}
if (!empty($writeOffsErp)) {
/** @var WriteOffsErp $writeOffsErp */
- $writeOffsErp->status = WriteOffsErp::STATUS_ERROR_1С;
+ $writeOffsErp->status = WriteOffsErp::STATUS_ERROR_1C;
$writeOffsErp->error_text = $errorText;
$writeOffsErp->save();
if ($writeOffsErp->getErrors()) {
}
if (!empty($waybillWriteOffsErp)) {
/** @var WaybillWriteOffs $waybillWriteOffsErp */
- $waybillWriteOffsErp->status = WriteOffsErp::STATUS_ERROR_1С;
+ $waybillWriteOffsErp->status = WriteOffsErp::STATUS_ERROR_1C;
$waybillWriteOffsErp->error_text = $errorText;
$waybillWriteOffsErp->save();
if ($waybillWriteOffsErp->getErrors()) {
} else {
if (!empty($writeOffsErp)) {
/** @var WriteOffsErp $writeOffsErp */
- $writeOffsErp->status = WriteOffsErp::STATUS_CREATED_1С;
+ $writeOffsErp->status = WriteOffsErp::STATUS_CREATED_1C;
$writeOffsErp->number_1c = $arr["number"] ?? '';
$writeOffsErp->save();
if ($writeOffsErp->getErrors()) {
}
if (!empty($waybillWriteOffsErp) && isset($arr["held"]) && $arr["held"]) {
/** @var WaybillWriteOffs $waybillWriteOffsErp */
- $waybillWriteOffsErp->status = WriteOffsErp::STATUS_CREATED_1С;
+ $waybillWriteOffsErp->status = WriteOffsErp::STATUS_CREATED_1C;
$waybillWriteOffsErp->name_1c = $arr["name"] ?? '';
$waybillWriteOffsErp->save();
if ($waybillWriteOffsErp->getErrors()) {
}
/** @var WaybillIncoming $waybillIncoming */
- $waybillIncoming->status = WriteOffsErp::STATUS_ERROR_1С;
+ $waybillIncoming->status = WriteOffsErp::STATUS_ERROR_1C;
$waybillIncoming->error_text = $errorText;
$waybillIncoming->save();
if ($waybillIncoming->getErrors()) {
} else {
if (isset($arr["held"]) && $arr["held"]) {
/** @var WaybillIncoming $waybillIncoming */
- $waybillIncoming->status = WriteOffsErp::STATUS_CREATED_1С;
+ $waybillIncoming->status = WriteOffsErp::STATUS_CREATED_1C;
$waybillIncoming->number_1c = $arr["name"] ?? '';
$waybillIncoming->save();
if ($waybillIncoming->getErrors()) {
}
/** @var ReplacementInvoice $replacementInvoice */
- $replacementInvoice->status = WriteOffsErp::STATUS_ERROR_1С;
+ $replacementInvoice->status = WriteOffsErp::STATUS_ERROR_1C;
$replacementInvoice->error_text = $errorText;
$replacementInvoice->save();
if ($replacementInvoice->getErrors()) {
} else {
if (isset($arr["held"]) && $arr["held"]) {
/** @var ReplacementInvoice $replacementInvoice */
- $replacementInvoice->status = WriteOffsErp::STATUS_CREATED_1С;
+ $replacementInvoice->status = WriteOffsErp::STATUS_CREATED_1C;
$replacementInvoice->number_1c = $arr["name"] ?? '';
$replacementInvoice->save();
if ($replacementInvoice->getErrors()) {
if (empty($arr["error"]) && !empty($arr["id"])) {
$writeOffsErp = WriteOffsErp::find()->where(['guid' => $arr["id"]])->one();
if ($writeOffsErp) {
- $writeOffsErp->status = WriteOffsErp::STATUS_CREATED_1С;
+ $writeOffsErp->status = WriteOffsErp::STATUS_CREATED_1C;
$writeOffsErp->number_1c = $arr["number"];
$writeOffsErp->save();
if ($writeOffsErp->getErrors()) {
} else {
$waybillWriteOffsErp = WaybillWriteOffs::find()->where(['guid' => $arr["id"]])->one();
if ($waybillWriteOffsErp) {
- $waybillWriteOffsErp->status = WriteOffsErp::STATUS_CREATED_1С;
+ $waybillWriteOffsErp->status = WriteOffsErp::STATUS_CREATED_1C;
$waybillWriteOffsErp->number_1c = $arr["number"];
$waybillWriteOffsErp->save();
if ($waybillWriteOffsErp->getErrors()) {
if (!Yii::$app->user->can('notOnlyApprovedAndCreatedIn1C001')) {
$query->andWhere(['status' => [
WriteOffsErp::STATUS_CONFIRM,
- WriteOffsErp::STATUS_CREATED_1С,
- WriteOffsErp::STATUS_ERROR_1С
+ WriteOffsErp::STATUS_CREATED_1C,
+ WriteOffsErp::STATUS_ERROR_1C
]]);
}
'write_offs_erp.active' => 1,
])
->andWhere([
- '<>', 'status', WriteOffsErp::STATUS_CREATED_1С
+ '<>', 'status', WriteOffsErp::STATUS_CREATED_1C
])
->with('writeOffsProductsErps');
'active' => 1,
])
->andWhere([
- '<>', 'status', WriteOffsErp::STATUS_CREATED_1С
+ '<>', 'status', WriteOffsErp::STATUS_CREATED_1C
])
->joinWith('writeOffsProductsErps')
->asArray()
if ($this->request->isPost && $model->load($this->request->post())) {
+ $isTransfer = (bool)Yii::$app->request->post('do_transfer', 0);
+ $postModels = Yii::$app->request->post('WriteOffsErp')['modelsProducts'] ?? [];
+ $transferIds = [];
+ foreach ($postModels as $row) {
+ if (!empty($row['transfer']) && !empty($row['id'])) {
+ $transferIds[] = (int)$row['id'];
+ }
+ }
+ $transferIds = array_unique(array_filter($transferIds));
+
+ if ($isTransfer) {
+ $transaction = \Yii::$app->db->beginTransaction();
+ try {
+ $new = WriteOffsErp::newFromBase($model, $adminId);
+
+ if (!$new->save(false)) {
+ Yii::error('Ошибка' . json_encode($new->getErrors(), JSON_UNESCAPED_UNICODE));
+ throw new \RuntimeException('Не удалось создать новый документ списания.' . json_encode($new->getErrors(), JSON_UNESCAPED_UNICODE));
+ }
+
+ if (empty($new)) {
+ throw new \RuntimeException('Не выбраны позиции для переноса.');
+ }
+ $rowsToMove = WriteOffsProductsErp::find()
+ ->where(['id' => $transferIds, 'active_product' => 1, 'write_offs_erp_id' => $model->id])
+ ->orderBy(['num_row' => SORT_ASC])
+ ->all();
+
+ if (!$rowsToMove) {
+ throw new \RuntimeException('Не найдены активные строки для переноса.');
+ }
+
+ $newNum = 1;
+
+ foreach ($rowsToMove as $row) {
+ $row->setWriteOffsErpId($new->id);
+ $row->setNumRow($newNum++);
+ $row->setUpdatedAdminId($adminId);
+ $row->setUpdatedAt();
+ if (!$row->save(false)) {
+ throw new \RuntimeException('Ошибка при переносе позиции ID=' . $row->id);
+ }
+
+ ImageDocumentLink::updateAll(
+ ['document_id' => $new->id],
+ [
+ 'document_group_id' => $documentGroupId,
+ 'document_id' => $model->id,
+ 'document_item_id' => $row->id,
+ ]
+ );
+ }
+
+
+ WriteOffsErp::recalcTotals($model);
+ WriteOffsErp::recalcTotals($new);
+
+ $transaction->commit();
+ Yii::$app->session->setFlash('success', 'Перенесено в новый документ №' . ($new->number ?? $new->id));
+ return $this->redirect(['/write-offs-erp/view', 'id' => $new->id]);
+ } catch (\Throwable $e) {
+ if (isset($transaction) && $transaction->isActive) {
+ $transaction->rollBack();
+ }
+ Yii::$app->session->setFlash('error', 'Ошибка переноса: ' . $e->getMessage());
+ }
+ }
$modelsProducts = MultipleModel::createMultipleModel(WriteOffsProductsErp::classname(), 'WriteOffsErp', 'modelsProducts', $modelWriteOffsProductsErps);
MultipleModel::loadMultipleFromArray($modelsProducts, $model->modelsProducts, '');
$model = WriteOffsErp::find()->andWhere([
'write_offs_erp.id' => $id,
'active' => 1,
- 'status' => [WriteOffsErp::STATUS_SEND, WriteOffsErp::STATUS_ERROR_1С],
+ 'status' => [WriteOffsErp::STATUS_SEND, WriteOffsErp::STATUS_ERROR_1C],
])
->joinWith(['writeOffsProductsErps'])
->one();
$modelStatus = $model->getStatus();
- if (in_array($modelStatus, [WriteOffsErp::STATUS_SEND, WriteOffsErp::STATUS_ERROR_1С])) {
+ if (in_array($modelStatus, [WriteOffsErp::STATUS_SEND, WriteOffsErp::STATUS_ERROR_1C])) {
$model->setStatusConfirm();
$model->resetSendAt();
$model->save(false);
const STATUS_CREATED = 1;
const STATUS_CONFIRM = 2;
const STATUS_SEND = 3;
- const STATUS_CREATED_1С = 4;
- const STATUS_ERROR_1С = 8;
+ const STATUS_CREATED_1C = 4;
+ const STATUS_ERROR_1C = 8;
const STATUS_DISABLE = 5;
const WRITE_OFFS_TYPE_BRAK = "Брак";
const WRITE_OFFS_TYPE_RETURN_KALUGA = "Возврат нереализованного товара (Калуга)";
self::STATUS_CREATED => "Создан",
self::STATUS_CONFIRM => "Одобрен",
self::STATUS_SEND => "Отправлен в 1С",
- self::STATUS_CREATED_1С => "Создан в 1С",
+ self::STATUS_CREATED_1C => "Создан в 1С",
self::STATUS_DISABLE => "Отклонен",
- self::STATUS_ERROR_1С => "Ошибка в 1С",
+ self::STATUS_ERROR_1C => "Ошибка в 1С",
];
public const TEST_STORES = [
self::STATUS_CREATED => 'Ожидает согласования',
self::STATUS_CONFIRM => 'Согласован',
self::STATUS_SEND => 'Отправлен в 1с',
- self::STATUS_CREATED_1С => 'Создан в 1с',
+ self::STATUS_CREATED_1C => 'Создан в 1с',
self::STATUS_DISABLE => 'Отключен',
- self::STATUS_ERROR_1С => 'Ошибка загрузки в 1с',
+ self::STATUS_ERROR_1C => 'Ошибка загрузки в 1с',
];
}
}
return (in_array($storeId, self::TEST_STORES));
}
+
+ /**
+ * Инициализация нового документа на основе исходного.
+ * Использует те же сеттеры, что и actionCreate.
+ */
+ public static function newFromBase(WriteOffsErp $base, int $adminId): WriteOffsErp
+ {
+ $new = new WriteOffsErp();
+ $new->loadDefaultValues();
+ $attrsToCopy = [
+ 'status',
+ 'store_id',
+ 'write_offs_type',
+ 'comment',
+ 'cause_group_id',
+ 'cause_id'
+ ];
+ foreach ($attrsToCopy as $attr) {
+ if ($base->hasProperty($attr)) {
+ $new->$attr = $base->$attr;
+ }
+ }
+
+ $new->setGuidCreated();
+ $new->setNumberDefault();
+ $new->setStatusCreated();
+ $new->setCreatedDate();
+ $new->setStoreGuidCreated();
+ $new->setCreatedAt();
+ $new->setCauseGroupId();
+ $new->setCreatedAdminId($adminId);
+
+ $new->setNumberCreated();
+ $new->setUpdatedAdminId($adminId);
+ $new->setQuantity(0);
+ $new->setSumm(0);
+ $new->setSummRetail(0);
+
+ return $new;
+ }
+
+
+ /**
+ * Пересчёт сумм документа по его активным строкам.
+ */
+ public static function recalcTotals(WriteOffsErp $doc): void
+ {
+ $items = WriteOffsProductsErp::find()
+ ->where(['write_offs_erp_id' => $doc->id, 'active_product' => 1])
+ ->all();
+
+ $sum = 0.0;
+ $qty = 0.0;
+ foreach ($items as $it) {
+ $sum += (float)$it->summ;
+ $qty += (float)$it->quantity;
+ }
+ $doc->setSumm($sum);
+ $doc->setSummRetail($sum); // как в create
+ $doc->setQuantity($qty);
+ $doc->setUpdatedAt();
+ $doc->setUpdatedAdminId($doc->getUpdatedAdminId() ?: $doc->getCreatedAdminId());
+
+ if (!$doc->save()) {
+ Yii::error('Ошибка сохранения документа списания ' . json_encode($doc->getErrors(),JSON_UNESCAPED_UNICODE));
+ }
+ }
}
->groupBy(['bouquet_composition.id', 'bf.year',
'bf.month'])
->andWhere(['status' => [
- WriteOffsErp::STATUS_CREATED_1С,
+ WriteOffsErp::STATUS_CREATED_1C,
]])
->innerJoinWith(['bouquetForecast bf' => function($query) use ($year, $month) {
<?= match ($model->status) {
WriteOffsErp::STATUS_CREATED => 'bg-info',
WriteOffsErp::STATUS_CONFIRM,
- WriteOffsErp::STATUS_CREATED_1С => 'bg-success',
+ WriteOffsErp::STATUS_CREATED_1C => 'bg-success',
WriteOffsErp::STATUS_SEND => 'bg-warning',
WriteOffsErp::STATUS_DISABLE,
- WriteOffsErp::STATUS_ERROR_1С => 'bg-danger',
+ WriteOffsErp::STATUS_ERROR_1C => 'bg-danger',
default => 'bg-secondary',
} ?> fs-5 text-white px-7 w-100 mb-4 text-center">
<?= Html::encode($model->status ? \yii_app\records\WriteOffsErp::STATUSES[$model->status] : null) ?>
match ($model->status) {
WriteOffsErp::STATUS_CREATED => 'bg-info',
WriteOffsErp::STATUS_CONFIRM,
- WriteOffsErp::STATUS_CREATED_1С => 'bg-success',
+ WriteOffsErp::STATUS_CREATED_1C => 'bg-success',
WriteOffsErp::STATUS_SEND => 'bg-warning',
WriteOffsErp::STATUS_DISABLE,
- WriteOffsErp::STATUS_ERROR_1С => 'bg-danger',
+ WriteOffsErp::STATUS_ERROR_1C => 'bg-danger',
default => 'bg-secondary',
} .
" fs-6 text-white px-7 w-100 mb-4 d-block'>
'label' => 'Текст ошибки',
'attribute' => 'error_text',
'value' => function ($model) {
- return $model->status == \yii_app\records\WriteOffsErp::STATUS_ERROR_1С ? $model->error_text : '';
+ return $model->status == \yii_app\records\WriteOffsErp::STATUS_ERROR_1C ? $model->error_text : '';
},
- 'visible' => $model->status == \yii_app\records\WriteOffsErp::STATUS_ERROR_1С,
+ 'visible' => $model->status == \yii_app\records\WriteOffsErp::STATUS_ERROR_1C,
],
[
'label' => 'Номер документа в 1С',
'attribute' => 'name_1c',
'value' => function ($model) {
return
- $model->status == \yii_app\records\WriteOffsErp::STATUS_CREATED_1С ?
+ $model->status == \yii_app\records\WriteOffsErp::STATUS_CREATED_1C ?
$model->name_1c : '';
},
- 'visible' => $model->status == \yii_app\records\WriteOffsErp::STATUS_CREATED_1С,
+ 'visible' => $model->status == \yii_app\records\WriteOffsErp::STATUS_CREATED_1C,
],
[
'label' => 'Отправлено в 1С',
],
'items' => $listProductsDict,
],
+ [
+ 'name' => 'transfer',
+ 'type' => 'checkbox',
+ 'title' => 'Перенести',
+ 'options' => [
+ 'class' => 'transfer-checkbox',
+ ],
+ ],
[
'name' => 'quantity',
'type' => 'textInput',
</div>
<?php
- if (in_array($model->status, [\yii_app\records\WriteOffsErp::STATUS_CREATED, \yii_app\records\WriteOffsErp::STATUS_ERROR_1С])) {
+ if (in_array($model->status, [\yii_app\records\WriteOffsErp::STATUS_CREATED, \yii_app\records\WriteOffsErp::STATUS_ERROR_1C])) {
?>
<div class="form-group">
<?= Html::button('Сохранить', ['class' => 'btn btn-success submitter']) ?>
<?php
}
?>
+ <?= Html::hiddenInput('do_transfer', 0, ['id' => 'do-transfer']) ?>
+
<?php ActiveForm::end(); ?>
+ <div class="form-group">
+ <?= Html::button('Перенести выделенные', [
+ 'class' => 'btn btn-warning',
+ 'id' => 'btn-transfer',
+ 'type' => 'button',
+ 'title' => 'Создать новый документ и переместить в него отмеченные позиции',
+ ]) ?>
+ </div>
<?php
if (!$model->isNewRecord) {
}
?>
-
</div>
'visibleButtons' => [
'view' => true,
'update' => function($model) {
- if ($model->status == WriteOffsErp::STATUS_CREATED || $model->status == WriteOffsErp::STATUS_ERROR_1С) {
+ if ($model->status == WriteOffsErp::STATUS_CREATED || $model->status == WriteOffsErp::STATUS_ERROR_1C) {
return true;
} else {
return false;
$this->params['breadcrumbs'][] = ['label' => 'Write Offs Erps', 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => $model->id, 'url' => ['view', 'id' => $model->id]];
$this->params['breadcrumbs'][] = 'Update';
+$this->registerJsFile('/js/write-offs-erp/update.js', ['position' => \yii\web\View::POS_END]);
+?>
?>
<div class="write-offs-erp-update m-5">
<?php
}
- if (($model->status == WriteOffsErp::STATUS_SEND || $model->status == WriteOffsErp::STATUS_ERROR_1С) && $allowShowReSendButton) {
+ if (($model->status == WriteOffsErp::STATUS_SEND || $model->status == WriteOffsErp::STATUS_ERROR_1C) && $allowShowReSendButton) {
?>
<p>
<?php
--- /dev/null
+(function(){
+ const form = $('#dynamic-form');
+ form.on('submit', function (e) {
+ const wantTransfer = $('#do-transfer').val() === '1';
+ if (wantTransfer) {
+ const anyChecked = $('.transfer-checkbox:checked').length > 0;
+ if (!anyChecked) {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ alert('Отметьте хотя бы одну позицию для переноса.');
+ $('#do-transfer').val(0);
+ return false;
+ }
+ }
+ });
+ $('#btn-transfer').on('click', function(e){
+ e.preventDefault();
+ e.stopImmediatePropagation();
+
+ const anyChecked = $('.transfer-checkbox:checked').length > 0;
+ if (!anyChecked) {
+ alert('Отметьте хотя бы одну позицию для переноса.');
+ return false;
+ }
+
+
+ if(!confirm('Перенести отмеченные позиции в новый документ?')){
+ return;
+ }
+
+ $('#do-transfer').val(1);
+ form.trigger('submit');
+ });
+
+ $('.submitter').on('click', function(e){
+ $('#do-transfer').val(0);
+ $('#dynamic-form').trigger('submit');
+ });
+})();
\ No newline at end of file