public function __construct(array $initParams) { if (!isset($initParams["PARENT_ID"])) { throw new ArgumentNullException('initParams["PARENT_ID"]'); } $this->parentAutomatic = Manager::getService($initParams["PARENT_ID"]); if (!$this->parentAutomatic || !$this->parentAutomatic instanceof Automatic) { throw new SystemException("Can't initialize AutomaticProfile's id: " . $initParams["ID"] . " parent Automatic parent_id: " . $initParams["PARENT_ID"]); } $this->parentSid = $this->parentAutomatic->getSid(); if (strlen($this->parentSid) <= 0) { throw new SystemException("Can't determine AutomaticProfile's SID. profile id: " . $initParams["ID"] . " parent Automatic id: " . $initParams["PARENT_ID"]); } $this->parentHandlerInitParams = $this->parentAutomatic->getHandlerInitParams($this->parentSid); if ($this->parentHandlerInitParams === false) { throw new SystemException("Can't get init services params of Automatic delivery service with sid: " . $this->parentSid); } parent::__construct($initParams); if (isset($this->config["MAIN"]["PROFILE_ID"])) { $this->profileId = $this->config["MAIN"]["PROFILE_ID"]; } if (strlen($this->profileId) > 0 && !array_key_exists($this->profileId, $this->parentHandlerInitParams["PROFILES"])) { throw new SystemException("Profile \"" . $this->profileId . "\" is not part of Automatic delivery service with sid: " . $this->parentSid); } $this->inheritParams(); }
/** * @param Sale\Order $order * @param Sale\Basket $basket * * @return Sale\Result * @throws Main\ArgumentNullException * @throws Main\ArgumentTypeException * @throws Main\NotSupportedException */ protected static function appendBasketToOrder(Sale\Order $order, Sale\Basket $basket) { $result = new Sale\Result(); $orderBasketCollection = $order->getBasket(); $shipmentCollection = $order->getShipmentCollection(); $systemShipment = $shipmentCollection->getSystemShipment(); $systemShipmentItemCollection = $systemShipment->getShipmentItemCollection(); /** @var Sale\BasketItem $basketItem */ foreach ($basket as $basketItem) { $basketProperty = array(); if ($basketPropertyCollection = $basketItem->getPropertyCollection()) { $basketProperty = $basketPropertyCollection->getPropertyValues(); } if ($orderBasketItem = $orderBasketCollection->getExistsItem($basketItem->getField('MODULE'), $basketItem->getField('PRODUCT_ID'), $basketProperty)) { $fields = $basketItem->getFieldValues(); $orderBasketItem->setFields(static::clearFields($fields)); } else { /** @var Sale\BasketItem $orderBasketItem */ $orderBasketCollection->addItem($basketItem); $basketItem->setCollection($orderBasketCollection); $systemShipmentItemCollection->resetCollection($orderBasketCollection); } } /** @var Sale\BasketItem $basketItem */ foreach ($basket as $basketItem) { if ($systemShipment->getDeliveryId() > 0) { /** @var Sale\Shipment $shipment */ $shipment = OrderCompatibility::getShipmentByDeliveryId($shipmentCollection, $systemShipment->getDeliveryId()); if (!$shipment) { if ($service = Sale\Delivery\Services\Manager::getService($systemShipment->getDeliveryId())) { /** @var Sale\Shipment $shipment */ $shipment = $shipmentCollection->createItem($service); } } if ($shipment) { $shipmentItemCollection = $shipment->getShipmentItemCollection(); if (!($shipmentItem = $shipmentItemCollection->getItemByBasketCode($basketItem->getBasketCode()))) { $shipmentItem = $shipmentItemCollection->createItem($basketItem); } /** @var Sale\Result $r */ $r = $shipmentItem->setQuantity($basketItem->getQuantity()); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } } } return $result; }
/** * @param Sale\ShipmentCollection $shipmentCollection * * @return Sale\Shipment * @throws Main\ArgumentNullException */ public static function createShipmentFromShipmentSystem(Sale\ShipmentCollection $shipmentCollection) { $shipment = null; /** @var Sale\Shipment $systemShipment */ $systemShipment = $shipmentCollection->getSystemShipment(); if ($systemShipment->getDeliveryId() > 0) { /** @var Sale\Shipment $shipment */ $shipment = static::getShipmentByDeliveryId($shipmentCollection, $systemShipment->getDeliveryId()); if (!$shipment) { if ($service = Sale\Delivery\Services\Manager::getService($systemShipment->getDeliveryId())) { /** @var Sale\Shipment $shipment */ $shipment = $shipmentCollection->createItem($service); $shipment->setField('DELIVERY_NAME', $service->getName()); } } } return $shipment; }
/** * @return Delivery\Services\Base|DeliveryService * @throws Main\ArgumentNullException * @throws Main\SystemException */ protected function loadDeliveryService() { if ($deliveryId = $this->getDeliveryId()) { $this->deliveryService = Delivery\Services\Manager::getService($deliveryId); } return $this->deliveryService; }
} if (isset($fields["DELIVERY_ID"])) { $DELIVERY_ID = $fields["DELIVERY_ID"]; } elseif (isset($_REQUEST["DELIVERY_ID"])) { $DELIVERY_ID = $_REQUEST["DELIVERY_ID"]; } else { $DELIVERY_ID = 0; } $DELIVERY_ID = intval($DELIVERY_ID); if ($DELIVERY_ID <= 0) { $strError .= Loc::getMessage("SALE_ESDE_ERROR_ID"); } $currencyLang = ""; $deliveryService = null; if ($DELIVERY_ID > 0) { $deliveryService = \Bitrix\Sale\Delivery\Services\Manager::getService($DELIVERY_ID); if ($deliveryService && \Bitrix\Main\Loader::includeModule('currency')) { $curFormat = \CCurrencyLang::getCurrencyFormat($deliveryService->getCurrency()); $currencyLang = trim(str_replace("#", '', $curFormat["FORMAT_STRING"])); } else { $currencyLang = $deliveryService->getCurrency(); } } if ($deliveryService && $ID <= 0 && isset($_GET["ES_CODE"]) && strlen($_GET["ES_CODE"]) > 0) { $embeddedList = $deliveryService->getEmbeddedExtraServicesList(); if (isset($embeddedList[$_GET["ES_CODE"]])) { $fields = $embeddedList[$_GET["ES_CODE"]]; $fields["CODE"] = $_GET["ES_CODE"]; $fields["ID"] = strval(mktime()); } }
$ID = 0; unset($fields["ID"]); } elseif ($_REQUEST["action"] == "profile_delete") { $idProf = isset($_REQUEST["ID_PROF"]) ? intval($_REQUEST["ID_PROF"]) : 0; if ($idProf > 0) { $res = \Bitrix\Sale\Delivery\Services\Table::delete($idProf); if (!$res->isSuccess()) { $strError .= implode("<br>\n", $res->getErrorMessages()) . "<br>"; } } else { $strError .= Loc::getMessage("SALE_DSE_PROFILE_DEL_ERROR", array("#ID#" => $idProf)) . "<br>"; } } /* Ask parent service witch class_names for children are allowed */ if (intval($fields["PARENT_ID"]) > 0) { $parentService = Services\Manager::getService($fields["PARENT_ID"]); $classNamesList = $parentService->getChildrenClassNames(); } else { $classNamesList = Services\Manager::getHandlersClassNames(); $classesToExclude = array('\\Bitrix\\Sale\\Delivery\\Services\\AutomaticProfile', '\\Bitrix\\Sale\\Delivery\\Services\\Group'); foreach ($classesToExclude as $class) { $key = array_search($class, $classNamesList); if ($key !== false) { unset($classNamesList[$key]); } } } /* if we have only one class - let's fix it */ if (empty($fields["CLASS_NAME"]) && count($classNamesList) == 1) { $fields["CLASS_NAME"] = current($classNamesList); }
/** * @param \Bitrix\Sale\Shipment $shipment * @return float|int * @throws Main\ArgumentNullException * @throws SystemException */ public static function getDeliveryPrice(\Bitrix\Sale\Shipment $shipment) { $totalPrice = 0; if ($shipment->getDeliveryId()) { $service = Services\Manager::getService($shipment->getDeliveryId()); if ($service) { $extraServices = $shipment->getExtraServices(); $extraServicesManager = $service->getExtraServices(); $extraServicesManager->setValues($extraServices); $result = $service->calculate($shipment); $totalPrice = $result->getPrice(); } } return $totalPrice; }
protected function changeDeliveryServiceAction() { $result = array(); $profiles = array(); $index = $this->request['index']; $formData = isset($this->request["formData"]) ? $this->request["formData"] : array(); $formData['ID'] = $formData['order_id']; $deliveryId = intval($formData['SHIPMENT'][$index]['DELIVERY_ID']); if ($deliveryId <= 0) { return; } $order = $this->getOrder($formData); /** @var \Bitrix\Sale\Delivery\Services\Base $service */ $service = Sale\Delivery\Services\Manager::getService($deliveryId); if ($service->canHasProfiles()) { $profiles = Admin\Blocks\OrderShipment::getDeliveryServiceProfiles($deliveryId); if (!isset($formData['SHIPMENT'][$index]['PROFILE'])) { reset($profiles); $initProfile = current($profiles); $formData['SHIPMENT'][$index]['PROFILE'] = $initProfile['ID']; $this->request["formData"]['SHIPMENT'][$index]['PROFILE'] = $initProfile['ID']; } } $res = Admin\Blocks\OrderShipment::updateData($order, $formData['SHIPMENT']); $data = $res->getData(); $shipment = array_shift($data['SHIPMENT']); if ($service->canHasProfiles()) { $profiles = Admin\Blocks\OrderShipment::checkProfilesRestriction($profiles, $shipment); $result["PROFILES"] = Admin\Blocks\OrderShipment::getProfileEditControl($profiles, $index, $shipment->getDeliveryId()); foreach ($profiles as $profile) { if ($formData['SHIPMENT'][$index]['PROFILE'] == $profile['ID'] && !$profile['RESTRICTED']) { $result['DELIVERY_ERROR'] = Loc::getMessage('SALE_OA_ERROR_DELIVERY_SERVICE'); break; } } } $deliveryService = Admin\Blocks\OrderShipment::getDeliveryServiceList($shipment); foreach ($deliveryService as $i => $dlService) { if ($dlService['ID'] <= 0) { continue; } if (!Sale\Delivery\Services\Manager::checkServiceRestriction($dlService['ID'], $shipment, '\\Bitrix\\Sale\\Delivery\\Restrictions\\BySite')) { unset($deliveryService[$i]); } } $deliveryServiceTree = Admin\Blocks\OrderShipment::makeDeliveryServiceTree($deliveryService); $result['DELIVERY_SERVICE_LIST'] = Admin\Blocks\OrderShipment::getTemplate($deliveryServiceTree); foreach ($deliveryService as $delivery) { if ($deliveryId == $delivery['ID'] && $delivery['RESTRICTED']) { $result['DELIVERY_ERROR'] = Loc::getMessage('SALE_OA_ERROR_DELIVERY_SERVICE'); break; } } $storeMap = Admin\Blocks\OrderShipment::getMap($shipment->getDeliveryId(), $index); if ($storeMap) { $result['MAP'] = $storeMap; } $extraServiceManager = new \Bitrix\Sale\Delivery\ExtraServices\Manager($deliveryId); $extraServiceManager->setOperationCurrency($order->getCurrency()); $deliveryExtraService = $shipment->getExtraServices(); if ($deliveryExtraService) { $extraServiceManager->setValues($deliveryExtraService); } $extraService = $extraServiceManager->getItems(); if ($extraService) { $result["EXTRA_SERVICES"] = Admin\Blocks\OrderShipment::getExtraServiceEditControl($extraService, $index); } $deliveryPrice = Admin\Blocks\OrderShipment::getDeliveryPrice($shipment); if ($shipment->getField('CUSTOM_PRICE_DELIVERY') == 'Y') { $result["CUSTOM_PRICE"] = $deliveryPrice; } else { $this->request['formData']['SHIPMENT'][$index]['PRICE_DELIVERY'] = $deliveryPrice; } $this->addResultData("SHIPMENT_DATA", $result); $this->formDataChanged = true; }
$arParams["LOCATION_TO"] = intval($arParams["LOCATION_TO"]); $arParams["LOCATION_FROM"] = intval($arParams["LOCATION_FROM"]); if ($arParams["LOCATION_FROM"] <= 0) { $arParams["LOCATION_FROM"] = COption::GetOptionString('sale', 'location'); } $arParams["STEP"] = intval($arParams["STEP"]); if ($arParams["STEP"] <= 0) { $arParams["AJAX_CALL"] = 'N'; } if (is_set($arParams["START_VALUE"])) { $arParams["START_VALUE"] = doubleval($arParams["START_VALUE"]); } if ($arParams["AJAX_CALL"] == "Y") { $shipment = CSaleDelivery::convertOrderOldToNew(array("WEIGHT" => $arParams["ORDER_WEIGHT"], "PRICE" => $arParams["ORDER_PRICE"], "LOCATION_TO" => $arParams["LOCATION_TO"], "LOCATION_ZIP" => $arParams['LOCATION_ZIP'], "ITEMS" => $arParams["ITEMS"], "CURRENCY" => $arParams["CURRENCY"])); /** @var \Bitrix\Sale\Delivery\Services\Base $deliveryObj */ $deliveryObj = \Bitrix\Sale\Delivery\Services\Manager::getService($arParams["DELIVERY_ID"]); if (!$deliveryObj) { ShowError(GetMessage("SALE_DELIVERY_HANDLER_NOT_INSTALL")); return; } $calcResult = $deliveryObj->calculate($shipment); $result = array("VALUE" => $calcResult->getPrice(), "TRANSIT" => $calcResult->getPeriodDescription(), "RESULT" => $calcResult->isSuccess() ? "OK" : "ERROR"); $result["TEXT"] = $calcResult->isSuccess() ? $calcResult->getDescription() : implode("<br>\n", $calcResult->getErrorMessages()); if ($calcResult->isNextStep()) { $result["RESULT"] = "NEXT_STEP"; } if ($calcResult->isSuccess() && strlen($calcResult->getDescription()) > 0) { $result["RESULT"] = "NOTE"; } if (intval($calcResult->getPacksCount()) > 0) { $result["PACKS_COUNT"] = $calcResult->getPacksCount();
/** * @param $deliveryId * @return Base|null * @throws ArgumentNullException * @throws SystemException * @throws \Bitrix\Main\ArgumentException */ public function getTrackingObjectByDeliveryId($deliveryId) { if (intval($deliveryId) <= 0) { throw new ArgumentNullException('deliveryId'); } $result = null; $deliveryService = Services\Manager::getService($deliveryId); if (!$deliveryService) { return null; } $class = $deliveryService->getTrackingClass(); if (strlen($class) > 0) { $result = $this->createTrackingObject($class, $deliveryService->getTrackingParams()); } return $result; }