• Модуль: 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;
}