]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Доработка работы со статусами
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 13 Oct 2025 13:20:39 +0000 (16:20 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 13 Oct 2025 13:20:39 +0000 (16:20 +0300)
erp24/api2/controllers/DataController.php
erp24/controllers/MarketplaceOrdersController.php
erp24/media/controllers/NotificationController.php
erp24/records/MarketplaceOrderStatusTypes.php
erp24/services/MarketplaceService.php

index 742f5dfca3279393b88b127b024abc5c1132f1f6..4a236fc37c6f8d2210dc85ffaadc0702ad0841d4 100644 (file)
@@ -3259,6 +3259,7 @@ class DataController extends BaseController
             ->all();
         $cancelledStatusId = $statuses[MarketplaceOrderStatusTypes::CANSELLED_CODE]['id'];
         $readyStatusId = $statuses[MarketplaceOrderStatusTypes::READY_CODE]['id'];
+        $deliveredStatusId = $statuses['DELIVERED']['id'];
         $status = $mpOrder['status'];
         $marketplaceOrder = MarketplaceOrders::find()
             ->where(['guid' => $mpOrder['id']])
@@ -3314,6 +3315,13 @@ class DataController extends BaseController
                 return $errorJson;
             }
 
+            // Проверяем, если заказ уже имеет статус CANCELLED или DELIVERED, то не меняем статусы
+            if ($marketplaceOrder->status_id === $cancelledStatusId || $marketplaceOrder->status_id === $deliveredStatusId) {
+                $result['status'] = 'no_change';
+                $result['message'] = 'Заказ уже имеет финальный статус (CANCELLED или DELIVERED) ' . $mpOrder['id'];
+                return $result;
+            }
+
             // Получаем статусы МП по статусу 1С
             /** @var $status MarketplaceOrderStatusTypes */
             /** @var $substatus MarketplaceOrderStatusTypes */
index 10ca79aded981d0973b134340762c25b6ccd8c09..de671206318b44daac4b49a5367f1ad037b09b80 100644 (file)
@@ -24,6 +24,7 @@ use yii\web\NotFoundHttpException;
 use yii\filters\VerbFilter;
 use yii_app\records\MarketplaceOrderStatusHistory;
 use yii_app\records\MarketplaceOrderStatusTypes;
+use yii_app\records\MarketplaceOrder1cStatuses;
 use yii_app\records\MarketplaceStore;
 use yii_app\records\MatrixErp;
 use yii_app\records\Prices;
@@ -749,7 +750,17 @@ class MarketplaceOrdersController extends Controller
             $model->status_id = $statusCancelled->id;
             $model->substatus_id = $substatusFailed->id;
             $model->cancelled_order_source = 'ERP';
-            $model->cancelled_order_date = date('Y-m-d H:m:s');
+            $model->cancelled_order_date = date('Y-m-d H:i:s');
+
+            // Устанавливаем status_processing_1c для отмены
+            $status1cWithCancelledId = ArrayHelper::getColumn(MarketplaceOrder1cStatuses::find()
+                ->where(['order_status_id' => $statusCancelled->id])
+                ->andWhere(['marketplace_id' => $model->marketplace_id])
+                ->asArray()
+                ->all(), 'id')[0] ?? null;
+            if ($status1cWithCancelledId !== null) {
+                $model->status_processing_1c = $status1cWithCancelledId;
+            }
             if ((int)$model->marketplace_id === MarketplaceStore::YANDEX_WAREHOUSE_ID) {
                 $rawData = json_decode($model->raw_data, true, 512, JSON_THROW_ON_ERROR);
                 $rawData['status'] = $statusCancelled->code;
@@ -792,7 +803,17 @@ class MarketplaceOrdersController extends Controller
         $model->status_id = $statusCancelled->id;
         $model->substatus_id = $substatusFailed->id;
         $model->cancelled_order_source = 'ERP';
-        $model->cancelled_order_date = date('Y-m-d H:m:s');
+        $model->cancelled_order_date = date('Y-m-d H:i:s');
+
+        // Устанавливаем status_processing_1c для отмены
+        $status1cWithCancelledId = ArrayHelper::getColumn(MarketplaceOrder1cStatuses::find()
+            ->where(['order_status_id' => $statusCancelled->id])
+            ->andWhere(['marketplace_id' => $model->marketplace_id])
+            ->asArray()
+            ->all(), 'id')[0] ?? null;
+        if ($status1cWithCancelledId !== null) {
+            $model->status_processing_1c = $status1cWithCancelledId;
+        }
 
         if (!$model->save()) {
             Yii::error('Ошибка сохранения модели: ' . json_encode($model->getErrors(), JSON_UNESCAPED_UNICODE));
index 24902e34ce0eefaa2457908bf6e8d2a3f120b3d4..894232e471e420aa8f7c1b17056c195c44742ff3 100644 (file)
@@ -104,17 +104,7 @@ class NotificationController extends Controller
         }
         */
 
-        $statuses = MarketplaceOrderStatusTypes::find()
-            ->select(['id', 'code'])
-            ->indexBy('code')
-            ->asArray()
-            ->all();
-        $cancelledStatusId = $statuses[MarketplaceOrderStatusTypes::CANSELLED_CODE]['id'];
-        $status1cWithCancelledId = ArrayHelper::getColumn(MarketplaceOrder1cStatuses::find()
-            ->where(['order_status_id' => $cancelledStatusId])
-            ->andWhere(['marketplace_id' => 2])
-            ->asArray()
-            ->all(), 'id');
+       
 
         $rawBody = Yii::$app->request->getRawBody();
 //        if (!is_dir(self::getPathNotification())) {
@@ -315,17 +305,6 @@ class NotificationController extends Controller
                         ]);
                     }
                     $result = MarketplaceService::processOrders($orderData);
-                    $order = MarketplaceOrders::find()
-                        ->where(['marketplace_order_id' => (string)$orderId])
-                        ->one();
-                    if ($order) {
-                        $order->cancelled_order_source = 'Yandex Market';
-                        $order->status_processing_1c = $status1cWithCancelledId;
-                        $order->cancelled_order_date = date('Y-m-d H:m:s');
-                        if (!$order->save()) {
-                            Yii::error('Ошибка сохранения заказа ' . json_encode($order->getErrors(), JSON_UNESCAPED_UNICODE));
-                        }
-                    }
                     return $this->asJson([
                         'version'   => '1.0.0',
                         'name'      => 'БазаЦветов24',
index 4a34061cfc3efb1a8532c5c8e0d15f250ae6efce..3475db92a14f56d6f7d88ba925daba24261eccbc 100644 (file)
@@ -26,6 +26,7 @@ class MarketplaceOrderStatusTypes extends \yii\db\ActiveRecord
             [
                 'class' => TimestampBehavior::class,
                 'createdAtAttribute' => 'created_at',
+                'updatedAtAttribute' => false,
                 'value' => new Expression('NOW()'),
             ],
         ];
index f39bf1d8d57e68d361eee173b5df9614ee004551..fb5c079d08b0b6e75ee45de287257f728310dacc 100644 (file)
@@ -1196,6 +1196,20 @@ class MarketplaceService
                     $marketplaceOrder->raw_data = $newRawData;
                     $marketplaceOrder->status_1c = MarketplaceOrders::STATUSES_1C_CREATED_IN_ERP;
 
+                    // Логика отмены для Яндекс.Маркета: если заказ получен уже отмененным
+                    if ($statusCode === 'CANCELLED') {
+                        $cancelledStatusId = $statuses[MarketplaceOrderStatusTypes::CANSELLED_CODE] ?? null;
+                        if ($cancelledStatusId) {
+                            $status1cWithCancelledId = ArrayHelper::getColumn(MarketplaceOrder1cStatuses::find()
+                                ->where(['order_status_id' => $cancelledStatusId])
+                                ->andWhere(['marketplace_id' => 2])
+                                ->asArray()
+                                ->all(), 'id')[0] ?? null;
+                            $marketplaceOrder->cancelled_order_source = 'Yandex Market';
+                            $marketplaceOrder->status_processing_1c = $status1cWithCancelledId;
+                            $marketplaceOrder->cancelled_order_date = date('Y-m-d H:i:s');
+                        }
+                    }
 
                     if ($marketplaceOrder->save()) {
                         self::sendMessageToTelegram($marketplaceOrder->guid, "Новый заказ из ЯМ");
@@ -1348,7 +1362,21 @@ class MarketplaceService
                             )
                         );
                     }
-                } else {
+                    } else {
+                        // Логика отмены для ЯндексМаркета: если статус обновлен на отмену
+                        if ($statusCode === 'CANCELLED' && $marketplaceOrder) {
+                            $cancelledStatusId = $statuses[MarketplaceOrderStatusTypes::CANSELLED_CODE] ?? null;
+                            if ($cancelledStatusId) {
+                                $status1cWithCancelledId = ArrayHelper::getColumn(MarketplaceOrder1cStatuses::find()
+                                    ->where(['order_status_id' => $cancelledStatusId])
+                                    ->andWhere(['marketplace_id' => 2])
+                                    ->asArray()
+                                    ->all(), 'id')[0] ?? null;
+                                $marketplaceOrder->cancelled_order_source = 'Yandex Market';
+                                $marketplaceOrder->status_processing_1c = $status1cWithCancelledId;
+                                $marketplaceOrder->cancelled_order_date = date('Y-m-d H:i:s');
+                            }
+                        }
                     // создание чеков
                     if ($marketplaceOrder->status->code == 'DELIVERED' &&
                         $marketplaceOrder->substatus->code == 'DELIVERY_SERVICE_DELIVERED' &&
@@ -1546,6 +1574,22 @@ class MarketplaceService
                             $marketplaceOrder->save();
                             $updatedOrdersCount += 1;
                         }
+
+                        // Логика отмены для ЯндексМаркета: если статус обновлен на отмену
+                        if ($statusCode === 'CANCELLED' && $marketplaceOrder) {
+                            $cancelledStatusId = $statuses[MarketplaceOrderStatusTypes::CANSELLED_CODE] ?? null;
+                            if ($cancelledStatusId) {
+                                $status1cWithCancelledId = ArrayHelper::getColumn(MarketplaceOrder1cStatuses::find()
+                                    ->where(['order_status_id' => $cancelledStatusId])
+                                    ->andWhere(['marketplace_id' => 2])
+                                    ->asArray()
+                                    ->all(), 'id')[0] ?? null;
+                                $marketplaceOrder->cancelled_order_source = 'Yandex Market';
+                                $marketplaceOrder->status_processing_1c = $status1cWithCancelledId;
+                                $marketplaceOrder->cancelled_order_date = date('Y-m-d H:i:s');
+                            }
+                        }
+
                         if (!$marketplaceOrder->delivery_to && $marketplaceOrder->readyto_1c === 0) {
                             $delivery = $order->getDelivery();
                             $shipments = $delivery->getShipments();
@@ -1956,12 +2000,13 @@ class MarketplaceService
                 ->indexBy('code')
                 ->asArray()
                 ->all();
-            $cancelledStatusId = $statuses[MarketplaceOrderStatusTypes::CANSELLED_CODE]['id'];
+            $statuses = ArrayHelper::map($statuses, 'code', 'id');
+            $cancelledStatusId = $statuses[MarketplaceOrderStatusTypes::CANSELLED_CODE];
             $status1cWithCancelledId = ArrayHelper::getColumn(MarketplaceOrder1cStatuses::find()
                 ->where(['order_status_id' => $cancelledStatusId])
                 ->andWhere(['marketplace_id' => 1])
                 ->asArray()
-                ->all(), 'id');
+                ->all(), 'id')[0] ?? null;;
             $order = self::getOrdersDataFromMessage($message);
 
                 if ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_NEW]) {
@@ -1990,14 +2035,7 @@ class MarketplaceService
                     $isCheckCreated = self::createCheckForMarketplaceOrder($marketplaceOrder);
                 }
             if ($statusCode == MarketplaceOrderStatusTypes::CANSELLED_CODE && $substatusCode == 'USER_CHANGED_MIND' && $marketplaceOrder) {
-                Yii::error('Заказ ' . $marketplaceOrder->marketplace_order_id);
-                /* @var $marketplaceOrder MarketplaceOrders */
-                $marketplaceOrder->cancelled_order_source = 'Flowwow';
-                $marketplaceOrder->status_processing_1c = $status1cWithCancelledId;
-                $marketplaceOrder->cancelled_order_date = date('Y-m-d H:m:s');
-                if (!$marketplaceOrder->save()) {
-                    Yii::error('Метки отмены заказа не проставлены ' . $marketplaceOrder->marketplace_order_id);
-                }
+                self::cancelFlowwowOrder($marketplaceOrder, $status1cWithCancelledId, true);
             }
         }
         return $count;
@@ -2334,11 +2372,6 @@ class MarketplaceService
                 }
             } else {
                 // отмена или успешное выполнение
-                if ($index == self::SUBJECT_INDEX[self::SUBJECT_CANCELLED]) {
-                    /** @var $marketplaceOrder MarketplaceOrders */
-                    $marketplaceOrder->cancelled_order_source = 'Flowwow';
-                    $marketplaceOrder->cancelled_order_date = date('Y-m-d H:m:s');
-                }
                 if ($marketplaceOrder->save()) {
                     self::createOrUpdateStatusHistory($marketplaceOrder->id, $statusId, $substatusId, $orderDetails);
                 } else {
@@ -2352,6 +2385,38 @@ class MarketplaceService
         return $newOrdersCount;
     }
 
+    /**
+     * Обработка отмены заказа Flowwow
+     *
+     * @param MarketplaceOrders $marketplaceOrder
+     * @param int|null $status1cWithCancelledId
+     * @param bool $logError
+     * @return bool
+     */
+    private static function cancelFlowwowOrder($marketplaceOrder, $status1cWithCancelledId = null, $logError = false)
+    {
+        /** @var $marketplaceOrder MarketplaceOrders */
+        $marketplaceOrder->cancelled_order_source = 'Flowwow';
+        $marketplaceOrder->cancelled_order_date = date('Y-m-d H:i:s');
+
+        if ($status1cWithCancelledId !== null) {
+            $marketplaceOrder->status_processing_1c = $status1cWithCancelledId;
+        }
+
+        if ($logError) {
+            Yii::error('Заказ ' . $marketplaceOrder->marketplace_order_id);
+        }
+
+        if (!$marketplaceOrder->save()) {
+            if ($logError) {
+                Yii::error('Метки отмены заказа не проставлены ' . $marketplaceOrder->marketplace_order_id);
+            }
+            return false;
+        }
+
+        return true;
+    }
+
     public static function getOrCreateStatus($statusCode, &$statuses, &$statusCodes)
     {
         if (!in_array($statusCode, $statusCodes)) {