Advertisement
Axxxxxx

lowest_and_highest_products

Jul 8th, 2021 (edited)
1,135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.39 KB | None | 0 0
  1. <?php
  2.  
  3. /**
  4.  * Поиск самого дорогого и самого дешевого товара, которые не были заказаны за прошлый месяц.
  5.  *
  6.  * Доп фильтрация по ID при совпадении цены - это же тестовое задание ;), а не решение продакшн.
  7.  * Добавьте еще сортировку/доп.фильтрацию.
  8.  *
  9.  *
  10.  * При выборке заказов поставлен 'limit' => 300, можно убрать, важно убедиться в том,
  11.  * чтобы процесс завершился раньше, чем отвалится по таймауту.
  12.  * При большом объеме данных запускать лучше в режиме cli с необходимым логированием (в файл / почту и т.п.).
  13.  *
  14.  * Лучше выполнять не через админку битрикса, а как отдельный скрипт.
  15.  */
  16.  
  17. set_time_limit(0);
  18.  
  19. if (php_sapi_name() == 'cli') {
  20.     $_SERVER['DOCUMENT_ROOT'] = '/home/bitrix/www';
  21. }
  22.  
  23. require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
  24. if (!\Bitrix\Main\Loader::includeModule('catalog')) {
  25.     echo 'Error with iblock module!';
  26.     die;
  27. }
  28. while (ob_get_level()) {
  29.     ob_end_flush();
  30. }
  31.  
  32. require_once $_SERVER['DOCUMENT_ROOT'].'/kint.php'; // для отладки
  33.  
  34. /**
  35.  * получение заказов за прошлый месяц.
  36.  * NB: выборка за прошлый месяц в комментарии (в примере взят январь 2021 ).
  37.  */
  38. $db_sales = \Bitrix\Sale\Order::getList([
  39.     'select' => ['ID'],
  40.     'filter' => [
  41.         '>=DATE_INSERT' => '01.01.2021', // date("d.m.Y", strtotime("first day of previous month"));
  42.         '<=DATE_INSERT' => '01.31.2021', // date("d.m.Y", strtotime("last day of previous month"));
  43.     ],
  44.     'limit' => 300, // NB: лимит поставлен для ускорения выборки.
  45. ])->fetchAll();
  46. $order_ids = array_column($db_sales, 'ID');
  47. // d($order_ids);
  48.  
  49. /*
  50.  * получение id товаров по отобранным заказм
  51.  */
  52. foreach ($order_ids as $order_id) {
  53.     $basketRes = \Bitrix\Sale\Internals\BasketTable::getList([
  54.         'filter' => [
  55.             'ORDER_ID' => $order_id,
  56.         ],
  57.     ]);
  58.  
  59.     while ($item = $basketRes->fetch()) {
  60.         $ids[] = $item['PRODUCT_ID'];
  61.     }
  62. }
  63. $ids = array_unique($ids);
  64. sort($ids);
  65.  
  66. /**
  67.  * Поскольку типов цен может быть несколько, необходимо получить их id.
  68.  * Для примера выбирается первое значение id типа.
  69.  */
  70. $rsGroup = \Bitrix\Catalog\GroupTable::getList();
  71. if ($arGroup = $rsGroup->fetch()) {
  72.     $price_id = $arGroup['ID'];
  73. } else {
  74.     die('что-то не так с типами цен.');
  75. }
  76.  
  77. /**
  78.  * Находим самый дорогой товар, исключая массив id товаров, которые были заказаны за прошлый месяц.
  79.  * В примере дополнительно отфильтрована цена (больше 0) и статус активности элемента.
  80.  */
  81. $db_res = CIBlockElement::GetList(
  82.     ['CATALOG_PRICE_'.$price_id => 'DESC'],
  83.     ['IBLOCK_ID' => IBLOCK_CATALOG, '!ID' => $ids, '=ACTIVE' => 'Y', '>CATALOG_PRICE_'.$price_id => 0],
  84.     false, false,
  85.     ['ID', 'NAME', 'ACTIVE', 'CATALOG_PRICE_'.$price_id]
  86. );
  87. if ($ar_res = $db_res->Fetch()) {
  88.     echo $ar_res['ID'],' | ',$ar_res['NAME'],' | ',$ar_res['CATALOG_PRICE_'.$price_id],'<br>';
  89. }
  90. /**
  91.  * Находим самый дешевый товар, исключая массив id товаров, которые были заказаны за прошлый месяц.
  92.  * В примере дополнительно отфильтрована цена (больше 0) и статус активности элемента.
  93.  */
  94. $db_res = CIBlockElement::GetList(
  95.     ['CATALOG_PRICE_'.$price_id => 'ASC'],
  96.     ['IBLOCK_ID' => IBLOCK_CATALOG, '!ID' => $ids, '=ACTIVE' => 'Y', '>CATALOG_PRICE_'.$price_id => 0],
  97.     false, false,
  98.     ['ID', 'NAME', 'ACTIVE', 'CATALOG_PRICE_'.$price_id]
  99. );
  100. if ($ar_res = $db_res->Fetch()) {
  101.     echo $ar_res['ID'],' | ',$ar_res['NAME'],' | ',$ar_res['CATALOG_PRICE_'.$price_id],'<br>';
  102. }
  103. die;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement