Example #1
1
 /**
  * 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;
 }
Example #2
0
 /**
  * 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);
 }
Example #3
0
             $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);
Example #4
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;
 }