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

index b12c08407d7f04f8f60a8689747e355b0b83460b..12214b56839ee2dfa16f2b71311c18f4d03fcafe 100644 (file)
@@ -6,6 +6,7 @@ use Yii;
 use yii\base\Action;
 use yii\data\ActiveDataProvider;
 use yii\data\ArrayDataProvider;
+use yii\db\Expression;
 use yii_app\records\Products1c;
 use yii_app\records\Products1cNomenclature;
 use yii_app\records\ProductsClass;
@@ -15,6 +16,10 @@ class ReportAction extends Action
 {
     public function run()
     {
+        $storeId = Yii::$app->request->post('store', 'dbd70103-2c7b-11e9-9b87-c85b76f0e893');
+        $isValid = Yii::$app->request->post('is_valid');
+        $productId = Yii::$app->request->post('product_id');
+
         $subQuery = Products1c::find()
             ->alias('p1n')
             ->leftJoin('products_class pc', 'p1n.id = pc.category_id')
@@ -24,28 +29,29 @@ class ReportAction extends Action
             ])
             ->select('p1n.id');
 
-        $storeId = Yii::$app->request->post('store', 'dbd70103-2c7b-11e9-9b87-c85b76f0e893');
-        $isValid = Yii::$app->request->post('is_valid');
         $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('marketplace_priority mp', 'mp.guid::text = mep.product_id')
-            ->leftJoin(['mp_check' => new \yii\db\Expression("
+            ->leftJoin('marketplace_priority mp', 'mp.guid::text = p1n.id::text')
+            ->leftJoin(['mp_check' => new Expression("
         LATERAL (
             SELECT
-                bool_or(COALESCE(b.quantity, 0) < (j.value::numeric * mp.reminder_koef)) AS has_insufficient_quantity,
+                bool_or(COALESCE(b.quantity, 0) < (j.value::numeric * COALESCE(mp.reminder_koef, 1))) AS has_insufficient_quantity,
                 string_agg(
                     format(
                         'Недостаточно товара %s (нужно ≥ %s, на складе %s)',
                         prod.name,
-                        (j.value::numeric * mp.reminder_koef),
+                        (j.value::numeric * COALESCE(mp.reminder_koef, 1)),
                         COALESCE(b.quantity::text, '0')
                     ),
                     E'\n'
-                ) FILTER (WHERE COALESCE(b.quantity, 0) < (j.value::numeric * mp.reminder_koef)) AS insuff_reason
+                ) FILTER (WHERE COALESCE(b.quantity, 0) < (j.value::numeric * COALESCE(mp.reminder_koef, 1))) AS insuff_reason
             FROM jsonb_each(
-                replace(trim(both '\"' from mep.value), '\"\"', '\"')::jsonb
+                CASE
+                    WHEN mep.value = '' THEN '{}' 
+                    ELSE replace(trim(both '\"' from mep.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
@@ -58,19 +64,12 @@ class ReportAction extends Action
                 new \yii\db\Expression("
             (
                 'Коэффициент: ' || COALESCE(mp.reminder_koef::text, '-') || 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
-                    ),
-                    ''
+                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
                 )
-                ||
-                CASE WHEN mp_check.has_insufficient_quantity THEN
-                    E'\n' || mp_check.insuff_reason
-                ELSE ''
-                END
             ) AS reason
         "),
                 new \yii\db\Expression("
@@ -81,6 +80,7 @@ class ReportAction extends Action
         "),
             ])
             ->where(['in', 'parent_id', $subQuery])
+            ->andFilterWhere(['p1n.id' => $productId])
             ->params([':storeId' => $storeId]);
 
         $products = (new \yii\db\Query())
@@ -100,6 +100,7 @@ class ReportAction extends Action
             'dataProvider' => $dataProvider,
             'isValid' => $isValid,
             'storeId' => $storeId,
+            'productId' => $productId,
         ]);
 
     }
index ae16dbaf5c948c0d11b88fac913117dfcb7c23c0..e54f2a01a6b03b831ad0271a6432cf0910bc8f6f 100644 (file)
@@ -3,6 +3,7 @@
 namespace yii_app\commands;
 
 use yii\console\Controller;
+use yii\db\Exception;
 use yii\helpers\ArrayHelper;
 use yii\helpers\Json;
 use yii_app\records\MatrixErp;
@@ -44,9 +45,15 @@ class MatrixErpController extends Controller
                         if ($matrixErpPropertyDynamic1) {
                             $matrixErpPropertyDynamic1->date_end = date("Y-m-d H:i:s");
                             $matrixErpPropertyDynamic1->active = 0;
-                            $matrixErpPropertyDynamic1->save();
-                            if ($matrixErpPropertyDynamic1->getErrors()) {
-                                var_dump($matrixErpPropertyDynamic1->getErrors());
+                            if (!$matrixErpPropertyDynamic1->save()) {
+                                $errors = $matrixErpPropertyDynamic1->getErrors();
+                                $errorText = '';
+                                foreach ($errors as $attribute => $msgs) {
+                                    foreach ($msgs as $msg) {
+                                        $errorText .= "$attribute: $msg\n";
+                                    }
+                                }
+                                throw new \Exception("MatrixErpPropertyDynamic update error:\n" . $errorText);
                             }
                         }
                         $matrixErpPropertyDynamic2 = new MatrixErpPropertyDynamic;
@@ -56,14 +63,27 @@ class MatrixErpController extends Controller
                         $matrixErpPropertyDynamic2->date_from = date("Y-m-d H:i:s");
                         $matrixErpPropertyDynamic2->date_end = '2100-01-01 00:00:00';
                         $matrixErpPropertyDynamic2->active = 1;
-                        $matrixErpPropertyDynamic2->save();
-                        if ($matrixErpPropertyDynamic2->getErrors()) {
-                            var_dump($matrixErpPropertyDynamic2->getErrors());
+                        if (!$matrixErpPropertyDynamic2->save()) {
+                            $errors = $matrixErpPropertyDynamic2->getErrors();
+                            $errorText = '';
+                            foreach ($errors as $attribute => $msgs) {
+                                foreach ($msgs as $msg) {
+                                    $errorText .= "$attribute: $msg\n";
+                                }
+                            }
+                            throw new \Exception("MatrixErpPropertyDynamic create error:\n" . $errorText);
                         }
+
                         $matrixErp->$field = $product->$field;
-                        $matrixErp->save();
-                        if ($matrixErp->getErrors()) {
-                            var_dump($matrixErp->getErrors());
+                        if (!$matrixErp->save()) {
+                            $errors = $matrixErp->getErrors();
+                            $errorText = '';
+                            foreach ($errors as $attribute => $msgs) {
+                                foreach ($msgs as $msg) {
+                                    $errorText .= "$attribute: $msg\n";
+                                }
+                            }
+                            throw new \Exception("MatrixErp update error:\n" . $errorText);
                         }
                     }
                 }
index 8dd83f9a79545f89db93321713e979b31fab1887..be7bfb9fb8d161ca490c01972ddcc9941924190e 100644 (file)
@@ -6,11 +6,13 @@ use yii\grid\GridView;
 use yii\helpers\ArrayHelper;
 use yii\helpers\Html;
 use yii_app\records\CityStore;
+use yii_app\services\MarketplaceService;
 
 /* @var $this yii\web\View */
 /* @var $dataProvider yii\data\ActiveDataProvider */
 /* @var $storeId string GUID магазина по дефолту Аэродромная */
 /* @var $isValid bool Флаг на активности на МП */
+/* @var $productId string GUID букета */
 
 $this->title = 'Отчет продуктов по активности на МП';
 $this->params['breadcrumbs'][] = $this->title;
@@ -35,6 +37,19 @@ $this->params['breadcrumbs'][] = $this->title;
                     ],
                 ]) ?>
             </div>
+            <div class="col-md">
+                <?= Select2::widget([
+                    'name' => 'product_id',
+                    'value' => $productId,
+                    'data' => ArrayHelper::map(MarketplaceService::getMarketplaceProducts(), 'id', 'name'),
+                    'options' => [
+                        'placeholder' => 'Букет',
+                    ],
+                    'pluginOptions' => [
+                        'allowClear' => true,
+                    ],
+                ]) ?>
+            </div>
             <div class="col-md">
                 <?= Select2::widget([
                     'name' => 'is_valid',