use yii_app\records\ShiftRemains;
use yii_app\records\ShiftTransfer;
use yii_app\records\StoreBalance;
+use yii_app\records\WaybillIncoming;
+use yii_app\records\WaybillWriteOffs;
use yii_app\services\TaskService;
class ShiftTransferController extends Controller
StoreBalance::setData($model);
} elseif ($action === 'save') {
$model->updateAttributes(['status_id' => ShiftTransfer::STATUS_ID_READY_TO_ACCEPT]);
- EqualizationRemains::updateData(Yii::$app->request->post()['ShiftTransfer']['equalizationRemains'], $id);
+ WaybillWriteOffs::updateAll(['active' => WaybillWriteOffs::INACTIVE, 'shift_transfer_id' => $model->id]);
} elseif ($action == 'recalculate') {
EqualizationRemains::setData($model);
Yii::$app->session->setFlash('success', 'Таблица замен успешно перерасчитана');
- } elseif ($action === 'rejection' || $action === 'back') {
+ } elseif ($action === 'rejection') {
$model->updateAttributes(['status_id' => ShiftTransfer::STATUS_ID_TRANSFER_ACTIONS]);
- //удаление данных из табличек с плюсом и минусом
+ WaybillWriteOffs::deleteAll(['shift_transfer_id' => $model->id]);
+ WaybillIncoming::deleteAll(['shift_transfer_id' => $model->id]);
} elseif ($action === 'resume') {
- //формирование табличек с минусом и плюсом
+ $model->updateAttributes(['status_id' => ShiftTransfer::STATUS_OF_THE_FORMATION_OF_SURPLUSES_AND_SHORTAGES]);
+ EqualizationRemains::updateData(Yii::$app->request->post()['ShiftTransfer']['equalizationRemains'], $id);
+ WaybillIncoming::setData($model);
+ WaybillWriteOffs::setData($model);
}
$this->redirect(Yii::$app->request->referrer);
'type' => 'Тип записи',
];
}
+
+ public function getProduct()
+ {
+ return $this->hasOne(Products1c::class, ['id' => 'product_guid']);
+ }
+
}
self::STATUS_ID_TRANSFER_ACTIONS => 'Действия по замене',
self::STATUS_ID_READY_TO_ACCEPT => 'Готова к принятию',
self::STATUS_ID_ACCEPTED => 'Принято',
- self::STATUS_OF_THE_FORMATION_OF_SURPLUSES_AND_SHORTAGES => 'Cтатус формирования излишков и недостачи',
+ self::STATUS_OF_THE_FORMATION_OF_SURPLUSES_AND_SHORTAGES => 'Формирования излишков и недостачи',
];
}
namespace yii_app\records;
use Yii;
+use yii\behaviors\BlameableBehavior;
+use yii\behaviors\TimestampBehavior;
+use yii\db\Expression;
+use yii_app\helpers\DataHelper;
/**
* This is the model class for table "waybill_incoming".
*/
class WaybillIncoming extends \yii\db\ActiveRecord
{
+ public const ACTIVE = 1;
+ public const INACTIVE = 2;
+ public const NEW = 1;
/**
* {@inheritdoc}
*/
public function rules()
{
return [
- [['guid', 'created_admin_id', 'store_id', 'store_guid', 'number', 'date', 'quantity', 'summ', 'created_at'], 'required'],
- [['shift_transfer_id', 'status', 'created_admin_id', 'updated_admin_id', 'store_id', 'active', 'deleted_admin_id'], 'default', 'value' => null],
+ [['guid', 'store_id', 'store_guid', 'date', 'quantity', 'summ'], 'required'],
+ [['shift_transfer_id', 'status', 'created_admin_id', 'updated_admin_id', 'store_id', 'number', 'active', 'deleted_admin_id'], 'default', 'value' => null],
[['shift_transfer_id', 'status', 'created_admin_id', 'updated_admin_id', 'store_id', 'active', 'deleted_admin_id'], 'integer'],
[['date', 'created_at', 'updated_at', 'deleted_at', 'send_at'], 'safe'],
[['comment'], 'string'],
];
}
+
+ public function behaviors()
+ {
+ return [
+ [
+ 'class' => TimestampBehavior::class,
+ 'createdAtAttribute' => 'created_at',
+ 'updatedAtAttribute' => 'updated_at',
+ 'value' => new Expression('NOW()'),
+ ],
+ [
+ 'class' => BlameableBehavior::class,
+ 'createdByAttribute' => 'created_admin_id',
+ 'updatedByAttribute' => 'updated_admin_id',
+ ],
+ ];
+ }
+
+
/**
* {@inheritdoc}
*/
];
}
- public function getShiftTransfer() {
+ public function getShiftTransfer()
+ {
return $this->hasOne(ShiftTransfer::class, ['id' => 'shift_transfer_id']);
}
+
+ public static function setData($shiftTransfer)
+ {
+ $model = new self();
+
+ $model->setAttributes([
+ 'guid' => DataHelper::createGuidMy(),
+ 'shift_transfer_id' => $shiftTransfer->id,
+ 'status' => self::NEW,
+ 'store_id' => array_flip(array_map('strval', CityStore::getAllActiveGuidId()))[$shiftTransfer->store_guid],
+ 'store_guid' => $shiftTransfer->store_guid,
+ 'date' => $shiftTransfer->date,
+ 'comment' => $shiftTransfer->comment,
+ 'quantity' => 0,
+ 'summ' => 0,
+ 'summ_self_cost' => 0,
+ 'active' => self::INACTIVE,
+ ]);
+
+ if ($model->validate()) {
+ $model->save();
+
+ $model->updateAttributes([
+ 'number' => 'ЕРП_ПС_' . date("Y-m-d_H-i") . '_' . $model->id
+ ]);
+
+ WaybillIncomingProducts::setData($model, $shiftTransfer);
+
+ $summaries = WaybillIncomingProducts::find()
+ ->andWhere(['waybill_incoming_id' => $model->id])
+ ->select([
+ 'total_product_count' => 'sum(product_count)',
+ 'total_summ' => 'sum(summ)',
+ 'total_summ_self_cost' => 'sum(summ_self_cost)'
+ ])
+ ->asArray()
+ ->one();
+
+ if ($summaries) {
+ $model->updateAttributes([
+ 'quantity' => $summaries['total_product_count'],
+ 'summ' => $summaries['total_summ'],
+ 'summ_self_cost' => $summaries['total_summ_self_cost']
+ ]);
+ }
+ } else {
+ var_dump($model->getErrors());
+ }
+ }
}
namespace yii_app\records;
-use Yii;
+use yii\behaviors\TimestampBehavior;
+use yii\db\Expression;
/**
* This is the model class for table "waybill_incoming_products".
return 'waybill_incoming_products';
}
+ public function behaviors()
+ {
+ return [
+ [
+ 'class' => TimestampBehavior::class,
+ 'createdAtAttribute' => 'created_at',
+ 'updatedAtAttribute' => 'updated_at',
+ 'value' => new Expression('NOW()'),
+ ]
+ ];
+ }
+
/**
* {@inheritdoc}
*/
public function rules()
{
return [
- [['waybill_incoming_id', 'name', 'summ', 'created_at'], 'required'],
+ [['waybill_incoming_id', 'name', 'summ'], 'required'],
[['waybill_incoming_id'], 'default', 'value' => null],
[['waybill_incoming_id'], 'integer'],
[['product_count', 'product_price', 'product_self_cost', 'summ', 'summ_self_cost'], 'number'],
];
}
+ public static function setData($waybillIncoming, $shiftTransfer)
+ {
+ $items = ShiftRemains::find()
+ ->andWhere(['shift_transfer_id' => $shiftTransfer->id])
+ ->andWhere(['>', 'fact_and_1c_diff', 0])
+ ->all();
+
+ foreach ($items as $item) {
+ $itemCount = abs($item->fact_and_1c_diff);
+ $er = EqualizationRemains::findOne([
+ 'shift_transfer_id' => $shiftTransfer->id,
+ 'product_id' => $item->product_guid
+ ]);
+
+ if ($er) {
+ if ($er->product_count == $itemCount) {
+ return;
+ }
+
+ $count = $er->product_count < $itemCount
+ ? $itemCount - $er->product_count
+ : $er->product_count;
+ } else {
+ $count = $itemCount;
+ }
+
+ $model = new self();
+ $model->setAttributes([
+ 'waybill_incoming_id' => $waybillIncoming->id,
+ 'name' => $item->product->name,
+ 'product_id' => $item->product_guid,
+ 'product_count' => abs($count),
+ 'product_price' => $item->retail_price,
+ 'product_self_cost' => $item->self_cost,
+ 'summ' => $count * $item->retail_price,
+ 'summ_self_cost' => $count * $item->self_cost,
+ ]);
+
+ if ($model->validate()) {
+ $model->save();
+ } else {
+ var_dump($model->getErrors());die();
+ }
+ }
+ }
+
/**
* {@inheritdoc}
*/
namespace yii_app\records;
use Yii;
+use yii\behaviors\BlameableBehavior;
+use yii\behaviors\TimestampBehavior;
+use yii\db\Expression;
+use yii_app\helpers\DataHelper;
/**
* This is the model class for table "waybill_write_offs".
*/
class WaybillWriteOffs extends \yii\db\ActiveRecord
{
+ public const ACTIVE = 1;
+ public const INACTIVE = 2;
+ public const NEW = 1;
+
/**
* {@inheritdoc}
*/
public function rules()
{
return [
- [['guid', 'created_admin_id', 'store_id', 'store_guid', 'number', 'date', 'quantity', 'summ', 'created_at'], 'required'],
- [['shift_transfer_id', 'status', 'created_admin_id', 'updated_admin_id', 'confirm_admin_id', 'store_id', 'active', 'deleted_admin_id'], 'default', 'value' => null],
- [['shift_transfer_id', 'status', 'created_admin_id', 'updated_admin_id', 'confirm_admin_id', 'store_id', 'active', 'deleted_admin_id'], 'integer'],
+ [['guid', 'store_id', 'store_guid', 'date', 'quantity', 'summ'], 'required'],
+ [['shift_transfer_id', 'status', 'created_admin_id', 'updated_admin_id', 'store_id', 'active', 'deleted_admin_id'], 'default', 'value' => null],
+ [['shift_transfer_id', 'status', 'created_admin_id', 'updated_admin_id', 'store_id', 'active', 'deleted_admin_id'], 'integer'],
[['date', 'created_at', 'updated_at', 'deleted_at', 'send_at'], 'safe'],
[['comment'], 'string'],
[['quantity', 'summ', 'summ_self_cost'], 'number'],
- [['guid', 'store_guid', 'number', 'number_1c', 'confirm_at'], 'string', 'max' => 100],
+ [['guid', 'store_guid', 'number', 'number_1c'], 'string', 'max' => 100],
[['guid'], 'unique'],
[['shift_transfer_id'], 'exist', 'skipOnError' => true, 'targetClass' => ShiftTransfer::class, 'targetAttribute' => ['shift_transfer_id' => 'id']],
];
}
+ public function behaviors()
+ {
+ return [
+ [
+ 'class' => TimestampBehavior::class,
+ 'createdAtAttribute' => 'created_at',
+ 'updatedAtAttribute' => 'updated_at',
+ 'value' => new Expression('NOW()'),
+ ],
+ [
+ 'class' => BlameableBehavior::class,
+ 'createdByAttribute' => 'created_admin_id',
+ 'updatedByAttribute' => 'updated_admin_id',
+ ],
+ ];
+ }
+
/**
* {@inheritdoc}
*/
'status' => 'Статус документа',
'created_admin_id' => 'Создан пользователем',
'updated_admin_id' => 'Изменён пользователем',
- 'confirm_admin_id' => 'Подтвержден пользователем',
'store_id' => 'id магазина в ERP',
'store_guid' => 'GUID магазина из 1с',
'number' => 'Название документа',
'created_at' => 'Дата создания',
'updated_at' => 'Дата обновления',
'deleted_at' => 'Дата удаление',
- 'confirm_at' => 'Дата подтверждения',
'send_at' => 'Дата отправления в 1с',
'active' => 'Активность',
'deleted_admin_id' => 'Удален пользователем',
];
}
+ public static function setData($shiftTransfer)
+ {
+ $model = new self();
+
+ $model->setAttributes([
+ 'guid' => DataHelper::createGuidMy(),
+ 'shift_transfer_id' => $shiftTransfer->id,
+ 'status' => self::NEW,
+ 'store_id' => array_flip(array_map('strval', CityStore::getAllActiveGuidId()))[$shiftTransfer->store_guid],
+ 'store_guid' => $shiftTransfer->store_guid,
+ 'date' => $shiftTransfer->date,
+ 'comment' => $shiftTransfer->comment,
+ 'quantity' => 0,
+ 'summ' => 0,
+ 'summ_self_cost' => 0,
+ 'active' => self::INACTIVE,
+ ]);
+
+ if ($model->validate()) {
+ $model->save();
+
+ $model->updateAttributes([
+ 'number' => 'ЕРП_ПС_' . date("Y-m-d_H-i") . '_' . $model->id
+ ]);
+
+ WaybillWriteOffsProducts::setData($model, $shiftTransfer);
+
+ $summaries = WaybillWriteOffsProducts::find()
+ ->andWhere(['waybill_write_offs_id' => $model->id])
+ ->select([
+ 'total_product_count' => 'sum(product_count)',
+ 'total_summ' => 'sum(summ)',
+ 'total_summ_self_cost' => 'sum(summ_self_cost)'
+ ])
+ ->asArray()
+ ->one();
+
+ if ($summaries) {
+ $model->updateAttributes([
+ 'quantity' => $summaries['total_product_count'],
+ 'summ' => $summaries['total_summ'],
+ 'summ_self_cost' => $summaries['total_summ_self_cost']
+ ]);
+ }
+ } else {
+ var_dump($model->getErrors());
+ }
+ }
+
/**
* Gets query for [[ShiftTransfer]].
*
namespace yii_app\records;
use Yii;
+use yii\behaviors\TimestampBehavior;
+use yii\db\Expression;
/**
* This is the model class for table "waybill_write_offs_products".
return 'waybill_write_offs_products';
}
+ public function behaviors()
+ {
+ return [
+ [
+ 'class' => TimestampBehavior::class,
+ 'createdAtAttribute' => 'created_at',
+ 'updatedAtAttribute' => 'updated_at',
+ 'value' => new Expression('NOW()'),
+ ]
+ ];
+ }
+
+
/**
* {@inheritdoc}
*/
public function rules()
{
return [
- [['waybill_write_offs_id', 'name', 'summ', 'created_at'], 'required'],
+ [['waybill_write_offs_id', 'name', 'summ'], 'required'],
[['waybill_write_offs_id'], 'default', 'value' => null],
[['waybill_write_offs_id'], 'integer'],
[['product_count', 'product_price', 'product_self_cost', 'summ', 'summ_self_cost'], 'number'],
];
}
+ public static function setData($waybillWriteOffs, $shiftTransfer)
+ {
+ $items = ShiftRemains::find()
+ ->andWhere(['shift_transfer_id' => $shiftTransfer->id])
+ ->andWhere(['<', 'fact_and_1c_diff', 0])
+ ->all();
+
+ foreach ($items as $item) {
+ $itemCount = abs($item->fact_and_1c_diff);
+ $er = EqualizationRemains::findOne([
+ 'shift_transfer_id' => $shiftTransfer->id,
+ 'product_id' => $item->product_guid
+ ]);
+
+ if ($er) {
+ if ($er->product_count == $itemCount) {
+ return;
+ }
+
+ $count = $er->product_count < $itemCount
+ ? $itemCount - $er->product_count
+ : $er->product_count;
+ } else {
+ $count = $itemCount;
+ }
+
+ $model = new self();
+ $model->setAttributes([
+ 'waybill_write_offs_id' => $waybillWriteOffs->id,
+ 'name' => $item->product->name,
+ 'product_id' => $item->product_guid,
+ 'product_count' => abs($count),
+ 'product_price' => $item->retail_price,
+ 'product_self_cost' => $item->self_cost,
+ 'summ' => $count * $item->retail_price,
+ 'summ_self_cost' => $count * $item->self_cost,
+ ]);
+
+ if ($model->validate()) {
+ $model->save();
+ } else {
+ var_dump($model->getErrors());die();
+ }
+ }
+ }
+
/**
* {@inheritdoc}
*/
$this->registerJsFile('/js/shift-transfer/replacement.js', ['position' => \yii\web\View::POS_END]);
$totalBalance = array_sum(array_column($shiftTransfer->equalizationRemains, 'balance'));
+$writeOffsBalance = \yii_app\records\WaybillWriteOffs::findOne(['shift_transfer_id' => $shiftTransfer->id])->summ ?? null;
+$incomingBalance = \yii_app\records\WaybillIncoming::findOne(['shift_transfer_id' => $shiftTransfer->id])->summ ?? null;
$form = \yii\widgets\ActiveForm::begin(); ?>
- <div class="row">
+ <div class="row py-2">
<div class="col-2">
-
- <?= Html::label('Таблица замен'); ?>
+ <?= Html::label('Таблица замен', null, ['class' => 'h4 font-weight-bold']); ?>
</div>
</div>
<?php
echo GridView::widget([
- 'dataProvider' => new ArrayDataProvider([
+ 'dataProvider' => new \yii\data\ArrayDataProvider([
'allModels' => $shiftTransfer->equalizationRemains,
]),
'showFooter' => true,
'label' => 'Цена товара розничная',
'format' => 'raw',
],
- [
- 'attribute' => 'product_self_cost',
- 'label' => 'Себестоимость товара',
- 'format' => 'raw',
- ],
[
'attribute' => 'product_replacement_id',
'label' => 'Товар замена',
'label' => 'Цена товара замены розничная',
'format' => 'raw',
],
- [
- 'attribute' => 'product_replacement_self_cost',
- 'label' => 'Себестоимость товара замены',
- 'format' => 'raw',
- ],
[
'attribute' => 'product_replacement_count',
'label' => 'Количество товара',
'format' => 'raw',
'pageSummary' => true,
- 'footer' => Html::tag('b', $totalBalance < 0 ? 'Недосдача: ' : 'Избыток: ')
+ 'footer' => Html::tag('b', $totalBalance < 0 ? 'Недостача: ' : 'Избыток: ')
],
[
'attribute' => 'balance',
'pageSummary' => true,
'footer' => Html::tag('b', number_format($totalBalance, 2, '.', ' ')),
],
- [
- 'attribute' => 'balance_self_cost',
- 'label' => 'Разница в сумме (Себестоимость)',
- 'format' => 'raw',
- 'pageSummary' => true,
- ],
[
'attribute' => 'updated_at',
'label' => 'Дата обновления записи',
'showPageSummary' => true,
'layout' => '{items}',
]);
+ ?>
+ <?php if (in_array($shiftTransfer->status_id, [ShiftTransfer::STATUS_OF_THE_FORMATION_OF_SURPLUSES_AND_SHORTAGES, ShiftTransfer::STATUS_ID_ACCEPTED, ShiftTransfer::STATUS_ID_READY_TO_ACCEPT])) : ?>
+ <div class="row py-2">
+ <?php echo Html::label('Таблица с недостачами', null, [
+ 'class' => 'h4 font-weight-bold'
+ ]);
+ echo GridView::widget([
+ 'dataProvider' => new \yii\data\ActiveDataProvider([
+ 'query' => \yii_app\records\WaybillWriteOffsProducts::find()
+ ->andWhere(['waybill_write_offs_id' => \yii_app\records\WaybillWriteOffs::findOne(['shift_transfer_id' => $shiftTransfer->id])->id ?? null])
+ ]),
+ 'showFooter' => true,
+ 'columns' => [
+ [
+ 'label' => 'Товар',
+ 'attribute' => 'name',
+ 'pageSummary' => 'Итого:',
+ ],
+ [
+ 'label' => 'Количество товара',
+ 'attribute' => 'product_count',
+ 'pageSummary' => true,
- //гридвью с двумя таблицами(плюс и минус)
+ ],
+ [
+ 'label' => 'Цена товара',
+ 'attribute' => 'product_price',
+ 'pageSummary' => true,
+ 'footer' => Html::tag('b', 'Недостача: '),
+ ],
+ [
+ 'label' => 'Сумма',
+ 'attribute' => 'summ',
+ 'pageSummary' => true,
+ 'footer' => Html::tag('b', number_format($writeOffsBalance, 2, '.', ' ')),
+ ],
+ ],
+ 'showPageSummary' => true,
+ 'layout' => '{items}',
+ ]);
+ ?>
+ </div>
+ <div class="row py-2">
+ <?php echo Html::label('Таблица с излишками', null, [
+ 'class' => 'h4 font-weight-bold'
+ ]);
+ echo GridView::widget([
+ 'dataProvider' => new \yii\data\ActiveDataProvider([
+ 'query' => \yii_app\records\WaybillIncomingProducts::find()
+ ->andWhere(['waybill_incoming_id' => \yii_app\records\WaybillIncoming::findOne(['shift_transfer_id' => $shiftTransfer->id])->id ?? null])
+ ]),
+ 'showFooter' => true,
+ 'columns' => [
+ [
+ 'label' => 'Товар',
+ 'attribute' => 'name',
+ 'pageSummary' => 'Итого:',
+ ],
+ [
+ 'label' => 'Количество товара',
+ 'attribute' => 'product_count',
+ 'pageSummary' => true,
+
+ ],
+ [
+ 'label' => 'Цена товара',
+ 'attribute' => 'product_price',
+ 'pageSummary' => true,
+ 'footer' => Html::tag('b', 'Излишек: '),
+ ],
+ [
+ 'label' => 'Сумма',
+ 'attribute' => 'summ',
+ 'pageSummary' => true,
+ 'footer' => Html::tag('b', number_format($incomingBalance, 2, '.', ' ')),
+ ],
+ ],
+ 'showPageSummary' => true,
+ 'layout' => '{items}',
+ ]); ?>
+ <?php endif; ?>
+ </div>
+ <?php
if ($shiftTransfer->status_id == ShiftTransfer::STATUS_OF_THE_FORMATION_OF_SURPLUSES_AND_SHORTAGES
&& Yii::$app->user->id == $shiftTransfer->end_shift_admin_id) {
- echo $btn = Html::submitButton('Сохранить', [
- 'class' => 'btn btn-primary float-right',
- 'name' => 'action',
- 'value' => 'save'
- ]);
+ echo $btn = Html::submitButton('Назад', [
+ 'class' => 'btn btn-primary float-right',
+ 'name' => 'action',
+ 'value' => 'rejection'
+ ]) . ' ' . Html::submitButton('Сохранить', [
+ 'class' => 'btn btn-success float-right',
+ 'name' => 'action',
+ 'value' => 'save'
+ ]);
}
if (
&& Yii::$app->user->id != $shiftTransfer->end_shift_admin_id
) {
echo Html::submitButton('Принять', [
- 'class' => 'btn btn-primary float-right',
+ 'class' => 'btn btn-success float-right',
'name' => 'action',
'value' => 'accept'
]) . ' ' . Html::submitButton('Отказ', [
var inputElement = $(this);
var rowId = inputElement.closest('tr').index();
var max = parseFloat($(inputElement).attr('max'));
- var value = parseFloat($(inputElement).val());
+ var value = parseFloat($(inputElement).val());
setDynamicMaxValue(inputElement, rowId);
}
});
-
-
-