From 26a6faf428009cf7c537f1b213c2145c9f592ea1 Mon Sep 17 00:00:00 2001 From: Aleksey Filippov Date: Sat, 28 Feb 2026 23:52:41 +0300 Subject: [PATCH] fix(ERP-248): fallback subsidy from subsidies[] when getSubsidy() returns null 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 --- erp24/services/MarketplaceService.php | 60 +++++++++++++++++++-------- 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/erp24/services/MarketplaceService.php b/erp24/services/MarketplaceService.php index d774196d..8119a550 100644 --- a/erp24/services/MarketplaceService.php +++ b/erp24/services/MarketplaceService.php @@ -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; -- 2.39.5