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

index 20108978054bf193a121eec69364c7a71e42a173..67bdd40f66c746e01a50b90d36fdc9c776e7d3fe 100644 (file)
@@ -12,4 +12,5 @@ erp24/api1/views/cron/txt/
 erp24/api1/views/cron/xml/
 erp24/package-lock.json
 /pgsql_last.sql
+/pgsql_last.sql.gz
 erp24/api2/users_auth_call_log2.txt
index 514b8ab5a9f5f14bd3c14764a535be896a41436d..f589dbd4f40c76198ebe449f5ec5c17d4187e073 100644 (file)
@@ -24,56 +24,70 @@ class ReportAction extends Action
             ])
             ->select('p1n.id');
 
+        $storeId = Yii::$app->request->get('store', 4);
+
         $products = 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('marketplace_priority mp', 'mp.guid::text = mep.product_id')
             ->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')
-
+        LATERAL (
+            SELECT
+                bool_or(COALESCE(b.quantity, 0) < (j.value::numeric * mp.reminder_koef)) AS has_insufficient_quantity,
+                string_agg(
+                    format(
+                        'Недостаточно товара %s (нужно ≥ %s, на складе %s)',
+                        prod.name,
+                        (j.value::numeric * mp.reminder_koef),
+                        COALESCE(b.quantity::text, '0')
+                    ),
+                    E'\n'
+                ) FILTER (WHERE COALESCE(b.quantity, 0) < (j.value::numeric * mp.reminder_koef)) AS insuff_reason
+            FROM jsonb_each(
+                replace(trim(both '\"' from mep.value), '\"\"', '\"')::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')
             ->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 
-                'Нет цены'
-            WHEN mp_check.has_insufficient_quantity THEN 
-                mp_check.insuff_reason
-            ELSE NULL
-        END AS reason
-    "),
+    (
+        'Коэффициент: ' || COALESCE(mp.reminder_koef::text, 'N/A') || E'\n' ||
+        COALESCE(
+            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
+            E'\n' || mp_check.insuff_reason
+        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
             ELSE TRUE
         END AS is_valid
-    ")
+    "),
             ])
             ->where(['in', 'parent_id', $subQuery])
+            ->orderBy(['is_valid' => SORT_ASC])
             ->asArray()
             ->all();
 
+
         $dataProvider = new ArrayDataProvider([
             'allModels' => $products,
             'pagination' => ['pageSize' => 20],
index 4da970c3df43f85ef889cb816922f323d2ff883b..dd1fad169329ba3ab84e0e304ccf3601d734342e 100644 (file)
@@ -63,9 +63,10 @@ $this->params['breadcrumbs'][] = $this->title;
             [
                 'attribute' => 'reason',
                 'label' => 'Причина не активности',
+                'format' => 'raw',
                 'value' => function ($model) {
-                    return $model['reason'] ?? '';
-                }
+                    return nl2br(htmlspecialchars($model['reason'] ?? ''));
+                },
             ],
         ],
     ]); ?>