From d050484467a318ccbeb32ff34b18a3e8f478ada3 Mon Sep 17 00:00:00 2001 From: marina Date: Fri, 29 Nov 2024 18:48:36 +0300 Subject: [PATCH] =?utf8?q?ERP-243=20=D0=94=D0=B5=D0=B9=D1=81=D1=82=D0=B2?= =?utf8?q?=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD?= =?utf8?q?=D0=B5=20(II=20=D1=8D=D1=82=D0=B0=D0=BF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/controllers/ShiftTransferController.php | 106 ++++++- ...5457_create_equalization_remains_table.php | 4 +- erp24/records/EqualizationRemains.php | 105 ++----- erp24/views/shift-transfer/_replacement.php | 282 ++++++++++++++---- erp24/views/shift-transfer/view.php | 4 +- .../js/shift-transfer/equalization-remains.js | 144 +++++++++ 6 files changed, 485 insertions(+), 160 deletions(-) create mode 100644 erp24/web/js/shift-transfer/equalization-remains.js diff --git a/erp24/controllers/ShiftTransferController.php b/erp24/controllers/ShiftTransferController.php index 7f30bc6a..47d9fa5f 100644 --- a/erp24/controllers/ShiftTransferController.php +++ b/erp24/controllers/ShiftTransferController.php @@ -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); + } } diff --git a/erp24/migrations/m241127_065457_create_equalization_remains_table.php b/erp24/migrations/m241127_065457_create_equalization_remains_table.php index 7accc9e6..b49e3dd7 100644 --- a/erp24/migrations/m241127_065457_create_equalization_remains_table.php +++ b/erp24/migrations/m241127_065457_create_equalization_remains_table.php @@ -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('Дата создания записи'), diff --git a/erp24/records/EqualizationRemains.php b/erp24/records/EqualizationRemains.php index cc933c3d..111755e5 100644 --- a/erp24/records/EqualizationRemains.php +++ b/erp24/records/EqualizationRemains.php @@ -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']); } /** diff --git a/erp24/views/shift-transfer/_replacement.php b/erp24/views/shift-transfer/_replacement.php index 317243ac..7ef65d00 100644 --- a/erp24/views/shift-transfer/_replacement.php +++ b/erp24/views/shift-transfer/_replacement.php @@ -1,7 +1,10 @@ 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; diff --git a/erp24/views/shift-transfer/view.php b/erp24/views/shift-transfer/view.php index 26f67c94..584cca66 100644 --- a/erp24/views/shift-transfer/view.php +++ b/erp24/views/shift-transfer/view.php @@ -72,9 +72,7 @@ use yii_app\records\Products1c;
render('_replacement', [ 'shiftTransfer' => $shiftTransfer, - 'controlerId' => $shiftTransfer->start_shift_admin_id, - 'status' => $shiftTransfer->status_id, - 'isAcceptance' => $isAcceptance, + 'products' => $products, ]) ?>
diff --git a/erp24/web/js/shift-transfer/equalization-remains.js b/erp24/web/js/shift-transfer/equalization-remains.js new file mode 100644 index 00000000..f163af03 --- /dev/null +++ b/erp24/web/js/shift-transfer/equalization-remains.js @@ -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(''); + + Object.entries(data.product_replacement || {}).forEach(([id, name]) => { + replacementSelect.append(``); + }); + + 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'); +}); -- 2.39.5