/** * @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; }
/** * @param Shipment $shipment * @return ShipmentItemCollection */ public static function load(Shipment $shipment) { /** @var ShipmentItemCollection $shipmentItemCollection */ $shipmentItemCollection = new static(); $shipmentItemCollection->shipment = $shipment; if ($shipment->getId() > 0) { $shipmentItemList = ShipmentItem::loadForShipment($shipment->getId()); /** @var ShipmentItem $shipmentItem */ foreach ($shipmentItemList as $shipmentItem) { $shipmentItem->setCollection($shipmentItemCollection); $shipmentItemCollection->addItem($shipmentItem); } } return $shipmentItemCollection; }
public function processAdditionalInfoShipmentEdit(Shipment $shipment, array $requestData) { if (empty($requestData['REQUEST_SELF']) || $requestData['REQUEST_SELF'] != 'Y') { return null; } $shipmentId = $shipment->getId(); if (intval($shipmentId) <= 0) { return null; } $dt = new \Bitrix\Main\Type\DateTime(); $arResult = CSaleDeliveryHandler::executeAction(\CSaleDelivery::getCodeById($shipment->getDeliveryId()), 'REQUEST_SELF', \CAllSaleDelivery::convertOrderNewToOld($shipment)); if (!$arResult) { return null; } $res = \Bitrix\Sale\Internals\OrderDeliveryReqTable::add(array("SHIPMENT_ID" => $shipmentId, "ORDER_ID" => $shipment->getCollection()->getOrder()->getId(), "DATE_REQUEST" => $dt, "PARAMS" => array("TYPE" => "REQUEST_SELF", "RESULT" => $arResult))); if (!$res->isSuccess()) { return null; } if (isset($arResult["TRACKING_NUMBER"])) { $shipment->setField("TRACKING_NUMBER", $arResult["TRACKING_NUMBER"]); } if (isset($arResult["DELIVERY_DOC_NUM"])) { $shipment->setField("DELIVERY_DOC_NUM", $arResult["DELIVERY_DOC_NUM"]); $shipment->setField("DELIVERY_DOC_DATE", $dt); } return $shipment; }
/** * @param Order $order * @param array $shipments * @return Result * @throws SystemException */ public static function updateData(Order &$order, array $shipments) { global $USER; $result = new Result(); $data = array(); $basketResult = null; if (!$order) { $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_ORDER_NOT_FOUND'))); return $result; } $shipmentCollection = $order->getShipmentCollection(); $isStartField = $shipmentCollection->isStartField(); foreach ($shipments as $item) { $shipmentId = intval($item['SHIPMENT_ID']); $isNew = $shipmentId <= 0; if ($isNew) { self::$shipment = $shipmentCollection->createItem(); } else { self::$shipment = $shipmentCollection->getItemById($shipmentId); if (!self::$shipment) { $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_SHIPMENT_NOT_FOUND'))); continue; } } self::$defaultFields = self::$shipment->getFieldValues(); /** @var \Bitrix\Sale\BasketItem $product */ $countItems = count(self::$shipment->getShipmentItemCollection()); $systemShipment = $shipmentCollection->getSystemShipment(); $systemShipmentItemCollection = $systemShipment->getShipmentItemCollection(); $products = array(); if (!isset($item['PRODUCT']) && self::$shipment->getId() <= 0) { $basket = $order->getBasket(); if ($basket) { $basketItems = $basket->getBasketItems(); foreach ($basketItems as $product) { $systemShipmentItem = $systemShipmentItemCollection->getItemByBasketCode($product->getBasketCode()); if ($product->isBundleChild() || !$systemShipmentItem || $systemShipmentItem->getQuantity() <= 0) { continue; } $products[] = array('AMOUNT' => $product->getQuantity(), 'BASKET_CODE' => $product->getBasketCode()); } } } else { $products = $item['PRODUCT']; } if ($item['DEDUCTED'] == 'Y') { $basketResult = OrderBasketShipment::updateData($order, self::$shipment, $products); if (!$basketResult->isSuccess()) { $result->addErrors($basketResult->getErrors()); } } $extraServices = $item['EXTRA_SERVICES'] ? $item['EXTRA_SERVICES'] : array(); $shipmentFields = array('COMPANY_ID' => isset($item['COMPANY_ID']) && $item['COMPANY_ID'] > 0 ? $item['COMPANY_ID'] : 0, 'DEDUCTED' => $item['DEDUCTED'], 'DELIVERY_DOC_NUM' => $item['DELIVERY_DOC_NUM'], 'TRACKING_NUMBER' => $item['TRACKING_NUMBER'], 'CURRENCY' => $order->getCurrency(), 'COMMENTS' => $item['COMMENTS'], 'STATUS_ID' => $isNew ? DeliveryStatus::getInitialStatus() : $item['STATUS_ID']); if ($item['DELIVERY_DOC_DATE']) { try { $shipmentFields['DELIVERY_DOC_DATE'] = new Date($item['DELIVERY_DOC_DATE']); } catch (Main\ObjectException $exception) { $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_UNCORRECT_FORM_DATE'))); } } $shipmentFields['DELIVERY_ID'] = $item['PROFILE'] > 0 ? $item['PROFILE'] : $item['DELIVERY_ID']; try { $service = Services\Manager::getService($shipmentFields['DELIVERY_ID']); if ($service->getParentService()) { $shipmentFields['DELIVERY_NAME'] = $service->getParentService()->getName() . ':' . $service->getName(); } else { $shipmentFields['DELIVERY_NAME'] = $service->getName(); } } catch (Main\ArgumentNullException $e) { $result->addError(new EntityError(Loc::getMessage('SALE_ORDER_SHIPMENT_ERROR_NO_DELIVERY_SERVICE'))); } $responsibleId = self::$shipment->getField('RESPONSIBLE_ID'); if ($item['RESPONSIBLE_ID'] != $responsibleId || empty($responsibleId)) { if (isset($item['RESPONSIBLE_ID'])) { $shipmentFields['RESPONSIBLE_ID'] = $item['RESPONSIBLE_ID']; } else { $shipmentFields['RESPONSIBLE_ID'] = $order->getField('RESPONSIBLE_ID'); } if (!empty($shipmentFields['RESPONSIBLE_ID'])) { $shipmentFields['EMP_RESPONSIBLE_ID'] = $USER->getID(); $shipmentFields['DATE_RESPONSIBLE_ID'] = new DateTime(); } } if ($extraServices) { self::$shipment->setExtraServices($extraServices); } $setFieldsResult = self::$shipment->setFields($shipmentFields); if (!$setFieldsResult->isSuccess()) { $result->addErrors($setFieldsResult->getErrors()); } self::$shipment->setStoreId($item['DELIVERY_STORE_ID']); if ($item['DEDUCTED'] == 'N') { $basketResult = OrderBasketShipment::updateData($order, self::$shipment, $products); if (!$basketResult->isSuccess()) { $result->addErrors($basketResult->getErrors()); } } try { $priceDeliveryInfo = array(); if ($item['CUSTOM_PRICE_DELIVERY'] != 'Y') { $totalPrice = self::getDeliveryPrice(self::$shipment); } else { $totalPrice = (double) str_replace(',', '.', $item['BASE_PRICE_DELIVERY']); } } catch (\Exception $e) { $totalPrice = 0; } $priceDeliveryInfo['CUSTOM_PRICE_DELIVERY'] = $item['CUSTOM_PRICE_DELIVERY']; $priceDeliveryInfo['BASE_PRICE_DELIVERY'] = $totalPrice; self::$shipment->setFields($priceDeliveryInfo); self::$shipment->setField('ALLOW_DELIVERY', $item['ALLOW_DELIVERY']); $data['SHIPMENT'][] = self::$shipment; } if ($isStartField) { $hasMeaningfulFields = $shipmentCollection->hasMeaningfulField(); /** @var Result $r */ $r = $shipmentCollection->doFinalAction($hasMeaningfulFields); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } $result->setData($data); return $result; }