/** * Load coupons for existing order. * * @return void */ public static function load() { if (self::$useMode != self::MODE_ORDER) { return; } self::$checkActivity = false; $couponsList = array(); $couponIterator = Internals\OrderCouponsTable::getList(array('select' => array('*', 'MODULE' => 'ORDER_DISCOUNT.MODULE_ID', 'DISCOUNT_ID' => 'ORDER_DISCOUNT.DISCOUNT_ID', 'DISCOUNT_NAME' => 'ORDER_DISCOUNT.NAME'), 'filter' => array('=ORDER_ID' => self::$orderId), 'order' => array('ID' => 'ASC'))); while ($coupon = $couponIterator->fetch()) { $couponData = $coupon['DATA']; $couponData['COUPON'] = $coupon['COUPON']; $couponData['STATUS'] = self::STATUS_ENTERED; $couponData['CHECK_CODE'] = self::COUPON_CHECK_OK; $couponData['MODULE'] = $coupon['MODULE']; $couponData['ID'] = $coupon['COUPON_ID']; $couponData['DISCOUNT_ID'] = $coupon['DISCOUNT_ID']; $couponData['DISCOUNT_NAME'] = (string) $coupon['DISCOUNT_NAME']; $couponData['DISCOUNT_ACTIVE'] = 'Y'; $couponData['TYPE'] = $coupon['TYPE']; $couponData['ACTIVE'] = 'Y'; $couponData['SAVED'] = 'Y'; foreach (self::$timeFields as $fieldName) { if (isset($couponData[$fieldName])) { $couponData[$fieldName] = Main\Type\DateTime::createFromTimestamp($couponData[$fieldName]); } } unset($fieldName); if (empty($couponData['USER_INFO']) && $couponData['MODE'] == self::COUPON_MODE_FULL) { $couponData['USER_INFO'] = array('USER_ID' => 0, 'MAX_USE' => 0, 'USE_COUNT' => 0, 'ACTIVE_FROM' => null, 'ACTIVE_TO' => null); } if (!empty($couponData['USER_INFO'])) { foreach (self::$timeFields as $fieldName) { if (isset($couponData['USER_INFO'][$fieldName])) { $couponData['USER_INFO'][$fieldName] = Main\Type\DateTime::createFromTimestamp($couponData['USER_INFO'][$fieldName]); } } unset($fieldName); foreach ($couponData['USER_INFO'] as $fieldName => $fieldValue) { $couponData[$fieldName] = $fieldValue; } } $couponsList[$couponData['COUPON']] = $couponData; } unset($coupon, $couponIterator); if (!empty($couponsList)) { self::setCoupons($couponsList, false); } self::$checkActivity = true; }
/** * Clear rule list. * * @param array $filter Filter for clear rules. * @return void */ protected static function clear($filter) { if (empty($filter) || !is_array($filter)) { return; } $ruleList = array(); $orderDiscountList = array(); $orderCouponList = array(); $ruleIterator = self::getList(array('select' => array('ID', 'ORDER_DISCOUNT_ID', 'COUPON_ID'), 'filter' => $filter)); while ($rule = $ruleIterator->fetch()) { $rule['ID'] = (int) $rule['ID']; $rule['ORDER_DISCOUNT_ID'] = (int) $rule['ORDER_DISCOUNT_ID']; $rule['COUPON_ID'] = (int) $rule['COUPON_ID']; $ruleList[] = $rule['ID']; } unset($rule, $ruleIterator); if (empty($ruleList)) { return; } $conn = Main\Application::getConnection(); $helper = $conn->getSqlHelper(); $ruleRows = array_chunk($ruleList, 500); $mainQuery = 'delete from ' . $helper->quote(self::getTableName()) . ' where ' . $helper->quote('ID') . ' in ('; $descrQuery = 'delete from ' . $helper->quote(OrderRulesDescrTable::getTableName()) . ' where ' . $helper->quote('RULE_ID') . ' in ('; foreach ($ruleRows as &$row) { $conn->queryExecute($mainQuery . implode(', ', $row) . ')'); $conn->queryExecute($descrQuery . implode(', ', $row) . ')'); } unset($row, $descrQuery, $mainQuery, $ruleRows, $ruleList); unset($helper, $conn); if (!empty($orderDiscountList)) { OrderDiscountTable::clearList($orderDiscountList); } unset($orderDiscountList); if (!empty($orderCouponList)) { OrderCouponsTable::clearList($orderCouponList); } unset($orderCouponList); }
$discountList[$discount['ORDER_ID']] = array(); } $discountList[$discount['ORDER_ID']][$discount['DISCOUNT_ID']] = $discount['DISCOUNT_NAME'] != '' ? $discount['DISCOUNT_NAME'] : $discount['DISCOUNT_ID']; } unset($discount, $discountsIterator); if (!empty($discountList)) { foreach ($discountList as $order => $orderDiscounts) { $rowsList[$order]->AddViewField('BASKET_DISCOUNT_NAME', implode('<br><br>', $orderDiscounts)); } unset($order, $orderDiscounts); } unset($discountList); } if (in_array('BASKET_DISCOUNT_COUPON', $arVisibleColumns)) { $couponsList = array(); $couponsIterator = Sale\Internals\OrderCouponsTable::getList(array('select' => array('ORDER_ID', 'COUPON'), 'filter' => array('@ORDER_ID' => array_keys($rowsList)), 'order' => array('ORDER_ID' => 'ASC', 'ID' => 'ASC'))); while ($coupon = $couponsIterator->fetch()) { $coupon['ORDER_ID'] = (int) $coupon['ORDER_ID']; if (!isset($couponsList[$coupon['ORDER_ID']])) { $couponsList[$coupon['ORDER_ID']] = array(); } $couponsList[$coupon['ORDER_ID']][] = $coupon['COUPON']; } unset($coupon, $couponsIterator); if (!empty($couponsList)) { foreach ($couponsList as $order => $coupons) { $rowsList[$order]->AddViewField('BASKET_DISCOUNT_COUPON', implode('<br><br>', $coupons)); } unset($order, $coupons); } unset($couponsList);
/** * 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; }