• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/notify.php
  • Класс: BitrixSaleNotify
  • Вызов: Notify::sendOrderAllowPayStatusChange
static function sendOrderAllowPayStatusChange(InternalsEntity $entity)
{
	$result = new Result();

	if (static::isNotifyDisabled())
	{
		return $result;
	}

	if (!$entity instanceof Order)
	{
		throw new MainArgumentTypeException('entity', 'BitrixSaleOrder');
	}

	$statusEventName = static::EVENT_ORDER_ALLOW_PAY_SEND_EMAIL_EVENT_NAME;

	if (static::hasSentEvent($entity->getId(), $statusEventName))
	{
		return $result;
	}

	/** @var InternalsFields $fields */
	$fields = $entity->getFields();
	$originalValues = $fields->getOriginalValues();

	if (array_key_exists('STATUS_ID', $originalValues) && $originalValues['STATUS_ID'] == $entity->getField("STATUS_ID"))
	{
		return $result;
	}

	static $cacheSiteData = array();

	if (!isset($cacheSiteData[$entity->getSiteId()]))
	{
		$siteRes = CSite::GetByID($entity->getSiteId());
		$siteData = $siteRes->Fetch();
	}
	else
	{
		$siteData = $cacheSiteData[$entity->getSiteId()];
	}

	$statusData = InternalsStatusTable::getList(array(
							 'select' => array(
								 'ID',
								 'NOTIFY',
								 'NAME' => 'BitrixSaleInternalsStatusLangTable:STATUS.NAME',
							 ),
							 'filter' => array(
								 '=ID' => $entity->getField("STATUS_ID"),
								 '=BitrixSaleInternalsStatusLangTable:STATUS.LID' => $siteData['LANGUAGE_ID'],
								 '=TYPE' => OrderStatus::TYPE
							 ),
							 'limit'  => 1,
						 ))->fetch();

	if (!empty($statusData) && $statusData['NOTIFY'] == "Y")
	{
		$isSend = true;

		$fields = array(
			"ORDER_ID" => $entity->getField("ACCOUNT_NUMBER"),
			"ORDER_REAL_ID" => $entity->getField("ID"),
			"ORDER_ACCOUNT_NUMBER_ENCODE" => urlencode(urlencode($entity->getField("ACCOUNT_NUMBER"))),
			"ORDER_DATE" => $entity->getDateInsert()->toString(),
			"ORDER_STATUS" => $statusData["NAME"],
			"EMAIL" => static::getUserEmail($entity),
			"TEXT" => "",
			"SALE_EMAIL" => MainConfigOption::get("sale", "order_email", "order@".$_SERVER["SERVER_NAME"]),
			"ORDER_PUBLIC_URL" => HelpersOrder::isAllowGuestView($entity) ? HelpersOrder::getPublicLink($entity) : ""
		);

		$eventManager = MainEventManager::getInstance();
		if ($eventsList = $eventManager->findEventHandlers('sale', static::EVENT_ON_ORDER_ALLOW_PAY_STATUS_EMAIL))
		{
			$event = new MainEvent('sale', static::EVENT_ON_ORDER_ALLOW_PAY_STATUS_EMAIL, array(
				'EVENT_NAME' => $statusEventName,
				'VALUES' => $fields
			));
			$event->send();

			if ($event->getResults())
			{
				/** @var MainEventResult $eventResult */
				foreach($event->getResults() as $eventResult)
				{
					if($eventResult->getType() === MainEventResult::ERROR)
					{
						$isSend = false;
					}
					elseif($eventResult->getType() == MainEventResult::SUCCESS)
					{
						if ($eventResultParams = $eventResult->getParameters())
						{
							/** @var Result $eventResultData */
							if (!empty($eventResultParams) && is_array($eventResultParams))
							{
								if (!empty($eventResultParams['EVENT_NAME']))
								{
									$statusEventName = $eventResultParams['EVENT_NAME'];
								}

								if (!empty($eventResultParams['VALUES']) && is_array($eventResultParams['VALUES']))
								{
									$fields = $eventResultParams['VALUES'];
								}
							}
						}
					}
				}
			}
		}

		if($isSend)
		{
			$eventMessage = new CEventMessage;
			$eventMessageRes = $eventMessage->GetList(
				'',
				'',
				array(
					"EVENT_NAME" => $statusEventName,
					"SITE_ID" => $entity->getSiteId(),
					'ACTIVE' => 'Y'
				)
			);
			if (!($eventMessageData = $eventMessageRes->Fetch()))
			{
				$statusEventName = static::EVENT_ORDER_ALLOW_PAY_SEND_EMAIL_EVENT_NAME;
			}

			unset($o, $b);
			$event = new CEvent;
			$event->Send($statusEventName, $entity->getSiteId(), $fields, "Y", "", array(), $siteData['LANGUAGE_ID']);
		}
	}

	static::addSentEvent($entity->getId(), $statusEventName);

	return $result;
}