Автоматическая отмена заказа Bitrix

Возврат к списку

Многие владельцы интернет-магазинов сталкивались с проблемой, когда некоторые пользователи хитрят, делают заказ, ждут некоторое время, а только потом оплачивают его. За это время "ожидания" цена на товар может вырасти, что особенно актуально на сегодняшний день, когда курс меняется каждый день, в результате владелец магазина терпит убытки. Если объемы маленькие, это не сильно заметно, но на крупных проектах, это ощутимо.

АвтоматическаяОтменаЗаказа.jpg

Для таких клиентов "хитрецов" или "забывак", был разработан скрипт агент, который запускается раз в сутки, смотрит если заказ старше "N" дней (задается параметром), то отменяет его.

   class NLAgent{
/*
 * Агент. CheckOldOrders() 
 * Агент получает заказы, которые старше 14. Отменяет их и генерирует почтовое уведомление. 
 * 
 */
	public static function CheckOldOrders($day = 0){
		global $DB;

		if(!CModule::IncludeModule('sale')){
			return 'NLAgent::CheckOldOrders('.$day.');';
		}

		if(empty($day)){
			$day = 14; 
		}

		$arFilter = Array(
			'STATUS_ID' => 'N',
			'PAYED' => 'N',
			'RESERVED' => 'N',
			'CANCELED' =>'N',
			'<=DATE_INSERT' => date($DB->DateFormatToPHP(CSite::GetDateFormat('SHORT')), AddToTimeStamp(array('DD' => -1 * $day), time()))
		);

		$db_sales = CSaleOrder::GetList(array('DATE_INSERT' => 'ASC'), $arFilter);
		while ($ar = $db_sales->Fetch())
		{
			CSaleOrder::CancelOrder($ar['ID'], 'Y', 'Автоматическая отмена заказа.');
			CSaleOrder::StatusOrder($ar['ID'], 'C');

			// Генерируем почтовое событие. Начало
			$arOrder = CSaleOrder::GetByID($ar['ID']);
			if(!$arOrder){
				return 'NLAgent::CheckOldOrders('.$day.');';
			}
			
			$userEmail = '';
			$dbOrderProp = CSaleOrderPropsValue::GetList(Array(), Array('ORDER_ID' => $ar['ID'], 'PROP_IS_EMAIL' => 'Y'));
			if($arOrderProp = $dbOrderProp->Fetch())
				$userEmail = $arOrderProp['VALUE'];
			
			if(strlen($userEmail) <= 0){
				$dbUser = CUser::GetByID($arOrder['USER_ID']);
				if($arUser = $dbUser->Fetch())
					$userEmail = $arUser['EMAIL'];
			}
			
			$dbSite = CSite::GetByID($arOrder['LID']);
			$arSite = $dbSite->Fetch();
			$arStatus = CSaleStatus::GetByID($arOrder['STATUS_ID'], $arSite['LANGUAGE_ID']);
			
			 $arFields = Array(
				'ORDER_ID' => $arOrder['ACCOUNT_NUMBER'],
				'ORDER_DATE' => $arOrder['DATE_INSERT_FORMAT'],
				'ORDER_STATUS' => $arStatus['NAME'],
				'EMAIL' => $userEmail,
				'ORDER_DESCRIPTION' => $arStatus['DESCRIPTION'],
				'TEXT' => '',
				'SALE_EMAIL' => COption::GetOptionString('sale', 'order_email', 'order@'.$_SERVER['SERVER_NAME']),
				'SERVER_NAME' => $_SERVER['SERVER_NAME']
				);
			 
			 CEvent::Send("AUTO_ORDER_CANCEL", $arOrder['LID'], $arFields,'N',47);
                       // Генерируем почтовое событие. Конец
			
		}
		
		return 'NLAgent::CheckOldOrders('.$day.');';
	}
}

Как подключить? 
1. Подключаем класс в init.php. Для удобства я все классы размещаю на сервере в папке /bitrix/php_interface/include/classes а в init.php подключаю нужные для работы. 
2. После того как класс подключен, переходим в раздел агентов на сервере http://site.ru/bitrix/admin/agent_list.php?lang=ru 
Создаем новый агент:
 

АгентОтменыЗаказов.png

Из настроек агента видно, что скрипт будет запускаться каждые сутки, и отклонять заказы которые старше 14 дней. 

Внимание, в примере кода дополнительно генерируется почтовое событие об автоматической отмене заказов, если оно вам не нужно просто удалите код генерации события (обозначено комментариями). 

В низу статьи прикрепил архив с классом. Желаю удачи во внедрении, надеюсь кому-нибудь эта доработка позволит уберечь себя от дополнительных расходов. 






21.03.2017 в 09:41
0
Здравствуйте. Судя по описанию и коду — очень полезное и простое решение.
Скажите, как именно нужно подключить этот модуль?
Я пробую вставить код непосредственно в init.php, так и отдельно в includes — сразу после этого у меня перестает работать сайт. :( Сто я делаю не так. Заранее благодарю.
ответная реплика
08.06.2017 в 13:00
0
нужно вставлять между тегами
ответная реплика


Возврат к списку