]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
fix(ERP-248): fallback subsidy from subsidies[] when getSubsidy() returns null
authorAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Sat, 28 Feb 2026 20:52:41 +0000 (23:52 +0300)
committerAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Sat, 28 Feb 2026 20:52:41 +0000 (23:52 +0300)
YandexMarket deprecated the item-level `subsidy` field and stopped sending
it for some order types (DBS). Instead, subsidy is now in `subsidies[]`.

When getSubsidy() returns null:
- sum amounts from getSubsidies() array
- log Yii::warning with calculated value

When getPartnerWarehouseId() returns null:
- fall back to marketplace_order.warehouse_guid (valid for DBS orders)
- only Yii::error if warehouse_guid is also null

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
erp24/services/MarketplaceService.php

index d774196dd0b01e9cdc4695fd4f6b75440d64750c..8119a5507df69d53e6ddebf3773f944cd8550367 100644 (file)
@@ -1435,11 +1435,15 @@ class MarketplaceService
                                 $orderItem->shop_sku = $item->getShopSku();
                                 $subsidy = $item->getSubsidy();
                                 if ($subsidy === null) {
-                                    Yii::error('getSubsidy() вернул null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku(), 'marketplace');
-                                    continue;
+                                    $subsidiesArr = $item->getSubsidies() ?? [];
+                                    $subsidy = 0;
+                                    foreach ($subsidiesArr as $sub) {
+                                        $subsidy += $sub->getAmount() ?? 0;
+                                    }
+                                    Yii::warning('getSubsidy() null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku() . ', subsidy из subsidies[]: ' . $subsidy, 'marketplace');
                                 }
                                 $orderItem->subsidy = $subsidy;
-                                $partnerWarehouseId = $item->getPartnerWarehouseId();
+                                $partnerWarehouseId = $item->getPartnerWarehouseId() ?? $marketplaceOrder->warehouse_guid;
                                 if ($partnerWarehouseId === null) {
                                     Yii::error('getPartnerWarehouseId() вернул null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku(), 'marketplace');
                                     continue;
@@ -1677,11 +1681,15 @@ class MarketplaceService
                                 $orderItem->shop_sku = $item->getShopSku();
                                 $subsidy = $item->getSubsidy();
                                 if ($subsidy === null) {
-                                    Yii::error('getSubsidy() вернул null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku(), 'marketplace');
-                                    continue;
+                                    $subsidiesArr = $item->getSubsidies() ?? [];
+                                    $subsidy = 0;
+                                    foreach ($subsidiesArr as $sub) {
+                                        $subsidy += $sub->getAmount() ?? 0;
+                                    }
+                                    Yii::warning('getSubsidy() null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku() . ', subsidy из subsidies[]: ' . $subsidy, 'marketplace');
                                 }
                                 $orderItem->subsidy = $subsidy;
-                                $partnerWarehouseId = $item->getPartnerWarehouseId();
+                                $partnerWarehouseId = $item->getPartnerWarehouseId() ?? $marketplaceOrder->warehouse_guid;
                                 if ($partnerWarehouseId === null) {
                                     Yii::error('getPartnerWarehouseId() вернул null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku(), 'marketplace');
                                     continue;
@@ -1716,11 +1724,15 @@ class MarketplaceService
                                 $orderItem->shop_sku = $item->getShopSku();
                                 $subsidy = $item->getSubsidy();
                                 if ($subsidy === null) {
-                                    Yii::error('getSubsidy() вернул null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku(), 'marketplace');
-                                    continue;
+                                    $subsidiesArr = $item->getSubsidies() ?? [];
+                                    $subsidy = 0;
+                                    foreach ($subsidiesArr as $sub) {
+                                        $subsidy += $sub->getAmount() ?? 0;
+                                    }
+                                    Yii::warning('getSubsidy() null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku() . ', subsidy из subsidies[]: ' . $subsidy, 'marketplace');
                                 }
                                 $orderItem->subsidy = $subsidy;
-                                $partnerWarehouseId = $item->getPartnerWarehouseId();
+                                $partnerWarehouseId = $item->getPartnerWarehouseId() ?? $marketplaceOrder->warehouse_guid;
                                 if ($partnerWarehouseId === null) {
                                     Yii::error('getPartnerWarehouseId() вернул null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku(), 'marketplace');
                                     continue;
@@ -1748,10 +1760,14 @@ class MarketplaceService
                                     $updateNeeded = false;
                                     $subsidy = $item->getSubsidy();
                                     if ($subsidy === null) {
-                                        Yii::error('getSubsidy() вернул null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku(), 'marketplace');
-                                        continue;
+                                        $subsidiesArr = $item->getSubsidies() ?? [];
+                                        $subsidy = 0;
+                                        foreach ($subsidiesArr as $sub) {
+                                            $subsidy += $sub->getAmount() ?? 0;
+                                        }
+                                        Yii::warning('getSubsidy() null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku() . ', subsidy из subsidies[]: ' . $subsidy, 'marketplace');
                                     }
-                                    $partnerWarehouseId = $item->getPartnerWarehouseId();
+                                    $partnerWarehouseId = $item->getPartnerWarehouseId() ?? $marketplaceOrder->warehouse_guid;
                                     if ($partnerWarehouseId === null) {
                                         Yii::error('getPartnerWarehouseId() вернул null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku(), 'marketplace');
                                         continue;
@@ -1801,11 +1817,15 @@ class MarketplaceService
                                     $orderItem->shop_sku = $item->getShopSku();
                                     $subsidy = $item->getSubsidy();
                                     if ($subsidy === null) {
-                                        Yii::error('getSubsidy() вернул null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku(), 'marketplace');
-                                        continue;
+                                        $subsidiesArr = $item->getSubsidies() ?? [];
+                                        $subsidy = 0;
+                                        foreach ($subsidiesArr as $sub) {
+                                            $subsidy += $sub->getAmount() ?? 0;
+                                        }
+                                        Yii::warning('getSubsidy() null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku() . ', subsidy из subsidies[]: ' . $subsidy, 'marketplace');
                                     }
                                     $orderItem->subsidy = $subsidy;
-                                    $partnerWarehouseId = $item->getPartnerWarehouseId();
+                                    $partnerWarehouseId = $item->getPartnerWarehouseId() ?? $marketplaceOrder->warehouse_guid;
                                     if ($partnerWarehouseId === null) {
                                         Yii::error('getPartnerWarehouseId() вернул null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku(), 'marketplace');
                                         continue;
@@ -1986,11 +2006,15 @@ class MarketplaceService
                                     $orderItem->shop_sku = $item->getShopSku();
                                     $subsidy = $item->getSubsidy();
                                     if ($subsidy === null) {
-                                        Yii::error('getSubsidy() вернул null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku(), 'marketplace');
-                                        continue;
+                                        $subsidiesArr = $item->getSubsidies() ?? [];
+                                        $subsidy = 0;
+                                        foreach ($subsidiesArr as $sub) {
+                                            $subsidy += $sub->getAmount() ?? 0;
+                                        }
+                                        Yii::warning('getSubsidy() null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku() . ', subsidy из subsidies[]: ' . $subsidy, 'marketplace');
                                     }
                                     $orderItem->subsidy = $subsidy;
-                                    $partnerWarehouseId = $item->getPartnerWarehouseId();
+                                    $partnerWarehouseId = $item->getPartnerWarehouseId() ?? $marketplaceOrder->warehouse_guid;
                                     if ($partnerWarehouseId === null) {
                                         Yii::error('getPartnerWarehouseId() вернул null для orderId=' . $marketplaceOrder->id . ', shopSku=' . $item->getShopSku(), 'marketplace');
                                         continue;