Код |
---|
<?
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
function getCurrentShipment(\Bitrix\Sale\Order $order)
{
/** @var Shipment $shipment */
foreach ($order->getShipmentCollection() as $shipment)
{
if (!$shipment->isSystem())
return $shipment;
}
return null;
}
\Bitrix\Main\Loader::includeModule('sale');
$order = \Bitrix\Sale\Order::create("s1", 1); // создаем фейковый объект заказа для расчетов
// создаем ф.о. корзины, чтобы не беспокоить текущую корзину покупателя и
//добавляем в ф.о. корзины только один товар, расчет по которому мы хотим показать и заполняем его нужными полями
$basket = \Bitrix\Sale\Basket::create("s1");
$item = $basket->createItem('catalog', 73);
$item->setFields(array(
'QUANTITY' => 1,
'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(),
'LID' => "s1",
'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
));
$order->setBasket($basket); // привязываем ф.о. корзины к заказу
$order->setPersonTypeId(1); //ставим тип плательщика, чтобы пройти ограничения доставки по типу плательщика корректно
//-------------------- создаем объект отгрузки заказа и наполняем его товарами ф. корзины
$shipmentCollection = $order->getShipmentCollection();
$shipment = $shipmentCollection->createItem();
$shipment->setFields(array(
'CURRENCY' => $order->getCurrency()
));
$shipmentItemCollection = $shipment->getShipmentItemCollection();
foreach ($order->getBasket() as $item)
{
$shipmentItem = $shipmentItemCollection->createItem($item);
$shipmentItem->setQuantity($item->getQuantity());
}
//-----------------------------------------------------------------------
// -------------------- прописываем код города доставки куда хотим показать расчет в свойства ф.о. заказа
$propertyCollection = $order->getPropertyCollection();
$property = $propertyCollection->getDeliveryLocation();
$property->setValue("0000103664");
//------------------------------------------------------------------------------
// ----------------- получаем список доставок, отфильрованных по ограничениям
$deliveries = \Bitrix\Sale\Delivery\Services\Manager::getRestrictedObjectsList($shipment);
//-------------------------------------------------------------------------------
// ------------- запускаем в цикле на каждой непосредственный расчет
$arDeliveries = array();
foreach ($deliveries as $key => $deliveryObj)
{
$clonedOrder = $order->createClone();
/** @var Shipment $clonedShipment */
$clonedShipment = getCurrentShipment($clonedOrder);
$clonedShipment->setField('CUSTOM_PRICE_DELIVERY', 'N');
$calcResult = false;
$calcOrder = false;
$arDelivery = array();
//$calcResult = $deliveryObj->calculate($shipment);
//$calcOrder = $order;
$clonedShipment->setField('DELIVERY_ID', $deliveryObj->getId());
$clonedOrder->getShipmentCollection()->calculateDelivery();
$calcResult = $deliveryObj->calculate($clonedShipment);
$calcOrder = $clonedOrder;
if ($calcResult->isSuccess())
{
$arDelivery['PRICE'] = \Bitrix\Sale\PriceMaths::roundByFormatCurrency($calcResult->getPrice(), $calcOrder->getCurrency());
$arDelivery['PRICE_FORMATED'] = SaleFormatCurrency($arDelivery['PRICE'], $calcOrder->getCurrency());
$currentCalcDeliveryPrice = \Bitrix\Sale\PriceMaths::roundByFormatCurrency($calcOrder->getDeliveryPrice(), $calcOrder->getCurrency());
if ($currentCalcDeliveryPrice >= 0 && $arDelivery['PRICE'] != $currentCalcDeliveryPrice)
{
$arDelivery['DELIVERY_DISCOUNT_PRICE'] = $currentCalcDeliveryPrice;
$arDelivery['DELIVERY_DISCOUNT_PRICE_FORMATED'] = SaleFormatCurrency($arDelivery['DELIVERY_DISCOUNT_PRICE'], $calcOrder->getCurrency());
}
if (strlen($calcResult->getPeriodDescription()) > 0)
{
$arDelivery['PERIOD_TEXT'] = $calcResult->getPeriodDescription();
}
$arDelivery["NAME"] = $deliveryObj->getNameWithParent();
$arDeliveries[] = $arDelivery;
}
}
// ------------ выводим на экран полученный массив доставок
echo "<pre>";
print_r($arDeliveries);
echo "</pre>";
//--------------------------------------------------------
|
Может быть Вам это поможет.