Example #1
0
 /**
  * Migrate discount data from b_sale_basket into new entity.
  *
  * @param array $order				Order data.
  * @return Result
  */
 public static function migrateOrderDiscounts($order)
 {
     if (self::$init === false) {
         self::init();
     }
     static $useBasePrice = null;
     if ($useBasePrice === null) {
         $useBasePrice = (string) Main\Config\Option::get('sale', 'get_discount_percent_from_base_price');
     }
     $process = true;
     $result = new Result();
     if (empty($order['ID']) || (int) $order['ID'] <= 0) {
         $process = false;
         $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_EMPTY_ORDER_ID'), self::ERROR_ID));
     }
     $catalogOrder = false;
     $basketData = array();
     if ($process) {
         $order['ID'] = (int) $order['ID'];
         $basePrices = array();
         $basketIterator = Internals\BasketTable::getList(array('select' => array('ID', 'DISCOUNT_COUPON', 'DISCOUNT_NAME', 'DISCOUNT_VALUE', 'MODULE', 'PRICE', 'DISCOUNT_PRICE', 'CURRENCY', 'SET_PARENT_ID', 'TYPE'), 'filter' => array('=ORDER_ID' => $order['ID'])));
         while ($basket = $basketIterator->fetch()) {
             $basket['ID'] = (int) $basket['ID'];
             $basket['MODULE'] = (string) $basket['MODULE'];
             $basket['DISCOUNT_COUPON'] = trim((string) $basket['DISCOUNT_COUPON']);
             $basket['DISCOUNT_NAME'] = trim((string) $basket['DISCOUNT_NAME']);
             $basket['SET_PARENT_ID'] = (int) $basket['SET_PARENT_ID'];
             $basket['TYPE'] = (int) $basket['TYPE'];
             if ($basket['MODULE'] == 'catalog') {
                 $basePrices[$basket['ID']] = array('BASE_PRICE' => $basket['PRICE'] + $basket['DISCOUNT_PRICE'], 'BASE_PRICE_CURRENCY' => $basket['CURRENCY']);
             }
             if ($basket['MODULE'] != 'catalog' || $basket['DISCOUNT_NAME'] == '' && $basket['DISCOUNT_COUPON'] == '') {
                 continue;
             }
             if ($basket['SET_PARENT_ID'] > 0 && $basket['TYPE'] <= 0) {
                 continue;
             }
             $catalogOrder = true;
             $hash = md5($basket['DISCOUNT_NAME'] . '|' . $basket['DISCOUNT_COUPON']);
             if (!isset($basketData[$hash])) {
                 $basketData[$hash] = array('DISCOUNT_NAME' => $basket['DISCOUNT_NAME'], 'DISCOUNT_COUPON' => $basket['DISCOUNT_COUPON'], 'ITEMS' => array());
             }
             $basketData[$hash]['ITEMS'][$basket['ID']] = $basket;
         }
         unset($basket, $basketIterator);
     }
     if ($process && $catalogOrder) {
         self::setManagerConfig(array('CURRENCY' => $order['CURRENCY'], 'SITE_ID' => $order['LID'], 'USE_BASE_PRICE' => $useBasePrice));
         foreach ($basketData as &$row) {
             if (!self::migrateDiscount($order['ID'], $row)) {
                 $process = false;
                 $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_SAVE_MIGRATE_DISCOUNT'), self::ERROR_ID));
                 break;
             }
         }
         unset($row);
     }
     unset($basketData);
     Internals\OrderDiscountDataTable::clearByOrder($order['ID']);
     if ($process) {
         if (!empty($basePrices)) {
             foreach ($basePrices as $basketId => $price) {
                 $fields = array('ORDER_ID' => $order['ID'], 'ENTITY_TYPE' => Internals\OrderDiscountDataTable::ENTITY_TYPE_BASKET, 'ENTITY_ID' => $basketId, 'ENTITY_VALUE' => $basketId, 'ENTITY_DATA' => $price);
                 $operationResult = Internals\OrderDiscountDataTable::add($fields);
                 if (!$operationResult->isSuccess()) {
                     $process = false;
                     $result->addErrors($operationResult->getErrors());
                 }
                 unset($operationResult);
             }
             unset($basketId, $price);
         }
     }
     if ($process) {
         $fields = array('ORDER_ID' => $order['ID'], 'ENTITY_TYPE' => Internals\OrderDiscountDataTable::ENTITY_TYPE_ORDER, 'ENTITY_ID' => $order['ID'], 'ENTITY_VALUE' => $order['ID'], 'ENTITY_DATA' => array('OLD_ORDER' => 'Y'));
         $operationResult = Internals\OrderDiscountDataTable::add($fields);
         if (!$operationResult->isSuccess()) {
             $process = false;
             $result->addErrors($operationResult->getErrors());
         }
         unset($operationResult);
     }
     unset($process);
     return $result;
 }
Example #2
0
 /**
  * Save discount result for new order.
  *
  * @return Result
  */
 protected function saveFull()
 {
     $result = new Result();
     $process = true;
     $order = $this->getOrder();
     $orderId = $order->getId();
     $basketResult = $this->getBasketTables();
     if (!$basketResult->isSuccess()) {
         $process = false;
         $result->addErrors($basketResult->getErrors());
     }
     if ($process) {
         DiscountCouponsManager::finalApply();
         DiscountCouponsManager::saveApplied();
         $couponsResult = $this->saveCoupons();
         if (!$couponsResult->isSuccess()) {
             $process = false;
             $result->addErrors($couponsResult->getErrors());
         }
     }
     if ($process) {
         //TODO: add in check - is old public (CSaleOrder::Add + CSaleBasket::OrderBasket)
         /*			if (!$this->newOrder)
         			{ */
         Internals\OrderRulesTable::clearByOrder($orderId);
         Internals\OrderDiscountDataTable::clearByOrder($orderId);
         //}
         $rulesList = array();
         $ruleDescr = array();
         $ruleIndex = 0;
         if (!empty($this->discountResult['BASKET'])) {
             foreach ($this->discountResult['BASKET'] as $basketCode => $discountList) {
                 $basketId = $this->forwardBasketTable[$basketCode];
                 foreach ($discountList as $discount) {
                     $orderDiscountId = $discount['DISCOUNT_ID'];
                     $rulesList[$ruleIndex] = array('MODULE_ID' => $this->discountsCache[$orderDiscountId]['MODULE_ID'], 'ORDER_DISCOUNT_ID' => $orderDiscountId, 'ORDER_ID' => $orderId, 'ENTITY_TYPE' => Internals\OrderRulesTable::ENTITY_TYPE_BASKET, 'ENTITY_ID' => $basketId, 'ENTITY_VALUE' => $basketId, 'COUPON_ID' => $discount['COUPON_ID'] != '' ? $this->couponsCache[$discount['COUPON_ID']]['ID'] : 0, 'APPLY' => $discount['RESULT']['APPLY']);
                     $ruleDescr[$ruleIndex] = array('MODULE_ID' => $this->discountsCache[$orderDiscountId]['MODULE_ID'], 'ORDER_DISCOUNT_ID' => $orderDiscountId, 'ORDER_ID' => $orderId, 'DESCR' => $discount['RESULT']['DESCR_DATA']);
                     $ruleIndex++;
                 }
                 unset($discount);
             }
             unset($basketId, $basketCode, $discountList);
         }
         if (!empty($this->discountResult['ORDER'])) {
             foreach ($this->discountResult['ORDER'] as $discount) {
                 $orderDiscountId = $discount['DISCOUNT_ID'];
                 if (!empty($discount['RESULT']['BASKET'])) {
                     foreach ($discount['RESULT']['BASKET'] as $basketCode => $applyData) {
                         $basketId = $this->forwardBasketTable[$basketCode];
                         $rulesList[$ruleIndex] = array('MODULE_ID' => $this->discountsCache[$orderDiscountId]['MODULE_ID'], 'ORDER_DISCOUNT_ID' => $orderDiscountId, 'ORDER_ID' => $orderId, 'ENTITY_TYPE' => Internals\OrderRulesTable::ENTITY_TYPE_BASKET, 'ENTITY_ID' => $basketId, 'ENTITY_VALUE' => $basketId, 'COUPON_ID' => $discount['COUPON_ID'] != '' ? $this->couponsCache[$discount['COUPON_ID']]['ID'] : 0, 'APPLY' => $applyData['APPLY']);
                         $ruleDescr[$ruleIndex] = array('MODULE_ID' => $this->discountsCache[$orderDiscountId]['MODULE_ID'], 'ORDER_DISCOUNT_ID' => $orderDiscountId, 'ORDER_ID' => $orderId, 'DESCR' => $applyData['DESCR_DATA']);
                         $ruleIndex++;
                     }
                     unset($basketCode, $applyData);
                 }
                 if (!empty($discount['RESULT']['DELIVERY'])) {
                     $rulesList[$ruleIndex] = array('MODULE_ID' => $this->discountsCache[$orderDiscountId]['MODULE_ID'], 'ORDER_DISCOUNT_ID' => $orderDiscountId, 'ORDER_ID' => $orderId, 'ENTITY_TYPE' => Internals\OrderRulesTable::ENTITY_TYPE_DELIVERY, 'ENTITY_ID' => (int) $discount['RESULT']['DELIVERY']['DELIVERY_ID'], 'ENTITY_VALUE' => (string) $discount['RESULT']['DELIVERY']['DELIVERY_ID'], 'COUPON_ID' => $discount['COUPON_ID'] != '' ? $this->couponsCache[$discount['COUPON_ID']]['ID'] : 0, 'APPLY' => $discount['RESULT']['DELIVERY']['APPLY']);
                     $ruleDescr[$ruleIndex] = array('MODULE_ID' => $this->discountsCache[$orderDiscountId]['MODULE_ID'], 'ORDER_DISCOUNT_ID' => $orderDiscountId, 'ORDER_ID' => $orderId, 'DESCR' => $discount['RESULT']['DELIVERY']['DESCR_DATA']);
                     $ruleIndex++;
                 }
             }
             unset($discount);
         }
         if (!empty($rulesList)) {
             foreach ($rulesList as $index => $ruleRow) {
                 $ruleResult = Internals\OrderRulesTable::add($ruleRow);
                 if ($ruleResult->isSuccess()) {
                     $ruleDescr[$index]['RULE_ID'] = $ruleResult->getId();
                     $descrResult = Internals\OrderRulesDescrTable::add($ruleDescr[$index]);
                     if (!$descrResult->isSuccess()) {
                         $process = false;
                         $result->addError(new Main\Entity\EntityError(Loc::getMessage('BX_SALE_DISCOUNT_ERR_SAVE_APPLY_RULES'), self::ERROR_ID));
                         unset($descrResult);
                         break;
                     }
                     unset($descrResult);
                 } else {
                     $process = false;
                     $result->addError(new Main\Entity\EntityError(Loc::getMessage('BX_SALE_DISCOUNT_ERR_SAVE_APPLY_RULES'), self::ERROR_ID));
                     unset($ruleResult);
                     break;
                 }
                 unset($ruleResult);
             }
             unset($ruleRow);
         }
     }
     if ($process) {
         $fields = array('ORDER_ID' => $orderId, 'ENTITY_TYPE' => Internals\OrderDiscountDataTable::ENTITY_TYPE_ORDER, 'ENTITY_ID' => $orderId, 'ENTITY_VALUE' => $orderId, 'ENTITY_DATA' => array('OPTIONS' => 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')), 'DELIVERY' => array('DELIVERY_ID' => $this->orderData['DELIVERY_ID'], 'CUSTOM_PRICE_DELIVERY' => $this->orderData['CUSTOM_PRICE_DELIVERY'], 'SHIPMENT_ID' => 0)));
         if ($this->shipment instanceof Shipment) {
             $fields['ENTITY_DATA']['DELIVERY']['SHIPMENT_ID'] = $this->shipment->getId();
         }
         $dataResult = Internals\OrderDiscountDataTable::add($fields);
         if (!$dataResult->isSuccess()) {
             $result->addError(new Main\Entity\EntityError(Loc::getMessage('BX_SALE_DISCOUNT_ERR_SAVE_APPLY_RULES'), self::ERROR_ID));
         }
         unset($dataResult, $fields);
         if (!empty($this->basketBasePrice)) {
             $orderCurrency = $order->getCurrency();
             foreach ($this->basketBasePrice as $basketCode => $basePrice) {
                 if (!isset($this->forwardBasketTable[$basketCode])) {
                     continue;
                 }
                 $fields = array('BASE_PRICE' => (string) $basePrice, 'BASE_PRICE_CURRENCY' => $orderCurrency);
                 Internals\OrderDiscountDataTable::saveBasketItemData($orderId, $this->forwardBasketTable[$basketCode], $fields, false);
             }
             unset($basketCode, $basePrice);
         }
     }
     if ($process) {
         if (DiscountCouponsManager::usedByManager()) {
             DiscountCouponsManager::clear(true);
         }
     }
     return $result;
 }