From 985ba1381d059261ab602f1a1df60a2ab364844c Mon Sep 17 00:00:00 2001 From: Alexander Smirnov Date: Mon, 18 Nov 2024 11:28:22 +0300 Subject: [PATCH] =?utf8?q?[ERP-241]=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0?= =?utf8?q?=D1=87=D0=B0=20=D1=81=D0=BC=D0=B5=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/controllers/ShiftTransferController.php | 103 +++++++ ...114_093632_create_table_shift_transfer.php | 73 +++++ erp24/records/ShiftRemains.php | 64 +++++ erp24/records/ShiftTransfer.php | 91 ++++++ erp24/views/shift-transfer/index.php | 70 +++++ erp24/views/shift-transfer/update.php | 267 ++++++++++++++++++ erp24/views/shift-transfer/view.php | 59 ++++ 7 files changed, 727 insertions(+) create mode 100644 erp24/controllers/ShiftTransferController.php create mode 100755 erp24/migrations/m241114_093632_create_table_shift_transfer.php create mode 100644 erp24/records/ShiftRemains.php create mode 100644 erp24/records/ShiftTransfer.php create mode 100644 erp24/views/shift-transfer/index.php create mode 100644 erp24/views/shift-transfer/update.php create mode 100644 erp24/views/shift-transfer/view.php diff --git a/erp24/controllers/ShiftTransferController.php b/erp24/controllers/ShiftTransferController.php new file mode 100644 index 00000000..ecac7147 --- /dev/null +++ b/erp24/controllers/ShiftTransferController.php @@ -0,0 +1,103 @@ +all(); + + $storeNameById = TaskService::getEntitiesByAlias('store'); + + $admins = ArrayHelper::map(Admin::find()->all(), 'id', 'name'); + + return $this->render('index', compact('shiftTransfers', 'storeNameById', 'admins')); + } + + public function actionCreate() { + $shiftTransfer = new ShiftTransfer; + + $isCreate = true; + + $storeNameById = TaskService::getEntitiesByAlias('store'); + + $adminArr = []; + foreach (\yii_app\records\Admin::find()->with('adminGroup')->all() as $admin) { + if ($admin->group_id > 0) { + $adminArr[] = ['id' => $admin->id, 'name' => $admin->name, 'groupName' => $admin->adminGroup->name ?? "Другие"]; + } + } + $admins = ArrayHelper::map($adminArr, 'id', 'name', 'groupName'); + + return $this->render('update', compact('shiftTransfer', 'isCreate', 'storeNameById', + 'admins')); + } + + public function actionUpdate($id = null) { + $shiftTransfer = ShiftTransfer::findOne($id); + + if (!$shiftTransfer) { + $shiftTransfer = new ShiftTransfer; + } + if ($shiftTransfer->load(Yii::$app->request->post()) && $shiftTransfer->validate()) { + $shiftTransfer->save(); + //echo "
"; var_dump(Yii::$app->request->post()); echo "
"; die; + ShiftRemains::deleteAll(['shift_transfer_id' => $shiftTransfer->id]); + $modelsShiftRemains = MultipleModel::createMultipleModel(ShiftRemains::class, + 'ShiftTransfer', 'shiftRemains'); + $postShiftTransfer = Yii::$app->request->post('ShiftTransfer'); + $loadDataShiftRemains = ArrayHelper::getValue($postShiftTransfer, 'shiftRemains'); + if (!empty($loadDataShiftRemains)) { + MultipleModel::loadMultipleFromArray($modelsShiftRemains, $loadDataShiftRemains , '',[]); + } + foreach ($modelsShiftRemains as $key => $modelsShiftRemain) { + $modelsShiftRemain->shift_transfer_id = $shiftTransfer->id; + if ($modelsShiftRemain->validate()) { + $modelsShiftRemain->save(); + } + } + return $this->redirect(['/shift-transfer/view', 'id' => $shiftTransfer->id]); + } + + $isCreate = false; + + $storeNameById = TaskService::getEntitiesByAlias('store'); + + $adminArr = []; + foreach (\yii_app\records\Admin::find()->with('adminGroup')->all() as $admin) { + if ($admin->group_id > 0) { + $adminArr[] = ['id' => $admin->id, 'name' => $admin->name, 'groupName' => $admin->adminGroup->name ?? "Другие"]; + } + } + $admins = ArrayHelper::map($adminArr, 'id', 'name', 'groupName'); + + return $this->render('update', compact('shiftTransfer', 'isCreate', 'storeNameById', + 'admins')); + } + + public function actionView($id) { + $shiftTransfer = ShiftTransfer::findOne($id); + + $storeNameById = TaskService::getEntitiesByAlias('store'); + + $admins = ArrayHelper::map(Admin::find()->all(), 'id', 'name'); + + return $this->render('view', + compact('shiftTransfer', 'storeNameById', 'admins')); + } + + public function actionDelete($id) { + ShiftTransfer::deleteAll(['id' => $id]); + + return $this->redirect(['/shift-transfer']); + } +} \ No newline at end of file diff --git a/erp24/migrations/m241114_093632_create_table_shift_transfer.php b/erp24/migrations/m241114_093632_create_table_shift_transfer.php new file mode 100755 index 00000000..cf6f3b8a --- /dev/null +++ b/erp24/migrations/m241114_093632_create_table_shift_transfer.php @@ -0,0 +1,73 @@ +createTable(self::TABLE_NAME, [ +// 'id' => $this->primaryKey(), +// 'name' => $this->string(40)->notNull()->comment('наименование статуса') +// ]); +// +// $this->batchInsert(self::TABLE_NAME, ['id', 'name'], [ +// [1, 'Ввод фактических остатков'], +// [2, 'Действия по замене'], +// [3, 'Готова к принятию'], +// [4, 'Принято'], +// ]); + + $this->createTable(self::TABLE_NAME2, [ + 'id' => $this->primaryKey(), + 'status_id' => $this->tinyInteger()->notNull()->comment('ID статуса'), + 'date' => $this->string(36)->notNull()->comment('дата передачи смены'), + 'date_start' => $this->dateTime()->notNull()->comment('время старта процедуры'), + 'date_end' => $this->dateTime()->null()->comment('время принятия смены'), + 'store_guid' => $this->string(36)->notNull()->comment("GUID магазина"), + 'end_shift_admin_id' => $this->integer()->notNull()->comment('ID сотрудника, передающего смену'), + 'start_shift_admin_id' => $this->integer()->notNull()->comment('ID сотрудника, принимающего смену'), + 'goods_transfer_summ' => $this->float()->null()->comment('Сумма, полученная в результате действий по замене товара'), + 'goods_transfer_count' => $this->float()->null()->comment('Количество замен общее, шт.'), + 'discrepancy_pieces' => $this->float()->null()->comment('Расхождение факта, шт.'), + 'discrepancy_rubles' => $this->float()->null()->comment('Расхождение факта, руб.'), + 'comment' => $this->text()->null()->comment('Комментарий принимающей стороны'), + 'report' => $this->text()->null()->comment('в формате HTML или TXT или JSON внешний вид всех данных при приеме') + ]); + + $this->createTable(self::TABLE_NAME3, [ + 'id' => $this->primaryKey(), + 'shift_transfer_id' => $this->integer()->notNull()->comment('ID смены по передаче'), + 'group_label' => $this->string(40)->null() + ->comment('ID группы или алиас групп товаров (срезка, горшечка и тд.) potted, wrap, matrix'), + 'product_guid' => $this->string(36)->notNull()->comment('GUID продукта'), + 'retail_price' => $this->float()->notNull()->comment('Цена розничная'), + 'self_cost' => $this->float()->notNull()->comment('Себестоимость'), + 'remains_summ' => $this->float()->notNull()->comment('Сумма остатков (недостача или излишек)'), + 'remains_count' => $this->float()->notNull()->comment('Фактические остатки кол-во'), + 'fact_and_1c_diff' => $this->float()->notNull() + ->comment('Разница факт и по программе 1с может быть и минус (- недостача, + излишек) 0 - соответствие.'), + 'remains_1c' => $this->float()->notNull()->comment('остатки по 1с (текущие)'), + ]); + } + + /** + * {@inheritdoc} + */ + public function safeDown() + { + $this->dropTable(self::TABLE_NAME3); + $this->dropTable(self::TABLE_NAME2); +// $this->dropTable(self::TABLE_NAME); + } +} diff --git a/erp24/records/ShiftRemains.php b/erp24/records/ShiftRemains.php new file mode 100644 index 00000000..467167b0 --- /dev/null +++ b/erp24/records/ShiftRemains.php @@ -0,0 +1,64 @@ + null], + [['shift_transfer_id'], 'integer'], + [['retail_price', 'self_cost', 'remains_summ', 'remains_count', 'fact_and_1c_diff', 'remains_1c'], 'number'], + [['group_label'], 'string', 'max' => 40], + [['product_guid'], 'string', 'max' => 36], + ]; + } + + /** + * {@inheritdoc} + */ + public function attributeLabels() + { + return [ + 'id' => 'ID', + 'shift_transfer_id' => 'Shift Transfer ID', + 'group_label' => 'Group Label', + 'product_guid' => 'Product Guid', + 'retail_price' => 'Retail Price', + 'self_cost' => 'Self Cost', + 'remains_summ' => 'Remains Summ', + 'remains_count' => 'Remains Count', + 'fact_and_1c_diff' => 'Fact And 1c Diff', + 'remains_1c' => 'Remains 1c', + ]; + } +} diff --git a/erp24/records/ShiftTransfer.php b/erp24/records/ShiftTransfer.php new file mode 100644 index 00000000..49589dc9 --- /dev/null +++ b/erp24/records/ShiftTransfer.php @@ -0,0 +1,91 @@ + 'Ввод фактических остатков', + self::STATUS_ID_TRANSFER_ACTIONS => 'Действия по замене', + self::STATUS_ID_READY_TO_ACCEPT => 'Готова к принятию', + self::STATUS_ID_ACCEPTED => 'Принято', + ]; + } + + /** + * {@inheritdoc} + */ + public static function tableName() + { + return 'shift_transfer'; + } + + /** + * {@inheritdoc} + */ + public function rules() + { + return [ + [['status_id', 'date', 'date_start', 'store_guid', 'end_shift_admin_id', 'start_shift_admin_id'], 'required'], + [['status_id', 'end_shift_admin_id', 'start_shift_admin_id'], 'default', 'value' => null], + [['status_id', 'end_shift_admin_id', 'start_shift_admin_id'], 'integer'], + [['date_start', 'date_end'], 'safe'], + [['goods_transfer_summ', 'goods_transfer_count', 'discrepancy_pieces', 'discrepancy_rubles'], 'number'], + [['comment', 'report'], 'string'], + [['date', 'store_guid'], 'string', 'max' => 36], + ]; + } + + /** + * {@inheritdoc} + */ + public function attributeLabels() + { + return [ + 'id' => 'ID', + 'status_id' => 'Статус', + 'date' => 'Дата', + 'date_start' => 'Дата начала', + 'date_end' => 'Дата конца', + 'store_guid' => 'Магазин', + 'end_shift_admin_id' => 'Передающий смену сотрудник', + 'start_shift_admin_id' => 'Принимающий смену сотрудник', + 'goods_transfer_summ' => 'Сумма полученная в результате действий по замене товара', + 'goods_transfer_count' => 'Количество замен общее', + 'discrepancy_pieces' => 'Расхождения факта, шт.', + 'discrepancy_rubles' => 'Расхождение факта, руб.', + 'comment' => 'Комментарий', + 'report' => 'Отчёт', + ]; + } + + public function getShiftRemains() { + return $this->hasMany(ShiftRemains::class, ['shift_transfer_id' => 'id']); + } +} diff --git a/erp24/views/shift-transfer/index.php b/erp24/views/shift-transfer/index.php new file mode 100644 index 00000000..603ea037 --- /dev/null +++ b/erp24/views/shift-transfer/index.php @@ -0,0 +1,70 @@ + + +
+ +

Передачи смен

+ + 'btn btn-success']) ?> + + new ArrayDataProvider([ + 'allModels' => $shiftTransfers + ]), + 'columns' => [ + ['class' => 'yii\grid\SerialColumn'], + [ + 'attribute' => 'status_id', + 'value' => function ($model) { + return ShiftTransfer::statusNames()[$model['status_id']]; + } + ], + 'date', + 'date_start', + 'date_end', + [ + 'attribute' => 'store_guid', + 'value' => function ($model) use ($storeNameById) { + return $storeNameById[$model['store_guid']]; + } + ], + [ + 'attribute' => 'end_shift_admin_id', + 'value' => function ($model) use ($admins) { + return $admins[$model['end_shift_admin_id']]; + } + ], + [ + 'attribute' => 'start_shift_admin_id', + 'value' => function ($model) use ($admins) { + return $admins[$model['start_shift_admin_id']]; + } + ], + 'goods_transfer_summ', + 'goods_transfer_count', + 'discrepancy_pieces', + 'discrepancy_rubles', + 'comment', + 'report', + [ + 'class' => ActionColumn::class, + 'urlCreator' => function ($action, ShiftTransfer $model, $key, $index, $column) { + return Url::toRoute([$action, 'id' => $model->id]); + } + ], + ] + ]) ?> + +
diff --git a/erp24/views/shift-transfer/update.php b/erp24/views/shift-transfer/update.php new file mode 100644 index 00000000..b807fad3 --- /dev/null +++ b/erp24/views/shift-transfer/update.php @@ -0,0 +1,267 @@ +registerCss(' + .multiple-input-list__btn.js-input-plus.btn.btn-success { + display: block !important; + width: 40px; + } +'); +?> + +
+ + 'btn btn-secondary']) ?> + +

передачи смены

+ + ['/shift-transfer/update', 'id' => Yii::$app->request->get('id')], + ]) ?> + + field($shiftTransfer, 'id')->hiddenInput()->label(false) ?> + +
+
+ field($shiftTransfer, 'status_id')->dropDownList(ShiftTransfer::statusNames()) ?> +
+
+
+
+ field($shiftTransfer, 'store_guid')->dropDownList($storeNameById) ?> +
+
+ field($shiftTransfer, 'date')->widget(DateTimePicker::class, [ + 'language' => 'ru', + 'template' => '{input}', + 'clientOptions' => [ + 'autoclose' => true, + 'format' => 'Y-m-d', + 'todayBtn' => true + ], + ]) ?> +
+
+
+
+ field($shiftTransfer, 'date_start')->widget(DateTimePicker::class, [ + 'language' => 'ru', + 'template' => '{input}', + 'clientOptions' => [ + 'autoclose' => true, + 'format' => 'Y-m-d H:i:s', + 'todayBtn' => true + ], + ]) ?> +
+
+ field($shiftTransfer, 'date_end')->widget(DateTimePicker::class, [ + 'language' => 'ru', + 'template' => '{input}', + 'clientOptions' => [ + 'autoclose' => true, + 'format' => 'Y-m-d H:i:s', + 'todayBtn' => true + ], + ]) ?> +
+
+
+
+ field($shiftTransfer, 'end_shift_admin_id')->widget(Select2::class, [ + 'data' => $admins, + 'language' => 'ru', + 'options' => ['placeholder' => 'Сотрудник...'], + 'pluginOptions' => [ + 'allowClear' => true + ], + ]) ?> +
+
+ field($shiftTransfer, 'start_shift_admin_id')->widget(Select2::class, [ + 'data' => $admins, + 'language' => 'ru', + 'options' => ['placeholder' => 'Сотрудник...'], + 'pluginOptions' => [ + 'allowClear' => true + ], + ]) ?> +
+
+
+
+ field($shiftTransfer, 'goods_transfer_summ')->textInput(['type' => 'number', 'step' => 0.01]) ?> +
+
+ field($shiftTransfer, 'goods_transfer_count')->textInput(['type' => 'number', 'step' => 0.01]) ?> +
+
+
+
+ field($shiftTransfer, 'discrepancy_pieces')->textInput(['type' => 'number', 'step' => 0.01]) ?> +
+
+ field($shiftTransfer, 'discrepancy_rubles')->textInput(['type' => 'number', 'step' => 0.01]) ?> +
+
+
+
+ field($shiftTransfer, 'comment')->textarea(['rows' => 6]) ?> +
+
+ field($shiftTransfer, 'report')->textarea(['rows' => 6]) ?> +
+
+ +
+
+ field($shiftTransfer, 'shiftRemains')->widget(MultipleInput::class, [ + 'min' => 0, + 'max' => 100, + 'columns' => [ +// [ +// 'name' => 'id', +// 'type' => BaseColumn::TYPE_HIDDEN_INPUT, +// 'value' => function($data) { +// return $data['id'] ?? ''; +// }, +// ], +// [ +// 'name' => 'shift_transfer_id', +// 'type' => BaseColumn::TYPE_HIDDEN_INPUT, +// 'value' => function($data) { +// return $data['shift_transfer_id'] ?? ''; +// }, +// ], + [ + 'name' => 'group_label', + 'title' => 'Название группы', + 'type' => BaseColumn::TYPE_DROPDOWN, + 'items' => ["wrap"=>"Упаковка","potted"=>"Горшечка", "services"=>"Услуги", + "services_delivery"=>"Услуги по доставке", "salut"=>"Пиротехника", + "matrix"=>"Матрица", "marketplace" => "Товары для маркетплейсов", + "marketplace_additional" => "Доп. товары для маркетплейсов", "related"=>"Сопутка", + "other_items"=>"Номенклатура 1%"], + 'value' => function($data) { + return $data['group_label'] ?? ''; + }, + 'headerOptions' => [ + 'style' => 'width: 70px;', + ] + ], + [ + 'name' => 'product_guid', + 'title' => 'GUID продукта', + 'type' => BaseColumn::TYPE_TEXT_INPUT, + 'value' => function($data) { + return $data['product_guid'] ?? ''; + }, + 'headerOptions' => [ + 'style' => 'width: 70px;', + ] + ], + [ + 'name' => 'retail_price', + 'title' => 'Розничная цена', + 'type' => BaseColumn::TYPE_TEXT_INPUT, + 'options' => ['type' => 'number', 'step' => 0.01], + 'value' => function($data) { + return $data['retail_price'] ?? ''; + }, + 'headerOptions' => [ + 'style' => 'width: 70px;', + ] + ], + [ + 'name' => 'self_cost', + 'title' => 'Себестоимость', + 'type' => BaseColumn::TYPE_TEXT_INPUT, + 'options' => ['type' => 'number', 'step' => 0.01], + 'value' => function($data) { + return $data['self_cost'] ?? ''; + }, + 'headerOptions' => [ + 'style' => 'width: 70px;', + ] + ], + [ + 'name' => 'remains_summ', + 'title' => 'Сумма остатков (недостача или излишек)', + 'type' => BaseColumn::TYPE_TEXT_INPUT, + 'options' => ['type' => 'number', 'step' => 0.01], + 'value' => function($data) { + return $data['remains_summ'] ?? ''; + }, + 'headerOptions' => [ + 'style' => 'width: 70px;', + ] + ], + [ + 'name' => 'remains_count', + 'title' => 'Фактические остатки кол-во', + 'type' => BaseColumn::TYPE_TEXT_INPUT, + 'options' => ['type' => 'number', 'step' => 0.01], + 'value' => function($data) { + return $data['remains_count'] ?? ''; + }, + 'headerOptions' => [ + 'style' => 'width: 70px;', + ] + ], + [ + 'name' => 'fact_and_1c_diff', + 'title' => 'Разница факт и по программе 1с', + 'type' => BaseColumn::TYPE_TEXT_INPUT, + 'options' => ['type' => 'number', 'step' => 0.01], + 'value' => function($data) { + return $data['fact_and_1c_diff'] ?? ''; + }, + 'headerOptions' => [ + 'style' => 'width: 70px;', + ] + ], + [ + 'name' => 'remains_1c', + 'title' => 'Остатки по 1с', + 'type' => BaseColumn::TYPE_TEXT_INPUT, + 'options' => ['type' => 'number', 'step' => 0.01], + 'value' => function($data) { + return $data['remains_1c'] ?? ''; + }, + 'headerOptions' => [ + 'style' => 'width: 70px;', + ] + ], + ], + 'addButtonPosition' => MultipleInput::POS_FOOTER, + 'addButtonOptions' => [ + 'class' => 'btn btn-success visible-md', + 'style' => 'display:block; width: 250px;', + ], + 'iconSource'=> 'fa', + ])->label(false);?> +
+
+ +
+ 'btn btn-success']) ?> +
+ + + +
diff --git a/erp24/views/shift-transfer/view.php b/erp24/views/shift-transfer/view.php new file mode 100644 index 00000000..58c7ab0e --- /dev/null +++ b/erp24/views/shift-transfer/view.php @@ -0,0 +1,59 @@ + + +
+ + 'btn btn-secondary']) ?> + Yii::$app->request->get('id')], ['class' => 'btn btn-primary']) ?> + +

Просмотр передачи смены

+ + $shiftTransfer, + 'attributes' => [ + [ + 'attribute' => 'status_id', + 'value' => function ($model) { + return ShiftTransfer::statusNames()[$model['status_id']]; + } + ], + 'date', + 'date_start', + 'date_end', + [ + 'attribute' => 'store_guid', + 'value' => function ($model) use ($storeNameById) { + return $storeNameById[$model['store_guid']]; + } + ], + [ + 'attribute' => 'end_shift_admin_id', + 'value' => function ($model) use ($admins) { + return $admins[$model['end_shift_admin_id']]; + } + ], + [ + 'attribute' => 'start_shift_admin_id', + 'value' => function ($model) use ($admins) { + return $admins[$model['start_shift_admin_id']]; + } + ], + 'goods_transfer_summ', + 'goods_transfer_count', + 'discrepancy_pieces', + 'discrepancy_rubles', + 'comment', + 'report' + ] + ]) ?> + +
-- 2.39.5