Exemplo n.º 1
0
 /**
  * @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'));
             }
         }
     }
 }
Exemplo n.º 2
0
         } else {
             $arErrorMess[] = 0 < $ID ? str_replace('#ID#', $ID, GetMessage('BT_SALE_DISCOUNT_EDIT_ERR_UPDATE')) : GetMessage('BT_SALE_DISCOUNT_EDIT_ERR_ADD');
         }
         $bVarsFromForm = true;
         $boolActParseError = true;
     }
 }
 $arFields = array("LID" => isset($_POST['LID']) ? $_POST['LID'] : '', "NAME" => isset($_POST['NAME']) ? $_POST['NAME'] : '', "ACTIVE_FROM" => isset($_POST['ACTIVE_FROM']) ? $_POST['ACTIVE_FROM'] : '', "ACTIVE_TO" => isset($_POST['ACTIVE_TO']) ? $_POST['ACTIVE_TO'] : '', "ACTIVE" => isset($_POST['ACTIVE']) && 'Y' == $_POST['ACTIVE'] ? 'Y' : 'N', "SORT" => intval(isset($_POST['SORT']) ? $_POST['SORT'] : 500), "PRIORITY" => intval(isset($_POST['PRIORITY']) ? $_POST['PRIORITY'] : ''), "LAST_DISCOUNT" => isset($_POST['LAST_DISCOUNT']) && 'N' == $_POST['LAST_DISCOUNT'] ? 'N' : 'Y', "XML_ID" => isset($_POST['XML_ID']) ? $_POST['XML_ID'] : '', 'CONDITIONS' => $CONDITIONS, 'ACTIONS' => $ACTIONS);
 if (isset($USER_GROUPS)) {
     $arFields["USER_GROUPS"] = $USER_GROUPS;
 } else {
     $arFields["USER_GROUPS"] = array();
 }
 if (empty($arErrorMess)) {
     if ($ID > 0) {
         if (!CSaleDiscount::Update($ID, $arFields)) {
             if ($ex = $APPLICATION->GetException()) {
                 $arErrorMess[] = $ex->GetString();
             } else {
                 $arErrorMess[] = str_replace('#ID#', $ID, GetMessage('BT_SALE_DISCOUNT_EDIT_ERR_UPDATE'));
             }
         }
     } else {
         $ID = CSaleDiscount::Add($arFields);
         $ID = intval($ID);
         if ($ID <= 0) {
             if ($ex = $APPLICATION->GetException()) {
                 $arErrorMess[] = $ex->GetString();
             } else {
                 $arErrorMess[] = GetMessage('BT_SALE_DISCOUNT_EDIT_ERR_ADD');
             }
Exemplo n.º 3
0
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);
		}
	}
}
Exemplo n.º 4
0
 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();
 }