]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
правки
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 18 Dec 2025 14:28:07 +0000 (17:28 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 18 Dec 2025 14:28:07 +0000 (17:28 +0300)
erp24/controllers/MarketplaceOrdersController.php
erp24/services/MarketplaceService.php

index 75d0629b6e20dafdf0a42f9e5413b643fd4db405..3f7e60b78ba22284838fd4f2b9bb25dea74845b4 100644 (file)
@@ -66,6 +66,9 @@ class MarketplaceOrdersController extends Controller
         $searchModel = new MarketplaceOrdersSearch();
         $dataProvider = $searchModel->search($this->request->queryParams);
 
+        // Добавляем eager loading для items для проверки готовности к отправке в 1С
+        $dataProvider->query->with('items');
+
         $dataProvider->sort->defaultOrder = [
             'creation_date' => SORT_DESC,
         ];
index 5b412387417f4a301834e262da1ddb16da3589ee..d9935d1fa255f5837c62098fb6cc882ed446f4ea 100644 (file)
@@ -1117,6 +1117,14 @@ class MarketplaceService
         try {
             $response = $apiInstance->getOrder($campaignId, $orderId, $contentType);
             $order = $response->getOrder();
+            
+            // Диагностика для проверки данных заказа
+            $itemsCount = $order->getItems() ? count($order->getItems()) : 0;
+            $hasDelivery = $order->getDelivery() !== null;
+            Yii::warning(
+                "fetchOrder: orderId={$orderId}, campaignId={$campaignId}, items={$itemsCount}, delivery=" . ($hasDelivery ? 'YES' : 'NO'),
+                'marketplace_fetch_order'
+            );
 
             return [$campaignId => [$order]];
         } catch (ApiException $e) {
@@ -1271,6 +1279,10 @@ class MarketplaceService
 
                         // Сохраняем данные доставки
                         $delivery = $order->getDelivery();
+                        Yii::warning(
+                            "Новый заказ #{$marketplaceOrder->id}: delivery=" . ($delivery ? 'present' : 'NULL') . ", items count=" . count($order->getItems() ?? []),
+                            'marketplace_order_creation'
+                        );
                         if ($delivery) {
                             $deliveryModel = new MarketplaceOrderDelivery();
                             $deliveryModel->order_id = $marketplaceOrder->id;
@@ -1339,12 +1351,16 @@ class MarketplaceService
                             }
                             if (!$deliveryModel->save()) {
                                 Yii::error(
-                                    'Ошибка сохранения доставки: ' . json_encode(
+                                    'Ошибка сохранения доставки для заказа #' . $marketplaceOrder->id . ': ' . json_encode(
                                         $deliveryModel->getErrors(),
                                         JSON_UNESCAPED_UNICODE
                                     )
                                 );
+                            } else {
+                                Yii::warning("Доставка успешно создана для заказа #{$marketplaceOrder->id}", 'marketplace_order_creation');
                             }
+                        } else {
+                            Yii::warning("Доставка не создана для заказа #{$marketplaceOrder->id}: delivery is NULL or empty", 'marketplace_order_creation');
                         }
 
                         // Сохраняем позиции заказа
@@ -1370,13 +1386,17 @@ class MarketplaceService
 
                                 if (!$orderItem->save()) {
                                     Yii::error(
-                                        'Ошибка сохранения элемента заказа: ' . json_encode(
+                                        'Ошибка сохранения элемента заказа для заказа #' . $marketplaceOrder->id . ': ' . json_encode(
                                             $orderItem->getErrors(),
                                             JSON_UNESCAPED_UNICODE
                                         )
                                     );
+                                } else {
+                                    Yii::warning("Товар успешно создан для заказа #{$marketplaceOrder->id}: {$orderItem->offer_name}", 'marketplace_order_creation');
                                 }
                             }
+                        } else {
+                            Yii::warning("Товары не созданы для заказа #{$marketplaceOrder->id}: items is empty", 'marketplace_order_creation');
                         }
                         // проверяем и устанавливаем ready_to = 1
                         $baseUrl = "https://partner.market.yandex.ru/order/";
@@ -1446,7 +1466,61 @@ class MarketplaceService
                         $marketplaceOrder->substatus_id = (int)$substatusId;
                         $marketplaceOrder->updated_at = date('Y-m-d H:i:s', strtotime($order->getUpdatedAt()));
                         $delivery = $order->getDelivery();
-                        $shipments = $delivery->getShipments();
+                        
+                        // Проверяем и создаем/обновляем доставку
+                        $existingDelivery = MarketplaceOrderDelivery::findOne(['order_id' => $marketplaceOrder->id]);
+                        if (!$existingDelivery && $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
+                                    )
+                                );
+                            }
+                        }
+                        
+                        $shipments = $delivery ? $delivery->getShipments() : null;
                         if ($shipments) {
                             foreach ($shipments as $index => $shipment) {
                                 Yii::error("срок доставки: {$index}" . json_encode($shipment, JSON_UNESCAPED_UNICODE));
@@ -1518,7 +1592,37 @@ class MarketplaceService
                         $existingItems = MarketplaceOrderItems::find()
                             ->where(['order_id' => $marketplaceOrder->id])
                             ->all();
-                        if (count($existingItems) !== count($newItems)) {
+                        
+                        // Если товаров нет, создаем их
+                        if (empty($existingItems) && !empty($newItems)) {
+                            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() ?? 0;
+                                $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId() ?? '';
+                                $orderItem->promos = json_encode($item->getPromos(), JSON_UNESCAPED_UNICODE);
+                                $orderItem->subsidies = json_encode($item->getSubsidies(), JSON_UNESCAPED_UNICODE);
+
+                                if (!$orderItem->save()) {
+                                    Yii::error(
+                                        'Ошибка сохранения элемента заказа: ' . json_encode(
+                                            $orderItem->getErrors(),
+                                            JSON_UNESCAPED_UNICODE
+                                        )
+                                    );
+                                }
+                            }
+                        } elseif (count($existingItems) !== count($newItems)) {
                             MarketplaceOrderItems::deleteAll(['order_id' => $marketplaceOrder->id]);
                             foreach ($newItems as $item) {
                                 $orderItem = new MarketplaceOrderItems();
@@ -1636,7 +1740,90 @@ class MarketplaceService
                             }
                         }
 
-                        if (!$marketplaceOrder->delivery_to && $marketplaceOrder->readyto_1c === 0) {
+                        // Проверяем и создаем доставку, если её нет
+                        $existingDelivery = MarketplaceOrderDelivery::findOne(['order_id' => $marketplaceOrder->id]);
+                        if (!$existingDelivery) {
+                            $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();
+                                    }
+                                }
+                                $shipments = $delivery->getShipments();
+                                if ($shipments) {
+                                    foreach ($shipments as $index => $shipment) {
+                                        Yii::error("срок доставки: {$index}" . json_encode($shipment, JSON_UNESCAPED_UNICODE));
+                                    }
+
+                                    $deliveryDateTo = ($shipments[0])->getShipmentDate() ?? null;
+                                    $deliveryTimeTo = ($shipments[0])->getShipmentTime() ?? '';
+
+                                    if ($deliveryDateTo) {
+                                        $datetimeString = str_replace('-', '.', $deliveryDateTo) . ' ' . $deliveryTimeTo;
+                                        $timestamp = strtotime($datetimeString);
+
+                                        if ($timestamp) {
+                                            $marketplaceOrder->delivery_to = date('Y-m-d H:i:s', $timestamp);
+
+                                            if (!$marketplaceOrder->save()) {
+                                                Yii::error('Ошибка сохранения сроков доставки: ' . json_encode($marketplaceOrder->getErrors(), JSON_UNESCAPED_UNICODE));
+                                            } else {
+                                                $updatedOrdersCount += 1;
+                                            }
+                                        } else {
+                                            Yii::error('Ошибка преобразования даты и времени: ' . $datetimeString);
+                                        }
+                                    } else {
+                                        Yii::error('Отсутствует shipmentDate у первого элемента shipments');
+                                    }
+                                }
+                                $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
+                                        )
+                                    );
+                                } else {
+                                    $updatedOrdersCount += 1;
+                                }
+                            }
+                        } elseif (!$marketplaceOrder->delivery_to && $marketplaceOrder->readyto_1c === 0) {
                             $delivery = $order->getDelivery();
                             $shipments = $delivery->getShipments();
                             if ($shipments) {
@@ -1667,6 +1854,45 @@ class MarketplaceService
                                 }
                             }
                         }
+
+                        // Проверяем и создаем товары, если их нет
+                        $existingItems = MarketplaceOrderItems::find()
+                            ->where(['order_id' => $marketplaceOrder->id])
+                            ->all();
+                        if (empty($existingItems)) {
+                            $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() ?? 0;
+                                    $orderItem->partner_warehouse_id = $item->getPartnerWarehouseId() ?? '';
+                                    $orderItem->promos = json_encode($item->getPromos(), JSON_UNESCAPED_UNICODE);
+                                    $orderItem->subsidies = json_encode($item->getSubsidies(), JSON_UNESCAPED_UNICODE);
+
+                                    if (!$orderItem->save()) {
+                                        Yii::error(
+                                            'Ошибка сохранения элемента заказа: ' . json_encode(
+                                                $orderItem->getErrors(),
+                                                JSON_UNESCAPED_UNICODE
+                                            )
+                                        );
+                                    } else {
+                                        $updatedOrdersCount += 1;
+                                    }
+                                }
+                            }
+                        }
                     }
                     self::setReadyMarketplaceOrders($marketplaceOrder);
                 }
@@ -2352,7 +2578,7 @@ class MarketplaceService
             Yii::warning('Не удалось извлечь данные заказа из HTML', __METHOD__);
             return [];
         } else {
-            Yii::info('Успешно распарен заказ №' . $orderNumber, __METHOD__);
+            Yii::warning('Успешно распарен заказ №' . $orderNumber, __METHOD__);
             return $order;
         }
     }
@@ -2799,7 +3025,7 @@ class MarketplaceService
             if (!$order->save()) {
                 Yii::error('Ошибка установки readyto_1c для заказа ID ' . $order->id . ': ' . json_encode($order->getErrors(), JSON_UNESCAPED_UNICODE));
             } else {
-                Yii::info('Заказ ID ' . $order->id . ' подготовлен к отправке в 1С.');
+                Yii::warning('Заказ ID ' . $order->id . ' подготовлен к отправке в 1С.');
             }
         }
 
@@ -2825,7 +3051,7 @@ class MarketplaceService
             if (!$order->save()) {
                 Yii::error('Ошибка установки readyto_1c = 1 у заказа ID ' . $order->id . ': ' . json_encode($order->getErrors(), JSON_UNESCAPED_UNICODE));
             } else {
-                Yii::info('Заказ ID ' . $order->id . ' автоматически помечен как готовый к отправке в 1C.');
+                Yii::warning('Заказ ID ' . $order->id . ' автоматически помечен как готовый к отправке в 1C.');
             }
         }
     }