]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Добавление причин по MatrixErpProperty
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 11 Aug 2025 11:49:45 +0000 (14:49 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 11 Aug 2025 11:49:45 +0000 (14:49 +0300)
erp24/actions/marketplace/ReportAction.php
erp24/records/MatrixErpProperty.php

index 404173f37bade6a2e868c9c5d289a8c3bbd3b612..a91f404d3d7bc811c3b41a1061f399f6df06a4d4 100644 (file)
@@ -7,6 +7,7 @@ use yii\base\Action;
 use yii\data\ActiveDataProvider;
 use yii\data\ArrayDataProvider;
 use yii\db\Expression;
+use yii_app\records\MatrixErpProperty;
 use yii_app\records\Products1c;
 use yii_app\records\Products1cNomenclature;
 use yii_app\records\ProductsClass;
@@ -20,6 +21,44 @@ class ReportAction extends Action
         $isValid = Yii::$app->request->get('is_valid', Yii::$app->request->post('is_valid'));
         $productId = Yii::$app->request->get('product_id', Yii::$app->request->post('product_id'));
 
+        $model = new MatrixErpProperty();
+        $labels = $model->attributeLabels();
+
+        $fields = [
+            'description' => 'string',
+            'image_id' => 'numeric',
+            'url_link_video' => 'string',
+            'date' => 'date',
+            'display_name' => 'string',
+            'external_image_url' => 'string',
+            'product_url' => 'string',
+            'flowwow_category' => 'string',
+            'flowwow_subcategory' => 'string',
+            'yandex_category' => 'string',
+            'length' => 'numeric',
+            'width' => 'numeric',
+            'height' => 'numeric',
+            'weight' => 'numeric',
+        ];
+
+        $conditions = [];
+        $texts = [];
+
+        foreach ($fields as $field => $type) {
+            $label = $labels[$field] ?? $field;
+
+            if ($type === 'string') {
+                $conditions[] = "mep.$field IS NULL OR TRIM(mep.$field) = ''";
+                $texts[] = "CASE WHEN mep.$field IS NULL OR TRIM(mep.$field) = '' THEN 'В карточке Матричного букета не заполнено: {$label}' END";
+            } else {
+                $conditions[] = "mep.$field IS NULL";
+                $texts[] = "CASE WHEN mep.$field IS NULL THEN 'В карточке Матричного букета не заполнено: {$label}' END";
+            }
+        }
+
+        $hasMissingSql = implode(" OR ", $conditions);
+        $missingTextSql = "TRIM(BOTH E'\n' FROM concat_ws(E'\n', " . implode(", ", $texts) . "))";
+
         $subQuery = Products1c::find()
             ->alias('p1n')
             ->leftJoin('products_class pc', 'p1n.id = pc.category_id')
@@ -32,8 +71,9 @@ class ReportAction extends Action
         $innerQuery = Products1c::find()
             ->alias('p1n')
             ->leftJoin('prices p', 'p.product_id = p1n.id')
-            ->leftJoin('matrix_erp_property_dynamic mep', 'mep.product_id = p1n.id AND mep.active = 1')
+            ->leftJoin('matrix_erp_property_dynamic mepd', 'mepd.product_id = p1n.id AND mepd.active = 1')
             ->leftJoin('marketplace_priority mp', 'mp.guid::text = p1n.id::text')
+            ->leftJoin('matrix_erp_property mep', 'mep.guid::text = p1n.id::text')
             ->leftJoin(['mp_check' => new Expression("
         LATERAL (
             SELECT
@@ -49,35 +89,43 @@ class ReportAction extends Action
                 ) FILTER (WHERE COALESCE(b.quantity, 0) < (j.value::numeric * COALESCE(mp.reminder_koef, 1))) AS insuff_reason
             FROM jsonb_each(
                 CASE
-                    WHEN mep.value = '' THEN '{}' 
-                    ELSE replace(trim(both '\"' from mep.value), '\"\"', '\"')
+                    WHEN mepd.value = '' THEN '{}' 
+                    ELSE replace(trim(both '\"' from mepd.value), '\"\"', '\"')
                 END::jsonb
             ) AS j(key, value)
             LEFT JOIN balances b ON b.product_id::text = j.key AND b.store_id = :storeId
             LEFT JOIN products_1c prod ON prod.id::text = j.key
         )
     ")], 'true')
+            ->leftJoin(['mep_check' => new Expression("
+    LATERAL (
+        SELECT
+            ($hasMissingSql) AS has_missing,
+            $missingTextSql AS missing_text
+    )
+")], 'true')
             ->select([
                 'p1n.id',
                 'p1n.name',
                 'p1n.articule',
                 new \yii\db\Expression("
-        CASE 
-            WHEN mep.id IS NULL OR p.price IS NULL OR mp_check.has_insufficient_quantity THEN
-                'Коэффициент: ' || COALESCE(mp.reminder_koef::text, '-') || E'\n' ||
-                concat_ws(
-                    E'\n',
-                    CASE WHEN mep.id IS NULL THEN 'Не имеет состава букета' ELSE NULL END,
-                    CASE WHEN p.price IS NULL THEN 'Нет имеет цены' ELSE NULL END,
-                    CASE WHEN mp_check.has_insufficient_quantity THEN mp_check.insuff_reason ELSE NULL END
-                )
-            ELSE
-                ''
-        END AS reason
-    "),
+    CASE
+        WHEN mepd.id IS NULL OR p.price IS NULL OR mp_check.has_insufficient_quantity OR mep_check.has_missing THEN
+            'Коэффициент: ' || COALESCE(mp.reminder_koef::text, '-') || E'\n' ||
+            concat_ws(
+                E'\n',
+                CASE WHEN mepd.id IS NULL THEN 'Не имеет состава букета' END,
+                CASE WHEN p.price IS NULL THEN 'Нет цены' END,
+                CASE WHEN mp_check.has_insufficient_quantity THEN mp_check.insuff_reason END,
+                NULLIF(mep_check.missing_text, '')
+            )
+        ELSE
+            ''
+    END AS reason
+"),
                 new \yii\db\Expression("
         CASE 
-            WHEN mep.id IS NULL OR p.price IS NULL OR mp_check.has_insufficient_quantity THEN FALSE
+            WHEN mepd.id IS NULL OR p.price IS NULL OR mp_check.has_insufficient_quantity OR mep_check.has_missing THEN FALSE
             ELSE TRUE
         END AS is_valid
     "),
index 3905a605506c91871254032e35ff7801cfdb821b..1817ba9ed89782ee0d2a61b949d2057daa61ded4 100644 (file)
@@ -79,8 +79,8 @@ class MatrixErpProperty extends \yii\db\ActiveRecord
             'updated_admin_id' => 'Updated Admin ID',
             'updated_at' => 'Updated At',
             'display_name' => 'Название на маркетплейсе',
-            'external_image_url' => 'СÑ\81Ñ\8bлка Ð½Ð° Ð¸Ð·Ð¾Ð±Ñ\80ажение Ð»ÐµÐ¶Ð°Ñ\89ее Ð½Ð° Ð²Ð½ÐµÑ\88нем Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81е',
-            'product_url' => 'Ссылка на продуктовую карточку, лежащую предположительно на api2',
+            'external_image_url' => 'Ссылка на изображение на внешнем ресурсе',
+            'product_url' => 'Ссылка на продуктовую карточку на api2',
             'flowwow_category' => 'Категория в flowwow',
             'flowwow_subcategory' => 'Подкатегория в flowwow',
             'length' => 'Длина',