]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
ERP-433 Отчет по остаткам букетов для МП и причинам, если логика не проходит. Возможн...
authormarina <m.zozirova@gmail.com>
Wed, 2 Jul 2025 07:31:17 +0000 (10:31 +0300)
committermarina <m.zozirova@gmail.com>
Wed, 2 Jul 2025 07:31:17 +0000 (10:31 +0300)
erp24/actions/marketplace/ReportAction.php
erp24/services/MarketplaceService.php
erp24/views/marketplace/report.php

index bc885cf168b5b2bb87cc4df57f033bf095c4a779..514b8ab5a9f5f14bd3c14764a535be896a41436d 100644 (file)
@@ -27,34 +27,53 @@ class ReportAction extends Action
         $products = Products1c::find()
             ->alias('p1n')
             ->leftJoin('prices p', 'p.product_id = p1n.id')
-            ->leftJoin('matrix_erp_property mep', 'mep.guid = p1n.id')
+            ->leftJoin('matrix_erp_property_dynamic mep', 'mep.product_id = p1n.id AND mep.active = 1')
+            ->leftJoin(['mp_check' => new \yii\db\Expression("
+    LATERAL (
+        SELECT
+            bool_or(mp.minimal_quantity > (j.value::numeric)) AS has_insufficient_quantity,
+            string_agg(
+                format(
+                    'Недостаточно \"%s\" (нужно ≥ %s, указано %s)',
+                    j.guid,
+                    mp.minimal_quantity,
+                    j.value
+                ),
+                E'\n'
+            ) FILTER (WHERE mp.minimal_quantity > (j.value::numeric)) AS insuff_reason
+        FROM jsonb_each_text(mep.value::jsonb) AS j(guid, value)
+        JOIN marketplace_priority mp ON mp.id::text = j.guid
+    )
+")], 'true')
+
             ->select([
                 'p1n.id',
                 'p1n.name',
                 'p1n.articule',
                 new \yii\db\Expression("
-            CASE 
-                WHEN mep.id IS NULL AND p.price IS NULL THEN 
-                    'Не имеет состава букета в MatrixErpProperty и нет цены'
-                WHEN mep.id IS NULL THEN 
-                    'Не имеет состава букета в MatrixErpProperty'
-                WHEN p.price IS NULL THEN 
-                    'Нет цены'
-                ELSE NULL
-            END AS reason
-        "),
+        CASE 
+            WHEN mep.id IS NULL AND p.price IS NULL THEN 
+                'Не имеет состава букета в MatrixErpProperty и нет цены'
+            WHEN mep.id IS NULL THEN 
+                'Не имеет состава букета в MatrixErpProperty'
+            WHEN p.price IS NULL THEN 
+                'Нет цены'
+            WHEN mp_check.has_insufficient_quantity THEN 
+                mp_check.insuff_reason
+            ELSE NULL
+        END AS reason
+    "),
                 new \yii\db\Expression("
-            CASE 
-                WHEN mep.id IS NULL OR p.price IS NULL THEN FALSE
-                ELSE TRUE
-            END AS is_valid
-        ")
+        CASE 
+            WHEN mep.id IS NULL OR p.price IS NULL OR mp_check.has_insufficient_quantity THEN FALSE
+            ELSE TRUE
+        END AS is_valid
+    ")
             ])
             ->where(['in', 'parent_id', $subQuery])
             ->asArray()
             ->all();
 
-
         $dataProvider = new ArrayDataProvider([
             'allModels' => $products,
             'pagination' => ['pageSize' => 20],
index 7bc8b269e54bdecf0f0a665578bcfab4446ab539..37a26fb2803784853e20189df0886ed549f823c4 100644 (file)
@@ -35,7 +35,7 @@ use yii_app\records\ProductsClass;
 class MarketplaceService
 {
 
-   // Порядок основных категорий (Цветы, Живые растения) не менять, добавлять в конец массива
+    // Порядок основных категорий (Цветы, Живые растения) не менять, добавлять в конец массива
     private const CATEGORIES_WITH_SUBCATEGORIES = [
         "Цветы" => [
             1 => "Монобукеты",
@@ -94,7 +94,8 @@ class MarketplaceService
         self::SUBJECT_DELIVERED => 5,
     ];
 
-    public static function infoForMarketplace(int $marketId) {
+    public static function infoForMarketplace(int $marketId)
+    {
         if (!array_key_exists($marketId, MarketplaceStore::getWarehouseId()))
             return;
 
@@ -121,23 +122,22 @@ class MarketplaceService
         // 2. Получение цен на букеты
         $prices = ArrayHelper::map(Prices::findAll(['product_id' => ArrayHelper::getColumn($productsGuids, 'id')]), 'product_id', 'price');
 
-       /* $allPrices = Prices::findAll(['product_id' => $productsGuidsIds]);
-
-        if (empty($allPrices)) {
-            Yii::warning('Не найдено цен для GUID.');
-        }
+        /* $allPrices = Prices::findAll(['product_id' => $productsGuidsIds]);
 
-        $prices = ArrayHelper::map($allPrices, 'product_id', 'price') ?: []; // Ensure $prices is an array
+         if (empty($allPrices)) {
+             Yii::warning('Не найдено цен для GUID.');
+         }
 
-        foreach ($productsGuidsIds as $productId) {
-            // Ensure $productId is scalar before checking
-            if (is_scalar($productId) && !array_key_exists($productId, $prices)) {
-                $prices[$productId] = 0;
-            } elseif (!is_scalar($productId)) {
-                Yii::warning('Invalid productId type: ' . gettype($productId));
-            }
-        }*/
+         $prices = ArrayHelper::map($allPrices, 'product_id', 'price') ?: []; // Ensure $prices is an array
 
+         foreach ($productsGuidsIds as $productId) {
+             // Ensure $productId is scalar before checking
+             if (is_scalar($productId) && !array_key_exists($productId, $prices)) {
+                 $prices[$productId] = 0;
+             } elseif (!is_scalar($productId)) {
+                 Yii::warning('Invalid productId type: ' . gettype($productId));
+             }
+         }*/
 
 
         // 3. Получение состава букетов
@@ -285,12 +285,13 @@ class MarketplaceService
                 }
             }
         }
-      //  var_dump($distribution);
+        //  var_dump($distribution);
 
         return $distribution;
     }
 
-    public static function getMarketplaceProducts() {
+    public static function getMarketplaceProducts()
+    {
         $productsGroup = ProductsClass::find()
             ->where(['tip' => [ProductsClass::MARKETPLACE, ProductsClass::MARKETPLACE_ADDITIONAL]])
             ->select('category_id')
@@ -301,6 +302,7 @@ class MarketplaceService
 
         return $products;
     }
+
     /**
      * Статический метод для получения всей информации по продуктам, которая необходима для создания фида.
      *
@@ -318,7 +320,6 @@ class MarketplaceService
             ->where(['tip' => 'products'])
             ->andWhere(['not', ['components' => '']])
             ->andWhere(['parent_id' => $parents])
-
             ->all();
 
         $count = (int)$id;
@@ -349,7 +350,7 @@ class MarketplaceService
             if ($price == 0) {
                 $message = "У товара {$product->id} отсутствует цена и он будет исключен из фида.";
                 Yii::error($message, __METHOD__);
-              InfoLogService::setInfoLog(
+                InfoLogService::setInfoLog(
                     __FILE__,
                     __LINE__,
                     $message,
@@ -427,13 +428,34 @@ class MarketplaceService
         $result = [];
 
         foreach ($products as $product) {
-            $check = self::checkProducts($product);
-            if ($check === false) {
-                continue;
+            $properties = MarketplaceService::getProductPropertiesByGuid($product->id);
+            if (!$properties) {
+                $message = "Товар с GUID {$product->id} не имеет свойств в MatrixErpProperty и был исключен из фида.";
+                Yii::error($message, __METHOD__);
+
+                InfoLogService::setInfoLog(
+                    __FILE__,
+                    __LINE__,
+                    $message,
+                    'Missing properties error'
+                );
             }
 
-            $properties = $check['properties'];
-            $price = $check['price'];
+            $price = MarketplaceService::getProductPrice($product->id);
+
+            if ($price == 0) {
+                $message = "У товара {$product->id} отсутствует цена и он будет исключен из фида.";
+                Yii::error($message, __METHOD__);
+
+
+                InfoLogService::setInfoLog(
+                    __FILE__,
+                    __LINE__,
+                    $message,
+                    'Zero price error'
+                );
+                continue;
+            }
 
             $components = json_decode($product->components, true);
             $composition = [];
@@ -473,7 +495,7 @@ class MarketplaceService
 
         return $result;
     }
-    
+
     public function checkProducts($product, $isView = false): array|false
     {
         $properties = MarketplaceService::getProductPropertiesByGuid($product->id);
@@ -541,11 +563,11 @@ class MarketplaceService
             $offer->addAttribute('available', $product['available'] ? 'true' : 'false');
 
             // Добавление URL продукта
-            $offer->addChild('url',  $product['productLink']);
+            $offer->addChild('url', $product['productLink']);
 
             // Добавление цены и валюты
             $offer->addChild('price', $product['price']);
-      //    $offer->addChild('oldPrice', $product['oldprice']);
+            //    $offer->addChild('oldPrice', $product['oldprice']);
             $offer->addChild('currencyId', 'RUB');
             $offer->addChild('categoryId', $product['category_id']);
 
@@ -561,7 +583,7 @@ class MarketplaceService
             }
 
             // Добавление веса и количества
-            if (isset($product['weight']) ) {
+            if (isset($product['weight'])) {
                 $offer->addChild('weight', $product['weight']);
             }
             if (!(isset($product['category_id']) && str_starts_with((string)$product['category_id'], '1'))) {
@@ -588,7 +610,6 @@ class MarketplaceService
             }
 
 
-
             // Добавление изображений продукта
             if (!empty($product['pictures'])) {
                 foreach ($product['pictures'] as $picture) {
@@ -601,7 +622,8 @@ class MarketplaceService
     }
 
 
-    private static function getProductPropertiesByGuid($guid) {
+    private static function getProductPropertiesByGuid($guid)
+    {
         $product = MatrixErpProperty::find()
             ->where(['guid' => $guid])
             ->one();
@@ -623,7 +645,8 @@ class MarketplaceService
         ];
     }
 
-    private static function getProductImageUrl($imageId) {
+    private static function getProductImageUrl($imageId)
+    {
         $image = Images::findOne($imageId);
         $fileName = '';
         if ($image && File::src($image->filename, 'images') != null) {
@@ -634,18 +657,27 @@ class MarketplaceService
 
         return null;
     }
-    private static function getProductLinkByGuid($guid) {
+
+    private static function getProductLinkByGuid($guid)
+    {
         return 'https://media.erp-flowers.ru/media/view-card?guid=' . urlencode($guid);
     }
 
-    private static function getProductPrice($productId) {
+    private static function getProductPrice($productId)
+    {
         $price = Prices::find()
             ->where(['product_id' => $productId])
             ->one();
         return $price['price'] ?? 0;
     }
-    private static function getProductOldPrice($productId) { return 300; }
-    private static function getProductDescription($productId) {
+
+    private static function getProductOldPrice($productId)
+    {
+        return 300;
+    }
+
+    private static function getProductDescription($productId)
+    {
 
         $product = MatrixErpProperty::find()
             ->where(['guid' => $productId])
@@ -657,8 +689,14 @@ class MarketplaceService
 
         return $product->description;
     }
-    private static function getProductQty($productId) { return 9; }
-    private static function getProductWeight($productId) {
+
+    private static function getProductQty($productId)
+    {
+        return 9;
+    }
+
+    private static function getProductWeight($productId)
+    {
         $product = MatrixErpProperty::find()
             ->where(['guid' => $productId])
             ->one();
@@ -677,7 +715,9 @@ class MarketplaceService
 
         return $product->weight ?? 0.5;
     }
-    private static function getProductCategory($productId) {
+
+    private static function getProductCategory($productId)
+    {
 
         $product = MatrixErpProperty::find()
             ->where(['guid' => $productId])
@@ -695,7 +735,7 @@ class MarketplaceService
             return null;
         }
 
-        return  self::getCategorySubcategoryId($product->flowwow_category, $product->flowwow_subcategory);
+        return self::getCategorySubcategoryId($product->flowwow_category, $product->flowwow_subcategory);
     }
 
     public static function getCategorySubcategoryId($category, $subcategory)
@@ -734,10 +774,13 @@ class MarketplaceService
         return (string)$categoryIndex . (string)$subcategoryIndex;
     }
 
-    private static function getProductMinOrder($productId) {
+    private static function getProductMinOrder($productId)
+    {
         return 1;
     }
-    private static function getProductAvailability($availableQty) {
+
+    private static function getProductAvailability($availableQty)
+    {
         return $availableQty > 0;
     }
 
@@ -820,14 +863,15 @@ class MarketplaceService
 
         ];
     }
+
     /**
      * Получает данные о заказах для указанных кампаний с учетом фильтров.
      *
-     * @param array       $campaignIds Массив идентификаторов кампаний (warehouse_guid).
-     * @param string|null $status      Фильтр по статусу заказа (например, "DELIVERED").
-     * @param string|null $substatus   Фильтр по подстатусу заказа (например, "CANCELLED").
-     * @param string      $fromDate    Начальная дата в формате "дд-мм-гггг".
-     * @param string|null $toDate      Конечная дата в формате "дд-мм-гггг".
+     * @param array $campaignIds Массив идентификаторов кампаний (warehouse_guid).
+     * @param string|null $status Фильтр по статусу заказа (например, "DELIVERED").
+     * @param string|null $substatus Фильтр по подстатусу заказа (например, "CANCELLED").
+     * @param string $fromDate Начальная дата в формате "дд-мм-гггг".
+     * @param string|null $toDate Конечная дата в формате "дд-мм-гггг".
      *
      * @return array Массив заказов, сгруппированных по кампании.
      */
@@ -884,8 +928,8 @@ class MarketplaceService
      * возвращая данные в виде массива, где ключ – идентификатор кампании (магазина),
      * а значение – массив заказов (в данном случае с одним заказом).
      *
-     * @param int         $campaignId  Идентификатор кампании (магазина) в API.
-     * @param int         $orderId     Идентификатор заказа.
+     * @param int $campaignId Идентификатор кампании (магазина) в API.
+     * @param int $orderId Идентификатор заказа.
      * @param string|null $contentType Заголовок Content-Type. Если не передан, используется значение по умолчанию.
      *
      * @return array Массив заказов в виде: [ $campaignId => [ $order ] ]
@@ -1151,18 +1195,18 @@ class MarketplaceService
                                 }
                             }
                         }
-                    // проверяем и устанавливаем ready_to = 1
-                     $baseUrl = "https://partner.market.yandex.ru/order/";
-                     $marketplaceOrder->order_link = $baseUrl . $marketplaceOrder->marketplace_order_id . "?tld=ru&partnerId=197274828";
-                     if (!$marketplaceOrder->save()) {
-                         Yii::error(
-                             'Ошибка сохранения заказа при создании ссылки: ' . json_encode(
-                                 $marketplaceOrder->getErrors(),
-                                 JSON_UNESCAPED_UNICODE
-                             )
-                         );
-                     }
-                    self::setReadyMarketplaceOrders($marketplaceOrder);
+                        // проверяем и устанавливаем ready_to = 1
+                        $baseUrl = "https://partner.market.yandex.ru/order/";
+                        $marketplaceOrder->order_link = $baseUrl . $marketplaceOrder->marketplace_order_id . "?tld=ru&partnerId=197274828";
+                        if (!$marketplaceOrder->save()) {
+                            Yii::error(
+                                'Ошибка сохранения заказа при создании ссылки: ' . json_encode(
+                                    $marketplaceOrder->getErrors(),
+                                    JSON_UNESCAPED_UNICODE
+                                )
+                            );
+                        }
+                        self::setReadyMarketplaceOrders($marketplaceOrder);
                     } else {
                         Yii::error(
                             'Ошибка сохранения заказа: ' . json_encode(
@@ -1404,8 +1448,8 @@ class MarketplaceService
      * Получает данные о возврате заказа через ReturnsApi.
      *
      * @param int $campaignId Идентификатор кампании (магазина).
-     * @param int $orderId    Идентификатор заказа.
-     * @param int $returnId   Идентификатор возврата.
+     * @param int $orderId Идентификатор заказа.
+     * @param int $returnId Идентификатор возврата.
      *
      * @return array Массив с данными возврата:
      *               - 'returnedAt': Время создания возврата (ISO 8601).
@@ -1427,7 +1471,7 @@ class MarketplaceService
             $returnedAt = $returnResult->getCreationDate();
             $rawReturnData = json_encode($returnResponse);
             return [
-                'returnedAt'    => $returnedAt,
+                'returnedAt' => $returnedAt,
                 'rawReturnData' => $rawReturnData,
             ];
         } catch (\Exception $e) {
@@ -1465,9 +1509,10 @@ class MarketplaceService
         $progressCallback = null,
         $seen = false,
         $unseen = false
-    ) {
+    )
+    {
         imap_errors();
-        imap_alerts(); 
+        imap_alerts();
         $debugMode = true;
 
         set_time_limit(300);
@@ -1482,12 +1527,12 @@ class MarketplaceService
 
         if (!$date) {
             //$date = date('d-M-Y');
-            $sinceDate = date('d-M-Y',strtotime("-1 day"));
-            $beforeDate = date('d-M-Y',strtotime("+1 day"));
+            $sinceDate = date('d-M-Y', strtotime("-1 day"));
+            $beforeDate = date('d-M-Y', strtotime("+1 day"));
             $searchCriteria = 'SINCE "' . $sinceDate . '" BEFORE "' . $beforeDate . '"';
         } else {
-            $sinceDate = date('d-M-Y',strtotime("{$date} -1 day"));
-            $beforeDate = date('d-M-Y',strtotime("{$date} +1 day"));
+            $sinceDate = date('d-M-Y', strtotime("{$date} -1 day"));
+            $beforeDate = date('d-M-Y', strtotime("{$date} +1 day"));
             if ($useSince) {
                 $searchCriteria = 'SINCE ';
                 $searchCriteria .= '"' . $date . '" ';
@@ -1560,7 +1605,7 @@ class MarketplaceService
             if ($progressCallback) {
                 call_user_func($progressCallback, "Поиск писем в папке: $folder...");
             }
-           // self::imap_debug_log("Поисковой запрос: {$searchCriteria}", $debugMode, $progressCallback);
+            // self::imap_debug_log("Поисковой запрос: {$searchCriteria}", $debugMode, $progressCallback);
             $emails = imap_search($inbox, $searchCriteria);
 
             self::check_imap_errors($debugMode, $progressCallback);
@@ -1681,7 +1726,7 @@ class MarketplaceService
             $email->date = $date;
             $email->body = $body;
             $email->created_at = date('Y-m-d H:i:s');
-            
+
             if ($email->save()) {
                 return $email;
             } else {
@@ -1692,7 +1737,8 @@ class MarketplaceService
     }
 
 
-    public static function imap_debug_log($message, $debugMode, $progressCallback) {
+    public static function imap_debug_log($message, $debugMode, $progressCallback)
+    {
 
         if ($debugMode) {
             if ($progressCallback) {
@@ -1702,7 +1748,8 @@ class MarketplaceService
         }
     }
 
-    public static function check_imap_errors($debugMode, $progressCallback) {
+    public static function check_imap_errors($debugMode, $progressCallback)
+    {
         $errors = imap_errors();
         $alerts = imap_alerts();
 
@@ -1755,27 +1802,27 @@ class MarketplaceService
     {
         $count = 0;
         if ($message) {
-                $store = MarketplaceStore::getWarehouseGuidByAccountEmail($message['to']) ?? 206008;
-
-                $order = self::getOrdersDataFromMessage($message);
-
-                if ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_NEW]) {
-                    $statusCode = 'PROCESSING';
-                    $substatusCode = 'STARTED';
-                } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_APPROVED]) {
-                    $statusCode = 'PROCESSING';
-                    $substatusCode = 'APPROVED';
-                } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_CANCELLED]) {
-                    $statusCode = 'CANCELLED';
-                    $substatusCode = 'USER_CHANGED_MIND';
-                } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_CHANGED]) {
-                    $statusCode = 'PROCESSING';
-                    $substatusCode = 'CHANGED';
-                } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_DELIVERED]) {
-                    $statusCode = 'DELIVERED';
-                    $substatusCode = 'DELIVERY_SERVICE_DELIVERED';
-                }
-                $count = self::processFlowwowOrders($order, $store, $statusCode, $substatusCode, $message['subject_index']);
+            $store = MarketplaceStore::getWarehouseGuidByAccountEmail($message['to']) ?? 206008;
+
+            $order = self::getOrdersDataFromMessage($message);
+
+            if ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_NEW]) {
+                $statusCode = 'PROCESSING';
+                $substatusCode = 'STARTED';
+            } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_APPROVED]) {
+                $statusCode = 'PROCESSING';
+                $substatusCode = 'APPROVED';
+            } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_CANCELLED]) {
+                $statusCode = 'CANCELLED';
+                $substatusCode = 'USER_CHANGED_MIND';
+            } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_CHANGED]) {
+                $statusCode = 'PROCESSING';
+                $substatusCode = 'CHANGED';
+            } elseif ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_DELIVERED]) {
+                $statusCode = 'DELIVERED';
+                $substatusCode = 'DELIVERY_SERVICE_DELIVERED';
+            }
+            $count = self::processFlowwowOrders($order, $store, $statusCode, $substatusCode, $message['subject_index']);
 
         }
         return $count;
@@ -1883,7 +1930,7 @@ class MarketplaceService
             }
 
             if ($clientText) {
-                $orderDetails['client'] =  str_replace('Позвонить', '', $clientText);
+                $orderDetails['client'] = str_replace('Позвонить', '', $clientText);
             }
 
             $recipientBlock = $main->findOne('p:contains("Получатель")');
@@ -1898,15 +1945,15 @@ class MarketplaceService
             $itemsBlock = false;
             if ($main->findOneOrFalse('table h2:contains("Детали заказа")') != false) {
                 $itemsBlock = $main->findOneOrFalse('table h2:contains("Детали заказа")');
-               // Yii::warning('Детали заказа 1: ' . json_encode($itemsBlock->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__);
+                // Yii::warning('Детали заказа 1: ' . json_encode($itemsBlock->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__);
             } elseif ($main->findOneOrFalse('table p:contains("Детали заказа")') != false) {
                 $itemsBlock = $main->findOneOrFalse('table p:contains("Детали заказа")');
-               // Yii::warning('Детали заказа 2: ' . json_encode($itemsBlock->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__);
+                // Yii::warning('Детали заказа 2: ' . json_encode($itemsBlock->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__);
             }
 
             if ($itemsBlock) {
                 Yii::warning('Детали заказа 3: ' . json_encode($itemsBlock->parentNode()->innerText(), JSON_UNESCAPED_UNICODE), __METHOD__);
-               // $itemsTable = $itemsBlock->parentNode()->find('table', 2);
+                // $itemsTable = $itemsBlock->parentNode()->find('table', 2);
                 $itemsTable = $itemsBlock->parentNode();
 
                 $itemsRows = $itemsTable->find('tr');
@@ -1921,12 +1968,12 @@ class MarketplaceService
                     // Извлекаем название и количество из второго <td>
                     $tds = $itemsRow->find('td');
                     if (count($tds) >= 2) {
-                        $itemData['name'] = trim(str_replace("\u{00A0}", ' ', strip_tags(preg_replace('/\s+/', ' ',$tds[1]->find('p', 0)->innerText()))));
+                        $itemData['name'] = trim(str_replace("\u{00A0}", ' ', strip_tags(preg_replace('/\s+/', ' ', $tds[1]->find('p', 0)->innerText()))));
                         $itemData['count'] = trim(str_replace(["\u{00A0}", 'шт.'], '', strip_tags(preg_replace('/\s+/', '', $tds[1]->find('p', 1)->innerText()))));
                     }
                     // Извлекаем цену из третьего <td>
                     if (count($tds) >= 3) {
-                        $itemData['price'] = (float)trim(str_replace(["\u{00A0}", '₽' , ' '], '', strip_tags(preg_replace('/\s+/', ' ', $tds[2]->find('p', 0)->innerText()))));
+                        $itemData['price'] = (float)trim(str_replace(["\u{00A0}", '₽', ' '], '', strip_tags(preg_replace('/\s+/', ' ', $tds[2]->find('p', 0)->innerText()))));
                     }
                     // Добавляем данные в массив
                     $orderItems[] = $itemData;
@@ -1945,9 +1992,9 @@ class MarketplaceService
                             (
                                 preg_replace
                                 (
-                                '/\s+/',
-                                ' ',
-                                $sumBlock->innerText()
+                                    '/\s+/',
+                                    ' ',
+                                    $sumBlock->innerText()
                                 )
                             )
                         )
@@ -2005,23 +2052,23 @@ class MarketplaceService
                 $marketplaceOrder = self::createOrder($orderDetails, $campaignId, $statusId, $substatusId);
                 if ($marketplaceOrder->save()) {
                     self::sendMessageToTelegram($marketplaceOrder->guid, "Тестовое сообщение для https://tracker.yandex.ru/ERP-326 из [2]");
-                     $newOrdersCount += 1;
-                     self::createOrUpdateStatusHistory($marketplaceOrder->id, $statusId, $substatusId, $orderDetails);
-                     self::saveOrderItems($orderDetails, $marketplaceOrder->id, $marketplaceOrder->warehouse_guid);
+                    $newOrdersCount += 1;
+                    self::createOrUpdateStatusHistory($marketplaceOrder->id, $statusId, $substatusId, $orderDetails);
+                    self::saveOrderItems($orderDetails, $marketplaceOrder->id, $marketplaceOrder->warehouse_guid);
                 } else {
-                     Yii::error(
-                         'Ошибка сохранения заказа: ' . json_encode(
-                             $marketplaceOrder->getErrors(),
-                             JSON_UNESCAPED_UNICODE
-                         )
-                     );
+                    Yii::error(
+                        'Ошибка сохранения заказа: ' . json_encode(
+                            $marketplaceOrder->getErrors(),
+                            JSON_UNESCAPED_UNICODE
+                        )
+                    );
                 }
                 self::setReadyMarketplaceOrders($marketplaceOrder);
             }
         } else {
             $marketplaceOrder->status_id = $statusId;
             $marketplaceOrder->substatus_id = $substatusId;
-            if ($index == self::SUBJECT_INDEX[self::SUBJECT_APPROVED] ) {
+            if ($index == self::SUBJECT_INDEX[self::SUBJECT_APPROVED]) {
                 //заказ принят
                 if ($marketplaceOrder->raw_data !== json_encode($orderDetails, JSON_UNESCAPED_UNICODE)) {
                     $marketplaceOrder->raw_data = json_encode($orderDetails, JSON_UNESCAPED_UNICODE);
@@ -2040,7 +2087,7 @@ class MarketplaceService
                 }
 
             } elseif ($index == self::SUBJECT_INDEX[self::SUBJECT_CHANGED]) {
-                $oldRawData = json_decode($marketplaceOrder->raw_data,true, 512, JSON_UNESCAPED_UNICODE);
+                $oldRawData = json_decode($marketplaceOrder->raw_data, true, 512, JSON_UNESCAPED_UNICODE);
                 $isChanged = false;
                 // заказ изменен
                 if (isset($orderDetails['comment']) && (!isset($oldRawData['comment']) || $orderDetails['comment'] != $oldRawData['comment'])) {
@@ -2175,7 +2222,7 @@ class MarketplaceService
                 (($statusHistoryRecord->status_id !== (int)$statusId && $statusHistoryRecord->status_id !== $deliveredStatusCodeId) ||
                     ($statusHistoryRecord->substatus_id !== (int)$substatusId && $statusHistoryRecord->substatus_id !== $deliveredSubstatusCodeId)) ||
                 (strtotime($order['date']) > strtotime($statusHistoryRecord->date_from))
-                ) {
+            ) {
                 $statusHistoryRecord->active = 0;
                 $statusHistoryRecord->date_end = date('Y-m-d H:i:s');
                 $statusHistoryRecord->save();
@@ -2199,7 +2246,7 @@ class MarketplaceService
             }
         }
     }
-    
+
 
     public static function saveOrderItems($order, $orderId, $warehouseGuid)
     {
@@ -2231,6 +2278,7 @@ class MarketplaceService
             }
         }
     }
+
     public static function extractArticleCode($productName)
     {
         if (preg_match('/\(([^()]+)\)\s*$/u', $productName, $matches)) {
index 3df942c63cbd4a8fe689ff140cdbc141bfb0aee4..4da970c3df43f85ef889cb816922f323d2ff883b 100644 (file)
@@ -1,16 +1,49 @@
 <?php
 
+use kartik\select2\Select2;
+use yii\bootstrap\ActiveForm;
 use yii\grid\GridView;
+use yii\helpers\ArrayHelper;
 use yii\helpers\Html;
+use yii_app\records\CityStore;
 
 /* @var $this yii\web\View */
 /* @var $dataProvider yii\data\ActiveDataProvider */
 
-$this->title = 'СпиÑ\81ок Ð¿Ñ\80одÑ\83кÑ\82ов, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð½Ðµ Ð¿Ð¾Ð¿Ð°Ð´Ð°Ñ\8eÑ\82 Ð² Ñ\84идÑ\8b';
+$this->title = 'Ð\9eÑ\82Ñ\87еÑ\82 Ð¿Ñ\80одÑ\83кÑ\82ов Ð¿Ð¾ Ð°ÐºÑ\82ивноÑ\81Ñ\82и Ð½Ð° Ð\9cÐ\9f';
 $this->params['breadcrumbs'][] = $this->title;
 ?>
 <div class="marketplace-report p-5">
 
+    <div class="filters">
+        <?php $form = ActiveForm::begin([]) ?>
+        <div class="row">
+            <div class="col-md">
+                <?= Select2::widget([
+                    'name' => 'store',
+                    'data' => ArrayHelper::map(
+                        CityStore::getAllActiveIdName(),
+                        'id',
+                        'name'
+                    ),
+                    'value' => 4,
+                    'options' => [
+                        'placeholder' => 'Выберите магазин',
+                        'allowClear' => true,
+                    ],
+                    'pluginOptions' => [
+                        'allowClear' => true,
+                    ],
+                ]) ?>
+            </div>
+            <div class="col-md">
+                <?= Html::submitButton('Применить', ['class' => 'btn btn-primary']) ?>
+            </div>
+        </div>
+        <?php ActiveForm::end() ?>
+    </div>
+
+
     <h1><?= Html::encode($this->title) ?></h1>
 
     <?= GridView::widget([