示例#1
0
 /**
  * Load applied discount list
  *
  * @param int $order				Order id.
  * @param bool $extendedMode		Get full information by discount.
  * @param array $basketList			Correspondence between basket ids and basket codes.
  * @param array $basketData			Basket data.
  * @return Result
  */
 public static function loadResultFromDatabase($order, $extendedMode = false, $basketList = array(), $basketData = array())
 {
     if (self::$init === false) {
         self::init();
     }
     $result = new Result();
     $translate = !empty($basketList) && is_array($basketList);
     $extendedMode = $extendedMode === true;
     $order = (int) $order;
     if ($order <= 0) {
         $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_BAD_ORDER_ID'), self::ERROR_ID));
         return $result;
     }
     $resultData = array('BASKET' => array(), 'ORDER' => array(), 'DISCOUNT_LIST' => array(), 'DISCOUNT_MODULES' => array(), 'COUPON_LIST' => array(), 'DATA' => array());
     $orderDiscountIndex = 0;
     $orderDiscountLink = array();
     $discountList = array();
     $discountSort = array();
     $couponList = array();
     $couponIterator = Internals\OrderCouponsTable::getList(array('select' => array('*'), 'filter' => array('=ORDER_ID' => $order), 'order' => array('ID' => 'ASC')));
     while ($coupon = $couponIterator->fetch()) {
         $coupon['ID'] = (int) $coupon['ID'];
         $coupon['ORDER_ID'] = (int) $coupon['ORDER_ID'];
         $coupon['ORDER_DISCOUNT_ID'] = (int) $coupon['ORDER_DISCOUNT_ID'];
         $resultData['COUPON_LIST'][$coupon['COUPON']] = $coupon;
         $couponList[$coupon['ID']] = $coupon['COUPON'];
     }
     unset($coupon, $couponIterator);
     $ruleIterator = Internals\OrderRulesTable::getList(array('select' => array('*', 'RULE_DESCR' => 'DESCR.DESCR', 'RULE_DESCR_ID' => 'DESCR.ID'), 'filter' => array('=ORDER_ID' => $order), 'order' => array('ID' => 'ASC')));
     while ($rule = $ruleIterator->fetch()) {
         $rule['ID'] = (int) $rule['ID'];
         $rule['ORDER_DISCOUNT_ID'] = (int) $rule['ORDER_DISCOUNT_ID'];
         $rule['ORDER_COUPON_ID'] = (int) $rule['COUPON_ID'];
         if ($rule['ORDER_COUPON_ID'] > 0) {
             if (!isset($couponList[$rule['COUPON_ID']])) {
                 $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_RULE_COUPON_NOT_FOUND', array('#ID#' => $rule['ID'], '#COUPON_ID#' => $rule['COUPON_ID']))));
             } else {
                 $rule['COUPON_ID'] = $couponList[$rule['ORDER_COUPON_ID']];
             }
         }
         $rule['RULE_DESCR_ID'] = (int) $rule['RULE_DESCR_ID'];
         if ($rule['MODULE_ID'] == 'sale') {
             $discountId = (int) $rule['ORDER_DISCOUNT_ID'];
             if (!isset($orderDiscountLink[$discountId])) {
                 $resultData['ORDER'][$orderDiscountIndex] = array('ORDER_ID' => $rule['ORDER_ID'], 'DISCOUNT_ID' => $rule['ORDER_DISCOUNT_ID'], 'ORDER_COUPON_ID' => $rule['ORDER_COUPON_ID'], 'COUPON_ID' => '', 'RESULT' => array());
                 if ($rule['ORDER_COUPON_ID'] > 0) {
                     $resultData['ORDER'][$orderDiscountIndex]['COUPON_ID'] = $rule['COUPON_ID'];
                 }
                 $orderDiscountLink[$discountId] =& $resultData['ORDER'][$orderDiscountIndex];
                 $orderDiscountIndex++;
             }
             $ruleItem = array('RULE_ID' => $rule['ID'], 'APPLY' => $rule['APPLY'], 'RULE_DESCR_ID' => $rule['RULE_DESCR_ID']);
             if (!empty($rule['RULE_DESCR']) && is_array($rule['RULE_DESCR'])) {
                 $ruleItem['DESCR_DATA'] = $rule['RULE_DESCR'];
                 $ruleItem['DESCR'] = self::formatArrayDescription($rule['RULE_DESCR']);
                 $ruleItem['DESCR_ID'] = $rule['RULE_DESCR_ID'];
             }
             switch ($rule['ENTITY_TYPE']) {
                 case Internals\OrderRulesTable::ENTITY_TYPE_BASKET:
                     if (!isset($orderDiscountLink[$discountId]['RESULT']['BASKET'])) {
                         $orderDiscountLink[$discountId]['RESULT']['BASKET'] = array();
                     }
                     $rule['ENTITY_ID'] = (int) $rule['ENTITY_ID'];
                     $ruleItem['BASKET_ID'] = $rule['ENTITY_ID'];
                     $index = $translate ? $basketList[$rule['ENTITY_ID']] : $rule['ENTITY_ID'];
                     if (!empty($basketData[$index])) {
                         $ruleItem['MODULE'] = $basketData[$index]['MODULE'];
                         $ruleItem['PRODUCT_ID'] = $basketData[$index]['PRODUCT_ID'];
                     }
                     $orderDiscountLink[$discountId]['RESULT']['BASKET'][$index] = $ruleItem;
                     break;
                 case Internals\OrderRulesTable::ENTITY_TYPE_DELIVERY:
                     if (!isset($orderDiscountLink[$discountId]['RESULT']['DELIVERY'])) {
                         $orderDiscountLink[$discountId]['RESULT']['DELIVERY'] = array();
                     }
                     $rule['ENTITY_ID'] = (int) $rule['ENTITY_ID'];
                     $ruleItem['DELIVERY_ID'] = $rule['ENTITY_ID'] > 0 ? $rule['ENTITY_ID'] : (string) $rule['ENTITY_VALUE'];
                     $orderDiscountLink[$discountId]['RESULT']['DELIVERY'] = $ruleItem;
                     break;
             }
             unset($ruleItem, $discountId);
         } else {
             if ($rule['ENTITY_TYPE'] != Internals\OrderRulesTable::ENTITY_TYPE_BASKET) {
                 continue;
             }
             $rule['ENTITY_ID'] = (int) $rule['ENTITY_ID'];
             if ($rule['ENTITY_ID'] <= 0) {
                 continue;
             }
             $index = $translate ? $basketList[$rule['ENTITY_ID']] : $rule['ENTITY_ID'];
             if (!isset($resultData['BASKET'][$index])) {
                 $resultData['BASKET'][$index] = array();
             }
             $ruleResult = array('BASKET_ID' => $rule['ENTITY_ID'], 'RULE_ID' => $rule['ID'], 'ORDER_ID' => $rule['ORDER_ID'], 'DISCOUNT_ID' => $rule['ORDER_DISCOUNT_ID'], 'ORDER_COUPON_ID' => $rule['ORDER_COUPON_ID'], 'COUPON_ID' => '', 'RESULT' => array('APPLY' => $rule['APPLY']), 'RULE_DESCR_ID' => $rule['RULE_DESCR_ID']);
             if ($rule['ORDER_COUPON_ID'] > 0) {
                 $ruleResult['COUPON_ID'] = $rule['COUPON_ID'];
             }
             if (!empty($basketData[$index])) {
                 $ruleResult['MODULE'] = $basketData[$index]['MODULE'];
                 $ruleResult['PRODUCT_ID'] = $basketData[$index]['PRODUCT_ID'];
             }
             if (!empty($rule['RULE_DESCR']) && is_array($rule['RULE_DESCR'])) {
                 $ruleResult['RESULT']['DESCR_DATA'] = $rule['RULE_DESCR'];
                 $ruleResult['RESULT']['DESCR'] = self::formatArrayDescription($rule['RULE_DESCR']);
                 $ruleResult['DESCR_ID'] = $rule['RULE_DESCR_ID'];
             }
             $resultData['BASKET'][$index][] = $ruleResult;
             unset($ruleResult);
         }
         $discountList[$rule['ORDER_DISCOUNT_ID']] = true;
         if (!isset($discountSort[$rule['ORDER_DISCOUNT_ID']])) {
             $discountSort[$rule['ORDER_DISCOUNT_ID']] = $rule['ID'];
         }
     }
     unset($rule, $ruleIterator);
     unset($couponList);
     if (!empty($discountList)) {
         $discountSelect = $extendedMode ? array('*') : array('ID', 'NAME', 'MODULE_ID', 'DISCOUNT_ID', 'USE_COUPONS');
         $discountIterator = Internals\OrderDiscountTable::getList(array('select' => $discountSelect, 'filter' => array('@ID' => array_keys($discountList))));
         while ($discount = $discountIterator->fetch()) {
             $discount['ID'] = (int) $discount['ID'];
             $discount['ORDER_DISCOUNT_ID'] = $discount['ID'];
             $discount['RULE_SORT'] = $discountSort[$discount['ID']];
             if ($discount['MODULE_ID'] == 'sale') {
                 $discount['EDIT_PAGE_URL'] = self::getEditUrl(array('ID' => $discount['DISCOUNT_ID']));
             } else {
                 $discount['EDIT_PAGE_URL'] = '';
                 if (!empty(self::$discountProviders[$discount['MODULE_ID']]['getEditUrl'])) {
                     $discount['EDIT_PAGE_URL'] = call_user_func_array(self::$discountProviders[$discount['MODULE_ID']]['getEditUrl'], array(array('ID' => $discount['DISCOUNT_ID'], 'MODULE_ID' => $discount['MODULE_ID'])));
                 }
             }
             $resultData['DISCOUNT_LIST'][$discount['ID']] = $discount;
         }
         unset($discount, $discountIterator, $discountSelect);
         if (!empty($resultData['DISCOUNT_LIST'])) {
             Main\Type\Collection::sortByColumn($resultData['DISCOUNT_LIST'], 'RULE_SORT', '', null, true);
             foreach ($resultData['DISCOUNT_LIST'] as &$discount) {
                 unset($discount['RULE_SORT']);
             }
             unset($discount);
         }
         $modulesIterator = Internals\OrderModulesTable::getList(array('select' => array('MODULE_ID', 'ORDER_DISCOUNT_ID'), 'filter' => array('@ORDER_DISCOUNT_ID' => array_keys($discountList))));
         while ($module = $modulesIterator->fetch()) {
             $orderDiscountId = (int) $module['ORDER_DISCOUNT_ID'];
             if (!isset($resultData['DISCOUNT_MODULES'][$orderDiscountId])) {
                 $resultData['DISCOUNT_MODULES'][$orderDiscountId] = array();
             }
             $resultData['DISCOUNT_MODULES'][$orderDiscountId][] = $module['MODULE_ID'];
         }
         unset($module, $modulesIterator);
     }
     unset($discountList);
     $dataIterator = Internals\OrderDiscountDataTable::getList(array('select' => array('*'), 'filter' => array('=ORDER_ID' => $order, '@ENTITY_TYPE' => array(Internals\OrderDiscountDataTable::ENTITY_TYPE_BASKET, Internals\OrderDiscountDataTable::ENTITY_TYPE_DELIVERY))));
     while ($data = $dataIterator->fetch()) {
         if ($data['ENTITY_TYPE'] == Internals\OrderDiscountDataTable::ENTITY_TYPE_BASKET) {
             if (!isset($resultData['DATA']['BASKET'])) {
                 $resultData['DATA']['BASKET'] = array();
             }
             $data['ENTITY_ID'] = (int) $data['ENTITY_ID'];
             $index = $translate ? $basketList[$data['ENTITY_ID']] : $data['ENTITY_ID'];
             $resultData['DATA']['BASKET'][$index] = $data['ENTITY_DATA'];
         } else {
         }
     }
     unset($data, $dataIterator);
     $result->addData($resultData);
     unset($resultData);
     return $result;
 }
示例#2
0
 /**
  * Load delivery information.
  *
  * @return Result
  */
 protected function loadOrderData()
 {
     $result = new Result();
     $loadDelivery = false;
     $order = $this->getOrder();
     $orderId = (int) $order->getId();
     if (empty($this->orderData)) {
         $this->fillEmptyOrderData($order);
     }
     $this->shipmentIds = array();
     $basketResult = $this->loadBasket();
     if (!$basketResult->isSuccess()) {
         $result->addErrors($basketResult->getErrors());
         return $result;
     }
     unset($basketResult);
     $skipLoadData = !$this->newOrder && ($this->getUseMode() == self::USE_MODE_FULL && !$this->isMixedBasket());
     if ($orderId > 0) {
         $basketResult = $this->getBasketTables();
         if (!$basketResult->isSuccess()) {
             $result->addErrors($basketResult->getErrors());
             return $result;
         }
         unset($basketResult);
     }
     $this->convertedOrder = !$this->newOrder;
     if (!$this->newOrder) {
         if (!$skipLoadData) {
             $dataIterator = Internals\OrderDiscountDataTable::getList(array('select' => array('*'), 'filter' => array('=ORDER_ID' => $orderId, '=ENTITY_TYPE' => Internals\OrderDiscountDataTable::ENTITY_TYPE_ORDER, '=ENTITY_ID' => $orderId)));
             if ($data = $dataIterator->fetch()) {
                 $entityData =& $data['ENTITY_DATA'];
                 if (!empty($entityData['DELIVERY'])) {
                     $this->orderData['DELIVERY_ID'] = $entityData['DELIVERY']['DELIVERY_ID'];
                     if (isset($entityData['DELIVERY']['CUSTOM_PRICE_DELIVERY'])) {
                         $this->orderData['CUSTOM_PRICE_DELIVERY'] = $entityData['DELIVERY']['CUSTOM_PRICE_DELIVERY'];
                     }
                     $this->shipment = null;
                     if (isset($entityData['DELIVERY']['SHIPMENT_ID'])) {
                         $entityData['DELIVERY']['SHIPMENT_ID'] = (int) $entityData['DELIVERY']['SHIPMENT_ID'];
                         if ($entityData['DELIVERY']['SHIPMENT_ID'] > 0) {
                             $this->shipmentIds[] = $entityData['DELIVERY']['SHIPMENT_ID'];
                             /** @var ShipmentCollection $orderShipmentList */
                             $orderShipmentList = $order->getShipmentCollection();
                             $this->shipment = $orderShipmentList->getItemById($entityData['DELIVERY']['SHIPMENT_ID']);
                             if (empty($this->shipment)) {
                                 $this->shipment = null;
                             } else {
                                 $loadDelivery = true;
                             }
                         }
                     }
                 }
                 $this->orderData['USE_BASE_PRICE'] = Main\Config\Option::get('sale', 'get_discount_percent_from_base_price');
                 if (!empty($entityData['OPTIONS'])) {
                     if (!empty($entityData['OPTIONS']['USE_BASE_PRICE'])) {
                         $this->orderData['USE_BASE_PRICE'] = $entityData['OPTIONS']['USE_BASE_PRICE'];
                     }
                     $this->saleOptions = $entityData['OPTIONS'];
                 }
                 if (!isset($entityData['OLD_ORDER'])) {
                     $this->convertedOrder = false;
                 }
             }
             unset($data, $dataIterator);
         } else {
             $this->convertedOrder = false;
         }
         if (empty($this->saleOptions)) {
             $this->saleOptions = array('USE_BASE_PRICE' => Main\Config\Option::get('sale', 'get_discount_percent_from_base_price'), 'SALE_DISCOUNT_ONLY' => Main\Config\Option::get('sale', 'use_sale_discount_only'), 'APPLY_MODE' => Main\Config\Option::get('sale', 'discount_apply_mode'));
             $this->orderData['USE_BASE_PRICE'] = $this->saleOptions['USE_BASE_PRICE'];
         }
         $this->discountsCache = array();
         $this->couponsCache = array();
         if (!$skipLoadData) {
             $applyResult = OrderDiscountManager::loadResultFromDatabase($order->getId(), true, $this->reverseBasketTable, $this->orderData['BASKET_ITEMS']);
             if (!$applyResult->isSuccess()) {
                 $result->addErrors($applyResult->getErrors());
             }
             $applyResultData = $applyResult->getData();
             if (!empty($applyResultData['DISCOUNT_LIST'])) {
                 foreach ($applyResultData['DISCOUNT_LIST'] as $orderDiscountId => $discountData) {
                     $discountData['ACTIONS_DESCR_DATA'] = false;
                     if (!empty($discountData['ACTIONS_DESCR']) && is_array($discountData['ACTIONS_DESCR'])) {
                         $discountData['ACTIONS_DESCR_DATA'] = $discountData['ACTIONS_DESCR'];
                         $discountData['ACTIONS_DESCR'] = self::formatDescription($discountData['ACTIONS_DESCR']);
                     } else {
                         $discountData['ACTIONS_DESCR'] = false;
                     }
                     if (empty($discountData['ACTIONS_DESCR'])) {
                         $discountData['ACTIONS_DESCR'] = false;
                         $discountData['ACTIONS_DESCR_DATA'] = false;
                     }
                     $this->discountsCache[$orderDiscountId] = $discountData;
                     if (isset($applyResultData['DISCOUNT_MODULES'][$orderDiscountId])) {
                         $this->cacheDiscountModules[$orderDiscountId] = $applyResultData['DISCOUNT_MODULES'][$orderDiscountId];
                     }
                 }
                 unset($orderDiscountId, $discountData);
             }
             if (!empty($applyResultData['COUPON_LIST'])) {
                 $this->couponsCache = $applyResultData['COUPON_LIST'];
             }
             $this->discountResult['BASKET'] = $applyResultData['BASKET'];
             if (!empty($this->discountResult['BASKET'])) {
                 foreach ($this->discountResult['BASKET'] as $discountList) {
                     foreach ($discountList as $discount) {
                         if ($discount['COUPON_ID'] == '') {
                             continue;
                         }
                         DiscountCouponsManager::setApplyByProduct($discount, array($discount['COUPON_ID']));
                     }
                 }
                 unset($discountList);
             }
             $this->discountResult['ORDER'] = $applyResultData['ORDER'];
             if (!empty($this->discountResult['ORDER'])) {
                 foreach ($this->discountResult['ORDER'] as $discount) {
                     if ($discount['COUPON_ID'] != '') {
                         DiscountCouponsManager::setApply($discount['COUPON_ID'], $discount['RESULT']);
                     }
                 }
                 unset($discount);
             }
             if (!empty($applyResultData['DATA']['BASKET'])) {
                 foreach ($applyResultData['DATA']['BASKET'] as $basketCode => $basketData) {
                     if (isset($basketData['BASE_PRICE'])) {
                         $this->orderData['BASKET_ITEMS'][$basketCode]['BASE_PRICE'] = (double) $basketData['BASE_PRICE'];
                         $this->basketBasePrice[$basketCode] = (double) $basketData['BASE_PRICE'];
                     }
                 }
             }
         }
     }
     if (!$loadDelivery) {
         $shipmentResult = $this->loadShipment();
         if (!$shipmentResult->isSuccess()) {
             $result->addErrors($shipmentResult->getErrors());
             return $result;
         }
         unset($shipmentResult);
     }
     $this->fillShipmentData();
     return $result;
 }