]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
ERP-259 Доработка второго шага передачи смен
authormarina <m.zozirova@gmail.com>
Fri, 6 Dec 2024 07:05:18 +0000 (10:05 +0300)
committermarina <m.zozirova@gmail.com>
Fri, 6 Dec 2024 07:05:18 +0000 (10:05 +0300)
erp24/controllers/ShiftTransferController.php
erp24/records/EqualizationRemains.php
erp24/views/shift-transfer/_replacement.php

index cb8ed07ff3efc385fa93160e20f1142078deadaf..fc4d378b90660f1221ce17149b69329da5dcc8de 100644 (file)
@@ -222,10 +222,16 @@ class ShiftTransferController extends Controller
             $shiftTransfer = ShiftTransfer::findOne($shiftTransferId);
             $storeId = array_flip(array_map('strval', CityStore::getAllActiveGuidId()))[$shiftTransfer->store_guid];
             $productSelfCost = SelfCostProduct::findOne(['product_guid' => $productGuid, 'date' => $shiftTransfer->date, 'store_id' => $storeId]);
-            $productReplacement = ArrayHelper::map(Products1c::findAll(['id' => Product1cReplacement::find()
-                ->where(['guid' => $productGuid])
-                ->select('guid_replacement')
-                ->column()]), 'id', 'name');
+            $productReplacement = ArrayHelper::map(
+                Product1cReplacement::find()
+                    ->andWhere(['in', 'guid_replacement', ShiftTransfer::find()
+                        ->select('product_replacement_id')
+                    ])
+                    ->andWhere(['guid' => $productGuid])
+                    ->select('guid_replacement')
+                    ->column(),
+                'id', 'name'
+            );
 
             if (!$productPrice || !$productReplacement || !$productSelfCost) {
                 throw new \Exception('У данного товара нет цены либо замен!');
index 2bf72474b32c6f1cb80ae51412bc9ef59cbe32dd..218337f319e102d78489f31f11cafc219d1cd2c3 100644 (file)
@@ -146,17 +146,60 @@ class EqualizationRemains extends \yii\db\ActiveRecord
                 ->andWhere(['guid' => $m->product_guid])
                 ->select('guid_replacement')
                 ->scalar();
+            if (!$plus->andWhere(['product_guid' => $replacement])->exists()) {
+                continue;
+            }
+
             $p = $plus->andWhere(['product_guid' => $replacement])->one();
+            $model = new EqualizationRemains();
+            $model->setAttributes([
+                'shift_id' => $shiftTransfer->id,
+                'product_id' => $m->product_guid,
+                'product_count' => min ($m->fact_and_1c_diff,$p->fact_and_1c_diff),
+                'product_price' => $m->retail_price,
+                'product_self_cost' => $m->self_cost,
+                'product_replacement_id' => $p->product_guid,
+                'product_replacement_count' => min ($m->fact_and_1c_diff,$p->fact_and_1c_diff),
+                'product_replacement_price' => $p->retail_price,
+                'product_replacement_self_cost' => $p->self_cost,
+                'balance' => $m->fact_and_1c_diff * ($p->retail_price - $m->retail_price),
+                'balance_self_cost' => $m->fact_and_1c_diff * ($p->self_cost - $m->self_cost)
+            ]);
+            if ($model->validate()) {
+                $model->save();
+            } elseif ($model->getErrors()) {
+                var_dump($model->errors);
+                die();
+            }
+        }
+
+        $plus =  ShiftRemains::find()
+            ->andWhere(['shift_transfer_id' => $shiftTransfer->id])
+            ->andWhere(['!=', 'fact_and_1c_diff', 0])
+            ->andWhere(['>', 'fact_and_1c_diff', 0])
+        ->all();
+        foreach ($plus as $p) {
+            if (EqualizationRemains::find()
+                ->andWhere(['shift_id' => $shiftTransfer->id])
+                ->andWhere(['product_replacement_id' => $p->product_guid])
+                ->exists()) {
+                continue;
+            }
+
+            $replacement = Product1cReplacement::find()
+                ->andWhere(['guid' => $p->product_guid])
+                ->select('guid_replacement')
+                ->scalar();
 
             $model = new EqualizationRemains();
             $model->setAttributes([
                 'shift_id' => $shiftTransfer->id,
                 'product_id' => $m->product_guid,
-                'product_count' => $m->fact_and_1c_diff,
+                'product_count' => min ($m->fact_and_1c_diff,$p->fact_and_1c_diff),
                 'product_price' => $m->retail_price,
                 'product_self_cost' => $m->self_cost,
                 'product_replacement_id' => $p->product_guid,
-                'product_replacement_count' => $m->fact_and_1c_diff,
+                'product_replacement_count' => min ($m->fact_and_1c_diff,$p->fact_and_1c_diff),
                 'product_replacement_price' => $p->retail_price,
                 'product_replacement_self_cost' => $p->self_cost,
                 'balance' => $m->fact_and_1c_diff * ($p->retail_price - $m->retail_price),
index 77382a2dad5ff7e7687f5a325bfba8bae48ac19b..e397c15a6998838acf883607e38d88137818b0b1 100644 (file)
@@ -17,129 +17,131 @@ use yii\widgets\ActiveForm;
 
 $this->registerJsFile('/js/shift-transfer/replacement.js', ['position' => \yii\web\View::POS_END]);
 
+$totalBalance = array_sum(array_column($shiftTransfer->equalizationRemains, 'balance'));
+
 $form = \yii\widgets\ActiveForm::begin();
 if (in_array($shiftTransfer->status_id, [ShiftTransfer::STATUS_ID_TRANSFER_ACTIONS, ShiftTransfer::STATUS_ID_INPUT_FACT_REMAINS])
     && Yii::$app->user->id === $shiftTransfer->end_shift_admin_id) {
-//    echo $form->field($shiftTransfer, 'equalizationRemains')->widget(MultipleInput::class, [
-//        'min' => 0,
-//        'max' => 100,
-//        'columns' => [
-//            [
-//                'name' => 'product_id',
-//                'title' => 'Заменяемый товар',
-//                'type' => Select2::class,
-//                'options' => [
-//                    'data' => array_merge(
-//                        ['text' => 'Выберите товар'],
-//                        $products
-//                    ),
-//                    'pluginOptions' => [
-//                        'allowClear' => true,
-//                    ],
-//                    'pluginEvents' => [
-//                        'change' => new \yii\web\JsExpression('function() { setProductData.call(this); }'),
-//                    ],
-//                ],
-//                'value' => function ($model) {
-//                    return $model->product->id ?? '';
-//                },
-//            ],
-//            [
-//                'name' => 'product_price',
-//                'type' => BaseColumn::TYPE_TEXT_INPUT,
-//                'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
-//                'title' => 'Цена товара',
-//                'value' => function ($data) {
-//                    return $data['product_price'] ?? '';
-//                },
-//            ],
-//            [
-//                'name' => 'product_self_cost',
-//                'type' => BaseColumn::TYPE_TEXT_INPUT,
-//                'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
-//                'title' => 'Себестоимость товара',
-//                'value' => function ($data) {
-//                    return $data['product_self_cost'] ?? '';
-//                },
-//            ],
-//            [
-//                'name' => 'product_replacement_id',
-//                'title' => 'Замещающий товар',
-//                'type' => Select2::class,
-//                'options' => [
-//                    'data' => [],
-//                    'options' => [
-//                        'placeholder' => 'Выберите товар',
-//                        'class' => 'form-control',
-//                    ],
-//                    'pluginOptions' => [
-//                        'allowClear' => true,
-//                    ],
-//                    'pluginEvents' => [
-//                        'select2:select' => new \yii\web\JsExpression('function() {
-//                        setReplacementPriceData.call(this);
-//                    }'),
-//                    ],
-//                ],
-//                'value' => function ($model) {
-//                    return $model->productReplacement->name ?? '';
-//                },
-//            ],
-//            [
-//                'name' => 'product_replacement_price',
-//                'type' => BaseColumn::TYPE_TEXT_INPUT,
-//                'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
-//                'title' => 'Цена замещающего товара',
-//                'value' => function ($data) {
-//                    return $data['product_replacement_price'] ?? '';
-//                },
-//            ],
-//            [
-//                'name' => 'product_replacement_self_cost',
-//                'type' => BaseColumn::TYPE_TEXT_INPUT,
-//                'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
-//                'title' => 'Себестоимость замещаемого товара',
-//                'value' => function ($data) {
-//                    return $data['product_replacement_self_cost'] ?? '';
-//                },
-//            ],
-//            [
-//                'name' => 'product_replacement_count',
-//                'type' => BaseColumn::TYPE_TEXT_INPUT,
-//                'options' => ['type' => 'number', 'step' => 1,],
-//                'title' => 'Количество',
-//                'value' => function ($data) {
-//                    return $data['product_replacement_count'] ?? '';
-//                }
-//            ],
-//            [
-//                'name' => 'balance',
-//                'title' => 'Баланс',
-//                'type' => BaseColumn::TYPE_TEXT_INPUT,
-//                'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
-//                'value' => function ($data) {
-//                    return $data['balance'] ?? '';
-//                },
-//            ],
-//            [
-//                'name' => 'balance_self_cost',
-//                'title' => 'Разница в сумме (Себестоиомость)',
-//                'type' => BaseColumn::TYPE_TEXT_INPUT,
-//                'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
-//                'value' => function ($data) {
-//                    return $data['balance_self_cost'] ?? '';
-//                },
-//            ],
-//        ],
-//        'addButtonPosition' => MultipleInput::POS_FOOTER,
-//        'addButtonOptions' => [
-//            'class' => 'btn btn-success visible',
-//        ],
-//        'removeButtonOptions' => [
-//            'class' => 'btn btn-danger visible',
-//        ],
-//        'iconSource' => 'fa',
-//    ])->label('Таблица возможных замен');
+    echo $form->field($shiftTransfer, 'equalizationRemains')->widget(MultipleInput::class, [
+        'min' => 0,
+        'max' => 100,
+        'columns' => [
+            [
+                'name' => 'product_id',
+                'title' => 'Заменяемый товар',
+                'type' => Select2::class,
+                'options' => [
+                    'data' => array_merge(
+                        ['text' => 'Выберите товар'],
+                        $products
+                    ),
+                    'pluginOptions' => [
+                        'allowClear' => true,
+                    ],
+                    'pluginEvents' => [
+                        'change' => new \yii\web\JsExpression('function() { setProductData.call(this); }'),
+                    ],
+                ],
+                'value' => function ($model) {
+                    return $model->product->id ?? '';
+                },
+            ],
+            [
+                'name' => 'product_price',
+                'type' => BaseColumn::TYPE_TEXT_INPUT,
+                'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
+                'title' => 'Цена товара',
+                'value' => function ($data) {
+                    return $data['product_price'] ?? '';
+                },
+            ],
+            [
+                'name' => 'product_self_cost',
+                'type' => BaseColumn::TYPE_TEXT_INPUT,
+                'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
+                'title' => 'Себестоимость товара',
+                'value' => function ($data) {
+                    return $data['product_self_cost'] ?? '';
+                },
+            ],
+            [
+                'name' => 'product_replacement_id',
+                'title' => 'Замещающий товар',
+                'type' => Select2::class,
+                'options' => [
+                    'data' => [],
+                    'options' => [
+                        'placeholder' => 'Выберите товар',
+                        'class' => 'form-control',
+                    ],
+                    'pluginOptions' => [
+                        'allowClear' => true,
+                    ],
+                    'pluginEvents' => [
+                        'select2:select' => new \yii\web\JsExpression('function() {
+                        setReplacementPriceData.call(this);
+                    }'),
+                    ],
+                ],
+                'value' => function ($model) {
+                    return $model->productReplacement->name ?? '';
+                },
+            ],
+            [
+                'name' => 'product_replacement_price',
+                'type' => BaseColumn::TYPE_TEXT_INPUT,
+                'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
+                'title' => 'Цена замещающего товара',
+                'value' => function ($data) {
+                    return $data['product_replacement_price'] ?? '';
+                },
+            ],
+            [
+                'name' => 'product_replacement_self_cost',
+                'type' => BaseColumn::TYPE_TEXT_INPUT,
+                'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
+                'title' => 'Себестоимость замещаемого товара',
+                'value' => function ($data) {
+                    return $data['product_replacement_self_cost'] ?? '';
+                },
+            ],
+            [
+                'name' => 'product_replacement_count',
+                'type' => BaseColumn::TYPE_TEXT_INPUT,
+                'options' => ['type' => 'number', 'step' => 1,],
+                'title' => 'Количество',
+                'value' => function ($data) {
+                    return $data['product_replacement_count'] ?? '';
+                }
+            ],
+            [
+                'name' => 'balance',
+                'title' => 'Баланс',
+                'type' => BaseColumn::TYPE_TEXT_INPUT,
+                'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
+                'value' => function ($data) {
+                    return $data['balance'] ?? '';
+                },
+            ],
+            [
+                'name' => 'balance_self_cost',
+                'title' => 'Разница в сумме (Себестоиомость)',
+                'type' => BaseColumn::TYPE_TEXT_INPUT,
+                'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
+                'value' => function ($data) {
+                    return $data['balance_self_cost'] ?? '';
+                },
+            ],
+        ],
+        'addButtonPosition' => MultipleInput::POS_FOOTER,
+        'addButtonOptions' => [
+            'class' => 'btn btn-success visible',
+        ],
+        'removeButtonOptions' => [
+            'class' => 'btn btn-danger visible',
+        ],
+        'iconSource' => 'fa',
+    ])->label('Таблица возможных замен');
 
     echo $btn = Html::submitButton('Сохранить', [
         'class' => 'btn btn-primary float-right',
@@ -152,6 +154,7 @@ if (in_array($shiftTransfer->status_id, [ShiftTransfer::STATUS_ID_TRANSFER_ACTIO
         'dataProvider' => new ArrayDataProvider([
             'allModels' => $shiftTransfer->equalizationRemains,
         ]),
+        'showFooter' => true,
         'columns' => [
             [
                 'attribute' => 'product_id',
@@ -192,12 +195,14 @@ if (in_array($shiftTransfer->status_id, [ShiftTransfer::STATUS_ID_TRANSFER_ACTIO
                 'label' => 'Количество товара',
                 'format' => 'raw',
                 'pageSummary' => true,
+                'footer' => Html::tag('b', $totalBalance < 0 ? 'Недосдача: ' : 'Избыток: ' ) // Выводим итог в футере для данного столбца
             ],
             [
                 'attribute' => 'balance',
                 'label' => 'Разница в сумме',
                 'format' => 'raw',
                 'pageSummary' => true,
+                'footer' => Html::tag('b', number_format($totalBalance, 2, '.', ' ')), // Показываем итог по балансу
             ],
             [
                 'attribute' => 'balance_self_cost',
@@ -219,7 +224,7 @@ if (in_array($shiftTransfer->status_id, [ShiftTransfer::STATUS_ID_TRANSFER_ACTIO
             ],
         ],
         'showPageSummary' => true,
-        'layout' => '{items}',
+        'layout' => '{items}{summary}',
     ]);
 
     if (