예제 #1
0
 /**
  * @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;
 }
예제 #2
0
 /**
  *
  * @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;
 }
예제 #3
0
 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);
 }