Считаем профит покупателей
Для персонализированный рассылки понадобилось узнать кто из покупателей давно не делал заказ, а кто делает регулярно. Написал небольшой скрипт, который можно запустить на любом сайте под управлением 1С-Битрикс (редакция с модулем Интернет-магазин).
Рассчитываются 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();'; }
Скрипт можно выполнить один раз, либо повесить на крон. Или например с помощью агента:
Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.