- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/providerbase.php
- Класс: BitrixSaleProviderBase
- Вызов: ProviderBase::deliverShipment
static function deliverShipment(Shipment $shipment)
{
$result = new Result();
$needDeliver = null;
if ($shipment->getFields()->isChanged('ALLOW_DELIVERY'))
{
$needDeliver = $shipment->getField('ALLOW_DELIVERY') === "Y";
}
if ($needDeliver === null || ($needDeliver === false && $shipment->getId() <= 0))
return $result;
$resultList = array();
/** @var ShipmentItemCollection $shipmentItemCollection */
if (!$shipmentItemCollection = $shipment->getShipmentItemCollection())
{
throw new ObjectNotFoundException('Entity "ShipmentItemCollection" not found');
}
/** @var ShipmentCollection $shipmentCollection */
if (!$shipmentCollection = $shipment->getCollection())
{
throw new ObjectNotFoundException('Entity "ShipmentCollection" not found');
}
/** @var Order $order */
if (!$order = $shipmentCollection->getOrder())
{
throw new ObjectNotFoundException('Entity "Order" not found');
}
/** @var Basket $basket */
if (!$basket = $order->getBasket())
{
return $result;
}
$basketList = static::getBasketFromShipmentItemCollection($shipmentItemCollection);
$basketProviderMap = static::createProviderBasketMap($basketList, array('ORDER_ID', 'USER_ID', 'QUANTITY', 'ALLOW_DELIVERY', 'PAY_CALLBACK', 'PAID'));
$basketProviderList = static::redistributeToProviders($basketProviderMap);
if (!empty($basketProviderList))
{
foreach ($basketProviderList as $provider => $providerBasketItemList)
{
if (array_key_exists("IBXSaleProductProvider", class_implements($provider)))
{
foreach ($providerBasketItemList as $providerBasketItem)
{
if ($providerBasketItem['BASKET_ITEM']->isBundleParent())
{
continue;
}
if ($providerBasketItem['BASKET_ITEM']->getField('MODULE') != '')
{
$data = array(
"PRODUCT_ID" => $providerBasketItem["PRODUCT_ID"],
"USER_ID" => $providerBasketItem["USER_ID"],
"PAID" => $providerBasketItem["PAID"],
"ORDER_ID" => $providerBasketItem["ORDER_ID"],
"BASKET_ID" => $providerBasketItem['BASKET_ID']
);
$r = static::deliverProductData($provider, $data);
if ($r->isSuccess())
{
$resultData = $r->getData();
if (array_key_exists($providerBasketItem["PRODUCT_ID"], $resultData))
{
$resultProductData = $resultData[$providerBasketItem["PRODUCT_ID"]];
}
}
else
{
$result->addErrors($r->getErrors());
}
if (!empty($resultProductData) && is_array($resultProductData))
{
$resultProductData['ORDER_ID'] = $providerBasketItem['ORDER_ID'];
}
}
else
{
$resultProductData = true;
}
$resultList[$providerBasketItem['BASKET_CODE']] = $resultProductData;
}
}
elseif (class_exists($provider))
{
$context = array(
'SITE_ID' => $order->getSiteId(),
'CURRENCY' => $order->getCurrency(),
);
if ($order->getUserId() > 0)
{
$context['USER_ID'] = $order->getUserId();
}
else
{
global $USER;
$context['USER_ID'] = $USER->getId();
}
$creator = InternalsProviderCreator::create($context);
/** @var ShipmentItem $shipmentItem */
foreach ($shipmentItemCollection as $shipmentItem)
{
$basketItem = $shipmentItem->getBasketItem();
$providerClass = $basketItem->getProviderEntity();
if ($providerClass instanceof SaleProviderBase)
{
$creator->addShipmentItem($shipmentItem);
}
}
$r = $creator->deliver();
if ($r->isSuccess())
{
$r = $creator->createItemsResultAfterDeliver($r);
if ($r->isSuccess())
{
$data = $r->getData();
if (array_key_exists('RESULT_AFTER_DELIVER_LIST', $data))
{
$resultList = $data['RESULT_AFTER_DELIVER_LIST'] + $resultList;
}
}
}
else
{
$result->addErrors($r->getErrors());
}
}
else
{
foreach ($providerBasketItemList as $providerBasketItem)
{
$resultProductData = CSaleBasket::ExecuteCallbackFunction(
$providerBasketItem['CALLBACK_FUNC'],
$providerBasketItem['MODULE'],
$providerBasketItem['PRODUCT_ID'],
$providerBasketItem['USER_ID'],
$providerBasketItem["ALLOW_DELIVERY"],
$providerBasketItem['ORDER_ID'],
$providerBasketItem["QUANTITY"]
);
$basketCode = $providerBasketItem['BASKET_ITEM']->getBasketCode();
if (!empty($resultProductData) && is_array($resultProductData))
{
$resultProductData['ORDER_ID'] = $providerBasketItem['ORDER_ID'];
}
$resultList[$basketCode] = $resultProductData;
}
}
}
if (!empty($resultList) && is_array($resultList))
{
$recurringID = intval($order->getField("RECURRING_ID"));
foreach ($resultList as $basketCode => $resultData)
{
if ($order->isPaid())
{
if (!empty($resultData) && is_array($resultData))
{
if (empty($resultData['ORDER_ID']) || intval($resultData['ORDER_ID']) < 0)
$resultData["ORDER_ID"] = $order->getId();
$resultData["REMAINING_ATTEMPTS"] = (defined("SALE_PROC_REC_ATTEMPTS") ? SALE_PROC_REC_ATTEMPTS : 3);
$resultData["SUCCESS_PAYMENT"] = "Y";
if ($recurringID > 0)
CSaleRecurring::Update($recurringID, $resultData);
else
CSaleRecurring::Add($resultData);
}
elseif ($recurringID > 0)
{
CSaleRecurring::Delete($recurringID);
}
}
else
{
/** @var BasketItem $basketItem */
if (!$basketItem = $basket->getItemByBasketCode($basketCode))
{
throw new ObjectNotFoundException('Entity "BasketItem" not found');
}
$resRecurring = CSaleRecurring::GetList(
array(),
array(
"USER_ID" => $order->getUserId(),
"PRODUCT_ID" => $basketItem->getProductId(),
"MODULE" => $basketItem->getField("MODULE")
)
);
while ($recurringData = $resRecurring->Fetch())
{
CSaleRecurring::Delete($recurringData["ID"]);
}
}
}
}
}
if (!empty($resultList))
{
$result->setData($resultList);
}
return $result;
}