/** * 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; }
/** * 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; }