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

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

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

	$statusEventName = static::EVENT_DEFAULT_STATUS_CHANGED_ID.$entity->getField("STATUS_ID");

	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()];
	}

	if (($statusData = CSaleStatus::GetByID($entity->getField("STATUS_ID"), $siteData['LANGUAGE_ID'])) && $statusData['NOTIFY'] == "Y")
	{
		$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_STATUS" => $statusData["NAME"],
			"EMAIL" => static::getUserEmail($entity),
			"ORDER_DESCRIPTION" => $statusData["DESCRIPTION"],
			"TEXT" => "",
			"SALE_EMAIL" => MainConfigOption::get("sale", "order_email", "order@".$_SERVER["SERVER_NAME"]),
			"ORDER_PUBLIC_URL" => HelpersOrder::isAllowGuestView($entity) ? HelpersOrder::getPublicLink($entity) : ""
		);

		if ($entity->getField("DATE_INSERT") instanceof MainTypeDate)
		{
			$fields['ORDER_DATE'] = $entity->getField("DATE_INSERT")->toString();
		}

		foreach(GetModuleEvents("sale", static::EVENT_ORDER_STATUS_EMAIL, true) as $oldEvent)
		{
			$fields["TEXT"] = ExecuteModuleEventEx($oldEvent, array($entity->getId(), $statusData["ID"]));
		}

		$eventName = $statusEventName;

		$isSend = true;
		foreach(GetModuleEvents("sale", static::EVENT_ORDER_STATUS_SEND_EMAIL, true) as $oldEvent)
		{
			if (ExecuteModuleEventEx($oldEvent, Array($entity->getId(), &$eventName, &$fields, $entity->getField("STATUS_ID")))===false)
			{
				$isSend = false;
			}
		}

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

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

	CSaleMobileOrderPush::send(static::EVENT_MOBILE_PUSH_ORDER_STATUS_CHANGE, array("ORDER" => static::getOrderFields($entity)));

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

	return $result;
}