• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/recurring/calculator.php
  • Класс: Bitrix\Crm\Recurring\Calculator
  • Вызов: Calculator::prepareCalculationDate
static function prepareCalculationDate(array $params)
{
	$result = array(
		"PERIOD" => (int)$params[self::FIELD_PERIOD_NAME] ? (int)$params[self::FIELD_PERIOD_NAME] : null
	);

	if (isset($params['PERIOD_DEAL']) && (int)$params['EXECUTION_TYPE'] === Manager::MULTIPLY_EXECUTION)
	{
		$result[self::FIELD_PERIOD_NAME] = (int)$params['PERIOD_DEAL'];

		switch($result[self::FIELD_PERIOD_NAME])
		{
			case self::SALE_TYPE_DAY_OFFSET:
			{
				$params['DAILY_INTERVAL_DAY'] = 2;
				break;
			}
			case self::SALE_TYPE_WEEK_OFFSET:
			{
				$result[self::FIELD_PERIOD_NAME] = self::SALE_TYPE_DAY_OFFSET;
				$params['DAILY_INTERVAL_DAY'] = 8;
				break;
			}
			case self::SALE_TYPE_MONTH_OFFSET:
			{
				$params['MONTHLY_MONTH_NUM_1'] = 2;
				$params['MONTHLY_INTERVAL_DAY'] = date('j');
				$params['MONTHLY_TYPE'] = DateType\Month::TYPE_DAY_OF_ALTERNATING_MONTHS;
				break;
			}
			case self::SALE_TYPE_YEAR_OFFSET:
			{
				$params['YEARLY_TYPE'] = DateType\Year::TYPE_ALTERNATING_YEAR;
				$params['INTERVAL_YEARLY'] = 2;
				break;
			}
		}
	}
	elseif (isset($params['DEAL_TYPE_BEFORE']) && (int)$params['EXECUTION_TYPE'] === Manager::SINGLE_EXECUTION)
	{
		$result[self::FIELD_PERIOD_NAME] = (int)$params['DEAL_TYPE_BEFORE'];

		switch($result[self::FIELD_PERIOD_NAME])
		{
			case self::SALE_TYPE_DAY_OFFSET:
			{
				$params['DAILY_TYPE'] = DateType\Day::TYPE_A_FEW_DAYS_BEFORE;
				$params['DAILY_INTERVAL_DAY'] = (int)$params['DEAL_COUNT_BEFORE'];
				break;
			}
			case self::SALE_TYPE_WEEK_OFFSET:
			{
				$params['WEEKLY_TYPE'] = DateType\Week::TYPE_A_FEW_WEEKS_BEFORE;
				$params['WEEKLY_INTERVAL_WEEK'] = (int)$params['DEAL_COUNT_BEFORE'];
				break;
			}
			case self::SALE_TYPE_MONTH_OFFSET:
			{
				$params['MONTHLY_TYPE'] = DateType\Month::TYPE_A_FEW_MONTHS_BEFORE;
				$result['INTERVAL_MONTH'] = (int)$params['DEAL_COUNT_BEFORE'];
				break;
			}
		}
	}

	switch($result[self::FIELD_PERIOD_NAME])
	{
		case static::SALE_TYPE_DAY_OFFSET:
			$result['INTERVAL_DAY'] = $params['DAILY_INTERVAL_DAY'];
			$result['IS_WORKDAY'] = $params['DAILY_WORKDAY_ONLY'];
			if (empty($params['DAILY_TYPE']))
			{
				$params['DAILY_TYPE'] = DateType\Day::TYPE_ALTERNATING_DAYS;
			}
			$result['TYPE'] = $params['DAILY_TYPE'];
			break;
		case static::SALE_TYPE_WEEK_OFFSET:
			
			$result['WEEKDAYS'] = $params['WEEKLY_WEEK_DAYS'];
			$result['INTERVAL_WEEK'] = $params['WEEKLY_INTERVAL_WEEK'];
			if (!isset($params['WEEKLY_TYPE']))
			{
				$params['WEEKLY_TYPE'] = DateType\Week::TYPE_ALTERNATING_WEEKDAYS;
			}
			$result['TYPE'] = $params['WEEKLY_TYPE'];
			break;
		case static::SALE_TYPE_MONTH_OFFSET:
			$result['INTERVAL_DAY'] = $params['MONTHLY_INTERVAL_DAY'];
			if ((int)$params['MONTHLY_TYPE'] === DateType\Month::TYPE_DAY_OF_ALTERNATING_MONTHS)
			{
				$result['INTERVAL_MONTH'] = $params['MONTHLY_MONTH_NUM_1'];
				$result['IS_WORKDAY'] = $params['MONTHLY_WORKDAY_ONLY'];
			}
			elseif ((int)$params['MONTHLY_TYPE'] === DateType\Month::TYPE_WEEKDAY_OF_ALTERNATING_MONTHS)
			{
				$result['INTERVAL_WEEK'] = $params['MONTHLY_WEEKDAY_NUM'];
				$result['INTERVAL_MONTH'] = $params['MONTHLY_MONTH_NUM_2'];
				$result['WEEKDAY'] = $params['MONTHLY_WEEK_DAY'];
			}
			$result['TYPE'] = $params['MONTHLY_TYPE'];
			break;
		case static::SALE_TYPE_YEAR_OFFSET:
			$result['INTERVAL_DAY'] = $params['YEARLY_INTERVAL_DAY'];

			if ((int)$params['YEARLY_TYPE'] === DateType\Year::TYPE_DAY_OF_CERTAIN_MONTH)
			{
				$result['INTERVAL_DAY'] = $params['YEARLY_INTERVAL_DAY'];
				$result['INTERVAL_MONTH'] = $params['YEARLY_MONTH_NUM_1'];
				$result['IS_WORKDAY'] = $params['YEARLY_WORKDAY_ONLY'];
			}
			elseif ((int)$params['YEARLY_TYPE'] === DateType\Year::TYPE_WEEKDAY_OF_CERTAIN_MONTH)
			{
				$result['INTERVAL_WEEK'] = $params['YEARLY_WEEK_DAY_NUM'];
				$result['INTERVAL_MONTH'] = $params['YEARLY_MONTH_NUM_2'];
				$result['WEEKDAY'] = $params['YEARLY_WEEK_DAY'];
			}
			$result['TYPE'] = (int)$params['YEARLY_TYPE'];
	}
	
	return $result;
}