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); }