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); }
$allowedStatusesEdit = \Bitrix\Sale\OrderStatus::getStatusesUserCanDoOperations($USER->GetID(), array('edit')); if (!in_array($order->getField("STATUS_ID"), $allowedStatusesEdit)) { LocalRedirect("/bitrix/admin/sale_order_view.php?ID=" . $ID . "&lang=" . LANGUAGE_ID . GetFilterParams("filter_")); } $userId = isset($_POST["USER_ID"]) ? intval($_POST["USER_ID"]) : $order->getUserId(); OrderEdit::initCouponsData($userId, $ID, isset($_POST["OLD_USER_ID"]) ? intval($_POST["USER_ID"]) : $userId); if (!$boolLocked) { \Bitrix\Sale\Order::lock($ID); } $isSavingOperation = $_SERVER["REQUEST_METHOD"] == "POST" && (isset($_POST["apply"]) || isset($_POST["save"])); $isRefreshDataAndSaveOperation = $_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["refresh_data_and_save"]) && $_POST["refresh_data_and_save"] == "Y"; $isNeedFieldsRestore = $_SERVER["REQUEST_METHOD"] == "POST" && !$isSavingOperation && !$isRefreshDataAndSaveOperation; //save order params if (($isSavingOperation || $isNeedFieldsRestore || $isRefreshDataAndSaveOperation) && $saleModulePermissions >= "U" && check_bitrix_sessid() && $result->isSuccess()) { if ($isSavingOperation || $isRefreshDataAndSaveOperation) { $order = OrderEdit::editOrderByFormData($_POST, $order, $USER->GetID(), true, $_FILES, $result); } if ($isRefreshDataAndSaveOperation) { /** @var \Bitrix\Sale\Basket $basket */ if (!($basket = $order->getBasket())) { throw new \Bitrix\Main\ObjectNotFoundException('Entity "Basket" not found'); } $res = $basket->refreshData(array('PRICE', 'QUANTITY', 'COUPONS')); if (!$res->isSuccess()) { $result->addErrors($res->getErrors()); } } if (($isSavingOperation || $isRefreshDataAndSaveOperation) && $result->isSuccess()) { if ($order) { $res = OrderEdit::saveCoupons($order->getUserId(), $_POST); if (!$res) {