Покупки на маркете - более гибкая логика расчёта доставки

Рейтинг: 0  
На голосовании
Предложил Пользователь 148975 13.06.2017 12:10:48

Покупки на маркете - более гибкая логика расчёта доставки

Сейчас этот модуль работает просто - при ошибке расчёта доставки он вообще не отдаёт результат.

В файле bitrix/modules/sale/general/ym_handler.php, функция processCartRequest($arPostData)
в строках

         $resItem = array( 
            'feedId' => $item['feedId'], 
            'offerId' => $item['offerId'],             
            'count' => $count, 
            'delivery' => $count > 0 ? TRUE : FALSE )
         ; 


Маркету отдаётся информация о возможности доставки ещё до просчёта доставки ($count - количество единиц товара в заказе, а не параметр доставки). Логика кода - если товара больше 0 штук, то разрешаем доставку по любому адресу.
Фактически невозможно обработать адрес и ответить Я.Маркету отказом в доставке.

Далее при расчёте доставки есть код:

      foreach($deliveryObjs as $delivery) 
      { 
         if(empty($this->mapDelivery[$delivery->getId()&#93) 
            continue; 
 
         $calcResult = $delivery->calculate($shipment); 
 
         if(!$calcResult->isSuccess()) 
            continue; 
... 


Тут идёт проверка на isSuccess() расчёта доставки, то есть часть нужной логики для отказа есть. Однако далее идёт код:

      if(!empty($resultItems) && !empty($deliveryOptions)) 
      { 
         $result['cart']['items'] = $resultItems; 
         $result['cart']['deliveryOptions'] = $deliveryOptions; 
         $result['cart']['paymentMethods'] = $this->getPaymentMethods(); 
      } 
 
      return $result; 
Из него следует, что без методов доставки Маркету вообще ничего не вернётся в ответ
(!empty($deliveryOptions)). 
Создал свой обработчик доставки, при попытке отказывать в доставке по адресам методом
       if ($distance>100) { 
         $result->addError(new Error('Доставка не разрешена')); 
         return $result; 
      } 
Маркет вообще перестаёт отрабатывать запрос с ошибкой.
Выше привёл причины в коде ядра.

Проблема заключается в том, что в таком случае некорректно работает эта форма Яндекс.Маркета https://partner.market.yandex.ru/sandbox/new.xml (Работа с тестовыми заказами), при отсутствии доставки эта форма не даёт даже актуализировать цены. При описанной мной логике (отдавать данные товара с
deliveryOptions=0
) данной проблемы нет.

Тех. поддержка Битрикс считает это нормальным поведением (тикет №1504727).