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