]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
ERP-243 Действия по замене (II этап)
authormarina <m.zozirova@gmail.com>
Fri, 29 Nov 2024 15:48:36 +0000 (18:48 +0300)
committermarina <m.zozirova@gmail.com>
Fri, 29 Nov 2024 15:48:36 +0000 (18:48 +0300)
erp24/controllers/ShiftTransferController.php
erp24/migrations/m241127_065457_create_equalization_remains_table.php
erp24/records/EqualizationRemains.php
erp24/views/shift-transfer/_replacement.php
erp24/views/shift-transfer/view.php
erp24/web/js/shift-transfer/equalization-remains.js [new file with mode: 0644]

index 7f30bc6acec7ce3e4b67ccd74d199bb66e4b9183..47d9fa5f1238e352170406c36babbab065d1cb84 100644 (file)
@@ -4,14 +4,17 @@ namespace app\controllers;
 
 use Yii;
 use yii\helpers\ArrayHelper;
+use yii\helpers\Json;
 use yii\web\Controller;
 use yii\web\Response;
 use yii_app\records\Admin;
 use yii_app\records\Balances;
+use yii_app\records\CityStore;
 use yii_app\records\EqualizationRemains;
 use yii_app\records\ExportImportTable;
 use yii_app\records\MultipleModel;
 use yii_app\records\Prices;
+use yii_app\records\Product1cReplacement;
 use yii_app\records\Products1c;
 use yii_app\records\ProductsClass;
 use yii_app\records\SelfCostProduct;
@@ -21,7 +24,8 @@ use yii_app\services\TaskService;
 
 class ShiftTransferController extends Controller
 {
-    public function actionIndex() {
+    public function actionIndex()
+    {
         $shiftTransfers = ShiftTransfer::find()->all();
 
         $storeNameById = TaskService::getEntitiesByAlias('store');
@@ -31,7 +35,8 @@ class ShiftTransferController extends Controller
         return $this->render('index', compact('shiftTransfers', 'storeNameById', 'admins'));
     }
 
-    public static function getAdminsWithDrugieLast() {
+    public static function getAdminsWithDrugieLast()
+    {
         $adminArr = [];
         $adminArrOther = [];
         foreach (\yii_app\records\Admin::find()->with('adminGroup')->all() as $admin) {
@@ -49,7 +54,8 @@ class ShiftTransferController extends Controller
         return $admins;
     }
 
-    public function actionCreate() {
+    public function actionCreate()
+    {
         $shiftTransfer = new ShiftTransfer;
 
         $isCreate = true;
@@ -62,7 +68,8 @@ class ShiftTransferController extends Controller
             'admins'));
     }
 
-    public function actionUpdate($id = null) {
+    public function actionUpdate($id = null)
+    {
         $shiftTransfer = ShiftTransfer::findOne($id);
 
         if (!$shiftTransfer) {
@@ -77,7 +84,7 @@ class ShiftTransferController extends Controller
             $postShiftTransfer = Yii::$app->request->post('ShiftTransfer');
             $loadDataShiftRemains = ArrayHelper::getValue($postShiftTransfer, 'shiftRemains');
             if (!empty($loadDataShiftRemains)) {
-                MultipleModel::loadMultipleFromArray($modelsShiftRemains, $loadDataShiftRemains , '',[]);
+                MultipleModel::loadMultipleFromArray($modelsShiftRemains, $loadDataShiftRemains, '', []);
             }
             foreach ($modelsShiftRemains as $key => $modelsShiftRemain) {
                 $modelsShiftRemain->shift_transfer_id = $shiftTransfer->id;
@@ -98,7 +105,8 @@ class ShiftTransferController extends Controller
             'admins'));
     }
 
-    public function actionGetProductsByGroupLabel() {
+    public function actionGetProductsByGroupLabel()
+    {
         Yii::$app->response->format = Response::FORMAT_JSON;
 
         $productsClass = ProductsClass::find()->select('category_id')
@@ -108,7 +116,8 @@ class ShiftTransferController extends Controller
             ->where(['parent_id' => $productsClass])->all(), 'id', 'name');
     }
 
-    public function actionGetProductPriceSelfCostAndRemains() {
+    public function actionGetProductPriceSelfCostAndRemains()
+    {
         Yii::$app->response->format = Response::FORMAT_JSON;
 
         $productGuid = Yii::$app->request->post('productGuid');
@@ -125,10 +134,16 @@ class ShiftTransferController extends Controller
         return ['price' => $price->price ?? 0, 'selfCost' => $selfCost->price ?? 0, 'quantity' => $balance->quantity ?? 0];
     }
 
-    public function actionView($id) {
-
+    public function actionView($id)
+    {
         if (Yii::$app->request->post()) {
-            ShiftRemains::updateAll(['type' => ShiftRemains::ARCHIVE_RECORD, ['shift_transfer_id' => $id]]);
+            $action = Yii::$app->request->post('action');
+
+            if ($action === 'accept') {
+                ShiftRemains::updateAll(['type' => ShiftRemains::ARCHIVE_RECORD], ['shift_transfer_id' => $id]);
+            } elseif ($action === 'save') {
+                EqualizationRemains::updateData(Yii::$app->request->post()['ShiftTransfer']['equalizationRemains'], $id);
+            }
         }
 
         $shiftTransfer = ShiftTransfer::findOne($id);
@@ -137,17 +152,78 @@ class ShiftTransferController extends Controller
 
         $admins = ArrayHelper::map(Admin::find()->all(), 'id', 'name');
 
-        $isAcceptance = in_array($shiftTransfer->status_id, [ShiftTransfer::STATUS_ID_TRANSFER_ACTIONS, ShiftTransfer::STATUS_ID_INPUT_FACT_REMAINS]);
-
-        EqualizationRemains::getEqualizationTable($shiftTransfer);
+        $products = ArrayHelper::map(Products1c::findAll(['id' => ShiftRemains::find()->where(['shift_transfer_id' => $id])->select('product_guid')->column()]), 'id', 'name');
 
         return $this->render('view',
-            compact('shiftTransfer', 'storeNameById', 'admins', 'isAcceptance'));
+            compact('shiftTransfer', 'storeNameById', 'admins', 'products'));
     }
 
-    public function actionDelete($id) {
+    public function actionDelete($id)
+    {
         ShiftTransfer::deleteAll(['id' => $id]);
 
         return $this->redirect(['/shift-transfer']);
     }
+
+    public function actionGetProductData(string $productGuid, int $shiftTransferId)
+    {
+        try {
+            $productPrice = Prices::findOne(['product_id' => $productGuid]);
+            $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');
+
+            if (!$productPrice || !$productReplacement || !$productSelfCost) {
+                throw new \Exception('У данного товара нет цены либо замен!');
+            }
+
+            $data = [
+                'success' => true,
+                'product_price' => $productPrice->price,
+                'product_replacement' => $productReplacement,
+                'product_self_cost' => $productSelfCost->price,
+            ];
+
+        } catch (\Throwable $exception) {
+            $data = [
+                'success' => false,
+                'message' => $exception->getMessage(),
+            ];
+        }
+
+        return Json::encode($data);
+    }
+
+    public function actionGetProductReplacementPrice(string $productGuid, int $shiftTransferId)
+    {
+        try {
+            $productPrice = Prices::findOne(['product_id' => $productGuid]);
+            $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]);
+
+
+            if (!$productPrice) {
+                throw new \Exception('У данного товара нет цены либо замен!');
+            }
+
+            $data = [
+                'success' => true,
+                'product_price' => $productPrice->price,
+                'product_replacement_self_cost' => $productSelfCost->price,
+            ];
+
+        } catch (\Throwable $exception) {
+            $data = [
+                'success' => false,
+                'message' => $exception->getMessage(),
+            ];
+        }
+
+        return Json::encode($data);
+    }
 }
index 7accc9e6dd218c15321580a018a899d5708f0122..b49e3dd7a27b8b54ec0e1db41a70f8a1f63b4288 100644 (file)
@@ -18,11 +18,11 @@ class m241127_065457_create_equalization_remains_table extends Migration
             'product_id' => $this->string()->comment('ID товара с недостатком'),
             'product_count' => $this->float()->comment('Количество товара с недостатком'),
             'product_price' => $this->float()->comment('Цена товара розничная'),
-            'product_price_self_cost' => $this->float()->comment('Себестоимость товара'),
+            'product_self_cost' => $this->float()->comment('Себестоимость товара'),
             'product_replacement_id' => $this->string()->comment('Товар замена'),
             'product_replacement_count' => $this->float()->comment('Количество товара замены'),
             'product_replacement_price' => $this->float()->comment('Цена товара замены розничная'),
-            'product_replacement_price_self_cost' => $this->float()->comment('Себестоимость товара замены'),
+            'product_replacement_self_cost' => $this->float()->comment('Себестоимость товара замены'),
             'balance' => $this->float()->comment('Разница в сумме'),
             'balance_self_cost' => $this->float()->comment('Разница в сумме (себестоимость)'),
             'created_at' => $this->dateTime()->comment('Дата создания записи'),
index cc933c3d413d2ebf73a9d5f0a66552737d3f96fe..111755e578b20b4565c54630f66e48c65152c9aa 100644 (file)
@@ -16,11 +16,11 @@ use yii\db\Expression;
  * @property string $product_id ID товара с недостатком
  * @property float $product_count Количество товара с недостатком
  * @property float $product_price Цена товара розничная
- * @property float $product_price_self_cost Себестоимость товара
+ * @property float $product_self_cost Себестоимость товара
  * @property string $product_replacement_id Товар замена
  * @property float $product_replacement_count Количество товара замены
  * @property float $product_replacement_price Цена товара замены розничная
- * @property float $product_replacement_price_self_cost Себестоимость товара замены
+ * @property float $product_replacement_self_cost Себестоимость товара замены
  * @property float $balance Разница в сумме
  * @property float $balance_self_cost Разница в сумме (Себестоиомость)
  * @property string $created_at Дата создания записи
@@ -63,7 +63,8 @@ class EqualizationRemains extends \yii\db\ActiveRecord
     {
         return [
             [['shift_id', 'created_by', 'updated_by'], 'integer'],
-            [['product_count', 'product_price', 'product_price_self_cost', 'product_replacement_count', 'product_replacement_price', 'product_replacement_price_self_cost', 'balance', 'balance_self_cost'], 'number'],
+            [['product_count', 'product_price', 'product_self_cost', 'product_replacement_count', 'product_replacement_price', 'product_replacement_self_cost', 'balance', 'balance_self_cost'], 'number'],
+            [['product_count', 'product_price', 'product_self_cost', 'product_replacement_count', 'product_replacement_price', 'product_replacement_self_cost', 'balance', 'balance_self_cost'], 'required'],
             [['created_at', 'updated_at'], 'safe'],
             [['product_id', 'product_replacement_id'], 'string', 'max' => 255],
         ];
@@ -80,11 +81,11 @@ class EqualizationRemains extends \yii\db\ActiveRecord
             'product_id' => 'ID товара с недостатком',
             'product_count' => 'Количество товара с недостатком',
             'product_price' => 'Цена товара розничная',
-            'product_price_self_cost' => 'Себестоимость товара',
+            'product_self_cost' => 'Себестоимость товара',
             'product_replacement_id' => 'Товар замена',
             'product_replacement_count' => 'Количество товара замены',
             'product_replacement_price' => 'Цена товара замены розничная',
-            'product_replacement_price_self_cost' => 'Себестоимость товара замены',
+            'product_replacement_self_cost' => 'Себестоимость товара замены',
             'balance' => 'Разница в сумме',
             'balance_self_cost' => 'Разница в сумме (Себестоимость)',
             'created_at' => 'Дата создания записи',
@@ -94,77 +95,29 @@ class EqualizationRemains extends \yii\db\ActiveRecord
         ];
     }
 
-    public static function getEqualizationTable(ShiftTransfer $shiftTransfer)
-    {
-        $existingReplacement = self::findAll(['shift_id' => $shiftTransfer->id]);
-
-        // Если записи уже существуют, возвращаем их
-        if (!empty($existingReplacement)) {
-            return $existingReplacement;
-        }
-
-        // Если записей нет, создаем их
-        $replacementArray = [];
-        $storeGuid = $shiftTransfer->store_guid;
-        $storeId = array_flip(array_map('strval', CityStore::getAllActiveGuidId()))[$storeGuid];
-        $date = $shiftTransfer->date;
-
-        foreach ($shiftTransfer->shiftRemains as $product) {
-            $productGuid = $product->product_guid;
-            $productReplacement = Product1cReplacement::findAll(['guid' => $productGuid]);
-
-            // Для каждого продукта находим замены
-            foreach ($productReplacement as $pr) {
-                $replacement = Balances::findOne(['store_id' => $storeGuid, 'product_id' => $pr->guid_replacement]);
-
-                // Проверяем условие замены (не хватка товаров)
-                if ($replacement && ($replacement->quantity + array_sum(array_column($replacementArray, 'count'))) < $product->remains_count) {
-                    // Собираем все данные в один массив
-                    $productPrice = Prices::findOne(['product_id' => $productGuid]);
-                    $productSelfCost = SelfCostProduct::findOne(['product_guid' => $productGuid, 'store' => $storeId, 'date' => $date]);
-                    $replacementPrice = Prices::findOne(['product_id' => $pr->guid_replacement]);
-                    $replacementSelfCost = SelfCostProduct::findOne(['product_guid' => $pr->guid_replacement, 'store' => $storeId, 'date' => $date]);
-
-                    // Если все данные найдены, добавляем информацию о балансе
-                    if ($productPrice && $productSelfCost && $replacementPrice && $replacementSelfCost) {
-                        $replacementArray[] = [
-                            'count' => $replacement->quantity,
-                            'product_price' => $productPrice->price,
-                            'product_self_cost' => $productSelfCost->price,
-                            'product_replacement' => $replacement->product_id,
-                            'product_replacement_price' => $replacementPrice->price,
-                            'product_replacement_self_cost' => $replacementSelfCost->price,
-                            'balance' => $replacement->quantity * ($productPrice->price - $replacementPrice->price),
-                            'balance_self_cost' => $replacement->quantity * ($productSelfCost->price - $replacementSelfCost->price),
-                        ];
-                    }
-                } else {
-                    // Если товаров достаточно, прерываем цикл
-                    break;
-                }
-            }
-        }
-
-        // Теперь сохраняем данные о выравнивании
-        foreach ($replacementArray as $replacementData) {
-            $equalizationRemains = new EqualizationRemains();
-            $equalizationRemains->setAttributes([
-                'shift_id' => $shiftTransfer->id,
-                'product_id' => $replacementData['product_id'],
-                'product_count' => $replacementData['count'],
-                'product_price' => $replacementData['product_price'],
-                'product_self_cost' => $replacementData['product_self_cost'],
-                'product_replacement' => $replacementData['product_replacement'],
-                'product_replacement_count' => $replacementData['count'],
-                'product_replacement_price' => $replacementData['product_replacement_price'],
-                'product_replacement_self_cost' => $replacementData['product_replacement_self_cost'],
-                'balance' => $replacementData['balance'],
-                'balance_self_cost' => $replacementData['balance_self_cost'],
+    public static function updateData(array $equalizationRemains, int $shift_id) {
+        self::deleteAll(['shift_id' => $shift_id]);
+
+        foreach ($equalizationRemains as $er) {
+            $equalizationRemain = new EqualizationRemains();
+            $equalizationRemain->setAttributes([
+                'shift_id' => $shift_id,
+                'product_id' => $er['product_id'],
+                'product_count' => $er['product_replacement_count'],
+                'product_price' => $er['product_price'],
+                'product_self_cost' => $er['product_self_cost'],
+                'product_replacement_id' => $er['product_replacement_id'],
+                'product_replacement_count' => $er['product_replacement_count'],
+                'product_replacement_price' => $er['product_replacement_price'],
+                'product_replacement_self_cost' => $er['product_replacement_self_cost'],
+                'balance' => $er['balance'],
+                'balance_self_cost' => $er['balance_self_cost'],
             ]);
-            $equalizationRemains->save();
-        }
 
-        return self::findAll(['shift_id' => $shiftTransfer->id]);
+            if ($equalizationRemain->validate())
+                $equalizationRemain->save();
+            else {var_dump($equalizationRemain->errors);die();}
+        }
     }
 
     /**
@@ -172,7 +125,7 @@ class EqualizationRemains extends \yii\db\ActiveRecord
      */
     public function getProduct()
     {
-        return $this->hasOne(Products1c::class, ['id' => 'product_id', 'tip' => 'products']);
+        return $this->hasOne(Products1c::class, ['id' => 'product_id']);
     }
 
     /**
@@ -180,7 +133,7 @@ class EqualizationRemains extends \yii\db\ActiveRecord
      */
     public function getProductReplacement()
     {
-        return $this->hasOne(Products1c::class, ['id' => 'product_replacement_id', 'tip' => 'products']);
+        return $this->hasOne(Products1c::class, ['id' => 'product_replacement_id']);
     }
 
     /**
index 317243acaeb23b3764cf74f24ca325191e856eac..7ef65d0020d8d74f8e0f7b24c4966688eecb9587 100644 (file)
@@ -1,7 +1,10 @@
 <?php
 
+use kartik\grid\GridView;
+use kartik\select2\Select2;
 use unclead\multipleinput\components\BaseColumn;
 use unclead\multipleinput\MultipleInput;
+use yii\data\ArrayDataProvider;
 use yii\helpers\Html;
 use yii_app\records\ShiftTransfer;
 use yii\widgets\ActiveForm;
@@ -10,75 +13,226 @@ use yii\widgets\ActiveForm;
 /* @var $storeNameById array */
 /* @var $admins array */
 /* @var $isAcceptance bool */
-
-
-$isAcceptance = false;
-$btn = '';
-if ($isAcceptance) {
-//if ($isAcceptance && Yii::$app->user->id === $controlerId) {
-    $btn = Html::submitButton('Принять', ['class' => 'btn btn-primary']);
-}
-//else if () {
-//   $btn = Html::submitButton('Сохранить', ['class' => 'btn btn-primary']);
-//}
-
-if ($isAcceptance) {
-    $buttonOptions = [
-        'class' => 'btn btn-success visible d-none',
-    ];
-} else {
-    $buttonOptions = [
-        'class' => 'btn btn-success visible',
-        'style' => 'display:block; width: 250px;',
-    ];
-}
+/* @var $products array */
 
 $form = \yii\widgets\ActiveForm::begin();
-echo $form->field($shiftTransfer, 'equalizationRemains')->widget(MultipleInput::class, [
-    'min' => 0,
-    'max' => 100,
-    'columns' => [
-        [
-            'name' => 'product_count',
-            'type' => BaseColumn::TYPE_TEXT_INPUT,
-            'options' => ['type' => 'number', 'step' => 0.01],
-            'title' => 'Заменяемый товар',
-        ],
-        [
-            'name' => 'product_price',
-            'type' => BaseColumn::TYPE_TEXT_INPUT,
-            'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
-            'title' => 'Цена товара',
-        ],
-        [
-            'title' => 'Замещающей товар',
-            'name' => 'product_replacement_id',
-            'enableError' => true,
-            'options' => ['class' => 'form-control'],
+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' => $products,
+                    'options' => [
+                        'placeholder' => 'Выберите товар',
+                        'class' => 'form-control',
+                    ],
+                    'pluginOptions' => [
+                        'allowClear' => true,
+                    ],
+                    'pluginEvents' => [
+                        'change' => new \yii\web\JsExpression('function() { setProductData.call(this); }'),
+                    ],
+                ],
+                'value' => function ($data) {
+                    return $data['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 ($data) {
+                    return $data['product_replacement_id'] ?? '';
+                },
+            ],
+            [
+                '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' => 0.01,],
+                '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'] ?? '';
+                },
+            ],
         ],
-        [
-            'name' => 'product_replacement_price',
-            'type' => BaseColumn::TYPE_TEXT_INPUT,
-            'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
-            'title' => 'Цена замещающего товара',
+        'addButtonPosition' => MultipleInput::POS_FOOTER,
+        'addButtonOptions' => [
+            'class' => 'btn btn-success visible',
         ],
-        [
-            'name' => 'product_replacement_count',
-            'type' => BaseColumn::TYPE_TEXT_INPUT,
-            'options' => ['type' => 'number', 'step' => 1],
-            'title' => 'Количество',
+        'removeButtonOptions' => [
+            'class' => 'btn btn-danger visible',
         ],
-        [
-            'name' => 'balance',
-            'title' => 'Баланс',
-            'type' => BaseColumn::TYPE_TEXT_INPUT,
-            'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
+        'iconSource' => 'fa',
+    ])->label('Таблица возможных замен');
+
+   echo $btn = Html::submitButton('Сохранить', [
+       'class' => 'btn btn-primary float-right',
+        'name' => 'action',
+        'value' => 'save'
+    ]);
+} else {
+    echo GridView::widget([
+        'dataProvider' => new ArrayDataProvider([
+            'allModels' => $shiftTransfer->equalizationRemains,  // Данные для таблицы
+        ]),
+        'columns' => [
+            [
+                'attribute' => 'product_replacement_id',
+                'label' => 'Товар замена',
+                'value' => function ($model) {
+                    return $model->productReplacement->name;
+                }
+            ],
+            [
+                'attribute' => 'product_price',
+                'label' => 'Цена товара розничная',
+                'format' => 'raw',
+            ],
+            [
+                'attribute' => 'product_self_cost',
+                'label' => 'Себестоимость товара',
+                'format' => 'raw',
+            ],
+            [
+                'attribute' => 'product_replacement_id',
+                'label' => 'Товар замена',
+                'value' => function ($model) {
+                    return $model->productReplacement->name;
+                }
+            ],
+            [
+                'attribute' => 'product_replacement_price',
+                'label' => 'Цена товара замены розничная',
+                'format' => 'raw',
+            ],
+            [
+                'attribute' => 'product_replacement_self_cost',
+                'label' => 'Себестоимость товара замены',
+                'format' => 'raw',
+            ],
+            [
+                'attribute' => 'product_replacement_count',
+                'label' => 'Количество товара',
+                'format' => 'raw',
+                'pageSummary' => true,
+            ],
+            [
+                'attribute' => 'balance',
+                'label' => 'Разница в сумме',
+                'format' => 'raw',
+                'pageSummary' => true,
+            ],
+            [
+                'attribute' => 'balance_self_cost',
+                'label' => 'Разница в сумме (Себестоимость)',
+                'format' => 'raw',
+                'pageSummary' => true,
+            ],
+            [
+                'attribute' => 'updated_at',
+                'label' => 'Дата обновления записи',
+                'format' => ['datetime', 'php:d.m.Y H:m:s'],
+            ],
+            [
+                'attribute' => 'updated_by',
+                'label' => 'Автор обновления записи',
+                'value' => function ($model) {
+                    return $model->updatedBy->name_full;
+                }
+            ],
         ],
-    ],
-    'addButtonPosition' => MultipleInput::POS_FOOTER,
-    'addButtonOptions' => $buttonOptions,
-    'iconSource' => 'fa',
-])->label('Таблица возможных замен');
+        'showPageSummary' => true,  // Показывать итоговые данные
+        'summary' => 'Показано {begin} - {end} из {totalCount} записей',  // Настройка вывода суммы
+        'footerRowOptions' => ['class' => 'footer-row'],  // Стили для итоговой строки
+        'rowOptions' => function ($model, $key, $index, $grid) {
+            // Дополнительные настройки для строк, если нужно
+            return [];
+        },
+    ]);
+
+    if (Yii::$app->user->id === $shiftTransfer->end_shift_admin_id && $shiftTransfer->status_id === ShiftTransfer::STATUS_ID_READY_TO_ACCEPT) {
+        echo $btn = Html::submitButton('Принять', [
+            'class' => 'btn btn-primary float-right',
+            'name' => 'action',
+            'value' => 'accept'
+        ]);
+    }
+}
 
 ActiveForm::end();
-echo $btn;
index 26f67c946f5ea76018341e6ccb8ba0a316afb4c8..584cca6651eeea7fac4b1da3f04822b28560793c 100644 (file)
@@ -72,9 +72,7 @@ use yii_app\records\Products1c;
         <div class="col-12">
             <?= $this->render('_replacement', [
                 'shiftTransfer' => $shiftTransfer,
-                'controlerId' => $shiftTransfer->start_shift_admin_id,
-                'status' => $shiftTransfer->status_id,
-                'isAcceptance' => $isAcceptance,
+                'products' => $products,
             ])
             ?>
         </div>
diff --git a/erp24/web/js/shift-transfer/equalization-remains.js b/erp24/web/js/shift-transfer/equalization-remains.js
new file mode 100644 (file)
index 0000000..f163af0
--- /dev/null
@@ -0,0 +1,144 @@
+let isRequestInProgress = false;
+let isRequestInProgressQuantity = false;
+let isRequestInProgressPrice = false;
+
+function getUrlParameter(name) {
+    return new URLSearchParams(window.location.search).get(name);
+}
+
+function setProductData() {
+    if (isRequestInProgress) return;  // Если запрос уже в процессе, выходим
+
+    isRequestInProgress = true;  // Устанавливаем флаг запроса
+    const $this = $(this);
+    const productGuid = $this.closest('tr').find('select').val();
+    const shiftTransferId = getUrlParameter('id');
+
+    if (!productGuid) return;  // Если productGuid не найден, выходим
+
+    $.ajax({
+        url: '/shift-transfer/get-product-data',
+        type: 'GET',
+        data: { productGuid, shiftTransferId },
+        success: function(response) {
+            let data;
+            try {
+                data = JSON.parse(response);
+            } catch (e) {
+                alert('Ошибка при обработке данных');
+                return;
+            }
+
+            if (!data.success) {
+                alert('Ошибка: ' + data.message);
+                return;
+            }
+
+            const index = $this.closest('tr').data('index');
+            $('#shifttransfer-equalizationremains-' + index + '-product_price').val(data.product_price);
+
+            const replacementSelect = $('#shifttransfer-equalizationremains-' + index + '-product_replacement_id');
+            replacementSelect.empty().append('<option value="">Выберите товар</option>');
+
+            Object.entries(data.product_replacement || {}).forEach(([id, name]) => {
+                replacementSelect.append(`<option value="${id}">${name}</option>`);
+            });
+
+            replacementSelect.css({ visibility: 'visible', height: 'auto', width: '100%' })
+                .trigger('change')
+                .val(replacementSelect.val() || replacementSelect.find('option').first().val())
+                .trigger('change');
+
+            $('#shifttransfer-equalizationremains-' + index + '-product_self_cost').val(data.product_self_cost || '');
+        },
+        error: function() {
+            alert('Ошибка запроса!');
+        },
+        complete: function() {
+            isRequestInProgress = false;  // Снимаем флаг, когда запрос завершен
+        }
+    });
+}
+
+function setReplacementPriceData() {
+    if (isRequestInProgressPrice) return;  // Если запрос уже в процессе, выходим
+
+    isRequestInProgressPrice = true;  // Устанавливаем флаг запроса
+    const $this = $(this);
+    const productGuid = $this.val();
+    const shiftTransferId = getUrlParameter('id');
+
+    if (!productGuid) return;  // Если productGuid не найден, выходим
+
+    $.ajax({
+        url: '/shift-transfer/get-product-replacement-price',
+        type: 'GET',
+        data: { productGuid, shiftTransferId },
+        success: function(response) {
+            let data;
+            try {
+                data = JSON.parse(response);
+            } catch (e) {
+                alert('Ошибка при обработке данных');
+                return;
+            }
+
+            if (!data.success) {
+                alert('Ошибка: ' + data.message);
+                return;
+            }
+
+            const index = $this.closest('tr').data('index');
+            const priceInput = $('#shifttransfer-equalizationremains-' + index + '-product_replacement_price');
+            const replacementSelfCostInput = $('#shifttransfer-equalizationremains-' + index + '-product_replacement_self_cost');
+
+            if (priceInput.length) {
+                priceInput.val(data.product_price).trigger('change');
+            }
+
+            if (replacementSelfCostInput.length) {
+                replacementSelfCostInput.val(data.product_replacement_self_cost || '').trigger('change');
+            }
+        },
+        error: function() {
+            alert('Ошибка запроса!');
+        },
+        complete: function() {
+            isRequestInProgressPrice = false;  // Снимаем флаг, когда запрос завершен
+        }
+    });
+}
+
+$(document).on('input', '.list-cell__product_replacement_count input', function() {
+    const $this = $(this);
+    const id = $this.attr('id');
+    const indexMatch = id.match(/shifttransfer-equalizationremains-(\d+)-/);
+
+    if (!indexMatch) {
+        alert('Ошибка: Невозможно извлечь индекс из ID');
+        return;
+    }
+
+    const index = indexMatch[1];
+    const quantity = parseFloat($this.val());
+    if (isNaN(quantity) || quantity < 0) {
+        alert('Введите корректное количество!');
+        return;
+    }
+
+    const productPrice = parseFloat($this.closest('tr').find(`.field-shifttransfer-equalizationremains-${index}-product_price input`).val());
+    const productSelfCost = parseFloat($this.closest('tr').find(`.field-shifttransfer-equalizationremains-${index}-product_self_cost input`).val());
+    const productReplacementPrice = parseFloat($this.closest('tr').find(`.field-shifttransfer-equalizationremains-${index}-product_replacement_price input`).val());
+    const productReplacementSelfCost = parseFloat($this.closest('tr').find(`.field-shifttransfer-equalizationremains-${index}-product_replacement_self_cost input`).val());
+
+    if (isNaN(productPrice) || isNaN(productSelfCost) || isNaN(productReplacementPrice) || isNaN(productReplacementSelfCost)) {
+        alert('Введите корректные значения для цены или себестоимости!');
+        return;
+    }
+
+    const balance = (productPrice - productReplacementPrice) * quantity;
+    const balanceSelfCost = (productSelfCost - productReplacementSelfCost) * quantity;
+
+    $('#shifttransfer-equalizationremains-' + index + '-balance').val(balance.toFixed(2)).trigger('change');
+    $('#shifttransfer-equalizationremains-' + index + '-balance_self_cost').val(balanceSelfCost.toFixed(2)).trigger('change');
+});