]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Перенос в сервис
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 24 Feb 2025 10:40:39 +0000 (13:40 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 24 Feb 2025 10:40:39 +0000 (13:40 +0300)
erp24/api2/controllers/YandexMarketController.php
erp24/services/MarketplaceService.php

index 4cc49aa64e0d4b5ef583957a588e93762690fb46..0facd9430f0a2c938c4615d97613e79be93483e2 100644 (file)
@@ -180,6 +180,8 @@ class YandexMarketController extends Controller
     {
         Yii::$app->response->format = Response::FORMAT_JSON;
         $request = Yii::$app->request;
+
+        // Если переданы тестовые данные в теле запроса, десериализуем и обрабатываем их
         $body = $request->getRawBody();
         if (!empty($body)) {
             $content = json_decode($body, false, 512, JSON_THROW_ON_ERROR);
@@ -187,430 +189,34 @@ class YandexMarketController extends Controller
             $testData = ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\GetOrdersResponse', []);
             if (!empty($testData) && isset($testData['orders'])) {
                 $ordersData[$testCampaignId] = $testData['orders'];
-                $result = $this->processOrders($ordersData);
-                return ['response' => 'OK (test data)', 'storeCount' => count($ordersData), 'result' => $result];
+                $result = MarketplaceService::processOrders($ordersData);
+                return [
+                    'response' => 'OK (test data)',
+                    'storeCount' => count($ordersData),
+                    'result' => $result
+                ];
             }
         }
 
         $fromDate = $request->get('from_date', date('d-m-Y'));
-        $toDate = $request->get('to_date', null);
-
-        $status = $request->get('status', null);
+        $toDate   = $request->get('to_date', null);
+        $status   = $request->get('status', null);
         $substatus = $request->get('substatus', null);
 
+        $campaignIds = MarketplaceStore::find()
+            ->select(['warehouse_guid'])
+            ->where(['warehouse_id' => 2])
+            ->column();
 
-            $campaignIds = MarketplaceStore::find()
-                ->select(['warehouse_guid'])
-                ->where(['warehouse_id' => 2])
-                ->column();
-
-        $config = Configuration::getDefaultConfiguration()
-            ->setApiKey('Api-Key', Yii::$app->params['YANDEX_MARKET_API_KEY']);
-        $apiInstance = new Api\OrdersApi(new GuzzleHttp\Client(), $config);
-
-        $allOrders = [];
+        $allOrders = MarketplaceService::fetchOrders($campaignIds, $status, $substatus, $fromDate, $toDate);
 
-        foreach ($campaignIds as $campaignId) {
-            $currentPage = 1;
-            $hasMore = true;
-            while ($hasMore) {
-                $result = $apiInstance->getOrdersWithHttpInfo(
-                    $campaignId,
-                    null,
-                    $status,                // строка, например, "DELIVERED"
-                    $substatus,             // строка, например, "CANCELLED"
-                    $fromDate,
-                    $toDate,
-                    null,
-                    null,
-                    null,
-                    null,
-                    null,
-                    null,
-                    null,
-                    null,
-                    null,
-                    null,
-                    null,
-                    null,
-                    null,
-                    null,
-
-                );
-                $pager = $result[0]->getPager();
-                if (empty($pager->getTotal())) {
-                    break;
-                }
-                $orders = $result[0]->getOrders();
-                if (!isset($allOrders[$campaignId]) || empty($allOrders[$campaignId])) {
-                    $allOrders[$campaignId] = $orders;
-                } else {
-                    $allOrders[$campaignId] = array_merge($allOrders[$campaignId], $orders);
-                }
-
-                $pager = $result[0]->getPager();
-                if ($pager && $pager->getPagesCount() > $currentPage) {
-                    $currentPage++;
-                    $hasMore = true;
-                } else {
-                    $hasMore = false;
-                }
-            }
-        }
-        //var_dump($allOrders);die();
-        $result = $this->processOrders($allOrders);
+        $result = MarketplaceService::processOrders($allOrders);
 
-        return ['response' => 'OK', 'storeCount' => count($allOrders), 'result' => $result];
+        return [
+            'response'   => 'OK',
+            'storeCount' => count($allOrders),
+            'result'     => $result
+        ];
     }
 
-    protected function processOrders(array $allOrders)
-    {
-        $statuses = MarketplaceOrderStatusTypes::find()
-            ->select(['id', 'code'])
-            ->indexBy('code')
-            ->asArray()
-            ->all();
-        $statuses = ArrayHelper::map($statuses, 'code', 'id');
-        $statusCodes = array_unique(array_keys($statuses));
-        $newOrdersCount = 0;
-        $updatedOrdersCount = 0;
-        foreach ($allOrders as $campaignId => $orders) {
-            foreach ($orders as $order) {
-                $statusCode = $order->getStatus();
-                $substatusCode = $order->getSubstatus();
-
-                if (!in_array($statusCode, $statusCodes)) {
-                    $newStatus = new MarketplaceOrderStatusTypes();
-                    $newStatus->code = $statusCode;
-                    if ($newStatus->save()) {
-                        $statusId = $newStatus->id;
-                        $statusCodes[] = $statusCode;
-                        $statuses[$statusCode] = $newStatus->id;
-                    } else {
-                        Yii::error(
-                            'Ошибка сохранения статуса: ' . json_encode(
-                                $newStatus->getErrors(),
-                                JSON_UNESCAPED_UNICODE
-                            )
-                        );
-                        $statusId = null;
-                    }
-                } else {
-                    $statusId = $statuses[$statusCode];
-                }
-
-                if (!in_array($substatusCode, $statusCodes)) {
-                    $newSubstatus = new MarketplaceOrderStatusTypes();
-                    $newSubstatus->code = $substatusCode;
-                    if ($newSubstatus->save()) {
-                        $substatusId = $newSubstatus->id;
-                        $statusCodes[] = $substatusCode;
-                        $statuses[$substatusCode] = $newSubstatus->id;
-                    } else {
-                        Yii::error(
-                            'Ошибка сохранения подстатуса: ' . json_encode(
-                                $newSubstatus->getErrors(),
-                                JSON_UNESCAPED_UNICODE
-                            )
-                        );
-                        $substatusId = null;
-                    }
-                } else {
-                    $substatusId = $statuses[$substatusCode];
-                }
-
-                $newRawData = json_encode($order);
-                $marketplaceOrder = MarketplaceOrders::find()
-                    ->where(['marketplace_order_id' => (string)$order->getId()])
-                    ->one();
-
-                if (!$marketplaceOrder) {
-                    // Создание нового заказа
-                    $marketplaceOrder = new MarketplaceOrders();
-                    $marketplaceOrder->marketplace_order_id = (string)$order->getId();
-                    $marketplaceOrder->creation_date = date('Y-m-d H:i:s', strtotime($order->getCreationDate()));
-                    $marketplaceOrder->updated_at = date('Y-m-d H:i:s', strtotime($order->getUpdatedAt()));
-                    $marketplaceOrder->total = $order->getBuyerTotal();
-                    $marketplaceOrder->delivery_total = $order->getDeliveryTotal();
-                    $marketplaceOrder->buyer_total_before_discount = $order->getBuyerTotalBeforeDiscount();
-                    $marketplaceOrder->tax_system = $order->getTaxSystem();
-                    $marketplaceOrder->payment_type = $order->getPaymentType();
-                    $marketplaceOrder->payment_method = $order->getPaymentMethod();
-                    $marketplaceOrder->cancel_requested = (int)$order->getCancelRequested();
-
-                    $warehouseGuid = (string)$campaignId;
-                    if ($warehouseGuid) {
-                        $store = MarketplaceStore::findOne(['warehouse_guid' => $warehouseGuid]);
-                        $marketplaceOrder->store_id = $store ? $store->store_id : null;
-                        $marketplaceOrder->warehouse_guid = $warehouseGuid;
-                    }
-
-                    $marketplaceOrder->status_id = (int)$statusId;
-                    $marketplaceOrder->substatus_id = (int)$substatusId;
-                    $marketplaceOrder->raw_data = $newRawData;
-
-                    if ($marketplaceOrder->save()) {
-                        $newOrdersCount += 1;
-                        // Создаем запись истории статусов
-                        $newStatusHistoryRecord = new MarketplaceOrderStatusHistory();
-                        $newStatusHistoryRecord->order_id = $marketplaceOrder->id;
-                        $newStatusHistoryRecord->status_id = (int)$statusId;
-                        $newStatusHistoryRecord->substatus_id = (int)$substatusId;
-                        $newStatusHistoryRecord->active = 1;
-                        $newStatusHistoryRecord->initiator = "ERP";
-                        $newStatusHistoryRecord->date_from = date('Y-m-d H:i:s');
-                        $newStatusHistoryRecord->date_end = '2100-01-01 00:00:00';
-                        if (!$newStatusHistoryRecord->save()) {
-                            Yii::error(
-                                'Ошибка сохранения истории статуса: ' . json_encode(
-                                    $newStatusHistoryRecord->getErrors(),
-                                    JSON_UNESCAPED_UNICODE
-                                )
-                            );
-                        }
-
-                        // Сохраняем данные доставки
-                        $delivery = $order->getDelivery();
-                        if ($delivery) {
-                            $deliveryModel = new MarketplaceOrderDelivery();
-                            $deliveryModel->order_id = $marketplaceOrder->id;
-                            $deliveryModel->type = $delivery->getType();
-                            $deliveryModel->service_name = $delivery->getServiceName();
-                            $deliveryModel->partner_type = $delivery->getDeliveryPartnerType();
-
-                            $address = $delivery->getAddress();
-                            if ($address) {
-                                $deliveryModel->country = $address->getCountry();
-                                $deliveryModel->postcode = $address->getPostcode();
-                                $deliveryModel->city = $address->getCity();
-                                $deliveryModel->street = $address->getStreet();
-                                $deliveryModel->house = $address->getHouse();
-                                $deliveryModel->apartment = $address->getApartment();
-                                $gps = $address->getGps();
-                                if ($gps) {
-                                    $deliveryModel->latitude = $gps->getLatitude();
-                                    $deliveryModel->longitude = $gps->getLongitude();
-                                }
-                            }
-                            $dates = $delivery->getDates();
-                            if ($dates) {
-                                $deliveryModel->delivery_start = date(
-                                    'Y-m-d H:i:s',
-                                    strtotime($dates->getFromDate() . ' ' . $dates->getFromTime())
-                                );
-                                $deliveryModel->delivery_end = date(
-                                    'Y-m-d H:i:s',
-                                    strtotime($dates->getToDate() . ' ' . $dates->getToTime())
-                                );
-                            }
-                            $courier = $delivery->getCourier();
-                            if ($courier) {
-                                $deliveryModel->courier_full_name = $courier->getFullName();
-                                $deliveryModel->courier_phone = $courier->getPhone();
-                                $deliveryModel->courier_extension = $courier->getPhoneExtension();
-                                $deliveryModel->courier_vehicle_number = $courier->getVehicleNumber();
-                                $deliveryModel->courier_vehicle_description = $courier->getVehicleDescription();
-                            }
-                            if (!$deliveryModel->save()) {
-                                Yii::error(
-                                    'Ошибка сохранения доставки: ' . json_encode(
-                                        $deliveryModel->getErrors(),
-                                        JSON_UNESCAPED_UNICODE
-                                    )
-                                );
-                            }
-                        }
-
-                        // Сохраняем позиции заказа
-                        $items = $order->getItems();
-                        if (!empty($items)) {
-                            foreach ($items as $item) {
-                                $orderItem = new MarketplaceOrderItems();
-                                $orderItem->order_id = $marketplaceOrder->id;
-                                $orderItem->external_item_id = $item->getId();
-                                $orderItem->offer_id = $item->getOfferId();
-                                $orderItem->offer_name = $item->getOfferName();
-                                $orderItem->price = $item->getPrice();
-                                $orderItem->buyer_price = $item->getBuyerPrice();
-                                $orderItem->buyer_price_before_discount = $item->getBuyerPriceBeforeDiscount();
-                                $orderItem->price_before_discount = $item->getPriceBeforeDiscount();
-                                $orderItem->count = $item->getCount();
-                                $orderItem->vat = $item->getVat();
-                                $orderItem->shop_sku = $item->getShopSku();
-                                $orderItem->subsidy = $item->getSubsidy();
-                                $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId();
-                                $orderItem->promos = json_encode($item->getPromos());
-                                $orderItem->subsidies = json_encode($item->getSubsidies());
-
-                                if (!$orderItem->save()) {
-                                    Yii::error(
-                                        'Ошибка сохранения элемента заказа: ' . json_encode(
-                                            $orderItem->getErrors(),
-                                            JSON_UNESCAPED_UNICODE
-                                        )
-                                    );
-                                }
-                            }
-                        }
-                    } else {
-                        Yii::error(
-                            'Ошибка сохранения заказа: ' . json_encode(
-                                $marketplaceOrder->getErrors(),
-                                JSON_UNESCAPED_UNICODE
-                            )
-                        );
-                    }
-                } else {
-                    // Обновление существующего заказа, если данные изменились
-                    if ($newRawData !== $marketplaceOrder->raw_data) {
-                        $marketplaceOrder->updated_at = date('Y-m-d H:i:s', strtotime($order->getUpdatedAt()));
-                        $marketplaceOrder->total = $order->getBuyerTotal();
-                        $marketplaceOrder->delivery_total = $order->getDeliveryTotal();
-                        $marketplaceOrder->buyer_total_before_discount = $order->getBuyerTotalBeforeDiscount();
-                        $marketplaceOrder->tax_system = $order->getTaxSystem();
-                        $marketplaceOrder->payment_type = $order->getPaymentType();
-                        $marketplaceOrder->payment_method = $order->getPaymentMethod();
-                        $marketplaceOrder->cancel_requested = (int)$order->getCancelRequested();
-                        $marketplaceOrder->raw_data = $newRawData;
-                        $marketplaceOrder->status_id = (int)$statusId;
-                        $marketplaceOrder->substatus_id = (int)$substatusId;
-                        $marketplaceOrder->updated_at = date('Y-m-d H:i:s', strtotime($order->getUpdatedAt()));
-                        $marketplaceOrder->save();
-                        $updatedOrdersCount += 1;
-                        // Обновление истории статусов, если изменился статус
-                        $statusHistoryRecord = MarketplaceOrderStatusHistory::find()->where(['order_id' => $marketplaceOrder->id])->one();
-                        if (
-                            $statusHistoryRecord &&
-                            ($statusHistoryRecord->status_id !== (int)$statusId ||
-                             $statusHistoryRecord->substatus_id !== (int)$substatusId)
-                        ) {
-                            $statusHistoryRecord->active = 0;
-                            $statusHistoryRecord->date_to = date('Y-m-d H:i:s');
-                            $statusHistoryRecord->save();
-
-                            $newStatusHistoryRecord = new MarketplaceOrderStatusHistory();
-                            $newStatusHistoryRecord->order_id = $marketplaceOrder->id;
-                            $newStatusHistoryRecord->status_id = (int)$statusId;
-                            $newStatusHistoryRecord->substatus_id = (int)$substatusId;
-                            $newStatusHistoryRecord->active = 1;
-                            $newStatusHistoryRecord->initiator = "ERP";
-                            $newStatusHistoryRecord->date_from = date('Y-m-d H:i:s');
-                            $newStatusHistoryRecord->date_end = date('Y-m-d H:i:s', strtotime("2100-01-01"));
-                            if (!$newStatusHistoryRecord->save()) {
-                                Yii::error(
-                                    'Ошибка сохранения новой истории статуса: ' . json_encode(
-                                        $newStatusHistoryRecord->getErrors(),
-                                        JSON_UNESCAPED_UNICODE
-                                    )
-                                );
-                            }
-                        }
-
-                        // Обновление позиций заказа
-                        $newItems = $order->getItems();
-                        $existingItems = MarketplaceOrderItems::find()
-                            ->where(['order_id' => $marketplaceOrder->id])
-                            ->all();
-                        if (count($existingItems) !== count($newItems)) {
-                            MarketplaceOrderItems::deleteAll(['order_id' => $marketplaceOrder->id]);
-                            foreach ($newItems as $item) {
-                                $orderItem = new MarketplaceOrderItems();
-                                $orderItem->order_id = $marketplaceOrder->id;
-                                $orderItem->external_item_id = $item->getId();
-                                $orderItem->offer_id = $item->getOfferId();
-                                $orderItem->offer_name = $item->getOfferName();
-                                $orderItem->price = $item->getPrice();
-                                $orderItem->buyer_price = $item->getBuyerPrice();
-                                $orderItem->buyer_price_before_discount = $item->getBuyerPriceBeforeDiscount();
-                                $orderItem->price_before_discount = $item->getPriceBeforeDiscount();
-                                $orderItem->count = $item->getCount();
-                                $orderItem->vat = $item->getVat();
-                                $orderItem->shop_sku = $item->getShopSku();
-                                $orderItem->subsidy = $item->getSubsidy();
-                                $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId();
-                                $orderItem->promos = json_encode($item->getPromos());
-                                $orderItem->subsidies = json_encode($item->getSubsidies());
-
-                                if (!$orderItem->save()) {
-                                    Yii::error(
-                                        'Ошибка сохранения элемента заказа: ' . json_encode(
-                                            $orderItem->getErrors(),
-                                            JSON_UNESCAPED_UNICODE
-                                        )
-                                    );
-                                }
-                            }
-                        } else {
-                            foreach ($newItems as $item) {
-                                $orderItem = MarketplaceOrderItems::findOne([
-                                    'order_id' => $marketplaceOrder->id,
-                                    'external_item_id' => $item->getId()
-                                ]);
-                                if ($orderItem) {
-                                    $updateNeeded = false;
-                                    $fields = [
-                                        'offer_id' => $item->getOfferId(),
-                                        'offer_name' => $item->getOfferName(),
-                                        'price' => $item->getPrice(),
-                                        'buyer_price' => $item->getBuyerPrice(),
-                                        'buyer_price_before_discount' => $item->getBuyerPriceBeforeDiscount(),
-                                        'price_before_discount' => $item->getPriceBeforeDiscount(),
-                                        'count' => $item->getCount(),
-                                        'vat' => $item->getVat(),
-                                        'shop_sku' => $item->getShopSku(),
-                                        'subsidy' => $item->getSubsidy(),
-                                        'partner_warehouse_id' => $item->getPartnerWarehouseId(),
-                                        'promos' => json_encode($item->getPromos()),
-                                        'subsidies' => json_encode($item->getSubsidies()),
-                                    ];
-
-                                    foreach ($fields as $attr => $value) {
-                                        if ($orderItem->$attr != $value) {
-                                            $orderItem->$attr = $value;
-                                            $updateNeeded = true;
-                                        }
-                                    }
-                                    if ($updateNeeded && !$orderItem->save()) {
-                                        Yii::error(
-                                            'Ошибка обновления элемента заказа: ' . json_encode(
-                                                $orderItem->getErrors(),
-                                                JSON_UNESCAPED_UNICODE
-                                            )
-                                        );
-                                    }
-                                } else {
-                                    $orderItem = new MarketplaceOrderItems();
-                                    $orderItem->order_id = $marketplaceOrder->id;
-                                    $orderItem->external_item_id = $item->getId();
-                                    $orderItem->offer_id = $item->getOfferId();
-                                    $orderItem->offer_name = $item->getOfferName();
-                                    $orderItem->price = $item->getPrice();
-                                    $orderItem->buyer_price = $item->getBuyerPrice();
-                                    $orderItem->buyer_price_before_discount = $item->getBuyerPriceBeforeDiscount();
-                                    $orderItem->price_before_discount = $item->getPriceBeforeDiscount();
-                                    $orderItem->count = $item->getCount();
-                                    $orderItem->vat = $item->getVat();
-                                    $orderItem->shop_sku = $item->getShopSku();
-                                    $orderItem->subsidy = $item->getSubsidy();
-                                    $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId();
-                                    $orderItem->promos = json_encode($item->getPromos());
-                                    $orderItem->subsidies = json_encode($item->getSubsidies());
-
-                                    if (!$orderItem->save()) {
-                                        Yii::error(
-                                            'Ошибка сохранения нового элемента заказа: ' . json_encode(
-                                                $orderItem->getErrors(),
-                                                JSON_UNESCAPED_UNICODE
-                                            )
-                                        );
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return ['newOrders' => $newOrdersCount, 'updateOrders' => $updatedOrdersCount];
-    }
 }
index 9c9f5a4a904d6151290fda04281c254d71f7264d..74c50c232f784d35d55cd3558a842a050871643c 100644 (file)
@@ -2,12 +2,20 @@
 
 namespace yii_app\services;
 
+use GuzzleHttp\Client;
+use OpenAPI\Client\Api\OrdersApi;
+use OpenAPI\Client\Configuration;
 use Yii;
 use yii\helpers\ArrayHelper;
 use yii\helpers\Json;
 use yii_app\helpers\File;
 use yii_app\records\Balances;
 use yii_app\records\Images;
+use yii_app\records\MarketplaceOrderDelivery;
+use yii_app\records\MarketplaceOrderItems;
+use yii_app\records\MarketplaceOrders;
+use yii_app\records\MarketplaceOrderStatusHistory;
+use yii_app\records\MarketplaceOrderStatusTypes;
 use yii_app\records\MarketplacePriority;
 use yii_app\records\MarketplaceStore;
 use yii_app\records\MatrixErpMedia;
@@ -800,7 +808,413 @@ class MarketplaceService
 
         ];
     }
+    /**
+     * Получает данные о заказах для указанных кампаний с учетом фильтров.
+     *
+     * @param array       $campaignIds Массив идентификаторов кампаний (warehouse_guid).
+     * @param string|null $status      Фильтр по статусу заказа (например, "DELIVERED").
+     * @param string|null $substatus   Фильтр по подстатусу заказа (например, "CANCELLED").
+     * @param string      $fromDate    Начальная дата в формате "дд-мм-гггг".
+     * @param string|null $toDate      Конечная дата в формате "дд-мм-гггг".
+     *
+     * @return array Массив заказов, сгруппированных по кампании.
+     */
+    public static function fetchOrders(array $campaignIds, $status = null, $substatus = null, $fromDate, $toDate)
+    {
+        $config = Configuration::getDefaultConfiguration()
+            ->setApiKey('Api-Key', Yii::$app->params['YANDEX_MARKET_API_KEY']);
+        $apiInstance = new OrdersApi(new Client(), $config);
+
+        $allOrders = [];
+
+        foreach ($campaignIds as $campaignId) {
+            $currentPage = 1;
+            $hasMore = true;
+            while ($hasMore) {
+                $result = $apiInstance->getOrdersWithHttpInfo(
+                    $campaignId,
+                    null,       // order_ids
+                    $status,    // статус заказа
+                    $substatus, // подстатус заказа
+                    $fromDate,
+                    $toDate,
+                    null, null, null, null, null, null, null, null, null, null, null, null, null, null
+                );
+
+                $pager = $result[0]->getPager();
+                if (empty($pager->getTotal())) {
+                    break;
+                }
+
+                $orders = $result[0]->getOrders();
+                if (!isset($allOrders[$campaignId]) || empty($allOrders[$campaignId])) {
+                    $allOrders[$campaignId] = $orders;
+                } else {
+                    $allOrders[$campaignId] = array_merge($allOrders[$campaignId], $orders);
+                }
+
+                if ($pager && $pager->getPagesCount() > $currentPage) {
+                    $currentPage++;
+                    $hasMore = true;
+                } else {
+                    $hasMore = false;
+                }
+            }
+        }
+
+        return $allOrders;
+    }
+
+    public static function processOrders(array $allOrders)
+    {
+        $statuses = MarketplaceOrderStatusTypes::find()
+            ->select(['id', 'code'])
+            ->indexBy('code')
+            ->asArray()
+            ->all();
+        $statuses = ArrayHelper::map($statuses, 'code', 'id');
+        $statusCodes = array_unique(array_keys($statuses));
+        $newOrdersCount = 0;
+        $updatedOrdersCount = 0;
+        foreach ($allOrders as $campaignId => $orders) {
+            foreach ($orders as $order) {
+                $statusCode = $order->getStatus();
+                $substatusCode = $order->getSubstatus();
+
+                if (!in_array($statusCode, $statusCodes)) {
+                    $newStatus = new MarketplaceOrderStatusTypes();
+                    $newStatus->code = $statusCode;
+                    if ($newStatus->save()) {
+                        $statusId = $newStatus->id;
+                        $statusCodes[] = $statusCode;
+                        $statuses[$statusCode] = $newStatus->id;
+                    } else {
+                        Yii::error(
+                            'Ошибка сохранения статуса: ' . json_encode(
+                                $newStatus->getErrors(),
+                                JSON_UNESCAPED_UNICODE
+                            )
+                        );
+                        $statusId = null;
+                    }
+                } else {
+                    $statusId = $statuses[$statusCode];
+                }
+
+                if (!in_array($substatusCode, $statusCodes)) {
+                    $newSubstatus = new MarketplaceOrderStatusTypes();
+                    $newSubstatus->code = $substatusCode;
+                    if ($newSubstatus->save()) {
+                        $substatusId = $newSubstatus->id;
+                        $statusCodes[] = $substatusCode;
+                        $statuses[$substatusCode] = $newSubstatus->id;
+                    } else {
+                        Yii::error(
+                            'Ошибка сохранения подстатуса: ' . json_encode(
+                                $newSubstatus->getErrors(),
+                                JSON_UNESCAPED_UNICODE
+                            )
+                        );
+                        $substatusId = null;
+                    }
+                } else {
+                    $substatusId = $statuses[$substatusCode];
+                }
 
+                $newRawData = json_encode($order);
+                $marketplaceOrder = MarketplaceOrders::find()
+                    ->where(['marketplace_order_id' => (string)$order->getId()])
+                    ->one();
+
+                if (!$marketplaceOrder) {
+                    // Создание нового заказа
+                    $marketplaceOrder = new MarketplaceOrders();
+                    $marketplaceOrder->marketplace_order_id = (string)$order->getId();
+                    $marketplaceOrder->creation_date = date('Y-m-d H:i:s', strtotime($order->getCreationDate()));
+                    $marketplaceOrder->updated_at = date('Y-m-d H:i:s', strtotime($order->getUpdatedAt()));
+                    $marketplaceOrder->total = $order->getBuyerTotal();
+                    $marketplaceOrder->delivery_total = $order->getDeliveryTotal();
+                    $marketplaceOrder->buyer_total_before_discount = $order->getBuyerTotalBeforeDiscount();
+                    $marketplaceOrder->tax_system = $order->getTaxSystem();
+                    $marketplaceOrder->payment_type = $order->getPaymentType();
+                    $marketplaceOrder->payment_method = $order->getPaymentMethod();
+                    $marketplaceOrder->cancel_requested = (int)$order->getCancelRequested();
+
+                    $warehouseGuid = (string)$campaignId;
+                    if ($warehouseGuid) {
+                        $store = MarketplaceStore::findOne(['warehouse_guid' => $warehouseGuid]);
+                        $marketplaceOrder->store_id = $store ? $store->store_id : null;
+                        $marketplaceOrder->warehouse_guid = $warehouseGuid;
+                    }
+
+                    $marketplaceOrder->status_id = (int)$statusId;
+                    $marketplaceOrder->substatus_id = (int)$substatusId;
+                    $marketplaceOrder->raw_data = $newRawData;
+
+                    if ($marketplaceOrder->save()) {
+                        $newOrdersCount += 1;
+                        // Создаем запись истории статусов
+                        $newStatusHistoryRecord = new MarketplaceOrderStatusHistory();
+                        $newStatusHistoryRecord->order_id = $marketplaceOrder->id;
+                        $newStatusHistoryRecord->status_id = (int)$statusId;
+                        $newStatusHistoryRecord->substatus_id = (int)$substatusId;
+                        $newStatusHistoryRecord->active = 1;
+                        $newStatusHistoryRecord->initiator = "ERP";
+                        $newStatusHistoryRecord->date_from = date('Y-m-d H:i:s');
+                        $newStatusHistoryRecord->date_end = '2100-01-01 00:00:00';
+                        if (!$newStatusHistoryRecord->save()) {
+                            Yii::error(
+                                'Ошибка сохранения истории статуса: ' . json_encode(
+                                    $newStatusHistoryRecord->getErrors(),
+                                    JSON_UNESCAPED_UNICODE
+                                )
+                            );
+                        }
+
+                        // Сохраняем данные доставки
+                        $delivery = $order->getDelivery();
+                        if ($delivery) {
+                            $deliveryModel = new MarketplaceOrderDelivery();
+                            $deliveryModel->order_id = $marketplaceOrder->id;
+                            $deliveryModel->type = $delivery->getType();
+                            $deliveryModel->service_name = $delivery->getServiceName();
+                            $deliveryModel->partner_type = $delivery->getDeliveryPartnerType();
+
+                            $address = $delivery->getAddress();
+                            if ($address) {
+                                $deliveryModel->country = $address->getCountry();
+                                $deliveryModel->postcode = $address->getPostcode();
+                                $deliveryModel->city = $address->getCity();
+                                $deliveryModel->street = $address->getStreet();
+                                $deliveryModel->house = $address->getHouse();
+                                $deliveryModel->apartment = $address->getApartment();
+                                $gps = $address->getGps();
+                                if ($gps) {
+                                    $deliveryModel->latitude = $gps->getLatitude();
+                                    $deliveryModel->longitude = $gps->getLongitude();
+                                }
+                            }
+                            $dates = $delivery->getDates();
+                            if ($dates) {
+                                $deliveryModel->delivery_start = date(
+                                    'Y-m-d H:i:s',
+                                    strtotime($dates->getFromDate() . ' ' . $dates->getFromTime())
+                                );
+                                $deliveryModel->delivery_end = date(
+                                    'Y-m-d H:i:s',
+                                    strtotime($dates->getToDate() . ' ' . $dates->getToTime())
+                                );
+                            }
+                            $courier = $delivery->getCourier();
+                            if ($courier) {
+                                $deliveryModel->courier_full_name = $courier->getFullName();
+                                $deliveryModel->courier_phone = $courier->getPhone();
+                                $deliveryModel->courier_extension = $courier->getPhoneExtension();
+                                $deliveryModel->courier_vehicle_number = $courier->getVehicleNumber();
+                                $deliveryModel->courier_vehicle_description = $courier->getVehicleDescription();
+                            }
+                            if (!$deliveryModel->save()) {
+                                Yii::error(
+                                    'Ошибка сохранения доставки: ' . json_encode(
+                                        $deliveryModel->getErrors(),
+                                        JSON_UNESCAPED_UNICODE
+                                    )
+                                );
+                            }
+                        }
+
+                        // Сохраняем позиции заказа
+                        $items = $order->getItems();
+                        if (!empty($items)) {
+                            foreach ($items as $item) {
+                                $orderItem = new MarketplaceOrderItems();
+                                $orderItem->order_id = $marketplaceOrder->id;
+                                $orderItem->external_item_id = $item->getId();
+                                $orderItem->offer_id = $item->getOfferId();
+                                $orderItem->offer_name = $item->getOfferName();
+                                $orderItem->price = $item->getPrice();
+                                $orderItem->buyer_price = $item->getBuyerPrice();
+                                $orderItem->buyer_price_before_discount = $item->getBuyerPriceBeforeDiscount();
+                                $orderItem->price_before_discount = $item->getPriceBeforeDiscount();
+                                $orderItem->count = $item->getCount();
+                                $orderItem->vat = $item->getVat();
+                                $orderItem->shop_sku = $item->getShopSku();
+                                $orderItem->subsidy = $item->getSubsidy();
+                                $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId();
+                                $orderItem->promos = json_encode($item->getPromos());
+                                $orderItem->subsidies = json_encode($item->getSubsidies());
+
+                                if (!$orderItem->save()) {
+                                    Yii::error(
+                                        'Ошибка сохранения элемента заказа: ' . json_encode(
+                                            $orderItem->getErrors(),
+                                            JSON_UNESCAPED_UNICODE
+                                        )
+                                    );
+                                }
+                            }
+                        }
+                    } else {
+                        Yii::error(
+                            'Ошибка сохранения заказа: ' . json_encode(
+                                $marketplaceOrder->getErrors(),
+                                JSON_UNESCAPED_UNICODE
+                            )
+                        );
+                    }
+                } else {
+                    // Обновление существующего заказа, если данные изменились
+                    if ($newRawData !== $marketplaceOrder->raw_data) {
+                        $marketplaceOrder->updated_at = date('Y-m-d H:i:s', strtotime($order->getUpdatedAt()));
+                        $marketplaceOrder->total = $order->getBuyerTotal();
+                        $marketplaceOrder->delivery_total = $order->getDeliveryTotal();
+                        $marketplaceOrder->buyer_total_before_discount = $order->getBuyerTotalBeforeDiscount();
+                        $marketplaceOrder->tax_system = $order->getTaxSystem();
+                        $marketplaceOrder->payment_type = $order->getPaymentType();
+                        $marketplaceOrder->payment_method = $order->getPaymentMethod();
+                        $marketplaceOrder->cancel_requested = (int)$order->getCancelRequested();
+                        $marketplaceOrder->raw_data = $newRawData;
+                        $marketplaceOrder->status_id = (int)$statusId;
+                        $marketplaceOrder->substatus_id = (int)$substatusId;
+                        $marketplaceOrder->updated_at = date('Y-m-d H:i:s', strtotime($order->getUpdatedAt()));
+                        $marketplaceOrder->save();
+                        $updatedOrdersCount += 1;
+                        // Обновление истории статусов, если изменился статус
+                        $statusHistoryRecord = MarketplaceOrderStatusHistory::find()->where(['order_id' => $marketplaceOrder->id])->one();
+                        if (
+                            $statusHistoryRecord &&
+                            ($statusHistoryRecord->status_id !== (int)$statusId ||
+                                $statusHistoryRecord->substatus_id !== (int)$substatusId)
+                        ) {
+                            $statusHistoryRecord->active = 0;
+                            $statusHistoryRecord->date_to = date('Y-m-d H:i:s');
+                            $statusHistoryRecord->save();
+
+                            $newStatusHistoryRecord = new MarketplaceOrderStatusHistory();
+                            $newStatusHistoryRecord->order_id = $marketplaceOrder->id;
+                            $newStatusHistoryRecord->status_id = (int)$statusId;
+                            $newStatusHistoryRecord->substatus_id = (int)$substatusId;
+                            $newStatusHistoryRecord->active = 1;
+                            $newStatusHistoryRecord->initiator = "ERP";
+                            $newStatusHistoryRecord->date_from = date('Y-m-d H:i:s');
+                            $newStatusHistoryRecord->date_end = date('Y-m-d H:i:s', strtotime("2100-01-01"));
+                            if (!$newStatusHistoryRecord->save()) {
+                                Yii::error(
+                                    'Ошибка сохранения новой истории статуса: ' . json_encode(
+                                        $newStatusHistoryRecord->getErrors(),
+                                        JSON_UNESCAPED_UNICODE
+                                    )
+                                );
+                            }
+                        }
+
+                        // Обновление позиций заказа
+                        $newItems = $order->getItems();
+                        $existingItems = MarketplaceOrderItems::find()
+                            ->where(['order_id' => $marketplaceOrder->id])
+                            ->all();
+                        if (count($existingItems) !== count($newItems)) {
+                            MarketplaceOrderItems::deleteAll(['order_id' => $marketplaceOrder->id]);
+                            foreach ($newItems as $item) {
+                                $orderItem = new MarketplaceOrderItems();
+                                $orderItem->order_id = $marketplaceOrder->id;
+                                $orderItem->external_item_id = $item->getId();
+                                $orderItem->offer_id = $item->getOfferId();
+                                $orderItem->offer_name = $item->getOfferName();
+                                $orderItem->price = $item->getPrice();
+                                $orderItem->buyer_price = $item->getBuyerPrice();
+                                $orderItem->buyer_price_before_discount = $item->getBuyerPriceBeforeDiscount();
+                                $orderItem->price_before_discount = $item->getPriceBeforeDiscount();
+                                $orderItem->count = $item->getCount();
+                                $orderItem->vat = $item->getVat();
+                                $orderItem->shop_sku = $item->getShopSku();
+                                $orderItem->subsidy = $item->getSubsidy();
+                                $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId();
+                                $orderItem->promos = json_encode($item->getPromos());
+                                $orderItem->subsidies = json_encode($item->getSubsidies());
+
+                                if (!$orderItem->save()) {
+                                    Yii::error(
+                                        'Ошибка сохранения элемента заказа: ' . json_encode(
+                                            $orderItem->getErrors(),
+                                            JSON_UNESCAPED_UNICODE
+                                        )
+                                    );
+                                }
+                            }
+                        } else {
+                            foreach ($newItems as $item) {
+                                $orderItem = MarketplaceOrderItems::findOne([
+                                    'order_id' => $marketplaceOrder->id,
+                                    'external_item_id' => $item->getId()
+                                ]);
+                                if ($orderItem) {
+                                    $updateNeeded = false;
+                                    $fields = [
+                                        'offer_id' => $item->getOfferId(),
+                                        'offer_name' => $item->getOfferName(),
+                                        'price' => $item->getPrice(),
+                                        'buyer_price' => $item->getBuyerPrice(),
+                                        'buyer_price_before_discount' => $item->getBuyerPriceBeforeDiscount(),
+                                        'price_before_discount' => $item->getPriceBeforeDiscount(),
+                                        'count' => $item->getCount(),
+                                        'vat' => $item->getVat(),
+                                        'shop_sku' => $item->getShopSku(),
+                                        'subsidy' => $item->getSubsidy(),
+                                        'partner_warehouse_id' => $item->getPartnerWarehouseId(),
+                                        'promos' => json_encode($item->getPromos()),
+                                        'subsidies' => json_encode($item->getSubsidies()),
+                                    ];
+
+                                    foreach ($fields as $attr => $value) {
+                                        if ($orderItem->$attr != $value) {
+                                            $orderItem->$attr = $value;
+                                            $updateNeeded = true;
+                                        }
+                                    }
+                                    if ($updateNeeded && !$orderItem->save()) {
+                                        Yii::error(
+                                            'Ошибка обновления элемента заказа: ' . json_encode(
+                                                $orderItem->getErrors(),
+                                                JSON_UNESCAPED_UNICODE
+                                            )
+                                        );
+                                    }
+                                } else {
+                                    $orderItem = new MarketplaceOrderItems();
+                                    $orderItem->order_id = $marketplaceOrder->id;
+                                    $orderItem->external_item_id = $item->getId();
+                                    $orderItem->offer_id = $item->getOfferId();
+                                    $orderItem->offer_name = $item->getOfferName();
+                                    $orderItem->price = $item->getPrice();
+                                    $orderItem->buyer_price = $item->getBuyerPrice();
+                                    $orderItem->buyer_price_before_discount = $item->getBuyerPriceBeforeDiscount();
+                                    $orderItem->price_before_discount = $item->getPriceBeforeDiscount();
+                                    $orderItem->count = $item->getCount();
+                                    $orderItem->vat = $item->getVat();
+                                    $orderItem->shop_sku = $item->getShopSku();
+                                    $orderItem->subsidy = $item->getSubsidy();
+                                    $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId();
+                                    $orderItem->promos = json_encode($item->getPromos());
+                                    $orderItem->subsidies = json_encode($item->getSubsidies());
+
+                                    if (!$orderItem->save()) {
+                                        Yii::error(
+                                            'Ошибка сохранения нового элемента заказа: ' . json_encode(
+                                                $orderItem->getErrors(),
+                                                JSON_UNESCAPED_UNICODE
+                                            )
+                                        );
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return ['newOrders' => $newOrdersCount, 'updateOrders' => $updatedOrdersCount];
+    }
 
 
 }
\ No newline at end of file