/** * @override * @throws Exception */ protected function prepareData() { $saleDiscountId = null; $wasAdded = false; $xmlId = $this->arParams['DISCOUNT_XML_ID']; $saleDiscountValue = (double) $this->arParams['DISCOUNT_VALUE']; $saleDiscountUnit = (string) $this->arParams['DISCOUNT_UNIT']; $fieldsAdd = array('LID' => $this->getSiteId(), 'NAME' => Loc::getMessage("CVP_DISCOUNT_NAME"), 'ACTIVE' => 'Y', 'ACTIVE_FROM' => '', 'ACTIVE_TO' => '', 'PRIORITY' => 1, 'SORT' => 100, 'LAST_DISCOUNT' => 'Y', 'XML_ID' => $xmlId, 'USER_GROUPS' => array(2), 'ACTIONS' => serialize(array('CLASS_ID' => 'CondGroup', 'DATA' => array('All' => 'AND'), 'CHILDREN' => array(array('CLASS_ID' => 'ActSaleBsktGrp', 'DATA' => array('Type' => 'Discount', 'Value' => $saleDiscountValue, 'Unit' => $saleDiscountUnit, 'All' => 'AND'), 'CHILDREN' => array())))), 'CONDITIONS' => serialize(array('CLASS_ID' => 'CondGroup', 'DATA' => array('All' => 'AND', 'True' => 'True'), 'CHILDREN' => array()))); if (strlen($xmlId) <= 0) { return; } $fields = array('XML_ID' => $xmlId, 'ACTIVE' => 'Y'); $saleDiscountDb = CSaleDiscount::GetList(array('DATE_CREATE' => 'DESC'), $fields, false, false, array('ID', 'ACTIONS', 'CONDITIONS')); if ($saleDiscount = $saleDiscountDb->Fetch()) { if ($saleDiscount['ACTIONS'] == $fieldsAdd['ACTIONS'] && $saleDiscount['CONDITIONS'] == $fieldsAdd['CONDITIONS']) { $saleDiscountId = $saleDiscount['ID']; } } if (!$saleDiscountId) { $fieldsAdd['ACTIVE'] = 'N'; $saleDiscountId = CSaleDiscount::Add($fieldsAdd); $wasAdded = true; } $this->arResult['COUPON'] = ''; if ($saleDiscountId) { $coupon = \Bitrix\Sale\Internals\DiscountCouponTable::generateCoupon(true); //$activeFrom = new \Bitrix\Main\Type\DateTime; //$activeTo = clone $activeFrom; $addDb = \Bitrix\Sale\Internals\DiscountCouponTable::add(array('DISCOUNT_ID' => $saleDiscountId, 'COUPON' => $coupon, 'TYPE' => \Bitrix\Sale\Internals\DiscountCouponTable::TYPE_ONE_ORDER, 'MAX_USE' => 1, 'USER_ID' => 0, 'DESCRIPTION' => $this->arParams['COUPON_DESCRIPTION'])); if ($addDb->isSuccess()) { $this->arResult['COUPON'] = $coupon; if ($wasAdded) { CSaleDiscount::Update($saleDiscountId, array('ACTIVE' => 'Y')); } } } }
/** * Update use coupon flag for discount list. * * @return void */ public static function updateUseCoupons() { if (!self::isCheckedCouponsUse() || empty(self::$discountCheckList)) { return; } Main\Type\Collection::normalizeArrayValuesByInt(self::$discountCheckList); if (empty(self::$discountCheckList)) { return; } $withoutCoupons = array_fill_keys(self::$discountCheckList, true); $withCoupons = array(); $couponIterator = DiscountCouponTable::getList(array('select' => array('DISCOUNT_ID', new Main\Entity\ExpressionField('CNT', 'COUNT(*)')), 'filter' => array('@DISCOUNT_ID' => self::$discountCheckList), 'group' => array('DISCOUNT_ID'))); while ($coupon = $couponIterator->fetch()) { $coupon['CNT'] = (int) $coupon['CNT']; if ($coupon['CNT'] > 0) { $coupon['DISCOUNT_ID'] = (int) $coupon['DISCOUNT_ID']; unset($withoutCoupons[$coupon['DISCOUNT_ID']]); $withCoupons[$coupon['DISCOUNT_ID']] = true; } } unset($coupon, $couponIterator); if (!empty($withoutCoupons)) { $withoutCoupons = array_keys($withoutCoupons); DiscountTable::setUseCoupons($withoutCoupons, 'N'); } if (!empty($withCoupons)) { $withCoupons = array_keys($withCoupons); DiscountTable::setUseCoupons($withCoupons, 'Y'); } unset($withCoupons, $withoutCoupons); static::clearDiscountCheckList(); }
if (!empty($errors)) { $errorMessage = new CAdminMessage(array('DETAILS' => implode('<br>', $errors), 'TYPE' => 'ERROR', 'MESSAGE' => Loc::getMessage('BX_SALE_DISCOUNT_COUPON_ERR_SAVE'), 'HTML' => true)); echo $errorMessage->Show(); unset($errorMessage); } $selectFields = array(); if (!$multiCoupons) { $defaultValues = array('DISCOUNT_ID' => '', 'COUPON' => '', 'ACTIVE' => 'Y', 'ACTIVE_FROM' => null, 'ACTIVE_TO' => null, 'TYPE' => Internals\DiscountCouponTable::TYPE_ONE_ORDER, 'MAX_USE' => 0, 'USE_COUNT' => 0, 'USER_ID' => 0, 'DESCRIPTION' => ''); $selectFields = array('ID', 'DISCOUNT_NAME' => 'DISCOUNT.NAME'); $selectFields = array_merge($selectFields, array_keys($defaultValues)); } else { $defaultValues = array('COUNT' => '', array('DISCOUNT_ID' => '', 'ACTIVE_FROM' => null, 'ACTIVE_TO' => null, 'TYPE' => Internals\DiscountCouponTable::TYPE_ONE_ORDER, 'MAX_USE' => 0)); } $coupon = array(); if (!$multiCoupons && $couponID > 0) { $couponIterator = Internals\DiscountCouponTable::getList(array('select' => $selectFields, 'filter' => array('=ID' => $couponID))); if (!($coupon = $couponIterator->fetch())) { $couponID = 0; } unset($couponIterator); } if ($couponID == 0) { $coupon = $defaultValues; } if (!$multiCoupons) { $coupon['DISCOUNT_NAME'] = (string) $coupon['DISCOUNT_NAME']; $coupon['DISCOUNT_ID'] = (int) $coupon['DISCOUNT_ID']; $coupon['TYPE'] = (int) $coupon['TYPE']; $coupon['USE_COUNT'] = (int) $coupon['USE_COUNT']; $coupon['MAX_USE'] = (int) $coupon['MAX_USE']; $coupon['USER_ID'] = (int) $coupon['USER_ID'];
{ $totalPages = ceil($totalCount/$navyParams['SIZEN']); if ($navyParams['PAGEN'] > $totalPages) $navyParams['PAGEN'] = $totalPages; $getListParams['limit'] = $navyParams['SIZEN']; $getListParams['offset'] = $navyParams['SIZEN']*($navyParams['PAGEN']-1); } else { $navyParams['PAGEN'] = 1; $getListParams['limit'] = $navyParams['SIZEN']; $getListParams['offset'] = 0; } } $couponIterator = new CAdminResult(Internals\DiscountCouponTable::getList($getListParams), $adminListTableID); if ($usePageNavigation) { $couponIterator->NavStart($getListParams['limit'], $navyParams['SHOW_ALL'], $navyParams['PAGEN']); $couponIterator->NavRecordCount = $totalCount; $couponIterator->NavPageCount = $totalPages; $couponIterator->NavPageNomer = $navyParams['PAGEN']; } else { $couponIterator->NavStart(); } $adminList->NavText($couponIterator->GetNavPrint(Loc::getMessage('BT_SALE_DISCOUNT_COUPON_LIST_MESS_NAV'))); while ($coupon = $couponIterator->Fetch()) {
unset($countQuery); $totalCount = (int) $totalCount['CNT']; if ($totalCount > 0) { $totalPages = ceil($totalCount / $navyParams['SIZEN']); if ($navyParams['PAGEN'] > $totalPages) { $navyParams['PAGEN'] = $totalPages; } $getListParams['limit'] = $navyParams['SIZEN']; $getListParams['offset'] = $navyParams['SIZEN'] * ($navyParams['PAGEN'] - 1); } else { $navyParams['PAGEN'] = 1; $getListParams['limit'] = $navyParams['SIZEN']; $getListParams['offset'] = 0; } } $couponIterator = new CAdminSubResult(Internals\DiscountCouponTable::getList($getListParams), $adminListTableID, $adminList->GetListUrl(true)); if ($usePageNavigation) { $couponIterator->NavStart($getListParams['limit'], $navyParams['SHOW_ALL'], $navyParams['PAGEN']); $couponIterator->NavRecordCount = $totalCount; $couponIterator->NavPageCount = $totalPages; $couponIterator->NavPageNomer = $navyParams['PAGEN']; } else { $couponIterator->NavStart(); } $adminList->NavText($couponIterator->GetNavPrint(Loc::getMessage('BT_SALE_DISCOUNT_COUPON_LIST_MESS_NAV'))); while ($coupon = $couponIterator->Fetch()) { $coupon['ID'] = (int) $coupon['ID']; $coupon['MAX_USE'] = (int) $coupon['MAX_USE']; $coupon['USE_COUNT'] = (int) $coupon['USE_COUNT']; if ($selectFieldsMap['CREATED_BY']) { $coupon['CREATED_BY'] = (int) $coupon['CREATED_BY'];
} else { $errors[] = str_replace('#ID#', $discountID, GetMessage('BT_SALE_DISCOUNT_EDIT_ERR_UPDATE')); } } } else { $discountID = (int) CSaleDiscount::Add($arFields); if ($discountID <= 0) { if ($ex = $APPLICATION->GetException()) { $errors[] = $ex->GetString(); } else { $errors[] = GetMessage('BT_SALE_DISCOUNT_EDIT_ERR_ADD'); } } else { if ($couponsAdd) { $couponsFields['DISCOUNT_ID'] = $discountID; $couponsResult = Internals\DiscountCouponTable::addPacket($couponsFields, $additionalFields['COUPON_COUNT']); if (!$couponsResult->isSuccess()) { $errors = $couponsResult->getErrorMessages(); } } } } } if (empty($errors)) { if (empty($_POST['apply'])) { LocalRedirect("/bitrix/admin/sale_discount.php?lang=" . LANGUAGE_ID . GetFilterParams("filter_", false)); } else { LocalRedirect("/bitrix/admin/sale_discount_edit.php?lang=" . LANGUAGE_ID . "&ID=" . $discountID . '&' . $control->ActiveTabParam()); } } }
/** * Clear freeze coupons. * * @param array $coupon Coupon data. * @return bool */ protected static function filterFreezeCoupons($coupon) { if (empty(self::$couponTypes)) { self::$couponTypes = Internals\DiscountCouponTable::getCouponTypes(true); } return isset($coupon['TYPE']) && isset(self::$couponTypes[$coupon['TYPE']]) && $coupon['STATUS'] != self::STATUS_FREEZE; }
public function runOperation() { global $APPLICATION; $found = false; $filter = array('>ID' => $this->lastID, '=VERSION' => Sale\Internals\DiscountTable::VERSION_15); $discountsIterator = Sale\Internals\DiscountTable::getList(array('select' => array('ID', 'MODIFIED_BY', 'TIMESTAMP_X', 'CONDITIONS_LIST', 'ACTIONS_LIST', 'NAME'), 'filter' => $filter, 'order' => array('ID' => 'ASC'), 'limit' => $this->maxOperationCounter)); while ($discount = $discountsIterator->fetch()) { $found = true; $error = array(); $rawFields = array('ID' => $discount['ID'], 'CONDITIONS' => $discount['CONDITIONS_LIST'], 'ACTIONS' => $discount['ACTIONS_LIST']); if (\CSaleDiscount::checkFields('UPDATE', $rawFields)) { $fields = array('MODIFIED_BY' => $discount['MODIFIED_BY'], 'TIMESTAMP_X' => $discount['TIMESTAMP_X'], 'UNPACK' => $rawFields['UNPACK'], 'APPLICATION' => $rawFields['APPLICATION']); if (isset($rawFields['EXECUTE_MODULE'])) { $fields['EXECUTE_MODULE'] = $rawFields['EXECUTE_MODULE']; } $useCoupons = 'N'; $coupon = Sale\Internals\DiscountCouponTable::getList(array('select' => array('ID', 'DISCOUNT_ID'), 'filter' => array('=DISCOUNT_ID' => $discount['ID']), 'limit' => 1))->fetch(); if (!empty($coupon)) { $useCoupons = 'Y'; } $fields['USE_COUPONS'] = $useCoupons; unset($coupon, $useCoupons); $updateResult = Sale\Internals\DiscountTable::update($discount['ID'], $fields); if ($updateResult->isSuccess()) { if (isset($rawFields['ENTITIES'])) { Sale\Internals\DiscountEntitiesTable::updateByDiscount($discount['ID'], $rawFields['ENTITIES'], true); } if (isset($rawFields['HANDLERS']['MODULES'])) { Sale\Internals\DiscountModuleTable::updateByDiscount($discount['ID'], $rawFields['HANDLERS']['MODULES'], true); } } else { $error = $updateResult->getErrorMessages(); } } else { if ($ex = $APPLICATION->GetException()) { $error[] = $ex->GetString(); } else { $error[] = Loc::getMessage('SALE_DISCOUNT_REINDEX_UPDATE_UNKNOWN_ERROR'); } } $this->lastID = $discount['ID']; $this->allOperationCounter++; if (!empty($error)) { $this->errorCounter++; $this->errors[] = Loc::getMessage('SALE_DISCOUNT_REINDEX_ORDER_ERROR_REPORT', array('#URL#' => str_replace('#ID#', $discount['ID'], $this->discountEditUrl), '#TITLE#' => trim((string) $discount['NAME']) != '' ? $discount['NAME'] : $discount['ID'], '#ERRORS#' => implode('; ', $error))); } if ($this->maxExecutionTime > 0 && time() - $this->startOperationTime > $this->maxExecutionTime) { break; } } unset($discount, $discountsIterator); if (!$found) { $this->finishOperation = true; } }
/** * Default onAfterDelete handler. Absolutely necessary. * * @param Main\Entity\Event $event Event object. * @return void */ public static function onAfterDelete(Main\Entity\Event $event) { $id = $event->getParameter('id'); $id = end($id); DiscountEntitiesTable::deleteByDiscount($id); DiscountModuleTable::deleteByDiscount($id); DiscountGroupTable::deleteByDiscount($id); if (self::$deleteCoupons !== false) { DiscountCouponTable::deleteByDiscount(self::$deleteCoupons); self::$deleteCoupons = false; } unset($id); }
/** * Check coupon type. * * @param int $value Coupon type. * @param array|int $primary Primary key. * @param array $row Current data. * @param Main\Entity\Field $field Field object. * @return bool|string */ public static function checkType($value, $primary, array $row, Main\Entity\Field $field) { if (Internals\DiscountCouponTable::isValidCouponType($value) || $value == Internals\DiscountCouponTable::TYPE_ARCHIVED) { return true; } return Loc::getMessage('ORDER_COUPONS_VALIDATOR_TYPE'); }
use Bitrix\Main\Loader; use Bitrix\Sale\Internals; require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_before.php'; Loc::loadMessages(__FILE__); global $USER; $result = array('STATUS' => 'OK', 'MESSAGE' => '', 'COUPON' => ''); if ($result['STATUS'] == 'OK') { if (!isset($USER) || !$USER instanceof CUser) { $result['STATUS'] = 'ERROR'; $result['MESSAGE'] = Loc::getMessage('BX_SALE_TOOLS_GEN_CPN_ERR_USER'); } elseif (!$USER->IsAuthorized()) { $result['STATUS'] = 'ERROR'; $result['MESSAGE'] = Loc::getMessage('BX_SALE_TOOLS_GEN_CPN_ERR_AUTH'); } } if ($result['STATUS'] == 'OK') { if (!check_bitrix_sessid()) { $result['STATUS'] = 'ERROR'; $result['MESSAGE'] = Loc::getMessage('BX_SALE_TOOLS_GEN_CPN_ERR_SESSION'); } } if ($result['STATUS'] == 'OK') { if (!Loader::includeModule('sale')) { $result['STATUS'] = 'ERROR'; $result['MESSAGE'] = Loc::getMessage('BX_SALE_TOOLS_GEN_CPN_ERR_MODULE'); } } if ($result['STATUS'] == 'OK') { $result['COUPON'] = Internals\DiscountCouponTable::generateCoupon(true); } echo CUtil::PhpToJSObject($result);
/** * Save coupon. * * @param array $coupon Coupon data. * @return Result */ public static function saveCoupon($coupon) { if (self::$init === false) { self::init(); } $result = new Result(); $process = true; $resultData = array('ID' => 0, 'ORDER_ID' => 0, 'ORDER_DISCOUNT_ID' => 0, 'COUPON' => '', 'TYPE' => Internals\DiscountCouponTable::TYPE_UNKNOWN, 'COUPON_ID' => 0, 'DATA' => array()); if (empty($coupon) || !is_array($coupon)) { $process = false; $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_EMPTY_COUPON'), self::ERROR_ID)); } if ($process) { if (empty($coupon['ORDER_DISCOUNT_ID']) || (int) $coupon['ORDER_DISCOUNT_ID'] <= 0) { $process = false; $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_EMPTY_COUPON'), self::ERROR_ID)); } if (empty($coupon['COUPON'])) { $process = false; $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_COUPON_CODE_ABSENT'), self::ERROR_ID)); } if (!isset($coupon['TYPE'])) { $process = false; $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_COUPON_TYPE_ABSENT', array('#COUPON#' => $coupon['COUPON'])), self::ERROR_ID)); } elseif (!Internals\DiscountCouponTable::isValidCouponType($coupon['TYPE']) && $coupon['TYPE'] != Internals\DiscountCouponTable::TYPE_ARCHIVED) { $process = false; $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_COUPON_TYPE_BAD', array('#COUPON#' => $coupon['COUPON'])), self::ERROR_ID)); } } if ($process) { if ($coupon['TYPE'] != Internals\DiscountCouponTable::TYPE_ARCHIVED) { if (empty($coupon['COUPON_ID']) || (int) $coupon['COUPON_ID'] <= 0) { $process = false; $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_COUPON_ID_BAD', array('#COUPON#' => $coupon['COUPON'])), self::ERROR_ID)); } } } if ($process) { $orderCouponIterator = Internals\OrderCouponsTable::getList(array('select' => array('*'), 'filter' => array('=COUPON' => $coupon['COUPON'], '=ORDER_ID' => $coupon['ORDER_ID']))); if ($orderCoupon = $orderCouponIterator->fetch()) { $resultData = $orderCoupon; } else { $fields = $coupon; if (array_key_exists('ID', $fields)) { unset($fields['ID']); } $couponResult = Internals\OrderCouponsTable::add($fields); if ($couponResult->isSuccess()) { $resultData = $fields; $resultData['ID'] = $couponResult->getId(); } else { $process = false; $result->addErrors($couponResult->getErrors()); } unset($couponResult, $fields); } unset($orderCoupon, $orderCouponIterator); } if ($process) { $result->setId($resultData['ID']); $result->setData($resultData); } unset($process, $resultData); return $result; }