/** * @internal * * @param Sale\Basket $basket * @param array $requestFields * * @return Sale\Result * @throws Main\ArgumentNullException */ public function fillBasket(Sale\Basket $basket, array $requestFields) { $orderCompatibility = $this->getOrderCompatibility(); /** @var Sale\Order $order */ $order = $orderCompatibility->getOrder(); $result = new Sale\Result(); if (empty($requestFields['BASKET_ITEMS'])) { return $result; } $isStartField = $order->isStartField(); $basketCodeList = array(); $r = $this->parseBasketItems($basket, $requestFields['BASKET_ITEMS']); if (!$r->isSuccess()) { return $r; } $resultData = $r->getData(); if (isset($resultData['BASKET'])) { $basket = $resultData['BASKET']; } if (isset($resultData['BASKET_CODE_LIST'])) { $basketCodeList = $resultData['BASKET_CODE_LIST']; } if (isset($resultData['BASKET_CHANGED']) && $resultData['BASKET_CHANGED'] === true) { $order->refreshVat(); } if (!empty($basketCodeList) && is_array($basketCodeList)) { foreach ($basketCodeList as $index => $basketCode) { DiscountCompatibility::setBasketCode($index, $basketCode); } } if ($isStartField) { /** @var Sale\Result $r */ $r = $order->doFinalAction(true); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } else { if (($data = $r->getData()) && !empty($data) && is_array($data)) { $result->setData($result->getData() + $data); } } } return $result; }
/** * * @param array $values * @return Result * @throws Main\ArgumentOutOfRangeException * @throws Main\NotSupportedException * @throws \Exception */ public function setFields(array $values) { $resultData = array(); $result = new Result(); $oldValues = null; foreach ($values as $key => $value) { $oldValues[$key] = $this->fields->get($key); } if ($eventName = static::getEntityEventName()) { $event = new Main\Event('sale', 'OnBefore' . $eventName . 'SetFields', array('ENTITY' => $this, 'VALUES' => $values, 'OLD_VALUES' => $oldValues)); $event->send(); if ($event->getResults()) { /** @var Main\EventResult $eventResult */ foreach ($event->getResults() as $eventResult) { if ($eventResult->getType() == Main\EventResult::SUCCESS) { if ($eventResultData = $eventResult->getParameters()) { if (isset($eventResultData['VALUES'])) { $values = $eventResultData['VALUES']; } } } elseif ($eventResult->getType() == Main\EventResult::ERROR) { $errorMsg = new ResultError(Main\Localization\Loc::getMessage('SALE_EVENT_ON_BEFORE_' . strtoupper($eventName) . '_SET_FIELDS_ERROR'), 'SALE_EVENT_ON_BEFORE_' . strtoupper($eventName) . '_SET_FIELDS_ERROR'); if ($eventResultData = $eventResult->getParameters()) { if (isset($eventResultData['ERROR']) && $eventResultData['ERROR'] instanceof ResultError) { $errorMsg = $eventResultData['ERROR']; } } $result->addError($errorMsg); } } } } if (!$result->isSuccess()) { return $result; } $isStartField = $this->isStartField(); foreach ($values as $key => $value) { $r = $this->setField($key, $value); if (!$r->isSuccess()) { $data = $r->getData(); if (!empty($data) && is_array($data)) { $resultData = array_merge($resultData, $data); } $result->addErrors($r->getErrors()); } } if (!empty($resultData)) { $result->setData($resultData); } if ($isStartField) { $hasMeaningfulFields = $this->hasMeaningfulField(); /** @var Result $r */ $r = $this->doFinalAction($hasMeaningfulFields); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } else { if (($data = $r->getData()) && !empty($data) && is_array($data)) { $result->setData($result->getData() + $data); } } } return $result; }
protected function refreshOrderDataAction() { $formData = isset($this->request["formData"]) ? $this->request["formData"] : array(); $additional = isset($this->request["additional"]) ? $this->request["additional"] : array(); $shipment = null; $opResults = new Result(); //use data from form, don't refresh data from provider Admin\OrderEdit::$isTrustProductFormData = true; $order = $this->getOrder($formData, $opResults); $isStartField = $order->isStartField(); if ($order->getId() > 0) { $order = Admin\OrderEdit::editOrderByFormData($formData, $order, $this->userId, false, array(), $opResults); } if ($order->getId() <= 0) { if (isset($formData['SHIPMENT']) && is_array($formData['SHIPMENT'])) { $res = Admin\Blocks\OrderShipment::updateData($order, $formData['SHIPMENT']); $res->getErrorMessages(); $data = $res->getData(); /** @var \Bitrix\Sale\Shipment $shipment */ $shipment = array_shift($data['SHIPMENT']); } if (isset($formData['PAYMENT']) && is_array($formData['PAYMENT'])) { $res = Admin\Blocks\OrderPayment::updateData($order, $formData['PAYMENT'], true); $res->getErrorMessages(); } } if ($isStartField) { $hasMeaningfulFields = $order->hasMeaningfulField(); /** @var Result $r */ $r = $order->doFinalAction($hasMeaningfulFields); } $result['PAYABLE'] = $order->getPrice() - $order->getSumPaid(); $result["BASE_PRICE"] = Admin\Blocks\OrderBasket::getBasePrice($order); $data = $this->result->getData(); if ($shipment) { if ($shipment->getField('CUSTOM_PRICE_DELIVERY') == 'Y') { $result["CUSTOM_PRICE"] = Admin\Blocks\OrderShipment::getDeliveryPrice($shipment); } if (!isset($data['SHIPMENT_DATA']['DELIVERY_SERVICE_LIST'])) { $deliveryService = Admin\Blocks\OrderShipment::getDeliveryServiceList(); 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); if (!isset($data['SHIPMENT_DATA']['DELIVERY_ERROR'])) { foreach ($deliveryService as $delivery) { if ($shipment->getDeliveryId() == $delivery['ID'] && $delivery['RESTRICTED']) { $result['DELIVERY_ERROR'] = Loc::getMessage('SALE_OA_ERROR_DELIVERY_SERVICE'); } } } } if (!isset($data['SHIPMENT_DATA']['PROFILES'])) { if ($shipment->getDeliveryId()) { $service = Sale\Delivery\Services\Manager::getService($shipment->getDeliveryId()); $parentService = $service->getParentService(); if ($parentService && $parentService->canHasProfiles()) { $profiles = Admin\Blocks\OrderShipment::getDeliveryServiceProfiles($parentService->getId()); $profiles = Admin\Blocks\OrderShipment::checkProfilesRestriction($profiles, $shipment); $result["PROFILES"] = Admin\Blocks\OrderShipment::getProfileEditControl($profiles); if (!isset($data['SHIPMENT_DATA']['DELIVERY_ERROR'])) { foreach ($profiles as $profile) { if ($shipment->getDeliveryId() == $profile['ID'] && !$profile['RESTRICTED']) { $result['DELIVERY_ERROR'] = Loc::getMessage('SALE_OA_ERROR_DELIVERY_SERVICE'); } } } } } } } $paySystemList = Admin\Blocks\OrderPayment::getPaySystemList($order); $result['PAY_SYSTEM_LIST'] = Admin\Blocks\OrderPayment::makePaymentSelectHtmlBody($paySystemList); $orderBasket = new Admin\Blocks\OrderBasket($order, "", $this->request["formData"]["BASKET_PREFIX"]); $basketPrepareParams = array(); if (!empty($additional["operation"]) && $additional["operation"] == "PRODUCT_ADD" || $this->request["action"] == "addProductToBasket") { $basketPrepareParams["SKIP_SKU_INFO"] = false; } else { $basketPrepareParams["SKIP_SKU_INFO"] = true; } $result["BASKET"] = $orderBasket->prepareData($basketPrepareParams); // collect info about changed fields if ($basketPrepareParams["SKIP_SKU_INFO"] && !empty($formData["PRODUCT"]) && is_array($formData["PRODUCT"])) { //prices $result["BASKET"]["PRICES_UPDATED"] = array(); $errors = array(); $PRECISE = 0.005; foreach ($formData["PRODUCT"] as $basketCode => $itemParams) { if ($basketCode == "new") { continue; } if (!isset($result["BASKET"]["ITEMS"][$basketCode]["PRICE"]) || !isset($itemParams["PRICE"])) { $errors[] = "Product price with basket code \"" . $basketCode . "\" not found."; continue; } if (abs(floatval($result["BASKET"]["ITEMS"][$basketCode]["PRICE"]) - floatval($itemParams["PRICE"])) >= $PRECISE) { $result["BASKET"]["PRICES_UPDATED"][$basketCode] = $result["BASKET"]["ITEMS"][$basketCode]["PRICE"]; } } if (!empty($errors)) { $this->addResultData("ERROR_PRICE_COMPARING", $errors); } } $resData = $opResults->getData(); if (!empty($resData["NEW_ITEM_BASKET_CODE"])) { $result["BASKET"]["NEW_ITEM_BASKET_CODE"] = $resData["NEW_ITEM_BASKET_CODE"]; } $result['RELATED_PROPS'] = Admin\Blocks\OrderBuyer::getRelPropData($order); $result["DISCOUNTS_LIST"] = Admin\OrderEdit::getOrderedDiscounts($order, false); if ($order->getBasket()) { $result['BASE_PRICE_DELIVERY'] = $result["DISCOUNTS_LIST"]['PRICES']['DELIVERY']['BASE_PRICE']; } else { $result['BASE_PRICE_DELIVERY'] = $order->getDeliveryPrice(); } $result['BASE_PRICE_DELIVERY'] = roundEx($result['BASE_PRICE_DELIVERY'], SALE_VALUE_PRECISION); $result['DELIVERY_PRICE_DISCOUNT'] = roundEx($result["DISCOUNTS_LIST"]['PRICES']['DELIVERY']['PRICE'], SALE_VALUE_PRECISION); $result["COUPONS_LIST"] = Admin\OrderEdit::getCouponList($order, false); $result["TOTAL_PRICES"] = Admin\OrderEdit::getTotalPrices($order, $orderBasket, false); $result["DELIVERY_DISCOUNT"] = $result["TOTAL_PRICES"]["DELIVERY_DISCOUNT"]; $result = array_merge($result, $order->getFieldValues()); if (!isset($result["PRICE"])) { $result["PRICE"] = 0; } /* DEMANDED */ if (isset($additional["demanded"]) && is_array($additional["demanded"])) { if (isset($additional["given"]) && is_array($additional["given"])) { $result = array_merge($result, $additional["given"]); } $demanded = $this->getDemandedFields($additional["demanded"], $result, $order); $result = array_merge($result, $demanded); } /* * */ if (!$opResults->isSuccess()) { foreach ($opResults->getErrors() as $error) { if ($error->getCode() == "CATALOG_QUANTITY_NOT_ENOGH" || $error->getCode() == "SALE_ORDER_SYSTEM_SHIPMENT_LESS_QUANTITY" || $error->getCode() == "CATALOG_NO_QUANTITY_PRODUCT") { $this->addResultError($error->getMessage()); } } } $this->addResultData("ORDER_DATA", $result); }