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

2k
Алексей,
Считаем профит покупателей
Считаем профит покупателей

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

Для персонализированный рассылки понадобилось узнать кто из покупателей давно не делал заказ, а кто делает регулярно. Написал небольшой скрипт, который можно запустить на любом сайте под управлением 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, разработчику, делаюИМ
Поделиться
Похожие статьи
Выводим выручку по заказам
Скидка, еще одна, плюс бесплатная доставка, а не переборщили ли мы и насколько выгодный получился за...
Читать дальше » 0
Алексей,
Как получить название единицы измерения товара
Да и вообще всю информацию о единице измерения товара. Сразу покажу готовый код для нового ядра битр...
Читать дальше » 0
Алексей,
Комментарии
❮…❯
Авторизуйтесь чтобы получать уведомления об ответе
Для персонализированный рассылки понадобилось узнать кто из покупателей давно не делал заказ, а кто делает регулярно. Написал небольшой скрипт, который можно запустить на любом сайте под управлением 1С-Битрикс (редакция с модулем Интернет-магазин)