retailcrm / bitrix-module

Bitrix integration plugin
http://www.retailcrm.ru
MIT License
12 stars 44 forks source link

Обновление типа доставки из CRM в Bitrix #236

Closed Mozgito closed 2 years ago

Mozgito commented 2 years ago

Обнаружил некорректную работу передачи типа доставки при выгрузке истории из CRM в Bitrix.

Здесь https://github.com/retailcrm/bitrix-module/blob/1d2a9dca8215492f542ac177577d41064f224267/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php#L1611 модуль берет отгрузки заказа в битриксе и исключает системные отгрузки из цикла (по умолчанию в заказе всегда есть системная скрытая отгрузка https://dev.1c-bitrix.ru/api_d7/bitrix/sale/technique/shipment.php), ходит по циклу отгрузок и меняет все несистемные отгрузки на те данные, что пришли в истории изменений из CRM.

Но есть исключение. Если по какой-то причине в заказе в битриксе отсутствует отгрузка (её не создали или удалили), то модуль ничего не обновит, так как он ходит по циклу из одного элемента, которым является системная отгрузка.

В итоге если в заказе в CRM менять тип доставки, то в заказе в битриксе ничего не изменится в блоке отгрузки. Предложение следующее:

https://github.com/retailcrm/bitrix-module/blob/1d2a9dca8215492f542ac177577d41064f224267/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php#L1558 Тут добавить новый параметр $updated = false;

После того как модуль смог отредактировать сущетсвующую в заказе отгрузку добавить $updated = true; А затем:

https://github.com/retailcrm/bitrix-module/blob/1d2a9dca8215492f542ac177577d41064f224267/intaro.retailcrm/classes/general/history/RetailCrmHistory_v5.php#L1621 Здесь после цикла foreach добавить следующий код:

if (!$updated) {
    $shipment = $shipmentColl->createItem($delivery);
    $shipment->setFields(array(
        'BASE_PRICE_DELIVERY' => $orderCrm['delivery']['cost'],
        'CURRENCY' => $order->getCurrency(),
        'DELIVERY_NAME' => $delivery->getName(),
        'CUSTOM_PRICE_DELIVERY' => 'Y'
    ));
}

Он как раз будет выполняться в случае если ни одной отгрузки нет в заказе битрикса и корректно будут переданы изменения типа доставки из CRM. И плюс заработает данный код:

$noDeliveryId = \Bitrix\Sale\Delivery\Services\EmptyDeliveryService::getEmptyDeliveryServiceId();

if ($crmCode === false || !isset($optionsDelivTypes[$crmCode])) {
    $deliveryId = $noDeliveryId;
}

В случае если в заказе в CRM будет снят тип доставки, то в заказе в битриксе будет создана стандартная битриксовая отгрузка "Без доставки". Полагаю такая работа модуля и задумывалась.

Информация актуальна и для 5.6.2 и для 5.8.4, так как метод deliveryUpdate не изменялся.

Chazovs commented 2 years ago

В кейсе с удалением отгрузки на стороне Битрикса проблему видим. Учтем в следующем релизе. В кейсе со снятием типа доставки на стороне системы, проблема не воспроизводится. А именно: при снятии типа доставки на стороне системы в Битриксе служба доставки в отгрузке меняется на "Без доставки". По второму кейсу просьба уточнить, при каких условиях он воспроизводится.

Mozgito commented 2 years ago

Кейс один. Это отсутствие отгрузки в заказе на стороне битрикса. Если там изначально нет отгрузки, то любые манипуляции с типом доставки в CRM никак не отразятся в битриксе.