->andWhere(['guid' => $m->product_guid])
->select('guid_replacement')
->scalar();
+ if (!$plus->andWhere(['product_guid' => $replacement])->exists()) {
+ continue;
+ }
+
$p = $plus->andWhere(['product_guid' => $replacement])->one();
+ $model = new EqualizationRemains();
+ $model->setAttributes([
+ 'shift_id' => $shiftTransfer->id,
+ 'product_id' => $m->product_guid,
+ 'product_count' => min ($m->fact_and_1c_diff,$p->fact_and_1c_diff),
+ 'product_price' => $m->retail_price,
+ 'product_self_cost' => $m->self_cost,
+ 'product_replacement_id' => $p->product_guid,
+ 'product_replacement_count' => min ($m->fact_and_1c_diff,$p->fact_and_1c_diff),
+ 'product_replacement_price' => $p->retail_price,
+ 'product_replacement_self_cost' => $p->self_cost,
+ 'balance' => $m->fact_and_1c_diff * ($p->retail_price - $m->retail_price),
+ 'balance_self_cost' => $m->fact_and_1c_diff * ($p->self_cost - $m->self_cost)
+ ]);
+ if ($model->validate()) {
+ $model->save();
+ } elseif ($model->getErrors()) {
+ var_dump($model->errors);
+ die();
+ }
+ }
+
+ $plus = ShiftRemains::find()
+ ->andWhere(['shift_transfer_id' => $shiftTransfer->id])
+ ->andWhere(['!=', 'fact_and_1c_diff', 0])
+ ->andWhere(['>', 'fact_and_1c_diff', 0])
+ ->all();
+ foreach ($plus as $p) {
+ if (EqualizationRemains::find()
+ ->andWhere(['shift_id' => $shiftTransfer->id])
+ ->andWhere(['product_replacement_id' => $p->product_guid])
+ ->exists()) {
+ continue;
+ }
+
+ $replacement = Product1cReplacement::find()
+ ->andWhere(['guid' => $p->product_guid])
+ ->select('guid_replacement')
+ ->scalar();
$model = new EqualizationRemains();
$model->setAttributes([
'shift_id' => $shiftTransfer->id,
'product_id' => $m->product_guid,
- 'product_count' => $m->fact_and_1c_diff,
+ 'product_count' => min ($m->fact_and_1c_diff,$p->fact_and_1c_diff),
'product_price' => $m->retail_price,
'product_self_cost' => $m->self_cost,
'product_replacement_id' => $p->product_guid,
- 'product_replacement_count' => $m->fact_and_1c_diff,
+ 'product_replacement_count' => min ($m->fact_and_1c_diff,$p->fact_and_1c_diff),
'product_replacement_price' => $p->retail_price,
'product_replacement_self_cost' => $p->self_cost,
'balance' => $m->fact_and_1c_diff * ($p->retail_price - $m->retail_price),
$this->registerJsFile('/js/shift-transfer/replacement.js', ['position' => \yii\web\View::POS_END]);
+$totalBalance = array_sum(array_column($shiftTransfer->equalizationRemains, 'balance'));
+
$form = \yii\widgets\ActiveForm::begin();
if (in_array($shiftTransfer->status_id, [ShiftTransfer::STATUS_ID_TRANSFER_ACTIONS, ShiftTransfer::STATUS_ID_INPUT_FACT_REMAINS])
&& Yii::$app->user->id === $shiftTransfer->end_shift_admin_id) {
-// echo $form->field($shiftTransfer, 'equalizationRemains')->widget(MultipleInput::class, [
-// 'min' => 0,
-// 'max' => 100,
-// 'columns' => [
-// [
-// 'name' => 'product_id',
-// 'title' => 'Заменяемый товар',
-// 'type' => Select2::class,
-// 'options' => [
-// 'data' => array_merge(
-// ['text' => 'Выберите товар'],
-// $products
-// ),
-// 'pluginOptions' => [
-// 'allowClear' => true,
-// ],
-// 'pluginEvents' => [
-// 'change' => new \yii\web\JsExpression('function() { setProductData.call(this); }'),
-// ],
-// ],
-// 'value' => function ($model) {
-// return $model->product->id ?? '';
-// },
-// ],
-// [
-// 'name' => 'product_price',
-// 'type' => BaseColumn::TYPE_TEXT_INPUT,
-// 'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
-// 'title' => 'Цена товара',
-// 'value' => function ($data) {
-// return $data['product_price'] ?? '';
-// },
-// ],
-// [
-// 'name' => 'product_self_cost',
-// 'type' => BaseColumn::TYPE_TEXT_INPUT,
-// 'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
-// 'title' => 'Себестоимость товара',
-// 'value' => function ($data) {
-// return $data['product_self_cost'] ?? '';
-// },
-// ],
-// [
-// 'name' => 'product_replacement_id',
-// 'title' => 'Замещающий товар',
-// 'type' => Select2::class,
-// 'options' => [
-// 'data' => [],
-// 'options' => [
-// 'placeholder' => 'Выберите товар',
-// 'class' => 'form-control',
-// ],
-// 'pluginOptions' => [
-// 'allowClear' => true,
-// ],
-// 'pluginEvents' => [
-// 'select2:select' => new \yii\web\JsExpression('function() {
-// setReplacementPriceData.call(this);
-// }'),
-// ],
-// ],
-// 'value' => function ($model) {
-// return $model->productReplacement->name ?? '';
-// },
-// ],
-// [
-// 'name' => 'product_replacement_price',
-// 'type' => BaseColumn::TYPE_TEXT_INPUT,
-// 'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
-// 'title' => 'Цена замещающего товара',
-// 'value' => function ($data) {
-// return $data['product_replacement_price'] ?? '';
-// },
-// ],
-// [
-// 'name' => 'product_replacement_self_cost',
-// 'type' => BaseColumn::TYPE_TEXT_INPUT,
-// 'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
-// 'title' => 'Себестоимость замещаемого товара',
-// 'value' => function ($data) {
-// return $data['product_replacement_self_cost'] ?? '';
-// },
-// ],
-// [
-// 'name' => 'product_replacement_count',
-// 'type' => BaseColumn::TYPE_TEXT_INPUT,
-// 'options' => ['type' => 'number', 'step' => 1,],
-// 'title' => 'Количество',
-// 'value' => function ($data) {
-// return $data['product_replacement_count'] ?? '';
-// }
-// ],
-// [
-// 'name' => 'balance',
-// 'title' => 'Баланс',
-// 'type' => BaseColumn::TYPE_TEXT_INPUT,
-// 'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
-// 'value' => function ($data) {
-// return $data['balance'] ?? '';
-// },
-// ],
-// [
-// 'name' => 'balance_self_cost',
-// 'title' => 'Разница в сумме (Себестоиомость)',
-// 'type' => BaseColumn::TYPE_TEXT_INPUT,
-// 'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
-// 'value' => function ($data) {
-// return $data['balance_self_cost'] ?? '';
-// },
-// ],
-// ],
-// 'addButtonPosition' => MultipleInput::POS_FOOTER,
-// 'addButtonOptions' => [
-// 'class' => 'btn btn-success visible',
-// ],
-// 'removeButtonOptions' => [
-// 'class' => 'btn btn-danger visible',
-// ],
-// 'iconSource' => 'fa',
-// ])->label('Таблица возможных замен');
+ echo $form->field($shiftTransfer, 'equalizationRemains')->widget(MultipleInput::class, [
+ 'min' => 0,
+ 'max' => 100,
+ 'columns' => [
+ [
+ 'name' => 'product_id',
+ 'title' => 'Заменяемый товар',
+ 'type' => Select2::class,
+ 'options' => [
+ 'data' => array_merge(
+ ['text' => 'Выберите товар'],
+ $products
+ ),
+ 'pluginOptions' => [
+ 'allowClear' => true,
+ ],
+ 'pluginEvents' => [
+ 'change' => new \yii\web\JsExpression('function() { setProductData.call(this); }'),
+ ],
+ ],
+ 'value' => function ($model) {
+ return $model->product->id ?? '';
+ },
+ ],
+ [
+ 'name' => 'product_price',
+ 'type' => BaseColumn::TYPE_TEXT_INPUT,
+ 'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
+ 'title' => 'Цена товара',
+ 'value' => function ($data) {
+ return $data['product_price'] ?? '';
+ },
+ ],
+ [
+ 'name' => 'product_self_cost',
+ 'type' => BaseColumn::TYPE_TEXT_INPUT,
+ 'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
+ 'title' => 'Себестоимость товара',
+ 'value' => function ($data) {
+ return $data['product_self_cost'] ?? '';
+ },
+ ],
+ [
+ 'name' => 'product_replacement_id',
+ 'title' => 'Замещающий товар',
+ 'type' => Select2::class,
+ 'options' => [
+ 'data' => [],
+ 'options' => [
+ 'placeholder' => 'Выберите товар',
+ 'class' => 'form-control',
+ ],
+ 'pluginOptions' => [
+ 'allowClear' => true,
+ ],
+ 'pluginEvents' => [
+ 'select2:select' => new \yii\web\JsExpression('function() {
+ setReplacementPriceData.call(this);
+ }'),
+ ],
+ ],
+ 'value' => function ($model) {
+ return $model->productReplacement->name ?? '';
+ },
+ ],
+ [
+ 'name' => 'product_replacement_price',
+ 'type' => BaseColumn::TYPE_TEXT_INPUT,
+ 'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
+ 'title' => 'Цена замещающего товара',
+ 'value' => function ($data) {
+ return $data['product_replacement_price'] ?? '';
+ },
+ ],
+ [
+ 'name' => 'product_replacement_self_cost',
+ 'type' => BaseColumn::TYPE_TEXT_INPUT,
+ 'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
+ 'title' => 'Себестоимость замещаемого товара',
+ 'value' => function ($data) {
+ return $data['product_replacement_self_cost'] ?? '';
+ },
+ ],
+ [
+ 'name' => 'product_replacement_count',
+ 'type' => BaseColumn::TYPE_TEXT_INPUT,
+ 'options' => ['type' => 'number', 'step' => 1,],
+ 'title' => 'Количество',
+ 'value' => function ($data) {
+ return $data['product_replacement_count'] ?? '';
+ }
+ ],
+ [
+ 'name' => 'balance',
+ 'title' => 'Баланс',
+ 'type' => BaseColumn::TYPE_TEXT_INPUT,
+ 'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
+ 'value' => function ($data) {
+ return $data['balance'] ?? '';
+ },
+ ],
+ [
+ 'name' => 'balance_self_cost',
+ 'title' => 'Разница в сумме (Себестоиомость)',
+ 'type' => BaseColumn::TYPE_TEXT_INPUT,
+ 'options' => ['type' => 'number', 'step' => 0.01, 'readonly' => true,],
+ 'value' => function ($data) {
+ return $data['balance_self_cost'] ?? '';
+ },
+ ],
+ ],
+ 'addButtonPosition' => MultipleInput::POS_FOOTER,
+ 'addButtonOptions' => [
+ 'class' => 'btn btn-success visible',
+ ],
+ 'removeButtonOptions' => [
+ 'class' => 'btn btn-danger visible',
+ ],
+ 'iconSource' => 'fa',
+ ])->label('Таблица возможных замен');
echo $btn = Html::submitButton('Сохранить', [
'class' => 'btn btn-primary float-right',
'dataProvider' => new ArrayDataProvider([
'allModels' => $shiftTransfer->equalizationRemains,
]),
+ 'showFooter' => true,
'columns' => [
[
'attribute' => 'product_id',
'label' => 'Количество товара',
'format' => 'raw',
'pageSummary' => true,
+ 'footer' => Html::tag('b', $totalBalance < 0 ? 'Недосдача: ' : 'Избыток: ' ) // Выводим итог в футере для данного столбца
],
[
'attribute' => 'balance',
'label' => 'Разница в сумме',
'format' => 'raw',
'pageSummary' => true,
+ 'footer' => Html::tag('b', number_format($totalBalance, 2, '.', ' ')), // Показываем итог по балансу
],
[
'attribute' => 'balance_self_cost',
],
],
'showPageSummary' => true,
- 'layout' => '{items}',
+ 'layout' => '{items}{summary}',
]);
if (