{
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);
$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];
- }
}
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;
];
}
+ /**
+ * Получает данные о заказах для указанных кампаний с учетом фильтров.
+ *
+ * @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