/** * @param Shipment $shipment * @return Result * @throws NotSupportedException */ public static function deliverShipment(Shipment $shipment) { global $APPLICATION; $result = new Result(); $needDeliver = $shipment->needDeliver(); if ($needDeliver === null || $needDeliver === false && $shipment->getId() <= 0) { return $result; } $resultList = array(); $shipmentItemCollection = $shipment->getShipmentItemCollection(); $basketList = static::getBasketFromShipmentItemCollection($shipmentItemCollection); $basketProviderMap = static::createProviderBasketMap($basketList, array('ORDER_ID', 'USER_ID', 'QUANTITY', 'PAID')); $basketProviderList = static::redistributeToProviders($basketProviderMap); if (!empty($basketProviderList)) { foreach ($basketProviderList as $provider => $providerBasketItemList) { if ($provider instanceof Provider) { throw new NotSupportedException('provider not supported'); } elseif ($provider && array_key_exists("IBXSaleProductProvider", class_implements($provider))) { foreach ($providerBasketItemList as $providerBasketItem) { if ($providerBasketItem['BASKET_ITEM']->isBundleParent()) { continue; } if (!$providerBasketItem['BASKET_ITEM']->isEmptyItem()) { $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']); $APPLICATION->ResetException(); $resultProductData = $provider::DeliverProduct($data); if ($ex = $APPLICATION->GetException()) { $result->addError(new ResultError($ex->GetString(), $ex->GetID())); } if (!empty($resultProductData) && is_array($resultProductData)) { $resultProductData['ORDER_ID'] = $providerBasketItem['ORDER_ID']; } } else { $resultProductData = true; } $resultList[$providerBasketItem['BASKET_CODE']] = $resultProductData; } } else { foreach ($providerBasketItemList as $providerBasketItem) { $resultProductData = \CSaleBasket::ExecuteCallbackFunction($providerBasketItem['CALLBACK_FUNC'], $providerBasketItem['MODULE'], $providerBasketItem['PRODUCT_ID'], $providerBasketItem['USER_ID'], $providerBasketItem["PAID"], $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)) { foreach ($resultList as $basketCode => $resultData) { if ($resultData && !empty($resultData) && is_array($resultData)) { $resultData["REMAINING_ATTEMPTS"] = defined("SALE_PROC_REC_ATTEMPTS") ? SALE_PROC_REC_ATTEMPTS : 3; $resultData["SUCCESS_PAYMENT"] = "Y"; // TODO: recurringID /* if ($recurringID > 0) \CSaleRecurring::Update($recurringID, $resultData); else \CSaleRecurring::Add($resultData); */ } /* elseif ($recurringID > 0) { \CSaleRecurring::Delete($recurringID); } */ } } } if (!empty($resultList)) { $result->setData($resultList); } return $result; }