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;
class ShiftTransferController extends Controller
{
- public function actionIndex() {
+ public function actionIndex()
+ {
$shiftTransfers = ShiftTransfer::find()->all();
$storeNameById = TaskService::getEntitiesByAlias('store');
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) {
return $admins;
}
- public function actionCreate() {
+ public function actionCreate()
+ {
$shiftTransfer = new ShiftTransfer;
$isCreate = true;
'admins'));
}
- public function actionUpdate($id = null) {
+ public function actionUpdate($id = null)
+ {
$shiftTransfer = ShiftTransfer::findOne($id);
if (!$shiftTransfer) {
$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;
'admins'));
}
- public function actionGetProductsByGroupLabel() {
+ public function actionGetProductsByGroupLabel()
+ {
Yii::$app->response->format = Response::FORMAT_JSON;
$productsClass = ProductsClass::find()->select('category_id')
->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');
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);
$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);
+ }
}
'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('Дата создания записи'),
* @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 Дата создания записи
{
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],
];
'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' => 'Дата создания записи',
];
}
- 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();}
+ }
}
/**
*/
public function getProduct()
{
- return $this->hasOne(Products1c::class, ['id' => 'product_id', 'tip' => 'products']);
+ return $this->hasOne(Products1c::class, ['id' => 'product_id']);
}
/**
*/
public function getProductReplacement()
{
- return $this->hasOne(Products1c::class, ['id' => 'product_replacement_id', 'tip' => 'products']);
+ return $this->hasOne(Products1c::class, ['id' => 'product_replacement_id']);
}
/**
<?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;
/* @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;
<div class="col-12">
<?= $this->render('_replacement', [
'shiftTransfer' => $shiftTransfer,
- 'controlerId' => $shiftTransfer->start_shift_admin_id,
- 'status' => $shiftTransfer->status_id,
- 'isAcceptance' => $isAcceptance,
+ 'products' => $products,
])
?>
</div>
--- /dev/null
+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');
+});