/** * @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')); } } } }
protected function __ConvertOldFormat($strAction, &$arFields) { global $APPLICATION; $arMsg = array(); $boolResult = true; $arNeedFields = array('LID', 'CURRENCY', 'DISCOUNT_TYPE', 'DISCOUNT_VALUE', 'PRICE_FROM', 'PRICE_TO'); $arUpdateFields = array('DISCOUNT_VALUE', 'PRICE_FROM', 'PRICE_TO'); $strAction = ToUpper($strAction); if (!array_key_exists('CONDITIONS', $arFields) && !array_key_exists('ACTIONS', $arFields)) { $strSiteCurrency = ''; $boolUpdate = false; if ('UPDATE' == $strAction) { $boolNeedQuery = false; foreach ($arUpdateFields as &$strFieldID) { if (array_key_exists($strFieldID, $arFields)) { $boolUpdate = true; break; } } if (isset($strFieldID)) { unset($strFieldID); } if ($boolUpdate) { foreach ($arNeedFields as &$strFieldID) { if (!array_key_exists($strFieldID, $arFields)) { $boolNeedQuery = true; break; } } if (isset($strFieldID)) { unset($strFieldID); } if ($boolNeedQuery) { $rsDiscounts = CSaleDiscount::GetList(array(), array('ID' => $arFields['ID']), false, false, $arNeedFields); if ($arDiscount = $rsDiscounts->Fetch()) { foreach ($arNeedFields as &$strFieldID) { if (!array_key_exists($strFieldID, $arFields)) { $arFields[$strFieldID] = $arDiscount[$strFieldID]; } } if (isset($strFieldID)) { unset($strFieldID); } } else { $boolUpdate = false; $boolResult = false; $arMsg[] = array('id' => 'ID', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_ABSENT')); } } } } if ('ADD' == $strAction || $boolUpdate) { if (!array_key_exists('LID', $arFields)) { $boolResult = false; $arMsg[] = array('id' => 'LID', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_SITE_ID_ABSENT')); } else { $arFields['LID'] = strval($arFields['LID']); if ('' == $arFields['LID']) { $boolResult = false; $arMsg[] = array('id' => 'LID', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_SITE_ID_ABSENT')); } else { $rsSites = CSite::GetByID($arFields["LID"]); if (!($arSite = $rsSites->Fetch())) { $boolResult = false; $arMsg[] = array('id' => 'LID', 'text' => Loc::getMessage('SKGD_NO_SITE', array('#ID#' => $arFields['LID']))); } else { $strSiteCurrency = CSaleLang::GetLangCurrency($arFields['LID']); } } } if (!array_key_exists('CURRENCY', $arFields)) { $boolResult = false; $arMsg[] = array('id' => 'CURRENCY', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_CURRENCY_ABSENT')); } else { $arFields['CURRENCY'] = strval($arFields['CURRENCY']); if ('' == $arFields['CURRENCY']) { $boolResult = false; $arMsg[] = array('id' => 'CURRENCY', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_CURRENCY_ABSENT')); } else { if (!($arCurrency = CCurrency::GetByID($arFields["CURRENCY"]))) { $boolResult = false; $arMsg[] = array('id' => 'CURRENCY', 'text' => Loc::getMessage('SKGD_NO_CURRENCY', array('#ID#' => $arFields['CURRENCY']))); } } } if (!array_key_exists("DISCOUNT_TYPE", $arFields)) { $boolResult = false; $arMsg[] = array('id' => 'DISCOUNT_TYPE', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_TYPE_ABSENT')); } else { $arFields["DISCOUNT_TYPE"] = strval($arFields["DISCOUNT_TYPE"]); if (CSaleDiscount::OLD_DSC_TYPE_PERCENT != $arFields["DISCOUNT_TYPE"] && CSaleDiscount::OLD_DSC_TYPE_FIX != $arFields["DISCOUNT_TYPE"]) { $boolResult = false; $arMsg[] = array('id' => 'DISCOUNT_TYPE', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_TYPE_BAD')); } } if (!array_key_exists('DISCOUNT_VALUE', $arFields)) { $boolResult = false; $arMsg[] = array('id' => 'DISCOUNT_VALUE', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_VALUE_ABSENT')); } else { $arFields['DISCOUNT_VALUE'] = (double) str_replace(',', '.', $arFields['DISCOUNT_VALUE']); if (0 >= $arFields['DISCOUNT_VALUE']) { $boolResult = false; $arMsg[] = array('id' => 'DISCOUNT_VALUE', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_VALUE_BAD')); } } if ($boolResult) { $arConditions = array('CLASS_ID' => 'CondGroup', 'DATA' => array('All' => 'AND', 'True' => 'True'), 'CHILDREN' => array()); $arActions = array('CLASS_ID' => 'CondGroup', 'DATA' => array('All' => 'AND', 'True' => 'True'), 'CHILDREN' => array()); $boolCurrency = $arFields['CURRENCY'] == $strSiteCurrency; if (array_key_exists('PRICE_FROM', $arFields)) { $arFields["PRICE_FROM"] = str_replace(",", ".", strval($arFields["PRICE_FROM"])); $arFields["PRICE_FROM"] = doubleval($arFields["PRICE_FROM"]); if (0 < $arFields["PRICE_FROM"]) { $dblValue = roundEx($boolCurrency ? $arFields['PRICE_FROM'] : CCurrencyRates::ConvertCurrency($arFields['PRICE_FROM'], $arFields['CURRENCY'], $strSiteCurrency), SALE_VALUE_PRECISION); $arConditions['CHILDREN'][] = array('CLASS_ID' => 'CondBsktAmtGroup', 'DATA' => array('logic' => 'EqGr', 'Value' => (string) $dblValue, 'All' => 'AND'), 'CHILDREN' => array()); $arFields["PRICE_FROM"] = $dblValue; } } if (array_key_exists('PRICE_TO', $arFields)) { $arFields["PRICE_TO"] = str_replace(",", ".", strval($arFields["PRICE_TO"])); $arFields["PRICE_TO"] = doubleval($arFields["PRICE_TO"]); if (0 < $arFields["PRICE_TO"]) { $dblValue = roundEx($boolCurrency ? $arFields['PRICE_TO'] : CCurrencyRates::ConvertCurrency($arFields['PRICE_TO'], $arFields['CURRENCY'], $strSiteCurrency), SALE_VALUE_PRECISION); $arConditions['CHILDREN'][] = array('CLASS_ID' => 'CondBsktAmtGroup', 'DATA' => array('logic' => 'EqLs', 'Value' => (string) $dblValue, 'All' => 'AND'), 'CHILDREN' => array()); $arFields["PRICE_TO"] = $dblValue; } } if (self::OLD_DSC_TYPE_PERCENT == $arFields['DISCOUNT_TYPE']) { $arActions['CHILDREN'][] = array('CLASS_ID' => 'ActSaleBsktGrp', 'DATA' => array('Type' => 'Discount', 'Value' => (string) roundEx($arFields['DISCOUNT_VALUE'], SALE_VALUE_PRECISION), 'Unit' => 'Perc', 'All' => 'AND'), 'CHILDREN' => array()); } else { $dblValue = roundEx($boolCurrency ? $arFields['DISCOUNT_VALUE'] : CCurrencyRates::ConvertCurrency($arFields['DISCOUNT_VALUE'], $arFields['CURRENCY'], $strSiteCurrency), SALE_VALUE_PRECISION); $arActions['CHILDREN'][] = array('CLASS_ID' => 'ActSaleBsktGrp', 'DATA' => array('Type' => 'Discount', 'Value' => (string) $dblValue, 'Unit' => 'CurAll', 'All' => 'AND'), 'CHILDREN' => array()); $arFields['DISCOUNT_VALUE'] = $dblValue; } $arFields['CONDITIONS'] = $arConditions; $arFields['ACTIONS'] = $arActions; $arFields['CURRENCY'] = $strSiteCurrency; } else { $obError = new CAdminException($arMsg); $APPLICATION->ThrowException($obError); } } } return $boolResult; }
$APPLICATION->SetTitle(str_replace('#ID#', $ID, GetMessage("BT_SALE_DISCOUNT_EDIT_MESS_UPDATE_DISCOUNT"))); } else { $APPLICATION->SetTitle(GetMessage("BT_SALE_DISCOUNT_EDIT_MESS_ADD_DISCOUNT")); } require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_after.php"; $arDefaultValues = array('LID' => '', 'NAME' => '', 'CURRENCY' => '', 'DISCOUNT_VALUE' => '', 'DISCOUNT_TYPE' => 'P', 'ACTIVE' => 'Y', 'SORT' => '100', 'ACTIVE_FROM' => '', 'ACTIVE_TO' => '', 'PRIORITY' => 1, 'LAST_DISCOUNT' => 'Y', 'CONDITIONS' => '', 'XML_ID' => '', 'ACTIONS' => ''); if (isset($_REQUEST['LID'])) { $arDefaultValues['LID'] = trim($_REQUEST['LID']); } if ('' == $arDefaultValues['LID']) { $arDefaultValues['LID'] = 's1'; } $arSelect = array_merge(array('ID'), array_keys($arDefaultValues)); $arDiscount = array(); $arDiscountGroupList = array(); $rsDiscounts = CSaleDiscount::GetList(array(), array("ID" => $ID), false, false, $arSelect); if (!($arDiscount = $rsDiscounts->Fetch())) { $ID = 0; $arDiscount = $arDefaultValues; } else { $rsDiscountGroups = CSaleDiscount::GetDiscountGroupList(array(), array('DISCOUNT_ID' => $ID), false, false, array('GROUP_ID')); while ($arDiscountGroup = $rsDiscountGroups->Fetch()) { $arDiscountGroupList[] = intval($arDiscountGroup['GROUP_ID']); } } if ($bVarsFromForm) { if ($boolCondParseError || $boolActParseError) { $mxTempo = $arDiscount['CONDITIONS']; $mxTempo2 = $arDiscount['ACTIONS']; $arDiscount = $arFields; if ($boolCondParseError) {
function __recalcSaleDiscount($user_id) { if(!$user_id) return; CModule::IncludeModule('sale'); CModule::IncludeModule('highloadblock'); $UserPrc = false; $hlblock = Bitrix\Highloadblock\HighloadBlockTable::getList(array('filter'=>array('NAME' => 'UserDiscounts')))->fetch(); $entity = Bitrix\Highloadblock\HighloadBlockTable::compileEntity( $hlblock ); $entity_data_class = $entity->getDataClass(); $rsData = $entity_data_class::getList(array( "select" => array("*"), "order" => array("ID" => "ASC"), "filter" => array('UF_USER_ID' => $user_id) )); if($arData = $rsData->Fetch()) { $UserPrc = $arData['UF_DISCOUNT']; } if($UserPrc) { $bCreated = false; $dbSaleDiscounts = CSaleDiscount::GetList( array(), array( "ACTIVE" => "Y", //"XML_ID" => 'HL_DISCOUNT_'.$UserPrc, ), false, false, array('ID','NAME',"XML_ID",'CONDITIONS') ); while ($arSaleDiscount = $dbSaleDiscounts->Fetch()) { $issetUsers = array(); $CONDITIONS = unserialize($arSaleDiscount['CONDITIONS']); foreach($CONDITIONS['CHILDREN'] as $arChildren) { if($arChildren['CLASS_ID'] == 'CondSaleOrderUserID') { $issetUsers[$arChildren['DATA']['value']] = $arChildren['DATA']['value']; } } if($arSaleDiscount['XML_ID'] == 'HL_DISCOUNT_'.$UserPrc) { $bCreated = true; if(!in_array($user_id, $issetUsers)) { $CONDITIONS['CHILDREN'][] = Array( 'CLASS_ID' => 'CondSaleOrderUserID', 'DATA' => Array( 'logic' => 'Equal', 'value' => $user_id ) ); $arDiscountFields = array( 'NAME' => $arSaleDiscount['NAME'], "ACTIVE" => 'Y', 'CONDITIONS' => $CONDITIONS ); CSaleDiscount::Update($arSaleDiscount['ID'], $arDiscountFields); } } else { if(in_array($user_id, $issetUsers)) { $tmpCond = array(); foreach($CONDITIONS['CHILDREN'] as $arChildren) { if(!($arChildren['CLASS_ID'] == 'CondSaleOrderUserID' && $arChildren['DATA']['value'] == $user_id)) { $tmpCond[] = $arChildren; } } if(empty($tmpCond)) { CSaleDiscount::Delete($arSaleDiscount['ID']); } else { $CONDITIONS['CHILDREN'] = $tmpCond; $arDiscountFields = array( 'NAME' => $arSaleDiscount['NAME'], "ACTIVE" => 'Y', 'CONDITIONS' => $CONDITIONS ); CSaleDiscount::Update($arSaleDiscount['ID'], $arDiscountFields); } } } } if(!$bCreated) { $arDiscountFields = array( "LID" => 's1', "NAME" => 'Скидка пользователям - '.$UserPrc.'%', "ACTIVE_FROM" => '', "ACTIVE_TO" => '', "ACTIVE" => 'Y', "SORT" => 100, "PRIORITY" => 1, "LAST_DISCOUNT" => 'Y', "XML_ID" => 'HL_DISCOUNT_'.$UserPrc, 'CONDITIONS' => Array( 'CLASS_ID' => 'CondGroup', 'DATA' => Array( 'All' => 'OR', 'True' => 'True' ), 'CHILDREN' => Array( Array( 'CLASS_ID' => 'CondSaleOrderUserID', 'DATA' => Array( 'logic' => 'Equal', 'value' => $user_id ) ), ) ), 'ACTIONS' => array( 'CLASS_ID' => 'CondGroup', 'DATA' => Array( 'All' => 'AND', ), 'CHILDREN' => Array( Array( 'CLASS_ID' => 'ActSaleBsktGrp', 'DATA' => Array( 'Type' => 'Discount', 'Value' => $UserPrc, 'Unit' => 'Perc', 'All' => 'AND', ), 'CHILDREN' => Array() ), ) ), 'USER_GROUPS' => array(2), ); $DiscountID = CSaleDiscount::Add($arDiscountFields); } } }
if (!in_array('ID', $arSelectFields)) { $arSelectFields[] = 'ID'; } $arSelectFieldsMap = array_fill_keys($arSelectFields, true); $arLangs = array(); $dbLangsList = CLang::GetList($b = "sort", $o = "asc"); while ($arLang = $dbLangsList->Fetch()) { $arLangs[$arLang["LID"]] = $arLang["LID"]; } $arSelectFields = array_values($arSelectFields); if (array_key_exists("mode", $_REQUEST) && $_REQUEST["mode"] == "excel") { $arNavParams = false; } else { $arNavParams = array("nPageSize" => CAdminResult::GetNavSize($sTableID)); } $dbResultList = CSaleDiscount::GetList(array($by => $order), $arFilter, false, $arNavParams, $arSelectFields); $dbResultList = new CAdminResult($dbResultList, $sTableID); $dbResultList->NavStart(); $lAdmin->NavText($dbResultList->GetNavPrint(GetMessage("BT_SALE_DISCOUNT_LIST_MESS_NAV"))); $arUserList = array(); $arUserID = array(); $strNameFormat = CSite::GetNameFormat(true); $arRows = array(); while ($arDiscount = $dbResultList->Fetch()) { $arDiscount['ID'] = intval($arDiscount['ID']); if (array_key_exists('CREATED_BY', $arSelectFieldsMap)) { $arDiscount['CREATED_BY'] = intval($arDiscount['CREATED_BY']); if (0 < $arDiscount['CREATED_BY']) { $arUserID[$arDiscount['CREATED_BY']] = true; } }
$arResultItem["DETAIL_PICTURE"] = CFile::GetFileArray($arProductPicture[$productId]["DETAIL_PICTURE"]); } $dblMinPrice = $allSum; $events = GetModuleEvents("sale", "OnSaleComponentOrderOneStepDiscountBefore"); while($arEvent = $events->Fetch()) ExecuteModuleEventEx($arEvent, Array(&$arResult, &$arUserResult, &$arParams)); $dbDiscount = CSaleDiscount::GetList( array("SORT" => "ASC"), array( "LID" => SITE_ID, "ACTIVE" => "Y", "!>ACTIVE_FROM" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "!<ACTIVE_TO" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "<=PRICE_FROM" => $arResult["ORDER_PRICE"], ">=PRICE_TO" => $arResult["ORDER_PRICE"], "USER_GROUPS" => $USER->GetUserGroupArray(), ), false, false, array("*") ); while ($arDiscount = $dbDiscount->Fetch()) { $dblDiscount = 0; $allSum_tmp = $allSum; if ($arDiscount["DISCOUNT_TYPE"] == "P") { if($arParams["COUNT_DISCOUNT_4_ALL_QUANTITY"] == "Y") {
$arBasketList[$i][$j]["REAL_PRICE"] = DoubleVal($arBasketList[$i][$j]["PRICE"]) - $curDiscount; $arDiscountPrice[$i] += $curDiscount * $arBasketList[$i][$j]["QUANTITY"]; } } else { $discountPrice = CCurrencyRates::ConvertCurrency($arDiscount["DISCOUNT_VALUE"], $arDiscount["CURRENCY"], $BASE_LANG_CURRENCY); $discountPrice = roundEx($discountPrice, SALE_VALUE_PRECISION); for ($j = 0; $j < count($arBasketList[$i]); $j++) { $curDiscount = roundEx(DoubleVal($arBasketList[$i][$j]["PRICE"]) * $DISCOUNT_PRICE / $arOrderPrice[$i], SALE_VALUE_PRECISION); $arBasketList[$i][$j]["REAL_PRICE"] = DoubleVal($arBasketList[$i][$j]["PRICE"]) - $curDiscount; $arDiscountPrice[$i] += $curDiscount * $arBasketList[$i][$j]["QUANTITY"]; } } } } } else { $dbDiscount = CSaleDiscount::GetList(array("SORT" => "ASC"), array("LID" => $LID, "ACTIVE" => "Y", "!>ACTIVE_FROM" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "!<ACTIVE_TO" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "<=PRICE_FROM" => $basketTotalPrice, ">=PRICE_TO" => $basketTotalPrice), false, false, array("*")); if ($arDiscount = $dbDiscount->Fetch()) { if ($arDiscount["DISCOUNT_TYPE"] == "P") { for ($i = 0; $i < count($arBasketList); $i++) { for ($j = 0; $j < count($arBasketList[$i]); $j++) { $curDiscount = roundEx(DoubleVal($arBasketList[$i][$j]["PRICE"]) * $arDiscount["DISCOUNT_VALUE"] / 100, SALE_VALUE_PRECISION); $arBasketList[$i][$j]["REAL_PRICE"] = DoubleVal($arBasketList[$i][$j]["PRICE"]) - $curDiscount; $arDiscountPrice[$i] += $curDiscount * $arBasketList[$i][$j]["QUANTITY"]; } } } else { $discountPrice = CCurrencyRates::ConvertCurrency($arDiscount["DISCOUNT_VALUE"], $arDiscount["CURRENCY"], $BASE_LANG_CURRENCY); $discountPrice = roundEx($discountPrice, SALE_VALUE_PRECISION); for ($i = 0; $i < count($arBasketList); $i++) { for ($j = 0; $j < count($arBasketList[$i]); $j++) { $curDiscount = roundEx(DoubleVal($arBasketList[$i][$j]["PRICE"]) * $DISCOUNT_PRICE / $basketTotalPrice, SALE_VALUE_PRECISION);
public static function ConvertDiscount($intStep = 100, $intMaxExecutionTime = 15) { global $DBType; global $DB; global $APPLICATION; self::InitStep(); $intStep = intval($intStep); if (0 >= $intStep) { $intStep = 100; } $startConvertTime = getmicrotime(); $obDiscount = new CSaleDiscount(); $strTableName = ''; switch (ToUpper($DBType)) { case 'MYSQL': $strTableName = 'b_catalog_discount'; break; case 'MSSQL': $strTableName = 'B_CATALOG_DISCOUNT'; break; case 'ORACLE': $strTableName = 'B_CATALOG_DISCOUNT'; break; } $intCount = CSaleDiscountConvert::GetCount(); if (0 == $intCount) { } $strStatus = 1 < $intCount ? 'N' : 'Y'; $arBaseCurrencies = array(); $rsSites = CSite::GetList($b = "id", $o = "asc"); while ($arSite = $rsSites->Fetch()) { $arBaseCurrencies[$arSite['ID']] = CSaleLang::GetLangCurrency($arSite['ID']); } CTimeZone::Disable(); $rsDiscounts = CSaleDiscount::GetList(array('ID' => 'ASC'), array('VERSION' => CSaleDiscount::VERSION_OLD), false, array('nTopCount' => $intStep), array('ID', 'SITE_ID', 'MODIFIED_BY', 'TIMESTAMP_X', 'PRICE_FROM', 'PRICE_TO', 'CURRENCY', 'DISCOUNT_VALUE', 'DISCOUNT_TYPE')); while ($arDiscount = $rsDiscounts->Fetch()) { $arFields = array(); $arFields['MODIFIED_BY'] = $arDiscount['MODIFIED_BY']; $arConditions = array('CLASS_ID' => 'CondGroup', 'DATA' => array('All' => 'AND', 'True' => 'True'), 'CHILDREN' => array()); $arActions = array('CLASS_ID' => 'CondGroup', 'DATA' => array('All' => 'AND', 'True' => 'True'), 'CHILDREN' => array()); $boolCurrency = $arDiscount['CURRENCY'] == $arBaseCurrencies[$arDiscount['SITE_ID']]; $strFrom = ''; $strTo = ''; $strValue = ''; $arDiscount['PRICE_FROM'] = doubleval($arDiscount['PRICE_FROM']); $arDiscount['PRICE_TO'] = doubleval($arDiscount['PRICE_TO']); $arDiscount['DISCOUNT_VALUE'] = doubleval($arDiscount['DISCOUNT_VALUE']); if (0 < $arDiscount['PRICE_FROM']) { $dblValue = roundEx($boolCurrency ? $arDiscount['PRICE_FROM'] : CCurrencyRates::ConvertCurrency($arDiscount['PRICE_FROM'], $arDiscount['CURRENCY'], $arBaseCurrencies[$arDiscount['SITE_ID']]), SALE_VALUE_PRECISION); $arConditions['CHILDREN'][] = array('CLASS_ID' => 'CondBsktAmtGroup', 'DATA' => array('logic' => 'EqGr', 'Value' => (string) $dblValue, 'All' => 'AND'), 'CHILDREN' => array()); if (!$boolCurrency) { $arFields['PRICE_FROM'] = $dblValue; } $strFrom = str_replace('#VALUE#', $dblValue . ' ' . $arBaseCurrencies[$arDiscount['SITE_ID']], GetMessage('BT_MOD_SALE_DSC_FORMAT_NAME_FROM')); } if (0 < $arDiscount['PRICE_TO']) { $dblValue = roundEx($boolCurrency ? $arDiscount['PRICE_TO'] : CCurrencyRates::ConvertCurrency($arDiscount['PRICE_TO'], $arDiscount['CURRENCY'], $arBaseCurrencies[$arDiscount['SITE_ID']]), SALE_VALUE_PRECISION); $arConditions['CHILDREN'][] = array('CLASS_ID' => 'CondBsktAmtGroup', 'DATA' => array('logic' => 'EqLs', 'Value' => (string) $dblValue, 'All' => 'AND'), 'CHILDREN' => array()); if (!$boolCurrency) { $arFields['PRICE_TO'] = $dblValue; } $strTo = str_replace('#VALUE#', $dblValue . ' ' . $arBaseCurrencies[$arDiscount['SITE_ID']], GetMessage('BT_MOD_SALE_DSC_FORMAT_NAME_TO')); } if (CSaleDiscount::OLD_DSC_TYPE_PERCENT == $arDiscount['DISCOUNT_TYPE']) { $arActions['CHILDREN'][] = array('CLASS_ID' => 'ActSaleBsktGrp', 'DATA' => array('Type' => 'Discount', 'Value' => (string) roundEx($arDiscount['DISCOUNT_VALUE'], SALE_VALUE_PRECISION), 'Unit' => 'Perc', 'All' => 'AND'), 'CHILDREN' => array()); $strValue = $arDiscount['DISCOUNT_VALUE'] . ' %'; } else { $dblValue = roundEx($boolCurrency ? $arDiscount['DISCOUNT_VALUE'] : CCurrencyRates::ConvertCurrency($arDiscount['DISCOUNT_VALUE'], $arDiscount['CURRENCY'], $arBaseCurrencies[$arDiscount['SITE_ID']]), SALE_VALUE_PRECISION); $arActions['CHILDREN'][] = array('CLASS_ID' => 'ActSaleBsktGrp', 'DATA' => array('Type' => 'Discount', 'Value' => (string) $dblValue, 'Unit' => 'CurAll', 'All' => 'AND'), 'CHILDREN' => array()); if (!$boolCurrency) { $arFields['DISCOUNT_VALUE'] = $dblValue; } $strValue = $dblValue . ' ' . $arBaseCurrencies[$arDiscount['SITE_ID']]; } if ('' != $strFrom || '' != $strTo) { $strName = str_replace(array('#VALUE#', '#FROM#', '#TO#'), array($strValue, $strFrom, $strTo), GetMessage('BT_MOD_SALE_DSC_FORMAT_NAME')); } else { $strName = str_replace('#VALUE#', $strValue, GetMessage('BT_MOD_SALE_DSC_FORMAT_SHORT_NAME')); } $arFields['CONDITIONS'] = $arConditions; $arFields['ACTIONS'] = $arActions; $arFields['NAME'] = $strName; if (!$boolCurrency) { $arFields['CURRENCY'] = $arBaseCurrencies[$arDiscount['SITE_ID']]; } if ('N' == $strStatus) { $arFields['ACTIVE'] = 'N'; } $mxRes = $obDiscount->Update($arDiscount['ID'], $arFields); if (!$mxRes) { self::$intErrors++; $strError = ''; if ($ex = $APPLICATION->GetException()) { $strError = $ex->GetString(); } if (empty($strError)) { $strError = GetMessage(''); } self::$arErrors[] = array('ID' => $arDiscount['ID'], 'NAME' => $strName, 'ERROR' => $strError); } else { $arTimeFields = array('~TIMESTAMP_X' => $DB->CharToDateFunction($arDiscount['TIMESTAMP_X'], "FULL")); $strUpdate = $DB->PrepareUpdate($strTableName, $arTimeFields); if (!empty($strUpdate)) { $strQuery = "UPDATE " . $strTableName . " SET " . $strUpdate . " WHERE ID = " . $arDiscount['ID']; $DB->Query($strQuery, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); } self::$intConverted++; self::$intConvertPerStep++; } if ($intMaxExecutionTime > 0 && getmicrotime() - $startConvertTime > $intMaxExecutionTime) { break; } } CTimeZone::Enable(); if ($intMaxExecutionTime > 2 * (getmicrotime() - $startConvertTime)) { self::$intNextConvertPerStep = $intStep * 2; } else { self::$intNextConvertPerStep = $intStep; } self::SaveStep(); }
/** * <p>Метод осуществляет продление подписки с кодом ID.</p> <p><b>Примечание</b>. Метод использует внутреннюю транзакцию. Если у вас используется <b>MySQL</b> и <b>InnoDB</b>, и ранее была открыта транзакция, то ее необходимо закрыть до подключения метода.</p> * * * * * @param int $ID Код записи с информацией о продлении. * * * * @return bool <p>Метод возвращает <i>true</i> в случае успешного продления или <i>false</i> * в случае ошибки.</p><br><br> * * @static * @link http://dev.1c-bitrix.ru/api_help/sale/classes/csalerecurring/csalerecurring.nextpayment.php * @author Bitrix */ public static function NextPayment($ID) { global $DB; global $USER; $ID = IntVal($ID); if ($ID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGR_NO_RECID"), "NO_RECORD_ID"); return False; } $arRecur = CSaleRecurring::GetByID($ID); if (!$arRecur) { $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $ID, GetMessage("SKGR_NO_RECID1")), "NO_RECORD"); return False; } $arOrder = CSaleOrder::GetByID($arRecur["ORDER_ID"]); if (!$arOrder) { $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $arRecur["ORDER_ID"], GetMessage("SKGR_NO_ORDER1")), "NO_ORDER"); return False; } $bSuccess = True; $newOrderID = IntVal($arRecur["ORDER_ID"]); /** @var $productProvider IBXSaleProductProvider */ if ($productProvider = CSaleBasket::GetProductProvider($arRecur)) { $arProduct = $productProvider::RecurringOrderProduct(array( "PRODUCT_ID" => $arRecur["PRODUCT_ID"], "USER_ID" => $arOrder["USER_ID"] )); } else { $arProduct = CSaleRecurring::ExecuteCallbackFunction( $arRecur["CALLBACK_FUNC"], $arRecur["MODULE"], $arRecur["PRODUCT_ID"], $arOrder["USER_ID"] ); } if (!$arProduct || !is_array($arProduct) || count($arProduct) <= 0) { CSaleRecurring::CancelRecurring($arRecur["ID"], "Y", "Product is not found"); /* $arFields = array( "CANCELED" => "Y", "DATE_CANCELED" => Date(CDatabase::DateFormatToPHP(CLang::GetDateFormat("FULL", LANG))), "CANCELED_REASON" => "Product is not found" ); CSaleRecurring::Update($arRecur["ID"], $arFields); */ //CSaleRecurring::Delete($arRecur["ID"]); return True; } if ($arProduct["WITHOUT_ORDER"] == "Y" || $arRecur["SUCCESS_PAYMENT"] == "Y") { $baseSiteCurrency = CSaleLang::GetLangCurrency($arOrder["LID"]); $productPrice = roundEx(CCurrencyRates::ConvertCurrency($arProduct["PRICE"], $arProduct["CURRENCY"], $baseSiteCurrency), SALE_VALUE_PRECISION); // Delivery $deliveryPrice = 0; $deliveryID = 0; $arOrder["DELIVERY_ID"] = IntVal($arOrder["DELIVERY_ID"]); if ($arOrder["DELIVERY_ID"] > 0) { $deliveryLocation = 0; $dbOrderPropValues = CSaleOrderPropsValue::GetList( array(), array( "ORDER_ID" => $arRecur["ORDER_ID"], "PROP_IS_LOCATION" => "Y" ), false, false, array("VALUE") ); if ($arOrderPropValues = $dbOrderPropValues->Fetch()) $deliveryLocation = IntVal($arOrderPropValues["VALUE"]); $dbDelivery = CSaleDelivery::GetList( array("SORT" => "ASC", "NAME" => "ASC"), array( "LID" => $arOrder["LID"], "WEIGHT" => DoubleVal($arProduct["WEIGHT"]) * DoubleVal($arProduct["QUANTITY"]), // Changed by Sigurd, 2007-08-16 "ORDER_PRICE" => $productPrice * DoubleVal($arProduct["QUANTITY"]), "ACTIVE" => "Y", "LOCATION" => $deliveryLocation ) ); while ($arDelivery = $dbDelivery->Fetch()) { $deliveryPriceTmp = roundEx(CCurrencyRates::ConvertCurrency($arDelivery["PRICE"], $arDelivery["CURRENCY"], $baseSiteCurrency), SALE_VALUE_PRECISION); if (IntVal($arDelivery["ID"]) == $arOrder["DELIVERY_ID"]) { $deliveryID = IntVal($arDelivery["ID"]); $deliveryPrice = $deliveryPriceTmp; break; } if ($deliveryPriceTmp < $deliveryPrice || $deliveryID <= 0) { $deliveryID = IntVal($arDelivery["ID"]); $deliveryPrice = $deliveryPriceTmp; } } if ($deliveryID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGR_NO_DELIVERY"), "NO_DELIVERY"); return False; } } // Sale discounts $discount = 0; $discountPrice = $productPrice; $discountProduct = 0; $dbDiscount = CSaleDiscount::GetList( array("SORT" => "ASC"), array( "LID" => $arOrder["LID"], "ACTIVE" => "Y", "!>ACTIVE_FROM" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "!<ACTIVE_TO" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "<=PRICE_FROM" => $productPrice, ">=PRICE_TO" => $productPrice, "USER_GROUPS" => $USER->GetUserGroup($arOrder['USER_ID']), ) ); if ($arDiscount = $dbDiscount->Fetch()) { if ($arDiscount["DISCOUNT_TYPE"] == "P") { $discountProduct = roundEx($productPrice * $arDiscount["DISCOUNT_VALUE"] / 100, SALE_VALUE_PRECISION); $discount = roundEx($discountProduct * DoubleVal($arProduct["QUANTITY"]), SALE_VALUE_PRECISION); // Changed by Sigurd, 2007-08-16 $discountPrice = $productPrice - $discountProduct; } else { $discountValue = CCurrencyRates::ConvertCurrency($arDiscount["DISCOUNT_VALUE"], $arDiscount["CURRENCY"], $baseSiteCurrency); $discountValue = roundEx($discountValue, SALE_VALUE_PRECISION); $discountProduct = roundEx(1.0 * $discountValue / DoubleVal($arProduct["QUANTITY"]), SALE_VALUE_PRECISION);// Changed by Sigurd, 2007-08-16 $discount = roundEx($curDiscount * DoubleVal($arProduct["QUANTITY"]), SALE_VALUE_PRECISION); $discountPrice = $productPrice - $discountProduct; } } $bUseVat = false; $vatRate = 0; if(DoubleVal($arProduct["VAT_RATE"]) > 0) { $bUseVat = true; $vatRate = $arProduct["VAT_RATE"]; } // Tax $arTaxExempt = array(); $dbUserGroups = CUser::GetUserGroupEx($arOrder["USER_ID"]); while ($arUserGroups = $dbUserGroups->Fetch()) { $dbTaxExemptTmp = CSaleTax::GetExemptList(array("GROUP_ID" => $arUserGroups["GROUP_ID"])); while ($arTaxExemptTmp = $dbTaxExemptTmp->Fetch()) { $arTaxExemptTmp["TAX_ID"] = IntVal($arTaxExemptTmp["TAX_ID"]); if (!in_array($arTaxExemptTmp["TAX_ID"], $arTaxExempt)) $arTaxExempt[] = $arTaxExemptTmp["TAX_ID"]; } } $taxPrice = 0; $taxVatPrice = 0; if(!$bUseVat) { $taxLocation = 0; $dbOrderPropValues = CSaleOrderPropsValue::GetList( array(), array( "ORDER_ID" => $arRecur["ORDER_ID"], "PROP_IS_LOCATION4TAX" => "Y" ), false, false, array("VALUE") ); if ($arOrderPropValues = $dbOrderPropValues->Fetch()) $taxLocation = IntVal($arOrderPropValues["VALUE"]); $arTaxList = array(); $dbTaxRateTmp = CSaleTaxRate::GetList( array("APPLY_ORDER" => "ASC"), array( "LID" => $arOrder["LID"], "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"], "ACTIVE" => "Y", "LOCATION" => $taxLocation ) ); while ($arTaxRateTmp = $dbTaxRateTmp->Fetch()) { if (!in_array(IntVal($arTaxRateTmp["TAX_ID"]), $arTaxExempt)) { $arTaxList[] = $arTaxRateTmp; } } } else { $arTaxList[] = Array( "ID" => 0, "TAX_NAME" => GetMessage("SKGR_VAT"), "IS_PERCENT" => "Y", "VALUE" => $vatRate*100, "VALUE_MONEY" => 0, "APPLY_ORDER" => 100, "IS_IN_PRICE" => "Y", "CODE" => "VAT" ); } $arTaxSums = array(); if (!empty($arTaxList)) { if(!$bUseVat) { $taxPriceTmp = CSaleOrderTax::CountTaxes( $discountPrice * DoubleVal($arProduct["QUANTITY"]), $arTaxList, $baseSiteCurrency ); for ($di = 0, $intCount = count($arTaxList); $di < $intCount; $di++) { $arTaxList[$di]["VALUE_MONEY"] += $arTaxList[$di]["TAX_VAL"]; } for ($di = 0, $intCount = count($arTaxList); $di < $intCount; $di++) { $arTaxSums[$arTaxList[$di]["TAX_ID"]]["VALUE"] = $arTaxList[$di]["VALUE_MONEY"]; $arTaxSums[$arTaxList[$di]["TAX_ID"]]["NAME"] = $arTaxList[$di]["NAME"]; if ($arTaxList[$di]["IS_IN_PRICE"] != "Y") { $taxPrice += $arTaxList[$di]["VALUE_MONEY"]; } } } else { $arTaxList[0]["VALUE_MONEY"] = (($discountPrice / ($vatRate +1)) * $vatRate) * DoubleVal($arProduct["QUANTITY"]); $taxVatPrice = $arTaxList[0]["VALUE_MONEY"]; } } // Changed by Sigurd, 2007-08-16 $totalOrderPrice = $discountPrice * DoubleVal($arProduct["QUANTITY"]) + $deliveryPrice + $taxPrice; $arProduct["WITHOUT_ORDER"] = (($arProduct["WITHOUT_ORDER"]=="Y") ? "Y" : "N"); if ($arProduct["WITHOUT_ORDER"] == "N") { $DB->StartTransaction(); // Saving $arSaleUser = CSaleUser::GetList(Array(), Array("USER_ID" => $arOrder["USER_ID"])); if(!empty($arSaleUser)) { $currentFUser = $arSaleUser["ID"]; } else { $currentFUser = CSaleUser::_Add( array( "=DATE_INSERT" => $DB->GetNowFunction(), "=DATE_UPDATE" => $DB->GetNowFunction(), "USER_ID" => $arOrder["USER_ID"] ) ); } $arFields = array( "FUSER_ID" => $currentFUser, "PRODUCT_ID" => $arProduct["PRODUCT_ID"], "PRODUCT_NAME" => $arProduct["PRODUCT_NAME"], "PRODUCT_URL" => $arProduct["PRODUCT_URL"], "PRODUCT_PRICE_ID" => $arProduct["PRODUCT_PRICE_ID"], "PRICE" => $arProduct["PRICE"], "CURRENCY" => $arProduct["CURRENCY"], "WEIGHT" => $arProduct["WEIGHT"], "QUANTITY" => $arProduct["QUANTITY"], "LID" => $arOrder["LID"], "DELAY" => "N", "CAN_BUY" => "Y", "NAME" => $arProduct["NAME"], "CALLBACK_FUNC" => $arProduct["CALLBACK_FUNC"], "ORDER_CALLBACK_FUNC" => $arProduct["ORDER_CALLBACK_FUNC"], "CANCEL_CALLBACK_FUNC" => $arProduct["CANCEL_CALLBACK_FUNC"], "PAY_CALLBACK_FUNC" => $arProduct["PAY_CALLBACK_FUNC"], "PRODUCT_PROVIDER_CLASS" => $arProduct["PRODUCT_PROVIDER_CLASS"], "MODULE" => $arRecur["MODULE"], "NOTES" => $arProduct["CATALOG_GROUP_NAME"], "DETAIL_PAGE_URL" => $arProduct["DETAIL_PAGE_URL"], "VATE_RATE" => $arProduct["VATE_RATE"], "PRODUCT_XML_ID" => $arProduct["PRODUCT_XML_ID"], "RENEWAL" => "Y" ); $basketID = CSaleBasket::Add($arFields); $basketID = IntVal($basketID); if ($basketID <= 0) $bSuccess = False; if ($bSuccess) { if (CModule::IncludeModule("statistic")) CStatistic::Set_Event("eStore", "add2basket", $arFields["PRODUCT_ID"]); $arFields = array( "LID" => $arOrder["LID"], "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"], "PAYED" => "N", "CANCELED" => "N", "STATUS_ID" => "N", "PRICE_DELIVERY" => $deliveryPrice, "ALLOW_DELIVERY" => "N", "PRICE" => $totalOrderPrice, "CURRENCY" => $baseSiteCurrency, "DISCOUNT_VALUE" => $discount, "USER_ID" => $arOrder["USER_ID"], "PAY_SYSTEM_ID" => $arOrder["PAY_SYSTEM_ID"], "DELIVERY_ID" => $deliveryID, "USER_DESCRIPTION" => $arOrder["USER_DESCRIPTION"], "TAX_VALUE" => (($bUseVat)? $taxVatPrice : $taxPrice), "STAT_GID" => $arOrder["STAT_GID"], "RECURRING_ID" => $arRecur["ID"] ); $newOrderID = CSaleOrder::Add($arFields); $newOrderID = IntVal($newOrderID); if ($newOrderID <= 0) $bSuccess = False; } if ($bSuccess) { $arDiscounts = array(); $arDiscounts[$basketID] = $discountProduct; CSaleBasket::OrderBasket($newOrderID, $currentFUser, $arOrder["LID"], $arDiscounts); } if ($bSuccess) { for ($it = 0, $intCount = count($arTaxList); $it < $intCount; $it++) { $arFields = array( "ORDER_ID" => $newOrderID, "TAX_NAME" => $arTaxList[$it]["TAX_NAME"], "IS_PERCENT" => $arTaxList[$it]["IS_PERCENT"], "VALUE" => ($arTaxList[$it]["IS_PERCENT"]=="Y") ? $arTaxList[$it]["VALUE"] : RoundEx(CCurrencyRates::ConvertCurrency($arTaxList[$it]["VALUE"], $arTaxList[$it]["CURRENCY"], $baseSiteCurrency), 2), "VALUE_MONEY" => $arTaxList[$it]["VALUE_MONEY"], "APPLY_ORDER" => $arTaxList[$it]["APPLY_ORDER"], "IS_IN_PRICE" => $arTaxList[$it]["IS_IN_PRICE"], "CODE" => $arTaxList[$it]["CODE"] ); CSaleOrderTax::Add($arFields); } $dbOrderPropValues = CSaleOrderPropsValue::GetList( array(), array("ORDER_ID" => $arRecur["ORDER_ID"]), false, false, array("ORDER_PROPS_ID", "NAME", "CODE", "VALUE", "PROP_IS_PAYER", "PROP_IS_EMAIL") ); while ($arOrderPropValues = $dbOrderPropValues->Fetch()) { $arFields = array( "ORDER_ID" => $newOrderID, "ORDER_PROPS_ID" => $arOrderPropValues["ORDER_PROPS_ID"], "NAME" => $arOrderPropValues["NAME"], "CODE" => $arOrderPropValues["CODE"], "VALUE" => $arOrderPropValues["VALUE"] ); CSaleOrderPropsValue::Add($arFields); if ($arOrderPropValues["PROP_IS_PAYER"] == "Y") $payerName = $arOrderPropValues["VALUE"]; if ($arOrderPropValues["PROP_IS_EMAIL"] == "Y") $payerEMail = $arOrderPropValues["VALUE"]; } } if ($bSuccess) { if (CModule::IncludeModule("statistic")) CStatistic::Set_Event("eStore", "order_create", $newOrderID); } if ($bSuccess) { $strOrderList = ""; $dbBasketTmp = CSaleBasket::GetList( array("NAME" => "ASC"), array("ORDER_ID" => $newOrderID) ); while ($arBasketTmp = $dbBasketTmp->Fetch()) { $strOrderList .= $arBasketTmp["NAME"]." - ".$arBasketTmp["QUANTITY"]." ".GetMessage("SALE_QUANTITY_UNIT"); $strOrderList .= "\n"; } if (strlen($payerName) <= 0 || strlen($payerEMail) <= 0) { $dbUser = CUser::GetByID($arOrder["USER_ID"]); if ($arUser = $dbUser->Fetch()) { if (strlen($payerName) <= 0) $payerName = $arUser["NAME"].((strlen($arUser["NAME"])<=0 || strlen($arUser["LAST_NAME"])<=0) ? "" : " ").$arUser["LAST_NAME"]; if (strlen($payerEMail) <= 0) $payerEMail = $arUser["EMAIL"]; } } $arFields = Array( "ORDER_ID" => $newOrderID, "ORDER_DATE" => Date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT", $arOrder["LID"]))), "ORDER_USER" => $payerName, "PRICE" => SaleFormatCurrency($totalOrderPrice, $baseSiteCurrency), "BCC" => COption::GetOptionString("sale", "order_email", "order@".$SERVER_NAME), "EMAIL" => $payerEMail, "ORDER_LIST" => $strOrderList, "SALE_EMAIL" => COption::GetOptionString("sale", "order_email", "order@".$SERVER_NAME) ); $eventName = "SALE_NEW_ORDER_RECURRING"; $bSend = true; foreach(GetModuleEvents("sale", "OnOrderRecurringSendEmail", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, Array($newOrderID, &$eventName, &$arFields))===false) $bSend = false; } if($bSend) { $event = new CEvent; $event->Send($eventName, $arOrder["LID"], $arFields, "N"); } } if ($bSuccess) $DB->Commit(); else $DB->Rollback(); } } else { $totalOrderPrice = $arOrder["PRICE"]; $baseSiteCurrency = $arOrder["CURRENCY"]; } $res = False; if ($bSuccess) { $res = CSaleUserAccount::Pay($arOrder["USER_ID"], $totalOrderPrice, $baseSiteCurrency, $newOrderID, True); if ($res) { if ($arProduct["WITHOUT_ORDER"] == "N") { CSaleOrder::PayOrder($newOrderID, "Y", False, False, $arRecur["ID"]); CSaleOrder::DeliverOrder($newOrderID, "Y", $arRecur["ID"]); CSaleOrder::DeductOrder($newOrderID, "Y", "", true, array(), $arRecur["ID"]); } else { /** @var $productProvider IBXSaleProductProvider */ if ($productProvider = CSaleBasket::GetProductProvider($arProduct)) { $r = $productProvider::DeliverProduct(array( "PRODUCT_ID" => $arProduct["PRODUCT_ID"], "USER_ID" => $arOrder["USER_ID"], "PAID" => true )); } else { $r = CSaleBasket::ExecuteCallbackFunction( $arProduct["PAY_CALLBACK_FUNC"], $arRecur["MODULE"], $arProduct["PRODUCT_ID"], $arOrder["USER_ID"], true ); } } $arFields = array( "ORDER_ID" => $newOrderID, "PRODUCT_NAME" => $arProduct["PRODUCT_NAME"], "PRODUCT_URL" => $arProduct["PRODUCT_URL"], "PRICE_TYPE" => $arProduct["PRICE_TYPE"], "RECUR_SCHEME_TYPE" => $arProduct["RECUR_SCHEME_TYPE"], "RECUR_SCHEME_LENGTH" => $arProduct["RECUR_SCHEME_LENGTH"], "WITHOUT_ORDER" => $arProduct["WITHOUT_ORDER"], "PRIOR_DATE" => Date($GLOBALS["DB"]->DateFormatToPHP(CLang::GetDateFormat("FULL", SITE_ID))), "NEXT_DATE" => $arProduct["NEXT_DATE"], "REMAINING_ATTEMPTS" => (Defined("SALE_PROC_REC_ATTEMPTS") ? SALE_PROC_REC_ATTEMPTS : 3), "SUCCESS_PAYMENT" => "Y" ); CSaleRecurring::Update($arRecur["ID"], $arFields); } else { $arFields = array( "ORDER_ID" => $newOrderID, "PRODUCT_NAME" => $arProduct["PRODUCT_NAME"], "PRODUCT_URL" => $arProduct["PRODUCT_URL"], "PRICE_TYPE" => $arProduct["PRICE_TYPE"], "RECUR_SCHEME_LENGTH" => $arProduct["RECUR_SCHEME_LENGTH"], "RECUR_SCHEME_TYPE" => $arProduct["RECUR_SCHEME_TYPE"], "WITHOUT_ORDER" => $arProduct["WITHOUT_ORDER"], "NEXT_DATE" => Date($GLOBALS["DB"]->DateFormatToPHP(CLang::GetDateFormat("FULL", SITE_ID)), time() + SALE_PROC_REC_TIME + CTimeZone::GetOffset()), "REMAINING_ATTEMPTS" => (IntVal($arRecur["REMAINING_ATTEMPTS"]) - 1), "SUCCESS_PAYMENT" => "N" ); CSaleRecurring::Update($arRecur["ID"], $arFields); if ((IntVal($arRecur["REMAINING_ATTEMPTS"]) - 1) <= 0) { CSaleRecurring::CancelRecurring($arRecur["ID"], "Y", "Can't pay order"); /* $arFields["CANCELED"] = "Y"; $arFields["DATE_CANCELED"] = Date(CDatabase::DateFormatToPHP(CLang::GetDateFormat("FULL", LANG))); $arFields["CANCELED_REASON"] = "Can't pay order"; */ } } } return $res; }
function GetByID($ID) { global $DB; $ID = intval($ID); if (0 < $ID) { $rsDiscounts = CSaleDiscount::GetList(array(), array('ID' => $ID), false, false, array()); if ($arDiscount = $rsDiscounts->Fetch()) { return $arDiscount; } } return false; }
break; case "activate": case "deactivate": $arFields = array("ACTIVE" => $_REQUEST['action'] == "activate" ? "Y" : "N"); if (!CSaleDiscount::Update($ID, $arFields)) { if ($ex = $APPLICATION->GetException()) { $lAdmin->AddGroupError($ex->GetString(), $ID); } else { $lAdmin->AddGroupError(GetMessage("ERROR_UPDATE_REC"), $ID); } } break; } } } $dbResultList = CSaleDiscount::GetList($by, $order, $arFilter); $dbResultList = new CAdminResult($dbResultList, $sTableID); $dbResultList->NavStart(); $lAdmin->NavText($dbResultList->GetNavPrint(GetMessage("PERS_TYPE_NAV"))); $lAdmin->AddHeaders(array(array("id" => "ID", "content" => GetMessage("PERS_TYPE_ID"), "sort" => "ID", "default" => true), array("id" => "LID", "content" => GetMessage("PERS_TYPE_LID"), "sort" => "LID", "default" => true), array("id" => "ACTIVE", "content" => GetMessage('PERS_TYPE_ACTIVE'), "sort" => "ACTIVE", "default" => true), array("id" => "PRICE", "content" => GetMessage("PERS_TYPE_PRICE"), "sort" => "", "default" => true), array("id" => "DISCOUNT", "content" => GetMessage("PERS_TYPE_DISCOUNT"), "sort" => "", "default" => true), array("id" => "SORT", "content" => GetMessage("PERS_TYPE_SORT"), "sort" => "SORT", "default" => true), array("id" => "ACTIVE_FROM", "content" => GetMessage("SDSN_ACTIVE_FROM"), "sort" => "ACTIVE_FROM", "default" => true), array("id" => "ACTIVE_TO", "content" => GetMessage("SDSN_ACTIVE_TO"), "sort" => "ACTIVE_TO", "default" => true))); $arVisibleColumns = $lAdmin->GetVisibleHeaderColumns(); $arLangs = array(); $dbLangsList = CLang::GetList($b = "sort", $o = "asc"); while ($arLang = $dbLangsList->Fetch()) { $arLangs[$arLang["LID"]] = $arLang["LID"]; } while ($arDiscount = $dbResultList->NavNext(true, "f_")) { $row =& $lAdmin->AddRow($f_ID, $arDiscount, "sale_discount_edit.php?ID=" . $f_ID . "&lang=" . LANG . GetFilterParams("filter_"), GetMessage("SDSN_UPDATE_ALT")); $row->AddField("ID", $f_ID); $row->AddSelectField("LID", $arLangs, array()); $row->AddCheckField("ACTIVE");