From: fomichev Date: Mon, 24 Feb 2025 10:40:39 +0000 (+0300) Subject: Перенос в сервис X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=08ec85117139934f59f869d7bc2c0199710cd969;p=erp24_rep%2Fyii-erp24%2F.git Перенос в сервис --- diff --git a/erp24/api2/controllers/YandexMarketController.php b/erp24/api2/controllers/YandexMarketController.php index 4cc49aa6..0facd943 100644 --- a/erp24/api2/controllers/YandexMarketController.php +++ b/erp24/api2/controllers/YandexMarketController.php @@ -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]; - } } diff --git a/erp24/services/MarketplaceService.php b/erp24/services/MarketplaceService.php index 9c9f5a4a..74c50c23 100644 --- a/erp24/services/MarketplaceService.php +++ b/erp24/services/MarketplaceService.php @@ -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