Считаем профит покупателей

Алексей Будагов,
Считаем профит покупателей

Для персонализированный рассылки понадобилось узнать кто из покупателей давно не делал заказ, а кто делает регулярно. Написал небольшой скрипт, который можно запустить на любом сайте под управлением 1С-Битрикс (редакция с модулем Интернет-магазин).

Рассчитываются 4 параметра:

  1. Дата последнего заказа
  2. Кол-во заказов за год
  3. Средний чек
  4. Объем купленных товаров за месяц

По этим полям можно отфильтровать/отсортировать на странице списка пользователей /bitrix/admin/user_admin.php?lang=ru А так же выгрузить в xls таблицу.

Собственно сам скрипт:

/**
 * Добавляет новые поля пользователей и заполняет их данными из заказов
 */
function exUserProps () {
	
	global $DB;
	
	$arExUserProps = array(
		'UF_ORDER_LAST_DATE' => array(
			'EDIT_FORM_LABEL' => array('ru' => 'Дата последнего заказа'),
			'FIELD_NAME' => 'UF_ORDER_LAST_DATE',
			'USER_TYPE_ID' => 'datetime'
		),
		'UF_ORDER_CNT_YEAR' => array(
			'EDIT_FORM_LABEL' => array('ru' => 'Кол-во заказов за год'),
			'FIELD_NAME' => 'UF_ORDER_CNT_YEAR',
			'USER_TYPE_ID' => 'integer'
		),
		'UF_ORDER_CHECK' => array(
			'EDIT_FORM_LABEL' => array('ru' => 'Средний чек'),
			'FIELD_NAME' => 'UF_ORDER_CHECK',
			'USER_TYPE_ID' => 'integer'
		),
		'UF_ORDER_ITEMS_CNT' => array(
			'EDIT_FORM_LABEL' => array('ru' => 'Объем купленных товаров за месяц'),
			'FIELD_NAME' => 'UF_ORDER_ITEMS_CNT',
			'USER_TYPE_ID' => 'integer'
		)
	);
	
	// Проверяем наличие полей
	foreach ($arExUserProps as $i => $arProp) {
		$dbData = CUserTypeEntity::GetList(
			array(),
			array('FIELD_NAME' => $arProp['FIELD_NAME'])
		);
		if ($arData = $dbData->Fetch()) {
			$arProp[$i]['ID'] = $arData['ID'];
		} else {
			$oUserTypeEntity  = new CUserTypeEntity();
			$arProp['ENTITY_ID'] = 'USER';
			$arProp['SHOW_FILTER'] = 'I';
			$arProp['LIST_COLUMN_LABEL'] = $arProp['LIST_FILTER_LABEL'] = $arProp['EDIT_FORM_LABEL'];
			if (!$arProp[$i]['ID'] = $oUserTypeEntity->Add($arProp)) {
				global $APPLICATION;
				AddMessage2Log($APPLICATION->GetException());
			}
		}
	}
	
	
	// Заполняем данными. Берем заказы за год
	\Bitrix\Main\Loader::includeModule("sale");
	
	$arUsersResult = array();
	
	$arFilter = Array(
        ">=DATE_INSERT" => date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), strtotime('-12 month'))
    );
    $dbSales = CSaleOrder::GetList(array("DATE_INSERT" => "DESC"), $arFilter);
    while ($arSale = $dbSales->Fetch()) {
	    $order = \Bitrix\Sale\Order::load($arSale['ID']);
	    $userId = $order->getField("USER_ID");
	  
	    // Дата последнего заказа
	    if (!$arUsersResult[$userId]['UF_ORDER_LAST_DATE'] || strtotime($arUsersResult[$userId]['UF_ORDER_LAST_DATE']) < $order->getField("DATE_INSERT")->getTimestamp()) {
	    	$arUsersResult[$userId]['UF_ORDER_LAST_DATE'] = $order->getField("DATE_INSERT")->toString();
	    }
	    
	    // Кол-во заказов за год
	    $arUsersResult[$userId]['UF_ORDER_CNT_YEAR']++;
	    
	    // Средний чек за год
	    $arUsersResult[$userId]['UF_ORDER_CHECK'] += $order->getField("PRICE");
	    
	    // Кол-во товаров за месяц
	    if ($order->getField("DATE_INSERT")->getTimestamp() > strtotime('-1 month')) {
		    foreach ($order->getBasket() as $basketItem) {
			    if (!$basketItem->GetField('SET_PARENT_ID')) {
				    $arUsersResult[$userId]['UF_ORDER_ITEMS_CNT'] += $basketItem->getQuantity();
			    }
		    }
	    }
    }
    
    if (count($arUsersResult) > 0) {
	    foreach ($arUsersResult as $id => $arUserResult) {
		    
		    if ($arUserResult['UF_ORDER_CHECK'] > 0 && $arUserResult['UF_ORDER_CNT_YEAR'] > 0) {
			    $arUserResult['UF_ORDER_CHECK'] = round($arUserResult['UF_ORDER_CHECK']/$arUserResult['UF_ORDER_CNT_YEAR']);
		    }
		    
		    $user = new CUser;
		    if (!$user->Update($id, $arUserResult)) {
		    	AddMessage2Log($user->LAST_ERROR);
		    }
	    }
    }
    
    return 'exUserProps();';
	
}

Скрипт можно выполнить один раз, либо повесить на крон. Или например с помощью агента:

Пример агента на битрикс
Опубликовано 11 Апреля 2018 | Обновлено 18 Апреля 2018
примеры d7, разработчику, делаюИМ

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

Комментарии