Last active
May 17, 2024 12:39
-
-
Save EscApp2/e8de07e1ed2c1b889cd8a410c41aca69 to your computer and use it in GitHub Desktop.
__OrderHelp setSalePropertyD7 getSalePropertyD7 setOrderProperty set sale order property d7 SaleOrderAjaxHelp SaleOrderSavedHelp SaleBasketHelp WebSiteHelp IblockCatalogHelp collectUnusedCoupons saveUnusedCoupons
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? | |
class __OrderHelp{ | |
static $ORDER_PROP_GROUPS = array(); | |
static $ORDER_PROP = array(); | |
public static function setSalePropertyD7($arOrder, $code, $value, $save_order = false){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
if(is_numeric($arOrder)){ | |
$arOrder = \Bitrix\Sale\Order::load($arOrder); | |
} | |
//https://dev.1c-bitrix.ru/api_d7/bitrix/sale/technique/property.php | |
//https://ru.stackoverflow.com/questions/1187173/%D0%9A%D0%B0%D0%BA-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0-%D0%B7%D0%B0%D0%BA%D0%B0%D0%B7%D0%B0-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5-%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F | |
$arProp = array(); | |
//no $propertyCollection->getItemByOrderPropertyCode | |
$findPropId = false; | |
$propertyCollection = $arOrder->getPropertyCollection(); | |
foreach($propertyCollection as $arProperty){ | |
$tmpProp = $arProperty->getProperty(); | |
$tmpProp['VALUE'] = $arProperty->getValue(); | |
$arProp[$tmpProp['CODE']] = $tmpProp; | |
if($code == $tmpProp['CODE']){ | |
$findPropId = $tmpProp['ID']; | |
} | |
} | |
$property = null; | |
if($propertyCollection->getItemByOrderPropertyId($findPropId) === null) { | |
$PROP = self::getPropByCodeD7($code, $arOrder->getPersonTypeId()); | |
$property = $propertyCollection->createItem( | |
[ | |
"ID" => $PROP['ID'], | |
"NAME" => $PROP['NAME'], | |
"CODE" => $PROP['CODE'], | |
'TYPE' => $PROP['TYPE'], | |
] | |
); | |
} else { | |
$property = $propertyCollection->getItemByOrderPropertyId($findPropId); | |
} | |
if($property && $value !== $property->getValue() ) { | |
$property->setField('VALUE', $value); | |
if($save_order){ | |
$arOrder->save(); | |
} | |
} | |
} | |
public static function getSalePropertyD7($arOrder, $code){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
if(is_numeric($arOrder)){ | |
$arOrder = \Bitrix\Sale\Order::load($arOrder); | |
} | |
$arProp = array(); | |
//no $propertyCollection->getItemByOrderPropertyCode | |
$findPropId = false; | |
$propertyCollection = $arOrder->getPropertyCollection(); | |
foreach($propertyCollection as $arProperty){ | |
$tmpProp = $arProperty->getProperty(); | |
if($code == $tmpProp['CODE']){ | |
$findPropId = $tmpProp['ID']; | |
} | |
} | |
if($findPropId){ | |
$property = $propertyCollection->getItemByOrderPropertyId($findPropId); | |
return $property->getValue(); | |
}else{ | |
return false; | |
} | |
} | |
public static function getPropByCodeD7($code,$personalType){ | |
if(empty(self::$ORDER_PROP)){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$db = \Bitrix\Sale\Internals\OrderPropsTable::getList(array( | |
"order"=>array("SORT"=>"ASC"), | |
"filter"=>array(), | |
)); | |
//$db = CSaleOrderProps::GetList(array("SORT"=>"ASC"),array()); | |
while($ar = $db->fetch()){ | |
self::$ORDER_PROP[$ar['PERSON_TYPE_ID']][$ar['CODE']] = $ar; | |
self::$ORDER_PROP["ALL"][$ar['CODE']] = $ar; | |
} | |
} | |
return self::$ORDER_PROP[$personalType][$code]; | |
} | |
public static function setBasketPropertyD7($basketItem, $CODE, $VALUE, $NAME = false, $save = false){ | |
if($basketItem){ | |
$basketPropertyCollection = $basketItem->getPropertyCollection(); | |
$arProps = $basketPropertyCollection->getPropertyValues(); | |
if(empty($NAME)){ | |
$NAME = $CODE; | |
} | |
if($arProps[$CODE]){ | |
$arProps[$CODE]['VALUE'] = $VALUE; | |
}else{ | |
$arProps[$CODE] = array( | |
'NAME' => $NAME, | |
'CODE' => $CODE, | |
'VALUE' => $VALUE, | |
'SORT' => 100, | |
); | |
} | |
$basketPropertyCollection->setProperty($arProps); | |
if($save){ | |
$basketPropertyCollection->save(); | |
} | |
} | |
} | |
public static function removeBasketPropertyD7($basketItem, $CODE, $save = false ){ | |
if($basketItem){ | |
$basketPropertyCollection = $basketItem->getPropertyCollection(); | |
foreach ($basketPropertyCollection as $propertyItem) { | |
if ($propertyItem->getField('CODE') == $CODE) { | |
$propertyItem->delete(); | |
break; | |
} | |
} | |
if($save){ | |
$basketPropertyCollection->save(); | |
} | |
} | |
} | |
public static function getOrderPropsGroupsD7(){ | |
if(empty(self::$ORDER_PROP_GROUPS)){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$resGroups = Bitrix\Sale\Internals\OrderPropsGroupTable::getList(array( | |
'order'=>array('SORT'=>'ASC'), | |
'filter'=>array() | |
)); | |
while($ar = $resGroups->fetch()){ | |
self::$ORDER_PROP_GROUPS[$ar['PERSON_TYPE_ID']][$ar['ID']] = $ar; | |
self::$ORDER_PROP_GROUPS["ALL"][$ar['ID']] = $ar; | |
} | |
} | |
return self::$ORDER_PROP_GROUPS; | |
} | |
public static function createSaleStringPropertyByCodeD7($code, $personalType){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
if(!self::getPropByCodeD7($code, $personalType)){ | |
$arOrderGroup = self::getOrderPropsGroupsD7(); | |
$arLastGroup = end($arOrderGroup[$personalType]); | |
$arSaveData = array( | |
'PERSON_TYPE_ID'=>$personalType, | |
'NAME'=>$code, | |
'CODE'=>$code, | |
'TYPE'=>'STRING', | |
'PROPS_GROUP_ID'=>$arLastGroup['ID'], | |
'ACTIVE'=>'Y', | |
'USER_PROPS'=>'N', | |
'UTIL'=>"Y", | |
'REQUIED'=>'N', | |
'SORT'=>100, | |
'ENTITY_REGISTRY_TYPE' => 'ORDER', //required | |
); | |
$result = Bitrix\Sale\Internals\OrderPropsTable::add($arSaveData); | |
if ($result->isSuccess()) | |
{ | |
self::$ORDER_PROP[$personalType][$arSaveData['CODE']] = $arSaveData; | |
self::$ORDER_PROP["ALL"][$arSaveData['CODE']] = $arSaveData; | |
//pre($result->getId()); | |
}else{ | |
//pre($result->getErrors()); | |
} | |
} | |
} | |
public static function getUserDataForOrder($arUserIds){ | |
$arUserList = array(); | |
$userQuery =\Bitrix\Main\UserTable::getList(array( | |
'order' => array('ID'=>'ASC'), | |
'filter' => array( | |
'=ID' => $arUserIds, | |
), | |
'runtime'=>array( | |
'PHONE_NUMBER' => [ | |
'data_type' => 'Bitrix\Main\UserPhoneAuthTable', | |
'reference' => [ | |
'=this.ID' => 'ref.USER_ID', | |
], | |
], | |
), | |
'select'=>array('ID' , 'NAME', 'LAST_NAME', "SECOND_NAME", "PERSONAL_PHONE", 'PERSONAL_MOBILE', 'EMAIL', "LOGIN", "EXTERNAL_AUTH_ID", 'PHONE_NUMBER_'=>'PHONE_NUMBER'), | |
)); | |
/* | |
$userQuery = CUser::getList('ID', 'ASC', | |
array('ID' => $arUserIds) , | |
array('FIELDS' => array('ID' , 'NAME', 'LAST_NAME', "SECOND_NAME", "PERSONAL_PHONE", 'PERSONAL_MOBILE', 'EMAIL', "LOGIN"))); | |
*/ | |
while($arUser = $userQuery->fetch()){ | |
$arUserList[$arUser['ID']] = $arUser; | |
$arUserList[$arUser['ID']]['PHONE'] = $arUser['PHONE_NUMBER_PHONE_NUMBER']?:$arUser['PERSONAL_PHONE'] ?: $arUser['PERSONAL_MOBILE']; | |
$userFIO = ''; | |
if (strval(trim($arUser['LAST_NAME'])) != '') | |
{ | |
$userFIO .= (strval($userFIO) != '' ? " " : "") . $arUser['LAST_NAME']; | |
} | |
if (strval(trim($arUser['NAME'])) != '') | |
{ | |
$userFIO .= (strval($userFIO) != '' ? " " : "") . $arUser['NAME']; | |
} | |
if (strval(trim($arUser['SECOND_NAME'])) != '') | |
{ | |
$userFIO .= (strval($userFIO) != '' ? " " : "") . $arUser['SECOND_NAME']; | |
} | |
$arUserList[$arUser['ID']]['FIO'] = $userFIO; | |
} | |
return $arUserList; | |
} | |
public static function getOrderPropsData($arOrderIds){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$arOrderPropList = array(); | |
if(count($arOrderIds)>0){ | |
$db_vals = \Bitrix\Sale\Internals\OrderPropsValueTable::GetList( | |
//$db_vals = \CSaleOrderPropsValue::GetList( | |
array(), | |
array( | |
"ORDER_ID" => $arOrderIds, | |
"CODE"=> array('FIO', 'EMAIL', 'PHONE'), | |
) | |
); | |
while($arOrderProp = $db_vals->fetch()){ | |
$arOrderPropList[$arOrderProp['ORDER_ID']][$arOrderProp['CODE']] = $arOrderProp['VALUE']; | |
} | |
} | |
return $arOrderPropList; | |
} | |
public static function getOrderPropsValues($arOrderIds){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$arOrderPropList = array(); | |
if(count($arOrderIds)>0){ | |
$db_vals = \Bitrix\Sale\Internals\OrderPropsValueTable::GetList( | |
array( | |
'filter'=>array( | |
"ORDER_ID" => $arOrderIds, | |
array( | |
"LOGIC"=>"OR", | |
"PROPERTY.IS_LOCATION"=>"Y", | |
"PROPERTY.IS_PAYER"=>"Y", | |
"PROPERTY.IS_EMAIL"=>"Y", | |
"PROPERTY.IS_PHONE"=>"Y", | |
//"PROPERTY.IS_PROFILE_NAME"=>"Y", | |
//"PROPERTY.IS_ADDRESS"=>"Y", | |
//"PROPERTY.IS_ZIP"=>"Y", | |
) | |
//"CODE"=> array('FIO', 'EMAIL', 'PHONE'), | |
), | |
"select"=>array("*", "PROPERTY_"=>"PROPERTY") | |
) | |
); | |
while($arOrderProp = $db_vals->fetch()){ | |
$CODE = $arOrderProp['CODE']; | |
if("Y" == $arOrderProp['PROPERTY_IS_PAYER']){ | |
$CODE = "NAME"; | |
}elseif("Y" == $arOrderProp['PROPERTY_IS_EMAIL']){ | |
$CODE = "EMAIL"; | |
}elseif("Y" == $arOrderProp['PROPERTY_IS_PHONE']){ | |
$CODE = "PHONE"; | |
}elseif("Y" == $arOrderProp['PROPERTY_IS_LOCATION']){ | |
$CODE = "LOCATION"; | |
} | |
$arOrderPropList[$arOrderProp['ORDER_ID']][$CODE] = array( | |
'CODE'=>$arOrderProp['CODE'], | |
"VALUE"=>$arOrderProp['VALUE'] | |
); | |
} | |
} | |
return $arOrderPropList; | |
} | |
public static function getOrderPropsByType($PERSON_TYPE_ID){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$arOrderPropList = array(); | |
$db_vals = \Bitrix\Sale\Internals\OrderPropsTable::GetList( | |
array( | |
'filter'=>array( | |
"PERSON_TYPE_ID"=>$PERSON_TYPE_ID, | |
array( | |
"LOGIC"=>"OR", | |
"IS_LOCATION"=>"Y", | |
"IS_PAYER"=>"Y", | |
"IS_EMAIL"=>"Y", | |
"IS_PHONE"=>"Y", | |
"IS_PROFILE_NAME"=>"Y", | |
//"IS_ADDRESS"=>"Y", | |
//"IS_ZIP"=>"Y", | |
) | |
), | |
) | |
); | |
while($arOrderProp = $db_vals->fetch()){ | |
$arCODE = array(); | |
if("Y" == $arOrderProp['IS_PAYER']){ | |
$arCODE[] = "NAME"; | |
}elseif("Y" == $arOrderProp['IS_EMAIL']){ | |
$arCODE[] = "EMAIL"; | |
}elseif("Y" == $arOrderProp['IS_PHONE']){ | |
$arCODE[] = "PHONE"; | |
}elseif("Y" == $arOrderProp['IS_LOCATION']){ | |
$arCODE[] = "LOCATION"; | |
} | |
if("Y" == $arOrderProp['IS_PROFILE_NAME']){ | |
$arCODE[] = "PROFILE"; | |
} | |
foreach($arCODE as $CODE){ | |
$arOrderPropList[$CODE] = $arOrderProp; | |
} | |
} | |
return $arOrderPropList; | |
} | |
public static function getOrderPropsByCode($PERSON_TYPE_ID, $arCODE){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$arOrderPropList = array(); | |
if(count($arCODE)>0){ | |
$db_vals = \Bitrix\Sale\Internals\OrderPropsTable::GetList( | |
array( | |
'filter'=>array( | |
"PERSON_TYPE_ID"=>$PERSON_TYPE_ID, | |
"CODE"=>$arCODE, | |
), | |
) | |
); | |
while($arOrderProp = $db_vals->fetch()){ | |
$arOrderPropList[$arOrderProp['CODE']] = $arOrderProp; | |
} | |
} | |
return $arOrderPropList; | |
} | |
public static function obtainTotal($arResult,$arParams,$order){ | |
$basket = $order->getBasket(); | |
$arResult['BASKET_POSITIONS'] = $basket->count(); | |
$arResult['BASKET_PRODUCTS_COUNT'] = array_sum($basket->getQuantityList()); | |
$arResult['ORDER_PRICE'] = $basket->getPrice(); | |
$arResult['ORDER_PRICE_FORMATED'] = SaleFormatCurrency($arResult['ORDER_PRICE'], $order->getCurrency()); | |
$arResult['ORDER_WEIGHT'] = $basket->getWeight(); | |
$arResult['ORDER_WEIGHT_FORMATED'] = roundEx(floatval($arResult['ORDER_WEIGHT'] / $arResult['WEIGHT_KOEF']), SALE_WEIGHT_PRECISION).' '.$arResult['WEIGHT_UNIT']; | |
$arResult['PRICE_WITHOUT_DISCOUNT_VALUE'] = $basket->getBasePrice(); | |
$arResult['PRICE_WITHOUT_DISCOUNT'] = SaleFormatCurrency($arResult['PRICE_WITHOUT_DISCOUNT_VALUE'], $order->getCurrency()); | |
$arResult['BASKET_PRICE_DISCOUNT_DIFF_VALUE'] = $basket->getBasePrice() - $basket->getPrice(); | |
$arResult['BASKET_PRICE_DISCOUNT_DIFF'] = SaleFormatCurrency($arResult['BASKET_PRICE_DISCOUNT_DIFF_VALUE'], $order->getCurrency()); | |
//maybe delete $order->getDiscountPrice() | |
$arResult['DISCOUNT_PRICE'] = \Bitrix\Sale\PriceMaths::roundPrecision( | |
$order->getDiscountPrice() + ($arResult['PRICE_WITHOUT_DISCOUNT_VALUE'] - $arResult['ORDER_PRICE']) | |
); | |
$arResult['DISCOUNT_PRICE_FORMATED'] = SaleFormatCurrency($arResult['DISCOUNT_PRICE'], $order->getCurrency()); | |
$arResult['DELIVERY_PRICE'] = \Bitrix\Sale\PriceMaths::roundPrecision($order->getDeliveryPrice()); | |
$arResult['DELIVERY_PRICE_FORMATED'] = SaleFormatCurrency($arResult['DELIVERY_PRICE'], $order->getCurrency()); | |
$arResult['ORDER_TOTAL_PRICE'] = \Bitrix\Sale\PriceMaths::roundPrecision($order->getPrice()); | |
$arResult['ORDER_TOTAL_PRICE_FORMATED'] = SaleFormatCurrency($arResult['ORDER_TOTAL_PRICE'], $order->getCurrency()); | |
return $arResult; | |
} | |
public static function obtainTotalArray($arResult,$arParams){ | |
$arResult['BASKET_POSITIONS'] = count($arResult['BASKET_ITEMS']); | |
$QUANTITY = 0; | |
$PRICE = 0; | |
$WEIGHT = 0; | |
$BASE_PRICE = 0; | |
foreach($arResult['BASKET_ITEMS'] as $arBasketItem){ | |
$QUANTITY += $arBasketItem['QUANTITY']; | |
$PRICE += $arBasketItem['PRICE']*$arBasketItem['QUANTITY']; | |
$WEIGHT += $arBasketItem['WEIGHT']*$arBasketItem['QUANTITY']; | |
$BASE_PRICE += $arBasketItem['BASE_PRICE']*$arBasketItem['QUANTITY']; | |
} | |
$arResult['BASKET_PRODUCTS_COUNT'] = $QUANTITY; | |
$CURRENCY = $arResult['BASE_LANG_CURRENCY']; | |
$arResult['ORDER_PRICE'] = $PRICE; | |
$arResult['ORDER_PRICE_FORMATED'] = SaleFormatCurrency($arResult['ORDER_PRICE'], $CURRENCY); | |
$arResult['ORDER_WEIGHT'] = $WEIGHT; | |
$arResult['ORDER_WEIGHT_FORMATED'] = roundEx(floatval($arResult['ORDER_WEIGHT'] / $arResult['WEIGHT_KOEF']), SALE_WEIGHT_PRECISION).' '.$arResult['WEIGHT_UNIT']; | |
$arResult['PRICE_WITHOUT_DISCOUNT_VALUE'] = $BASE_PRICE; | |
$arResult['PRICE_WITHOUT_DISCOUNT'] = SaleFormatCurrency($arResult['PRICE_WITHOUT_DISCOUNT_VALUE'], $CURRENCY); | |
$arResult['BASKET_PRICE_DISCOUNT_DIFF_VALUE'] = $BASE_PRICE - $PRICE; | |
$arResult['BASKET_PRICE_DISCOUNT_DIFF'] = SaleFormatCurrency($arResult['BASKET_PRICE_DISCOUNT_DIFF_VALUE'], $CURRENCY); | |
$arResult['DISCOUNT_PRICE'] = \Bitrix\Sale\PriceMaths::roundPrecision( | |
($arResult['PRICE_WITHOUT_DISCOUNT_VALUE'] - $arResult['ORDER_PRICE']) | |
); | |
$arResult['DISCOUNT_PRICE_FORMATED'] = SaleFormatCurrency($arResult['DISCOUNT_PRICE'], $CURRENCY); | |
$arResult['DELIVERY_PRICE'] = \Bitrix\Sale\PriceMaths::roundPrecision($arResult['DELIVERY_PRICE']); | |
$arResult['DELIVERY_PRICE_FORMATED'] = SaleFormatCurrency($arResult['DELIVERY_PRICE'], $CURRENCY); | |
$arResult['ORDER_TOTAL_PRICE'] = \Bitrix\Sale\PriceMaths::roundPrecision($PRICE+$arResult['DELIVERY_PRICE']); | |
$arResult['ORDER_TOTAL_PRICE_FORMATED'] = SaleFormatCurrency($arResult['ORDER_TOTAL_PRICE'], $CURRENCY); | |
$result = array(); | |
$result['TOTAL'] = [ | |
'BASKET_POSITIONS' => $arResult["BASKET_POSITIONS"], | |
'BASKET_PRODUCTS_COUNT' => $arResult["BASKET_PRODUCTS_COUNT"], | |
'PRICE_WITHOUT_DISCOUNT_VALUE' => $arResult["PRICE_WITHOUT_DISCOUNT_VALUE"], | |
'PRICE_WITHOUT_DISCOUNT' => $arResult["PRICE_WITHOUT_DISCOUNT"], | |
'BASKET_PRICE_DISCOUNT_DIFF_VALUE' => $arResult["BASKET_PRICE_DISCOUNT_DIFF_VALUE"], | |
'BASKET_PRICE_DISCOUNT_DIFF' => $arResult["BASKET_PRICE_DISCOUNT_DIFF"], | |
'PAYED_FROM_ACCOUNT_FORMATED' => $arResult["PAYED_FROM_ACCOUNT_FORMATED"], | |
'ORDER_TOTAL_PRICE' => $arResult["ORDER_TOTAL_PRICE"], | |
'ORDER_TOTAL_PRICE_FORMATED' => $arResult["ORDER_TOTAL_PRICE_FORMATED"], | |
'ORDER_TOTAL_LEFT_TO_PAY' => $arResult["ORDER_TOTAL_LEFT_TO_PAY"], | |
'ORDER_TOTAL_LEFT_TO_PAY_FORMATED' => $arResult["ORDER_TOTAL_LEFT_TO_PAY_FORMATED"], | |
'ORDER_WEIGHT' => $arResult["ORDER_WEIGHT"], | |
'ORDER_WEIGHT_FORMATED' => $arResult["ORDER_WEIGHT_FORMATED"], | |
'ORDER_PRICE' => $arResult["ORDER_PRICE"], | |
'ORDER_PRICE_FORMATED' => $arResult["ORDER_PRICE_FORMATED"], | |
'USE_VAT' => $arResult["USE_VAT"], | |
'VAT_RATE' => $arResult["VAT_RATE"], | |
'VAT_SUM' => $arResult["VAT_SUM"], | |
'VAT_SUM_FORMATED' => $arResult["VAT_SUM_FORMATED"], | |
'TAX_PRICE' => $arResult["TAX_PRICE"], | |
'TAX_LIST' => $arResult["TAX_LIST"], | |
'DISCOUNT_PRICE' => $arResult["DISCOUNT_PRICE"], | |
'DISCOUNT_PRICE_FORMATED' => $arResult["DISCOUNT_PRICE_FORMATED"], | |
'DELIVERY_PRICE' => $arResult["DELIVERY_PRICE"], | |
'DELIVERY_PRICE_FORMATED' => $arResult["DELIVERY_PRICE_FORMATED"], | |
'PAY_SYSTEM_PRICE' => $arResult["PAY_SYSTEM_PRICE"], | |
'PAY_SYSTEM_PRICE_FORMATTED' => $arResult["PAY_SYSTEM_PRICE_FORMATTED"], | |
]; | |
$arResult['JS_DATA']['TOTAL'] = array_merge($arResult['JS_DATA']['TOTAL'], $result['TOTAL']); | |
return $arResult; | |
} | |
public static function obtainTaxes($arResult,$arParams,$order){ | |
$arResult["USE_VAT"] = $order->isUsedVat(); | |
$arResult["VAT_RATE"] = $order->getVatRate(); | |
$arResult["VAT_SUM"] = $order->getVatSum(); | |
if ($arResult["VAT_SUM"] === null) | |
$arResult["VAT_SUM"] = 0; | |
$arResult["VAT_SUM_FORMATED"] = SaleFormatCurrency($arResult["VAT_SUM"], $order->getCurrency()); | |
$taxes = $order->getTax(); | |
$taxes->refreshData(); | |
if ($order->isUsedVat()) | |
{ | |
if ($arParams['SHOW_VAT_PRICE'] === 'Y') | |
{ | |
$arResult['TAX_LIST'] = $taxes->getAvailableList(); | |
} | |
} | |
else | |
{ | |
$arResult['TAX_LIST'] = $taxes->getTaxList(); | |
if (is_array($arResult['TAX_LIST']) && !empty($arResult['TAX_LIST'])) | |
{ | |
foreach ($arResult['TAX_LIST'] as $key => &$tax) | |
{ | |
if ($tax['VALUE_MONEY']) | |
$tax['VALUE_MONEY_FORMATED'] = SaleFormatCurrency($tax['VALUE_MONEY'], $order->getCurrency()); | |
} | |
} | |
} | |
$arResult['TAX_PRICE'] = $order->getTaxPrice(); | |
return $arResult; | |
} | |
public static function fillTotal($arResult, $arParams){ | |
$result['TOTAL'] = [ | |
'BASKET_POSITIONS' => $arResult["BASKET_POSITIONS"], | |
'BASKET_PRODUCTS_COUNT' => $arResult["BASKET_PRODUCTS_COUNT"], | |
'PRICE_WITHOUT_DISCOUNT_VALUE' => $arResult["PRICE_WITHOUT_DISCOUNT_VALUE"], | |
'PRICE_WITHOUT_DISCOUNT' => $arResult["PRICE_WITHOUT_DISCOUNT"], | |
'BASKET_PRICE_DISCOUNT_DIFF_VALUE' => $arResult["BASKET_PRICE_DISCOUNT_DIFF_VALUE"], | |
'BASKET_PRICE_DISCOUNT_DIFF' => $arResult["BASKET_PRICE_DISCOUNT_DIFF"], | |
'PAYED_FROM_ACCOUNT_FORMATED' => $arResult["PAYED_FROM_ACCOUNT_FORMATED"], | |
'ORDER_TOTAL_PRICE' => $arResult["ORDER_TOTAL_PRICE"], | |
'ORDER_TOTAL_PRICE_FORMATED' => $arResult["ORDER_TOTAL_PRICE_FORMATED"], | |
'ORDER_TOTAL_LEFT_TO_PAY' => $arResult["ORDER_TOTAL_LEFT_TO_PAY"], | |
'ORDER_TOTAL_LEFT_TO_PAY_FORMATED' => $arResult["ORDER_TOTAL_LEFT_TO_PAY_FORMATED"], | |
'ORDER_WEIGHT' => $arResult["ORDER_WEIGHT"], | |
'ORDER_WEIGHT_FORMATED' => $arResult["ORDER_WEIGHT_FORMATED"], | |
'ORDER_PRICE' => $arResult["ORDER_PRICE"], | |
'ORDER_PRICE_FORMATED' => $arResult["ORDER_PRICE_FORMATED"], | |
'USE_VAT' => $arResult["USE_VAT"], | |
'VAT_RATE' => $arResult["VAT_RATE"], | |
'VAT_SUM' => $arResult["VAT_SUM"], | |
'VAT_SUM_FORMATED' => $arResult["VAT_SUM_FORMATED"], | |
'TAX_PRICE' => $arResult["TAX_PRICE"], | |
'TAX_LIST' => $arResult["TAX_LIST"], | |
'DISCOUNT_PRICE' => $arResult["DISCOUNT_PRICE"], | |
'DISCOUNT_PRICE_FORMATED' => $arResult["DISCOUNT_PRICE_FORMATED"], | |
'DELIVERY_PRICE' => $arResult["DELIVERY_PRICE"], | |
'DELIVERY_PRICE_FORMATED' => $arResult["DELIVERY_PRICE_FORMATED"], | |
'PAY_SYSTEM_PRICE' => $arResult["PAY_SYSTEM_PRICE"], | |
'PAY_SYSTEM_PRICE_FORMATTED' => $arResult["PAY_SYSTEM_PRICE_FORMATTED"], | |
]; | |
return $result; | |
} | |
public static function getUserId() | |
{ | |
global $USER; | |
return $USER instanceof CUser ? $USER->GetID() : null; | |
} | |
public static function reCalcTotalBlock(&$arResult, $order){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
//pre($arResult); | |
// пересчитать цены для TOTAL блока | |
// can not create order here | |
$arResult = self::obtainTotal($arResult,$arParams,$order); | |
$arResult = self::obtainTaxes($arResult,$arParams,$order); | |
$result = self::fillTotal($arResult,$arParams); | |
$arResult['JS_DATA']['TOTAL'] = array_merge($arResult['JS_DATA']['TOTAL'], $result['TOTAL']); | |
// Изменить блок общей цены end | |
} | |
public static function getCurUserBasketObj(){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$basket = \Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite()); | |
return $basket; | |
} | |
public static function __createBasketObjFromArray($arBasketArray){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$siteId = \Bitrix\Main\Context::getCurrent()->getSite(); | |
$new_basket = \Bitrix\Sale\Basket::create($siteId); | |
$arRemoveProducts = array(); | |
foreach ($arBasketArray as $arBasketItem) | |
{ | |
$obBasketItem = \Bitrix\Sale\BasketItem::load($new_basket, $arBasketItem); | |
//pre($obBasketItem); | |
$new_basket->addItem($obBasketItem); | |
/* | |
$arBasketArrayCopy = array(); | |
$new_item = $new_basket->createItem('catalog', $arBasketItem['PRODUCT_ID']); | |
$arSkipFields = $new_item::getCalculatedFields(); | |
foreach($new_item::getSettableFields() as $keyCode){ | |
if(in_array($keyCode, $arSkipFields)){ | |
continue; | |
} | |
if(array_key_exists($keyCode,$arBasketItem)){ | |
$arBasketArrayCopy[$keyCode] = $arBasketItem[$keyCode]; | |
} | |
} | |
//$new_item->setFields($arBasketArrayCopy); | |
$new_item->initFields($arBasketArrayCopy);*/ | |
} | |
//pre($new_basket); | |
return $new_basket; | |
} | |
public static function __createOrderObjFromBasketArray($arBasketArray, $arResult, $basketChangeFunction = false){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$siteId = \Bitrix\Main\Context::getCurrent()->getSite(); | |
$new_basket = \Bitrix\Sale\Basket::create($siteId); | |
$userId = self::getUserId() ?: CSaleUser::GetAnonymousUserID(); | |
$registry = \Bitrix\Sale\Registry::getInstance(\Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER); | |
/** @var Order $orderClassName */ | |
$orderClassName = $registry->getOrderClassName(); | |
$order = $orderClassName::create($siteId, $userId); | |
//операция order->appendBasket влияет на корзину | |
$order->appendBasket($new_basket); | |
//$result = $order->setBasket($new_basket);// append and refresh // we dont need refresh | |
$arBasketArray = array_column($arBasketArray, null, "ID");// array_reindex | |
$new_basket = $order->getBasket(); | |
foreach ($arBasketArray as $arBasketItem) | |
{ | |
$obBasketItem = \Bitrix\Sale\BasketItem::load($new_basket, $arBasketItem); | |
$new_basket->addItem($obBasketItem); | |
} | |
//pre($new_basket->getBasePrice()); | |
//pre($new_basket->getPrice()); | |
//pre($order->getPrice()); | |
$shipment = false; | |
foreach($arResult['DELIVERY'] as $arDelivery){ | |
if("Y" == $arDelivery['CHECKED']){ | |
$shipmentCollection = $order->getShipmentCollection(); | |
$shipment = $shipmentCollection->createItem(); | |
$service = \Bitrix\Sale\Delivery\Services\Manager::getById($arDelivery['ID']); | |
//операция shipment->setFields влияет на корзину | |
$shipment->setFields(array( | |
'DELIVERY_ID' => $service['ID'], | |
'DELIVERY_NAME' => $service['NAME'], | |
)); | |
$shipmentItemCollection = $shipment->getShipmentItemCollection(); | |
$basketItems = $new_basket->getBasketItems(); | |
foreach($basketItems as $item){ | |
//т.к. операция shipment->setFields влияет на корзину | |
// то shipmentItemCollection заполняем из массива arBasketArray | |
//$obBasketItem = \Bitrix\Sale\BasketItem::load($new_basket, $arBasketArray[$item->getId()]); | |
$shipmentItem = $shipmentItemCollection->createItem($item); | |
//операция shipmentItem->setQuantity влияет на корзину | |
$shipmentItem->setQuantity($obBasketItem->getQuantity()); | |
} | |
} | |
} | |
//pre($new_basket->getBasePrice()); | |
//pre($new_basket->getPrice()); | |
//pre($order->getPrice()); | |
if($basketChangeFunction && is_callable($basketChangeFunction)){ | |
//т.к. операция shipment->setFields влияет на корзину | |
//и операция order->appendBasket влияет на корзину | |
//и операция shipmentItem->setQuantity влияет на корзину | |
//мы заново вносим все данные | |
foreach ($arBasketArray as $arBasketItem) | |
{ | |
$obItem = $new_basket->getItemById($arBasketItem['ID']); | |
$arBasketItem = call_user_func_array($basketChangeFunction, array($arBasketItem)); | |
$arBasketArrayCopy = array(); | |
$arSkipFields = $obItem::getCalculatedFields(); | |
foreach($obItem::getSettableFields() as $keyCode){ | |
if(in_array($keyCode, $arSkipFields)){ | |
continue; | |
} | |
if(array_key_exists($keyCode,$arBasketItem)){ | |
$arBasketArrayCopy[$keyCode] = $arBasketItem[$keyCode]; | |
} | |
} | |
$obItem->initFields($arBasketArrayCopy); | |
} | |
} | |
return $order; | |
} | |
public static function createOrderObjWithBasketChanges($obBasket, $arResult, $basketChangeFunction = false){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$siteId = \Bitrix\Main\Context::getCurrent()->getSite(); | |
$userId = self::getUserId() ?: CSaleUser::GetAnonymousUserID(); | |
$registry = \Bitrix\Sale\Registry::getInstance(\Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER); | |
/** @var Order $orderClassName */ | |
$orderClassName = $registry->getOrderClassName(); | |
$order = $orderClassName::create($siteId, $userId); | |
//операция order->appendBasket влияет на корзину | |
// может применить скидки | |
$order->appendBasket($obBasket); | |
$shipment = false; | |
foreach($arResult['DELIVERY'] as $arDelivery){ | |
if("Y" == $arDelivery['CHECKED']){ | |
$shipmentCollection = $order->getShipmentCollection(); | |
$shipment = $shipmentCollection->createItem(); | |
$service = \Bitrix\Sale\Delivery\Services\Manager::getById($arDelivery['ID']); | |
//операция shipment->setFields влияет на корзину | |
$shipment->setFields(array( | |
'DELIVERY_ID' => $service['ID'], | |
'DELIVERY_NAME' => $service['NAME'], | |
)); | |
$shipmentItemCollection = $shipment->getShipmentItemCollection(); | |
$basketItems = $obBasket->getBasketItems(); | |
foreach($basketItems as $item){ | |
$shipmentItem = $shipmentItemCollection->createItem($item); | |
//операция shipmentItem->setQuantity влияет на корзину | |
$shipmentItem->setQuantity($item->getQuantity()); | |
} | |
} | |
} | |
//pre($new_basket->getBasePrice()); | |
//pre($new_basket->getPrice()); | |
//pre($order->getPrice()); | |
if($basketChangeFunction && is_callable($basketChangeFunction)){ | |
//т.к. операция shipment->setFields влияет на корзину | |
//и операция order->appendBasket влияет на корзину | |
//и операция shipmentItem->setQuantity влияет на корзину | |
//после этих операция мы запускаем кастомное изменение корзины | |
$basketItems = $obBasket->getBasketItems(); | |
foreach($basketItems as $obItem){ | |
$arBasketItem = call_user_func_array($basketChangeFunction, array($obItem)); | |
$arBasketArrayCopy = array(); | |
$arSkipFields = $obItem::getCalculatedFields(); | |
foreach($obItem::getSettableFields() as $keyCode){ | |
if(in_array($keyCode, $arSkipFields)){ | |
continue; | |
} | |
if(array_key_exists($keyCode,$arBasketItem)){ | |
$arBasketArrayCopy[$keyCode] = $arBasketItem[$keyCode]; | |
} | |
} | |
$obItem->initFields($arBasketArrayCopy); | |
} | |
} | |
return $order; | |
} | |
public static function getOrderableBasketArrayFromObj($obBasket){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$basketItems = array(); | |
if (!$obBasket->isEmpty()) | |
{ | |
$orderableBasket = $obBasket->getOrderableItems(); | |
/** @var Sale\BasketItem $item */ | |
foreach ($orderableBasket as $item) | |
{ | |
$basketItems[$item->getId()] = self::getBasketItemArray($item); | |
} | |
} | |
return $basketItems; | |
} | |
public static function getBasketItemArray($arInitBasketItem,$arNewBasketRow = false){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
\Bitrix\Main\Loader::includeModule('currency'); | |
if (is_object($arInitBasketItem)) | |
{ | |
$obBasketItem = $arInitBasketItem; | |
$arInitBasketItem = $obBasketItem->getFieldValues(); | |
$arInitBasketItem['PROPS'] = self::getBasketItemProperties($obBasketItem); | |
$arInitBasketItem['PROPS_ALL'] = $obBasketItem->getPropertyCollection()->getPropertyValues(); | |
$arInitBasketItem['QUANTITY'] = $obBasketItem->getQuantity(); | |
} | |
if($arNewBasketRow){ | |
$basketItem = array_merge($arInitBasketItem, $arNewBasketRow); | |
}else{ | |
$basketItem = $arInitBasketItem; | |
} | |
$basketItem['DISCOUNT_PRICE'] = $basketItem['BASE_PRICE'] - $basketItem['PRICE']; | |
$context = \Bitrix\Main\Application::getInstance()->getContext(); | |
$siteId = $context->getSite(); | |
$params['WEIGHT_KOEF'] = (float)COption::GetOptionString('sale', 'weight_koef', 1, $siteId); | |
if ($params['WEIGHT_KOEF'] === 0.0) | |
{ | |
$params['WEIGHT_KOEF'] = 1; | |
} | |
$params['WEIGHT_UNIT'] = htmlspecialcharsbx(COption::GetOptionString('sale', 'weight_unit', '', $siteId)); | |
$basketItem['QUANTITY'] = (float)$basketItem['QUANTITY']; | |
$basketItem['WEIGHT'] = (float)$basketItem['WEIGHT']; | |
$basketItem['WEIGHT_FORMATED'] = roundEx($basketItem['WEIGHT'] / $params['WEIGHT_KOEF'], SALE_WEIGHT_PRECISION).' '.$params['WEIGHT_UNIT']; | |
$basketItem['PRICE'] = \Bitrix\Sale\PriceMaths::roundPrecision((float)$basketItem['PRICE']); | |
$basketItem['PRICE_FORMATED'] = \CCurrencyLang::CurrencyFormat($basketItem['PRICE'], $basketItem['CURRENCY'], true); | |
$basketItem['FULL_PRICE'] = \Bitrix\Sale\PriceMaths::roundPrecision((float)$basketItem['BASE_PRICE']); | |
$basketItem['FULL_PRICE_FORMATED'] = \CCurrencyLang::CurrencyFormat($basketItem['FULL_PRICE'], $basketItem['CURRENCY'], true); | |
$basketItem['DISCOUNT_PRICE'] = \Bitrix\Sale\PriceMaths::roundPrecision((float)$basketItem['DISCOUNT_PRICE']); | |
$basketItem['DISCOUNT_PRICE_FORMATED'] = \CCurrencyLang::CurrencyFormat($basketItem['DISCOUNT_PRICE'], $basketItem['CURRENCY'], true); | |
$basketItem['SUM_VALUE'] = $basketItem['PRICE'] * $basketItem['QUANTITY']; | |
$basketItem['SUM'] = \CCurrencyLang::CurrencyFormat($basketItem['SUM_VALUE'], $basketItem['CURRENCY'], true); | |
$basketItem['SUM_FULL_PRICE'] = $basketItem['FULL_PRICE'] * $basketItem['QUANTITY']; | |
$basketItem['SUM_FULL_PRICE_FORMATED'] = \CCurrencyLang::CurrencyFormat($basketItem['SUM_FULL_PRICE'], $basketItem['CURRENCY'], true); | |
$basketItem['SUM_DISCOUNT_PRICE'] = $basketItem['DISCOUNT_PRICE'] * $basketItem['QUANTITY']; | |
$basketItem['SUM_DISCOUNT_PRICE_FORMATED'] = \CCurrencyLang::CurrencyFormat($basketItem['SUM_DISCOUNT_PRICE'], $basketItem['CURRENCY'], true); | |
$basketItem['VAT_RATE'] = (float)$basketItem['VAT_RATE']; | |
$basketItem['PRICE_VAT_VALUE'] = $basketItem['VAT_VALUE'] | |
= ($basketItem['PRICE'] * $basketItem['QUANTITY'] / ($basketItem['VAT_RATE'] + 1)) * $basketItem['VAT_RATE'] / $basketItem['QUANTITY']; | |
$basketItem['DISCOUNT_PRICE_PERCENT'] = 0; | |
if ($basketItem['CUSTOM_PRICE'] !== 'Y' && $basketItem['FULL_PRICE'] > 0 && $basketItem['DISCOUNT_PRICE'] > 0) | |
{ | |
$basketItem['DISCOUNT_PRICE_PERCENT'] = \Bitrix\Sale\Discount::calculateDiscountPercent( | |
$basketItem['FULL_PRICE'], | |
$basketItem['DISCOUNT_PRICE'] | |
); | |
if ($basketItem['DISCOUNT_PRICE_PERCENT'] === null) | |
$basketItem['DISCOUNT_PRICE_PERCENT'] = 0; | |
} | |
$basketItem['DISCOUNT_PRICE_PERCENT_FORMATED'] = \Bitrix\Sale\BasketItem::formatQuantity($basketItem['DISCOUNT_PRICE_PERCENT']).'%'; | |
if ($basketItem['CAN_BUY'] !== 'Y' && $basketItem['DELAY'] !== 'Y') | |
{ | |
$basketItem['NOT_AVAILABLE'] = true; | |
} | |
return $basketItem; | |
} | |
public static function makeCompatibleArray(&$array) | |
{ | |
if (empty($array) || !is_array($array)) | |
return; | |
$arr = []; | |
foreach ($array as $key => $value) | |
{ | |
if ( | |
is_array($value) | |
|| (is_string($value) && preg_match("/[;&<>\"]/", $value)) | |
) | |
{ | |
$arr[$key] = htmlspecialcharsEx($value); | |
} | |
else | |
{ | |
$arr[$key] = $value; | |
} | |
$arr["~{$key}"] = $value; | |
} | |
$array = $arr; | |
} | |
public static function getBasketItemProperties(\Bitrix\Sale\BasketItem $basketItem) | |
{ | |
$properties = []; | |
/** @var Sale\BasketPropertiesCollection $propertyCollection */ | |
$propertyCollection = $basketItem->getPropertyCollection(); | |
$basketId = $basketItem->getBasketCode(); | |
foreach ($propertyCollection->getPropertyValues() as $property) | |
{ | |
if ($property['CODE'] == 'CATALOG.XML_ID' || $property['CODE'] == 'PRODUCT.XML_ID' || $property['CODE'] == 'SUM_OF_CHARGE') | |
continue; | |
$property = array_filter($property, ['CSaleBasketHelper', 'filterFields']); | |
$property['BASKET_ID'] = $basketId; | |
self::makeCompatibleArray($property); | |
$properties[] = $property; | |
} | |
return $properties; | |
} | |
public static function getResultBasket($arResult){ | |
return $arResult['BASKET_ITEMS']; | |
} | |
public static function setResultBasket($arResult, $arBasket){ | |
$arResult['BASKET_ITEMS'] = $arBasket; | |
foreach($arBasket as $arBasketItem){ | |
$arCols = []; | |
if(!empty($arResult["GRID"]["ROWS"][$arBasketItem["ID"]])){ | |
$arCols = $arResult["GRID"]["ROWS"][$arBasketItem["ID"]]["columns"]; | |
} | |
$arResult["GRID"]["ROWS"][$arBasketItem["ID"]] = [ | |
"id" => $arBasketItem["ID"], | |
"data" => $arBasketItem, | |
"actions" => [], | |
"columns" => $arCols, | |
"editable" => true, | |
]; | |
} | |
$arResult['JS_DATA']["GRID"]["ROWS"] = $arResult["GRID"]["ROWS"]; | |
return $arResult; | |
} | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// use in digift | |
class SaleOrderAjaxHelp{ | |
public static function isAjaxCall($request = false){ | |
if(!$request){ | |
$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest(); | |
} | |
$arValues = $request->getValues(); | |
if( | |
!empty($arValues['is_ajax_post']) // sale.order.ajax 14 version | |
|| !empty($arValues['via_ajax']) | |
|| !empty($arValues['soa-action']) | |
){ | |
return true; | |
} | |
return false; | |
} | |
public static function isSubmitOrderCall($request = false){ | |
if(!$request){ | |
$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest(); | |
} | |
$arValues = $request->getValues(); | |
if(!empty($arValues['confirmorder'])){ | |
return true; | |
} | |
if('saveOrderAjax' == $arValues['action']){ | |
return true; | |
} | |
return false; | |
} | |
public static function addError(&$arResult, $ERROR_TEXT, $BLOCK = 'MAIN'){ | |
//$BLOCK = //MAIN //AUTH //REGION //DELIVERY //PAY_SYSTEM //PROPERTY | |
$arResult["ERROR"][] = $ERROR_TEXT; | |
$arResult["ERROR_SORTED"][$BLOCK][] = $ERROR_TEXT; | |
$arResult["JS_DATA"]["ERROR"][$BLOCK][] = $ERROR_TEXT; | |
} | |
public static function getRequestValue($value=false,$request = false){ | |
if(!$request){ | |
$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest(); | |
} | |
$arValues = $request->getValues(); | |
if($value){ | |
return $arValues[$value]; | |
} | |
return $arValues; | |
} | |
public static function findPropByCode($code,$arResult){ | |
$arSearch = array("USER_PROPS_Y","USER_PROPS_N" /*, 'RELATED' */); | |
foreach($arSearch as $group){ | |
foreach($arResult['ORDER_PROP'][$group] as $arProp){ | |
if($arProp['CODE'] == $code){ | |
return $arProp; | |
} | |
} | |
} | |
foreach($arResult['JS_DATA']['ORDER_PROP']['properties'] as $arProp){ | |
if($arProp['CODE'] == $code){ | |
if("N" == $arProp['MULTIPLE']){ | |
$arProp['VALUE'] = $arProp['VALUE'][0]; | |
} | |
return $arProp; | |
} | |
} | |
} | |
public static function setPropData($arCode,&$arResult, $DataKey, $value, $double = false){ | |
if (!is_array($arCode)){ | |
$arCode = array($arCode); | |
} | |
foreach($arCode as $code){ | |
$Next = true; | |
foreach($arResult["ORDER_PROP"]["USER_PROPS_Y"] as $key=>$props){ | |
if ($props['CODE'] == $code){ | |
$arResult["ORDER_PROP"]["USER_PROPS_Y"][$key][$DataKey] = $value; | |
if($double){ | |
$arResult["ORDER_PROP"]["USER_PROPS_Y"][$key]['~'.$DataKey] = $value; | |
} | |
$Next = false; | |
break; | |
} | |
} | |
if ($Next){ | |
foreach($arResult["ORDER_PROP"]["USER_PROPS_N"] as $key=>$props){ | |
if ($props['CODE'] == $code){ | |
$arResult["ORDER_PROP"]["USER_PROPS_N"][$key][$DataKey] = $value; | |
if($double){ | |
$arResult["ORDER_PROP"]["USER_PROPS_N"][$key]['~'.$DataKey] = $value; | |
} | |
break; | |
} | |
} | |
} | |
foreach($arResult["JS_DATA"]["ORDER_PROP"]['properties'] as $key=>$props){ | |
if ($props['CODE'] == $code){ | |
$arResult["JS_DATA"]["ORDER_PROP"]['properties'][$key][$DataKey][0] = $value; | |
break; | |
} | |
} | |
} | |
return false; | |
} | |
public static function getActiveDelivery($arResult){ | |
foreach($arResult['DELIVERY'] as $arDelivery){ | |
if("Y" == $arDelivery['CHECKED']){ | |
return $arDelivery; | |
} | |
} | |
return false; | |
} | |
public static function getDeliveryList($arResult){ | |
return $arResult['DELIVERY']; | |
} | |
public static function setActiveDelivery($arResult, $DELIVERY_ID){ | |
foreach($arResult['DELIVERY'] as &$arDelivery){ | |
if("Y" == $arDelivery['CHECKED']){ | |
if($arDelivery['ID'] != $DELIVERY_ID){ | |
unset($arDelivery['CHECKED']); | |
} | |
} | |
} | |
$arResult['DELIVERY'][$DELIVERY_ID]['CHECKED'] = "Y"; | |
return $arResult; | |
} | |
public static function removeDelivery($arResult, $DELIVERY_ID){ | |
foreach($arResult['DELIVERY'] as $key=>$arDelivery){ | |
if($arDelivery['ID'] == $DELIVERY_ID){ | |
unset($arResult['DELIVERY'][$key]); | |
} | |
} | |
return $arResult; | |
} | |
public static function getResultBasket($arResult){ | |
return $arResult['BASKET_ITEMS']; | |
} | |
public static function setResultBasket($arResult, $arBasket){ | |
$arResult['BASKET_ITEMS'] = $arBasket; | |
foreach($arBasket as $arBasketItem){ | |
$arCols = []; | |
if(!empty($arResult["GRID"]["ROWS"][$arBasketItem["ID"]])){ | |
$arCols = $arResult["GRID"]["ROWS"][$arBasketItem["ID"]]["columns"]; | |
} | |
$arResult["GRID"]["ROWS"][$arBasketItem["ID"]] = [ | |
"id" => $arBasketItem["ID"], | |
"data" => $arBasketItem, | |
"actions" => [], | |
"columns" => $arCols, | |
"editable" => true, | |
]; | |
} | |
$arResult['JS_DATA']["GRID"]["ROWS"] = $arResult["GRID"]["ROWS"]; | |
return $arResult; | |
} | |
public static function getBasketItemArray($arInitBasketItem,$arNewBasketRow = false){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
\Bitrix\Main\Loader::includeModule('currency'); | |
if (is_object($arInitBasketItem)) | |
{ | |
$obBasketItem = $arInitBasketItem; | |
$arInitBasketItem = $obBasketItem->getFieldValues(); | |
$arInitBasketItem['PROPS'] = self::getBasketItemProperties($obBasketItem); | |
$arInitBasketItem['PROPS_ALL'] = $obBasketItem->getPropertyCollection()->getPropertyValues(); | |
$arInitBasketItem['QUANTITY'] = $obBasketItem->getQuantity(); | |
} | |
if($arNewBasketRow){ | |
$basketItem = array_merge($arInitBasketItem, $arNewBasketRow); | |
}else{ | |
$basketItem = $arInitBasketItem; | |
} | |
$basketItem['DISCOUNT_PRICE'] = $basketItem['BASE_PRICE'] - $basketItem['PRICE']; | |
$context = \Bitrix\Main\Application::getInstance()->getContext(); | |
$siteId = $context->getSite(); | |
$params['WEIGHT_KOEF'] = (float)COption::GetOptionString('sale', 'weight_koef', 1, $siteId); | |
if ($params['WEIGHT_KOEF'] === 0.0) | |
{ | |
$params['WEIGHT_KOEF'] = 1; | |
} | |
$params['WEIGHT_UNIT'] = htmlspecialcharsbx(COption::GetOptionString('sale', 'weight_unit', '', $siteId)); | |
$basketItem['QUANTITY'] = (float)$basketItem['QUANTITY']; | |
$basketItem['WEIGHT'] = (float)$basketItem['WEIGHT']; | |
$basketItem['WEIGHT_FORMATED'] = roundEx($basketItem['WEIGHT'] / $params['WEIGHT_KOEF'], SALE_WEIGHT_PRECISION).' '.$params['WEIGHT_UNIT']; | |
$basketItem['PRICE'] = \Bitrix\Sale\PriceMaths::roundPrecision((float)$basketItem['PRICE']); | |
$basketItem['PRICE_FORMATED'] = \CCurrencyLang::CurrencyFormat($basketItem['PRICE'], $basketItem['CURRENCY'], true); | |
$basketItem['FULL_PRICE'] = \Bitrix\Sale\PriceMaths::roundPrecision((float)$basketItem['BASE_PRICE']); | |
$basketItem['FULL_PRICE_FORMATED'] = \CCurrencyLang::CurrencyFormat($basketItem['FULL_PRICE'], $basketItem['CURRENCY'], true); | |
$basketItem['DISCOUNT_PRICE'] = \Bitrix\Sale\PriceMaths::roundPrecision((float)$basketItem['DISCOUNT_PRICE']); | |
$basketItem['DISCOUNT_PRICE_FORMATED'] = \CCurrencyLang::CurrencyFormat($basketItem['DISCOUNT_PRICE'], $basketItem['CURRENCY'], true); | |
$basketItem['SUM_VALUE'] = $basketItem['PRICE'] * $basketItem['QUANTITY']; | |
$basketItem['SUM'] = \CCurrencyLang::CurrencyFormat($basketItem['SUM_VALUE'], $basketItem['CURRENCY'], true); | |
$basketItem['SUM_FULL_PRICE'] = $basketItem['FULL_PRICE'] * $basketItem['QUANTITY']; | |
$basketItem['SUM_FULL_PRICE_FORMATED'] = \CCurrencyLang::CurrencyFormat($basketItem['SUM_FULL_PRICE'], $basketItem['CURRENCY'], true); | |
$basketItem['SUM_DISCOUNT_PRICE'] = $basketItem['DISCOUNT_PRICE'] * $basketItem['QUANTITY']; | |
$basketItem['SUM_DISCOUNT_PRICE_FORMATED'] = \CCurrencyLang::CurrencyFormat($basketItem['SUM_DISCOUNT_PRICE'], $basketItem['CURRENCY'], true); | |
$basketItem['VAT_RATE'] = (float)$basketItem['VAT_RATE']; | |
$basketItem['PRICE_VAT_VALUE'] = $basketItem['VAT_VALUE'] | |
= ($basketItem['PRICE'] * $basketItem['QUANTITY'] / ($basketItem['VAT_RATE'] + 1)) * $basketItem['VAT_RATE'] / $basketItem['QUANTITY']; | |
$basketItem['DISCOUNT_PRICE_PERCENT'] = 0; | |
if ($basketItem['CUSTOM_PRICE'] !== 'Y' && $basketItem['FULL_PRICE'] > 0 && $basketItem['DISCOUNT_PRICE'] > 0) | |
{ | |
$basketItem['DISCOUNT_PRICE_PERCENT'] = \Bitrix\Sale\Discount::calculateDiscountPercent( | |
$basketItem['FULL_PRICE'], | |
$basketItem['DISCOUNT_PRICE'] | |
); | |
if ($basketItem['DISCOUNT_PRICE_PERCENT'] === null) | |
$basketItem['DISCOUNT_PRICE_PERCENT'] = 0; | |
} | |
$basketItem['DISCOUNT_PRICE_PERCENT_FORMATED'] = \Bitrix\Sale\BasketItem::formatQuantity($basketItem['DISCOUNT_PRICE_PERCENT']).'%'; | |
if ($basketItem['CAN_BUY'] !== 'Y' && $basketItem['DELAY'] !== 'Y') | |
{ | |
$basketItem['NOT_AVAILABLE'] = true; | |
} | |
return $basketItem; | |
} | |
public static function obtainTotalArray($arResult){ | |
$arResult['BASKET_POSITIONS'] = count($arResult['BASKET_ITEMS']); | |
$QUANTITY = 0; | |
$PRICE = 0; | |
$WEIGHT = 0; | |
$BASE_PRICE = 0; | |
foreach($arResult['BASKET_ITEMS'] as $arBasketItem){ | |
$QUANTITY += $arBasketItem['QUANTITY']; | |
$PRICE += $arBasketItem['PRICE']*$arBasketItem['QUANTITY']; | |
$WEIGHT += $arBasketItem['WEIGHT']*$arBasketItem['QUANTITY']; | |
$BASE_PRICE += $arBasketItem['BASE_PRICE']*$arBasketItem['QUANTITY']; | |
} | |
$arResult['BASKET_PRODUCTS_COUNT'] = $QUANTITY; | |
$CURRENCY = $arResult['BASE_LANG_CURRENCY']; | |
$arResult['ORDER_PRICE'] = $PRICE; | |
$arResult['ORDER_PRICE_FORMATED'] = SaleFormatCurrency($arResult['ORDER_PRICE'], $CURRENCY); | |
$arResult['ORDER_WEIGHT'] = $WEIGHT; | |
$arResult['ORDER_WEIGHT_FORMATED'] = roundEx(floatval($arResult['ORDER_WEIGHT'] / $arResult['WEIGHT_KOEF']), SALE_WEIGHT_PRECISION).' '.$arResult['WEIGHT_UNIT']; | |
$arResult['PRICE_WITHOUT_DISCOUNT_VALUE'] = $BASE_PRICE; | |
$arResult['PRICE_WITHOUT_DISCOUNT'] = SaleFormatCurrency($arResult['PRICE_WITHOUT_DISCOUNT_VALUE'], $CURRENCY); | |
$arResult['BASKET_PRICE_DISCOUNT_DIFF_VALUE'] = $BASE_PRICE - $PRICE; | |
$arResult['BASKET_PRICE_DISCOUNT_DIFF'] = SaleFormatCurrency($arResult['BASKET_PRICE_DISCOUNT_DIFF_VALUE'], $CURRENCY); | |
$arResult['DISCOUNT_PRICE'] = \Bitrix\Sale\PriceMaths::roundPrecision( | |
($arResult['PRICE_WITHOUT_DISCOUNT_VALUE'] - $arResult['ORDER_PRICE']) | |
); | |
$arResult['DELIVERY_PRICE'] = \Bitrix\Sale\PriceMaths::roundPrecision($arResult['DELIVERY_PRICE']); | |
$arResult['DELIVERY_PRICE_FORMATED'] = SaleFormatCurrency($arResult['DELIVERY_PRICE'], $CURRENCY); | |
$arResult['DISCOUNT_PRICE_FORMATED'] = SaleFormatCurrency($arResult['DISCOUNT_PRICE'], $CURRENCY); | |
$arResult['ORDER_TOTAL_PRICE'] = \Bitrix\Sale\PriceMaths::roundPrecision($PRICE+$arResult['DELIVERY_PRICE']); | |
$arResult['ORDER_TOTAL_PRICE_FORMATED'] = SaleFormatCurrency($arResult['ORDER_TOTAL_PRICE'], $CURRENCY); | |
$result = array(); | |
$result['TOTAL'] = [ | |
'BASKET_POSITIONS' => $arResult["BASKET_POSITIONS"], | |
'BASKET_PRODUCTS_COUNT' => $arResult["BASKET_PRODUCTS_COUNT"], | |
'PRICE_WITHOUT_DISCOUNT_VALUE' => $arResult["PRICE_WITHOUT_DISCOUNT_VALUE"], | |
'PRICE_WITHOUT_DISCOUNT' => $arResult["PRICE_WITHOUT_DISCOUNT"], | |
'BASKET_PRICE_DISCOUNT_DIFF_VALUE' => $arResult["BASKET_PRICE_DISCOUNT_DIFF_VALUE"], | |
'BASKET_PRICE_DISCOUNT_DIFF' => $arResult["BASKET_PRICE_DISCOUNT_DIFF"], | |
'PAYED_FROM_ACCOUNT_FORMATED' => $arResult["PAYED_FROM_ACCOUNT_FORMATED"], | |
'ORDER_TOTAL_PRICE' => $arResult["ORDER_TOTAL_PRICE"], | |
'ORDER_TOTAL_PRICE_FORMATED' => $arResult["ORDER_TOTAL_PRICE_FORMATED"], | |
'ORDER_TOTAL_LEFT_TO_PAY' => $arResult["ORDER_TOTAL_LEFT_TO_PAY"], | |
'ORDER_TOTAL_LEFT_TO_PAY_FORMATED' => $arResult["ORDER_TOTAL_LEFT_TO_PAY_FORMATED"], | |
'ORDER_WEIGHT' => $arResult["ORDER_WEIGHT"], | |
'ORDER_WEIGHT_FORMATED' => $arResult["ORDER_WEIGHT_FORMATED"], | |
'ORDER_PRICE' => $arResult["ORDER_PRICE"], | |
'ORDER_PRICE_FORMATED' => $arResult["ORDER_PRICE_FORMATED"], | |
'USE_VAT' => $arResult["USE_VAT"], | |
'VAT_RATE' => $arResult["VAT_RATE"], | |
'VAT_SUM' => $arResult["VAT_SUM"], | |
'VAT_SUM_FORMATED' => $arResult["VAT_SUM_FORMATED"], | |
'TAX_PRICE' => $arResult["TAX_PRICE"], | |
'TAX_LIST' => $arResult["TAX_LIST"], | |
'DISCOUNT_PRICE' => $arResult["DISCOUNT_PRICE"], | |
'DISCOUNT_PRICE_FORMATED' => $arResult["DISCOUNT_PRICE_FORMATED"], | |
'DELIVERY_PRICE' => $arResult["DELIVERY_PRICE"], | |
'DELIVERY_PRICE_FORMATED' => $arResult["DELIVERY_PRICE_FORMATED"], | |
'PAY_SYSTEM_PRICE' => $arResult["PAY_SYSTEM_PRICE"], | |
'PAY_SYSTEM_PRICE_FORMATTED' => $arResult["PAY_SYSTEM_PRICE_FORMATTED"], | |
]; | |
$arResult['JS_DATA']['TOTAL'] = array_merge($arResult['JS_DATA']['TOTAL'], $result['TOTAL']); | |
return $arResult; | |
} | |
public static function subtractValueFromOrder($arResult, $subtractValue, $with_delivery = false){ | |
//$arResult['ORDER_PRICE'] | |
//$arResult['DELIVERY_PRICE'] | |
//$arResult['ORDER_TOTAL_PRICE'] | |
$maxSubtractValue = $subtractValue; | |
$itemsSubtractValue = $subtractValue; | |
$deliverySubtractValue = 0; | |
if($with_delivery){ | |
if($subtractValue >= $arResult['ORDER_TOTAL_PRICE']){ | |
$maxSubtractValue = $arResult['ORDER_TOTAL_PRICE']; | |
$deliverySubtractValue = $arResult['DELIVERY_PRICE']; | |
$itemsSubtractValue = $maxSubtractValue - $deliverySubtractValue; | |
}else{ | |
if($subtractValue >= $arResult['ORDER_PRICE']){ | |
$itemsSubtractValue = $arResult['ORDER_PRICE']; | |
$deliverySubtractValue = $subtractValue - $itemsSubtractValue; | |
} | |
} | |
}else{ | |
if($subtractValue >= $arResult['ORDER_PRICE']){ | |
$itemsSubtractValue = | |
$maxSubtractValue = $arResult['ORDER_PRICE']; | |
} | |
} | |
$arBasketList = SaleOrderAjaxHelp::getResultBasket($arResult); | |
foreach($arBasketList as &$arBasketItem){ | |
if($itemsSubtractValue == $arResult['ORDER_PRICE']){ | |
$NEW_PRICE = 0; | |
}else{ | |
$fullPrice = $arBasketItem['PRICE']*$arBasketItem['QUANTITY']; | |
$NEW_PRICE = $arBasketItem['PRICE'] - (($fullPrice/$arResult['ORDER_PRICE'])*$itemsSubtractValue)/$arBasketItem['QUANTITY']; | |
} | |
$arBasketItem = SaleOrderAjaxHelp::getBasketItemArray($arBasketItem, array('PRICE'=>$NEW_PRICE)); // внести изменения | |
} | |
unset($arBasketItem); | |
$arResult = SaleOrderAjaxHelp::setResultBasket($arResult, $arBasketList); | |
if($with_delivery){ | |
$arResult['DELIVERY_PRICE'] -= $deliverySubtractValue; | |
} | |
$arResult = SaleOrderAjaxHelp::obtainTotalArray($arResult); | |
return $arResult; | |
} | |
/* | |
Bitrix\Main\EventManager::getInstance()->addEventHandler( | |
'sale', | |
'OnSaleComponentOrderCreated', | |
'OnSaleComponentOrderCreated_33485', | |
false, | |
20 | |
); | |
function OnSaleComponentOrderCreated_33485($order, &$arUserResult, $request, &$arParams, &$arResult, &$arDeliveryServiceAll, &$arPaySystemServiceAll){ | |
self::isChangedHandler($order,$request); | |
} | |
*/ | |
public static function isChangedHandler($order,$request=false){ | |
global $SaleOrderAjaxHelp; | |
if(empty($SaleOrderAjaxHelp['isChangedHandler'])){ | |
$DELIVERY_ID = false; | |
$PAYSYSTEM_ID = false; | |
if($order instanceof \Bitrix\Sale\Order){ | |
$deliveryIds = $order->getDeliverySystemId(); | |
$DELIVERY_ID = $deliveryIds[0]; | |
$paymentIds = $order->getPaymentSystemId(); | |
$PAYSYSTEM_ID = $paymentIds[0]; | |
}elseif(is_array($order)){ | |
foreach($order['PAY_SYSTEM'] as $arPaySystem){ | |
if("Y" == $arPaySystem['CHECKED']){ | |
$PAYSYSTEM_ID = $arPaySystem['ID']; | |
} | |
} | |
foreach($order['DELIVERY'] as $arDelivery){ | |
if("Y" == $arDelivery['CHECKED']){ | |
$DELIVERY_ID = $arDelivery['ID']; | |
} | |
} | |
} | |
$arValues = self::getRequestValue(false,$request); | |
if(!empty($arValues['soa-action']) || !empty($arValues['action'])){ | |
//ajax | |
$_SESSION['SaleOrderAjaxHelp']['CurDeliverySelectedFirstTime'] = false; | |
$_SESSION['SaleOrderAjaxHelp']['PREV_DELIVERY']['PREV_DELIVERY_ID_SAVE'] = $_SESSION['SaleOrderAjaxHelp']['PREV_DELIVERY']['PREV_DELIVERY_ID']; | |
$delivery_change = false; | |
if(!empty($_SESSION['SaleOrderAjaxHelp']['PREV_DELIVERY']['PREV_DELIVERY_ID'])){ | |
if($_SESSION['SaleOrderAjaxHelp']['PREV_DELIVERY']['PREV_DELIVERY_ID'] != $arValues['DELIVERY_ID']){ | |
$delivery_change = true; | |
} | |
} | |
$_SESSION['SaleOrderAjaxHelp']['DeliveryChanged'] = $delivery_change; | |
if($delivery_change){ | |
if(!in_array($arValues['DELIVERY_ID'],$_SESSION['SaleOrderAjaxHelp']['PREV_DELIVERY']['PREV_DELIVERY_LIST'])){ | |
$_SESSION['SaleOrderAjaxHelp']['CurDeliverySelectedFirstTime'] = true; | |
} | |
} | |
$_SESSION['SaleOrderAjaxHelp']['PREV_DELIVERY']['PREV_DELIVERY_ID'] = $arValues['DELIVERY_ID']; | |
$_SESSION['SaleOrderAjaxHelp']['PREV_DELIVERY']['PREV_DELIVERY_LIST'][$arValues['DELIVERY_ID']] = $arValues['DELIVERY_ID']; | |
$_SESSION['SaleOrderAjaxHelp']['CurPaySystemSelectedFirstTime'] = false; | |
$_SESSION['SaleOrderAjaxHelp']['PREV_PAYSYSTEM']['PREV_PAYSYSTEM_ID_SAVE'] = $_SESSION['SaleOrderAjaxHelp']['PREV_DELIVERY']['PREV_PAYSYSTEM_ID']; | |
$paysystem_change = false; | |
if(!empty($_SESSION['SaleOrderAjaxHelp']['PREV_PAYSYSTEM']['PREV_PAYSYSTEM_ID'])){ | |
if($_SESSION['SaleOrderAjaxHelp']['PREV_PAYSYSTEM']['PREV_PAYSYSTEM_ID'] != $arValues['PAY_SYSTEM_ID']){ | |
$paysystem_change = true; | |
} | |
} | |
$_SESSION['SaleOrderAjaxHelp']['PaySystemChanged'] = $paysystem_change; | |
if($paysystem_change){ | |
if(!in_array($arValues['PAY_SYSTEM_ID'],$_SESSION['SaleOrderAjaxHelp']['PREV_PAYSYSTEM']['PREV_PAYSYSTEM_LIST'])){ | |
$_SESSION['SaleOrderAjaxHelp']['CurPaySystemSelectedFirstTime'] = true; | |
} | |
} | |
$_SESSION['SaleOrderAjaxHelp']['PREV_PAYSYSTEM']['PREV_PAYSYSTEM_ID'] = $arValues['PAY_SYSTEM_ID']; | |
$_SESSION['SaleOrderAjaxHelp']['PREV_PAYSYSTEM']['PREV_PAYSYSTEM_LIST'][$arValues['PAY_SYSTEM_ID']] = $arValues['PAY_SYSTEM_ID']; | |
}else{ | |
//no ajax | |
$_SESSION['SaleOrderAjaxHelp']['CurDeliverySelectedFirstTime'] = true; | |
$_SESSION['SaleOrderAjaxHelp']['PREV_DELIVERY'] = array(); | |
$_SESSION['SaleOrderAjaxHelp']['PREV_DELIVERY']['PREV_DELIVERY_ID'] = $DELIVERY_ID; | |
$_SESSION['SaleOrderAjaxHelp']['PREV_DELIVERY']['PREV_DELIVERY_LIST'][$DELIVERY_ID] = $DELIVERY_ID; | |
$_SESSION['SaleOrderAjaxHelp']['PREV_DELIVERY']['PREV_DELIVERY_ID_SAVE'] = false; | |
$_SESSION['SaleOrderAjaxHelp']['CurPaySystemSelectedFirstTime'] = true; | |
$_SESSION['SaleOrderAjaxHelp']['PREV_PAYSYSTEM'] = array(); | |
$_SESSION['SaleOrderAjaxHelp']['PREV_PAYSYSTEM']['PREV_PAYSYSTEM_ID'] = $PAYSYSTEM_ID; | |
$_SESSION['SaleOrderAjaxHelp']['PREV_PAYSYSTEM']['PREV_PAYSYSTEM_LIST'][$PAYSYSTEM_ID] = $PAYSYSTEM_ID; | |
$_SESSION['SaleOrderAjaxHelp']['PREV_PAYSYSTEM']['PREV_PAYSYSTEM_ID_SAVE'] = false; | |
} | |
$SaleOrderAjaxHelp['isChangedHandler'] = true; | |
} | |
} | |
public static function IsCurDeliverySelectedFirstTime($order=false,$request=false){ | |
global $SaleOrderAjaxHelp; | |
if(empty($SaleOrderAjaxHelp['isChangedHandler'])){ | |
if($order){ | |
self::isChangedHandler($order,$request); | |
} | |
} | |
if( $_SESSION['SaleOrderAjaxHelp']['CurDeliverySelectedFirstTime']){ | |
return true; | |
} | |
return false; | |
} | |
public static function isPaySystemChanged($order=false,$request=false){ | |
global $SaleOrderAjaxHelp; | |
if(empty($SaleOrderAjaxHelp['isChangedHandler'])){ | |
if($order){ | |
self::isChangedHandler($order,$request); | |
} | |
} | |
if( $_SESSION['SaleOrderAjaxHelp']['PaySystemChanged']){ | |
return true; | |
} | |
return false; | |
} | |
public static function isDeliveryChanged($order=false,$request=false){ | |
global $SaleOrderAjaxHelp; | |
if(empty($SaleOrderAjaxHelp['isChangedHandler'])){ | |
if($order){ | |
self::isChangedHandler($order,$request); | |
} | |
} | |
if( $_SESSION['SaleOrderAjaxHelp']['DeliveryChanged']){ | |
return true; | |
} | |
return false; | |
} | |
public static function getCheckedDelivery($arResult){ | |
foreach($arResult['DELIVERY'] as $arDelivery){ | |
if("Y" == $arDelivery['CHECKED']){ | |
return $arDelivery; | |
} | |
} | |
} | |
public static function getCheckedDeliveryID($arResult){ | |
foreach($arResult['DELIVERY'] as $arDelivery){ | |
if("Y" == $arDelivery['CHECKED']){ | |
return $arDelivery['ID']; | |
} | |
} | |
} | |
public static function getPrevDeliveryId($arResult){ | |
global $SaleOrderAjaxHelp; | |
if(!empty($SaleOrderAjaxHelp['isChangedHandler'])){ | |
return $_SESSION['SaleOrderAjaxHelp']['PREV_DELIVERY']['PREV_DELIVERY_ID_SAVE']; | |
} | |
return false; | |
} | |
} | |
class SaleOrderSavedHelp{ | |
static $ORDER_PROP_GROUPS = array(); | |
static $ORDER_PROP = array(); | |
public static function getOrder($ORDER_ID){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$obOrder = false; | |
if(is_numeric($ORDER_ID)){ | |
$obOrder = \Bitrix\Sale\Order::load($ORDER_ID); | |
}else{ | |
$obOrder = $ORDER_ID; | |
} | |
return $obOrder; | |
} | |
public static function getPropertyD7($order, $code){ | |
$obOrder = self::getOrder($order); | |
if(is_numeric($arOrder)){ | |
$arOrder = \Bitrix\Sale\Order::load($arOrder); | |
} | |
$arProp = array(); | |
//no $propertyCollection->getItemByOrderPropertyCode | |
$findPropId = false; | |
$propertyCollection = $obOrder->getPropertyCollection(); | |
foreach($propertyCollection as $arProperty){ | |
$tmpProp = $arProperty->getProperty(); | |
if($code == $tmpProp['CODE']){ | |
$findPropId = $tmpProp['ID']; | |
} | |
} | |
if($findPropId){ | |
$property = $propertyCollection->getItemByOrderPropertyId($findPropId); | |
return $property->getValue(); | |
}else{ | |
return false; | |
} | |
} | |
public static function setPropertyD7($order, $code, $value, $save_order = false){ | |
$obOrder = self::getOrder($order); | |
//https://dev.1c-bitrix.ru/api_d7/bitrix/sale/technique/property.php | |
//https://ru.stackoverflow.com/questions/1187173/%D0%9A%D0%B0%D0%BA-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0-%D0%B7%D0%B0%D0%BA%D0%B0%D0%B7%D0%B0-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5-%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F | |
$arProp = array(); | |
//no $propertyCollection->getItemByOrderPropertyCode | |
$findPropId = false; | |
$propertyCollection = $obOrder->getPropertyCollection(); | |
foreach($propertyCollection as $arProperty){ | |
$tmpProp = $arProperty->getProperty(); | |
$tmpProp['VALUE'] = $arProperty->getValue(); | |
$arProp[$tmpProp['CODE']] = $tmpProp; | |
if($code == $tmpProp['CODE']){ | |
$findPropId = $tmpProp['ID']; | |
} | |
} | |
$property = null; | |
if($propertyCollection->getItemByOrderPropertyId($findPropId) === null) { | |
$PROP = self::getPropertyArrayByCodeD7($code, $obOrder->getPersonTypeId()); | |
$property = $propertyCollection->createItem( | |
[ | |
"ID" => $PROP['ID'], | |
"NAME" => $PROP['NAME'], | |
"CODE" => $PROP['CODE'], | |
'TYPE' => $PROP['TYPE'], | |
] | |
); | |
} else { | |
$property = $propertyCollection->getItemByOrderPropertyId($findPropId); | |
} | |
if($property && $value !== $property->getValue() ) { | |
$property->setField('VALUE', $value); | |
if($save_order){ | |
$obOrder->save(); | |
} | |
} | |
} | |
public static function getPropertyArrayByCodeD7($code,$personalType){ | |
if(empty(self::$ORDER_PROP)){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$db = \Bitrix\Sale\Internals\OrderPropsTable::getList(array( | |
"order"=>array("SORT"=>"ASC"), | |
"filter"=>array(), | |
)); | |
//$db = CSaleOrderProps::GetList(array("SORT"=>"ASC"),array()); | |
while($ar = $db->fetch()){ | |
self::$ORDER_PROP[$ar['PERSON_TYPE_ID']][$ar['CODE']] = $ar; | |
self::$ORDER_PROP["ALL"][$ar['CODE']] = $ar; | |
} | |
} | |
return self::$ORDER_PROP[$personalType][$code]; | |
} | |
public static function getOrderPropsGroupsD7(){ | |
if(empty(self::$ORDER_PROP_GROUPS)){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$resGroups = Bitrix\Sale\Internals\OrderPropsGroupTable::getList(array( | |
'order'=>array('SORT'=>'ASC'), | |
'filter'=>array() | |
)); | |
while($ar = $resGroups->fetch()){ | |
self::$ORDER_PROP_GROUPS[$ar['PERSON_TYPE_ID']][$ar['ID']] = $ar; | |
self::$ORDER_PROP_GROUPS["ALL"][$ar['ID']] = $ar; | |
} | |
} | |
return self::$ORDER_PROP_GROUPS; | |
} | |
public static function createSaleStringPropertyByCodeD7($code, $personalType){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
if(!self::getPropertyArrayByCodeD7($code, $personalType)){ | |
$arOrderGroup = self::getOrderPropsGroupsD7(); | |
$arLastGroup = end($arOrderGroup[$personalType]); | |
$arSaveData = array( | |
'PERSON_TYPE_ID'=>$personalType, | |
'NAME'=>$code, | |
'CODE'=>$code, | |
'TYPE'=>'STRING', | |
'PROPS_GROUP_ID'=>$arLastGroup['ID'], | |
'ACTIVE'=>'Y', | |
'USER_PROPS'=>'N', | |
'UTIL'=>"Y", | |
'REQUIED'=>'N', | |
'SORT'=>100, | |
'ENTITY_REGISTRY_TYPE' => 'ORDER', //required | |
); | |
$result = Bitrix\Sale\Internals\OrderPropsTable::add($arSaveData); | |
if ($result->isSuccess()) | |
{ | |
self::$ORDER_PROP[$personalType][$arSaveData['CODE']] = $arSaveData; | |
self::$ORDER_PROP["ALL"][$arSaveData['CODE']] = $arSaveData; | |
//pre($result->getId()); | |
}else{ | |
//pre($result->getErrors()); | |
} | |
} | |
} | |
public static function createSaleYNPropertyByCodeD7($code, $personalType){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
if(!self::getPropertyArrayByCodeD7($code, $personalType)){ | |
$arOrderGroup = self::getOrderPropsGroupsD7(); | |
$arLastGroup = end($arOrderGroup[$personalType]); | |
$arSaveData = array( | |
'PERSON_TYPE_ID'=>$personalType, | |
'NAME'=>$code, | |
'CODE'=>$code, | |
'TYPE'=>'Y/N', | |
'PROPS_GROUP_ID'=>$arLastGroup['ID'], | |
'ACTIVE'=>'Y', | |
'USER_PROPS'=>'N', | |
'UTIL'=>"Y", | |
'REQUIED'=>'N', | |
'SORT'=>100, | |
'ENTITY_REGISTRY_TYPE' => 'ORDER', //required | |
); | |
$result = Bitrix\Sale\Internals\OrderPropsTable::add($arSaveData); | |
if ($result->isSuccess()) | |
{ | |
self::$ORDER_PROP[$personalType][$arSaveData['CODE']] = $arSaveData; | |
self::$ORDER_PROP["ALL"][$arSaveData['CODE']] = $arSaveData; | |
//pre($result->getId()); | |
}else{ | |
//pre($result->getErrors()); | |
} | |
} | |
} | |
public static function subtractValueCalculate($order, $subtractValue, $with_delivery = false){ | |
$obOrder = self::getOrder($order); | |
$arResult = array( | |
"ORDER_PRICE"=>$obOrder->getPrice() - $obOrder->getDeliveryPrice(), | |
"DELIVERY_PRICE"=>$obOrder->getDeliveryPrice(), | |
"ORDER_TOTAL_PRICE"=>$obOrder->getPrice(), | |
); | |
//$arResult['ORDER_PRICE'] | |
//$arResult['DELIVERY_PRICE'] | |
//$arResult['ORDER_TOTAL_PRICE'] | |
$maxSubtractValue = $subtractValue; | |
$itemsSubtractValue = $subtractValue; | |
$deliverySubtractValue = 0; | |
if($with_delivery){ | |
if($subtractValue >= $arResult['ORDER_TOTAL_PRICE']){ | |
$maxSubtractValue = $arResult['ORDER_TOTAL_PRICE']; | |
$deliverySubtractValue = $arResult['DELIVERY_PRICE']; | |
$itemsSubtractValue = $maxSubtractValue - $deliverySubtractValue; | |
}else{ | |
if($subtractValue >= $arResult['ORDER_PRICE']){ | |
$itemsSubtractValue = $arResult['ORDER_PRICE']; | |
$deliverySubtractValue = $subtractValue - $itemsSubtractValue; | |
} | |
} | |
}else{ | |
if($subtractValue >= $arResult['ORDER_PRICE']){ | |
$itemsSubtractValue = | |
$maxSubtractValue = $arResult['ORDER_PRICE']; | |
} | |
} | |
return array( | |
'MAX_SUBTRACT_VALUE'=>$maxSubtractValue, | |
"BASKET_SUBTRACT_VALUE"=>$itemsSubtractValue, | |
"DELIVERY_SUBTRACT_VALUE"=>$deliverySubtractValue, | |
); | |
} | |
//сохранить заказ после исполнения функции | |
public static function subtractValueFromOrder($order, $subtractValue, $with_delivery = false){ | |
$obOrder = self::getOrder($order); | |
$arData = self::subtractValueCalculate($order, $subtractValue, $with_delivery); | |
self::subtractValueFromBasket($obOrder,$arData['BASKET_SUBTRACT_VALUE']); | |
if($with_delivery){ | |
if($arData['DELIVERY_SUBTRACT_VALUE']>0){ | |
self::subtractValueFromDelivery($obOrder,$arData['DELIVERY_SUBTRACT_VALUE']); | |
} | |
} | |
return $arData; | |
} | |
//сохранить заказ после исполнения функции | |
public static function subtractValueFromBasket($order, $subtractValue){ | |
$obOrder = self::getOrder($order); | |
$obBasket = $obOrder->getBasket(); | |
$ORDER_PRICE = $obOrder->getPrice() - $obOrder->getDeliveryPrice(); | |
foreach ($obBasket as $basketItem) { | |
$arBasketItem = $basketItem->getFields()->getValues(); | |
if($subtractValue == $ORDER_PRICE){ | |
$NEW_PRICE = 0; | |
}else{ | |
$fullPrice = $arBasketItem['PRICE']*$arBasketItem['QUANTITY']; | |
$NEW_PRICE = $arBasketItem['PRICE'] - (($fullPrice/$ORDER_PRICE)*$subtractValue)/$arBasketItem['QUANTITY']; | |
} | |
$arBasketItem = SaleOrderAjaxHelp::getBasketItemArray($arBasketItem, array('PRICE'=>$NEW_PRICE)); // внести изменения | |
$basketItem->setFields(array( | |
//'CURRENCY' => $arFields['CURRENCY'],//Bitrix\Currency\CurrencyManager::getBaseCurrency(), | |
//'LID' => $arFields['LID'], //Bitrix\Main\Context::getCurrent()->getSite(), | |
'CUSTOM_PRICE' => 'Y', | |
'PRICE' => $arBasketItem['PRICE'], | |
'DISCOUNT_PRICE'=>$arBasketItem['DISCOUNT_PRICE'], //important 'CUSTOM_PRICE' => 'Y' make 'DISCOUNT_PRICE' = 0 | |
)); | |
$basketItem->save(); | |
} | |
} | |
//сохранить заказ после исполнения функции | |
public static function subtractValueFromDelivery($order, $subtractValue){ | |
//https://dev.1c-bitrix.ru/api_d7/bitrix/sale/technique/shipment.php | |
// PRICE_DELIVERY не доступна для редактирования | |
// используем DISCOUNT_PRICE - не помогло | |
// используем setFieldNoDemand - помогло!!!! | |
$obOrder = self::getOrder($order); | |
$tmp_substract = $subtractValue; | |
$arNewShipments = array(); | |
$arDelShipments = array(); | |
$shipmentCollection = $obOrder->getShipmentCollection(); | |
foreach($shipmentCollection as $shipment){ | |
if($tmp_substract>0){ | |
$arShipment = $shipment->getFields()->getValues(); | |
if($arShipment['PRICE_DELIVERY']>0){ | |
$arDelShipments[] = $shipment->getId(); | |
if($tmp_substract > $arShipment['PRICE_DELIVERY']){ | |
$arShipment['PRICE_DELIVERY'] = 0; | |
$tmp_substract = $tmp_substract-$arShipment['PRICE_DELIVERY']; | |
}else{ | |
$arShipment['PRICE_DELIVERY'] -= $tmp_substract; | |
$tmp_substract = 0; | |
} | |
$deliveryData = [ | |
'CUSTOM_PRICE_DELIVERY' => 'Y', | |
'BASE_PRICE_DELIVERY'=>$arShipment['BASE_PRICE_DELIVERY'], | |
'DISCOUNT_PRICE'=> $arShipment['BASE_PRICE_DELIVERY']-$arShipment['PRICE_DELIVERY'], | |
'PRICE_DELIVERY' => $arShipment['PRICE_DELIVERY'], | |
]; | |
$shipment->setFieldNoDemand('PRICE_DELIVERY', $arShipment['PRICE_DELIVERY']); | |
$shipment->setFieldNoDemand('DISCOUNT_PRICE', $arShipment['DISCOUNT_PRICE']); | |
} | |
} | |
} | |
$newDeliveryPrice = $obOrder->getDeliveryPrice()-$subtractValue; | |
if($newDeliveryPrice<0){ | |
$newDeliveryPrice = 0; | |
} | |
$obOrder->setFieldNoDemand("PRICE_DELIVERY",$newDeliveryPrice); | |
/* | |
$service = \Bitrix\Sale\Delivery\Services\Manager::getById($deliveryId); | |
$deliveryData = [ | |
'DELIVERY_ID' => $service['ID'], | |
'DELIVERY_NAME' => $service['NAME'], | |
'ALLOW_DELIVERY' => 'Y', | |
'PRICE_DELIVERY' => $deliveryPrice, | |
'CUSTOM_PRICE_DELIVERY' => 'Y' | |
]; | |
$shipment->setFields($deliveryData); | |
*/ | |
} | |
public static function dividePaymentsWithInnerPaySystemForDigift($order,$subtractValue){ | |
$INNER_PAY_SYSTEM_NAME = "Оплата подарочным сертификатом от digift"; | |
$INNER_PAY_SYSTEM_STATUS_ADD = "Добавление на счет подарочного сертификата от digift"; | |
Bitrix\Main\Loader::includeModule('sale'); | |
$obOrder = self::getOrder($order); | |
$paymentCollection = $obOrder->getPaymentCollection(); | |
$InnerPaySystemId = \Bitrix\Sale\PaySystem\Manager::getInnerPaySystemId(); | |
// если существует внутренний счет | |
if($InnerPaySystemId){ | |
$allreadyDivided = false; | |
// если НЕ существует оплата через внутренний счет | |
$innerPayment = $paymentCollection->getInnerPayment(); | |
if($innerPayment && $innerPayment->getField('PAY_SYSTEM_NAME') == $INNER_PAY_SYSTEM_NAME){ | |
$allreadyDivided = true; | |
} | |
if(!$allreadyDivided){ | |
$firstPaySystemChangeSum = false; | |
// изменяем сумму первой оплаты | |
foreach($paymentCollection as $payment){ | |
if($payment->getPaymentSystemId() != $InnerPaySystemId){ | |
$SUM = $payment->getField('SUM'); | |
$new_sum = $SUM-$subtractValue; | |
$payment->setField('SUM', $new_sum); | |
// если сумма первой оплаты равна нулю, | |
// значит пользователю оплату совершать не нужно | |
// делаем оплату оплаченной | |
if(empty($new_sum)){ | |
$payment->setField('PAID', "Y"); | |
} | |
$firstPaySystemChangeSum = true; | |
break; // only first payment | |
} | |
} | |
if($firstPaySystemChangeSum){ | |
// добавить необходимую сумму на внутренний счет | |
CSaleUserAccount::UpdateAccount( | |
$obOrder->getUserId(), | |
$subtractValue, | |
$obOrder->getCurrency(), | |
$INNER_PAY_SYSTEM_STATUS_ADD, | |
$obOrder->getId() | |
); | |
// создаем вторую оплату - через внутренний счет. | |
$newPayment = $paymentCollection->createItem(); | |
$newPayment->setField('PAY_SYSTEM_ID',$InnerPaySystemId); | |
$newPayment->setField('PAY_SYSTEM_NAME', $INNER_PAY_SYSTEM_NAME); | |
$newPayment->setField('SUM', $subtractValue); | |
$newPayment->setField('PAID', "Y"); | |
$obOrder->save(); | |
} | |
} | |
} | |
} | |
public static function concatPaymentFromInnerPaySystemForDigift($order , $save_order = false){ | |
$INNER_PAY_SYSTEM_NAME = "Оплата подарочным сертификатом от digift"; | |
$INNER_PAY_SYSTEM_STATUS_DELETE = "Удаление со счета подарочного сертификата от digift, при отмене заказа"; | |
Bitrix\Main\Loader::includeModule('sale'); | |
$obOrder = self::getOrder($order); | |
$paymentCollection = $obOrder->getPaymentCollection(); | |
$InnerPaySystemId = \Bitrix\Sale\PaySystem\Manager::getInnerPaySystemId(); | |
// если существует внутренний счет | |
if($InnerPaySystemId){ | |
$allreadyDivided = false; | |
// если существует оплата через внутренний счет | |
$innerPayment = $paymentCollection->getInnerPayment(); | |
if($innerPayment && $innerPayment->getField('PAY_SYSTEM_NAME') == $INNER_PAY_SYSTEM_NAME){ | |
$allreadyDivided = true; | |
} | |
// если разделено | |
if($allreadyDivided){ | |
$addValue = $innerPayment->getField('SUM'); | |
$firstPaySystemChangeSum = false; | |
// изменяем сумму первой оплаты | |
foreach($paymentCollection as $payment){ | |
if($payment->getPaymentSystemId() != $InnerPaySystemId){ | |
$SUM = $payment->getField('SUM'); | |
$payment->setField('SUM', $SUM+$addValue); | |
$firstPaySystemChangeSum = true; | |
break; // only first payment | |
} | |
} | |
if($firstPaySystemChangeSum){ | |
// создаем вторую оплату - через внутренний счет. | |
global $CAN_DELETE; | |
$CAN_DELETE = true; | |
$innerPayment->setField('PAID', "N"); | |
$r = $innerPayment->delete(); | |
$CAN_DELETE = false; | |
if (!$r->isSuccess()) | |
{ | |
logto($r->getErrorMessages(),16,true); | |
//var_dump(); | |
}else{ | |
if($save_order){ | |
$obOrder->save(); | |
// удалить сумму с внутреннего счета | |
/*CSaleUserAccount::UpdateAccount( | |
$obOrder->getUserId(), | |
-1*$addValue, | |
$obOrder->getCurrency(), | |
$INNER_PAY_SYSTEM_STATUS_DELETE, | |
$obOrder->getId() | |
);*/ | |
} | |
} | |
} | |
} | |
} | |
} | |
public static function isOrderFullyPaid($ORDER_ID){ | |
$obOrder = self::getOrder($ORDER_ID); | |
if($obOrder){ | |
return $obOrder->isPaid(); | |
} | |
return false; | |
} | |
public static function isOrderFullyShipped($ORDER_ID){ | |
// TODO recheck | |
$obOrder = self::getOrder($ORDER_ID); | |
if($obOrder){ | |
return $obOrder->isShipped(); | |
} | |
return false; | |
} | |
public static function getOrderPaySystems($ORDER_ID){ | |
$obOrder = self::getOrder($ORDER_ID); | |
$arPayment = array(); | |
$paySystemResult = \Bitrix\Sale\PaySystem\Manager::getList(); | |
while ($paySystem = $paySystemResult->fetch()) | |
{ | |
$ID = $paySystem['ID'];// PAY_SYSTEM_ID | |
$arPayment[$ID] = array( | |
"ID"=> $ID, | |
"HANDLER"=>$paySystem['ACTION_FILE'], | |
"NAME"=>$paySystem['NAME'], | |
"PSA_NAME"=>$paySystem['PSA_NAME'], | |
); | |
} | |
$paymentIds = $obOrder->getPaymentSystemId(); | |
$paymentIds = array_unique($paymentIds); | |
$arReturn = array(); | |
foreach($paymentIds as $paySystemId){ | |
$arReturn[$paySystemId] = $arPayment[$paySystemId]; | |
} | |
return $arReturn; | |
} | |
public static function getOrderDelivery($ORDER_ID){ | |
$arReturn = array(); | |
//$obResult = \Bitrix\Sale\Delivery\Services\Manager::getList(); | |
//while ($arData = $obResult->fetch()) | |
//{pre($arData);} | |
if($ORDER_ID){ | |
$obOrder = self::getOrder($ORDER_ID); | |
$arDelivery = array(); | |
$deliveryId = array(); | |
$shipmentList = $obOrder->getShipmentCollection()->getNotSystemItems(); | |
foreach ($shipmentList as $shipmentData) { | |
if ($shipmentData->isSystem()) { | |
continue; | |
} | |
$d = $shipmentData->getDelivery(); | |
$HANDLER = false; | |
$FULL_CODE = $P_CODE = $CODE = $d->getCode(); | |
$FULL_NAME = $P_NAME = $NAME = $d->getName(); | |
$PARENT_ID = false; | |
$isProfile = false; | |
if($d->isProfile()){ | |
$isProfile = true; | |
$parent = $d->getParentService(); | |
$PARENT_ID = $parent->getId(); | |
$P_CODE = $parent->getCode(); | |
if(!empty($P_CODE)){ | |
//$FULL_CODE = $P_CODE.":".$CODE; | |
} | |
$P_NAME = $parent->getName(); | |
if(!empty($P_NAME)){ | |
$FULL_NAME = $d->getNameWithParent(); | |
} | |
$arParams = $parent->getHandlerInitParams($P_CODE); | |
$HANDLER = ($arParams['HANDLER']); | |
$LOGO = $parent->getLogotipPath(); | |
}else{ | |
if(method_exists($d, 'getHandlerInitParams')){ | |
$arParams = $d->getHandlerInitParams($CODE); | |
$HANDLER = ($arParams['HANDLER']); | |
} | |
} | |
$ID = $shipmentData->getDeliveryId(); | |
$arReturn[$ID] = array( | |
'ID'=>$ID, | |
'IS_PROFILE'=>$isProfile, | |
'CODE'=>$CODE, | |
'NAME'=>$NAME, | |
'PARENT_CODE'=>$P_CODE, | |
'PARENT_NAME'=>$P_NAME, | |
'FULL_NAME'=>$FULL_NAME, | |
'FULL_CODE'=>$FULL_CODE, | |
'PARENT_ID'=>$PARENT_ID, | |
'DESCRIPTION'=>$d->getDescription(), | |
'HANDLER'=>$HANDLER, | |
'LOGOTIP_PATH'=>$d->getLogotipPath(), | |
'PARENT_LOGOTIP_PATH'=>$LOGO, | |
); | |
} | |
} | |
return $arReturn; | |
} | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// при нажатии галочки отключить акцию для использования промокода или дисконтной карты | |
AddEventHandler("main", "OnProlog", "isBasketAction"); | |
function isBasketAction(){ | |
global $APPLICATION; | |
if(defined('ADMIN_SECTION')){ | |
return true; | |
} | |
$page = $APPLICATION->GetCurPage(true); | |
if(strpos($page, 'sale.basket.basket/ajax.php') === false){ | |
return true; | |
} | |
$request = $_REQUEST; | |
if('Y' == $request['via_ajax'] && 'refreshAjax' == $request['action']){ | |
if($request['customParams']){ | |
if("Y" == $request['customParams']['disable_sale_custom_discount_actions']){ | |
$_SESSION['DISABLE_SALE_CUSTOM_DISCOUNT_ACTIONS'] = true; | |
}else{ | |
$_SESSION['DISABLE_SALE_CUSTOM_DISCOUNT_ACTIONS'] = false; | |
} | |
// /bitrix/php_interface/include/events/discounts_new.php | |
OnBasketUpdateHandler(); // force activate or deactivate actions | |
} | |
} | |
} | |
class SaleBasketHelp{ | |
public static function getBasketCoupons_one(){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
//https://qna.habr.com/q/635910 | |
$basket = \Bitrix\Sale\Basket::loadItemsForFUser( | |
\CSaleBasket::GetBasketUserID(), | |
"s1" | |
); | |
$order = \Bitrix\Sale\Order::create( "s1" , \Bitrix\Sale\Fuser::getId()); | |
$order ->setPersonTypeId( 1 ); | |
$order ->setBasket( $basket ); | |
$discounts = $order ->getDiscount(); | |
$res = $discounts ->getApplyResult(); | |
foreach($res['COUPON_LIST'] as $cupo_n=>$ar_r){ | |
//тут проводим манипуляцую с купоном | |
} | |
} | |
public static function getBasketCoupons(){ | |
//sale/lib/basketcomponenthelper.php | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$basket = \Bitrix\Sale\Basket::loadItemsForFUser( | |
\CSaleBasket::GetBasketUserID(), | |
"s1" | |
); | |
//$oldApiStatus = Bitrix\Sale\Compatible\DiscountCompatibility::isUsed(); | |
//if ($oldApiStatus) | |
// Bitrix\Sale\Compatible\DiscountCompatibility::stopUsageCompatible(); | |
//\Bitrix\Sale\DiscountCouponsManager::freezeCouponStorage(); | |
$discountResult = array(); | |
$discounts = \Bitrix\Sale\Discount::buildFromBasket($basket, new \Bitrix\Sale\Discount\Context\Fuser($basket->getFUserId(true))); | |
if($discounts){ | |
$discounts->calculate(); // need on non basket page | |
$discountResult = $discounts->getApplyResult(); | |
} | |
//\Bitrix\Sale\DiscountCouponsManager::unFreezeCouponStorage(); | |
//if ($oldApiStatus) | |
// Bitrix\Sale\Compatible\DiscountCompatibility::revertUsageCompatible(); | |
$arReturn = array(); | |
if($discountResult['COUPON_LIST'] && is_array($discountResult['COUPON_LIST'])){ | |
foreach($discountResult['COUPON_LIST'] as $coupon_key=>$arCoupon){ | |
$arReturn[$coupon_key] = array_merge($arCoupon,$arCoupon['DATA']); | |
$arReturn[$coupon_key]['ID'] = $arReturn[$coupon_key]['COUPON_ID']; | |
unset( | |
$arReturn[$coupon_key]['DATA'] | |
, $arReturn[$coupon_key]['ORDER_DISCOUNT_ID'] | |
, $arReturn[$coupon_key]['APPLY'] | |
, $arReturn[$coupon_key]['COUPON_ID'] | |
); | |
} | |
} | |
return $arReturn; | |
} | |
public static function getAllBasketCoupons(){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$coupons = \Bitrix\Sale\DiscountCouponsManager::get(true, [], true); | |
if (!empty($coupons)) | |
{ | |
foreach ($coupons as &$coupon) | |
{ | |
if ($coupon['STATUS'] == \Bitrix\Sale\DiscountCouponsManager::STATUS_NOT_FOUND | |
|| $coupon['STATUS'] == \Bitrix\Sale\DiscountCouponsManager::STATUS_FREEZE) | |
{ | |
$coupon['JS_STATUS'] = 'BAD'; | |
} | |
elseif ($coupon['STATUS'] == \Bitrix\Sale\DiscountCouponsManager::STATUS_NOT_APPLYED | |
|| $coupon['STATUS'] == \Bitrix\Sale\DiscountCouponsManager::STATUS_ENTERED) | |
{ | |
$coupon['JS_STATUS'] = 'ENTERED'; | |
if ($coupon['STATUS'] == \Bitrix\Sale\DiscountCouponsManager::STATUS_NOT_APPLYED) | |
{ | |
$coupon['STATUS_TEXT'] = | |
\Bitrix\Sale\DiscountCouponsManager::getCheckCodeMessage(\Bitrix\Sale\DiscountCouponsManager::COUPON_CHECK_OK); | |
$coupon['CHECK_CODE_TEXT'] = [$coupon['STATUS_TEXT']]; | |
} | |
} | |
else | |
{ | |
$coupon['JS_STATUS'] = 'APPLYED'; | |
} | |
$coupon['JS_CHECK_CODE'] = ''; | |
if (isset($coupon['CHECK_CODE_TEXT'])) | |
{ | |
$coupon['JS_CHECK_CODE'] = is_array($coupon['CHECK_CODE_TEXT']) | |
? implode(', ', $coupon['CHECK_CODE_TEXT']) | |
: $coupon['CHECK_CODE_TEXT']; | |
} | |
} | |
unset($coupon); | |
} | |
return $coupons; | |
} | |
public static function setSalePropertyD7($arOrder, $code, $value, $save_order = false){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
if(is_numeric($arOrder)){ | |
$arOrder = \Bitrix\Sale\Order::load($arOrder); | |
} | |
//https://dev.1c-bitrix.ru/api_d7/bitrix/sale/technique/property.php | |
//https://ru.stackoverflow.com/questions/1187173/%D0%9A%D0%B0%D0%BA-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0-%D0%B7%D0%B0%D0%BA%D0%B0%D0%B7%D0%B0-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5-%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F | |
$arProp = array(); | |
//no $propertyCollection->getItemByOrderPropertyCode | |
$findPropId = false; | |
$propertyCollection = $arOrder->getPropertyCollection(); | |
foreach($propertyCollection as $arProperty){ | |
$tmpProp = $arProperty->getProperty(); | |
$tmpProp['VALUE'] = $arProperty->getValue(); | |
$arProp[$tmpProp['CODE']] = $tmpProp; | |
if($code == $tmpProp['CODE']){ | |
$findPropId = $tmpProp['ID']; | |
} | |
} | |
$property = null; | |
if($propertyCollection->getItemByOrderPropertyId($findPropId) === null) { | |
$PROP = self::getPropByCodeD7($code, $arOrder->getPersonTypeId()); | |
$property = $propertyCollection->createItem( | |
[ | |
"ID" => $PROP['ID'], | |
"NAME" => $PROP['NAME'], | |
"CODE" => $PROP['CODE'], | |
'TYPE' => $PROP['TYPE'], | |
] | |
); | |
} else { | |
$property = $propertyCollection->getItemByOrderPropertyId($findPropId); | |
} | |
if($property && $value !== $property->getValue() ) { | |
$property->setField('VALUE', $value); | |
if($save_order){ | |
$arOrder->save(); | |
} | |
} | |
} | |
static $ORDER_PROP = array(); | |
public static function getPropByCodeD7($code,$personalType){ | |
if(empty(self::$ORDER_PROP)){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$db = \Bitrix\Sale\Internals\OrderPropsTable::getList(array( | |
"order"=>array("SORT"=>"ASC"), | |
"filter"=>array(), | |
)); | |
//$db = CSaleOrderProps::GetList(array("SORT"=>"ASC"),array()); | |
while($ar = $db->fetch()){ | |
self::$ORDER_PROP[$ar['PERSON_TYPE_ID']][$ar['CODE']] = $ar; | |
self::$ORDER_PROP["ALL"][$ar['CODE']] = $ar; | |
} | |
} | |
return self::$ORDER_PROP[$personalType][$code]; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? | |
function OnSaleComponentOrderJsData_mwi_31454(&$arResult,&$arParams) | |
{ | |
\Bitrix\Main\Loader::includeModule('iblock'); | |
\Bitrix\Main\Loader::includeModule('catalog'); | |
$arBasketList =__OrderHelp::getResultBasket($arResult); | |
foreach($arBasketList as &$arBasketItem){ | |
$PROPS = $arBasketItem['PROPS']; | |
$PROPS = array_column($PROPS, null, "CODE");// array_reindex | |
if(!empty($PROPS['OLD_PRICE']['VALUE'])){ | |
$OLD_PRICE = $PROPS['OLD_PRICE']['VALUE']; | |
$arPrice = explode("|",$OLD_PRICE); | |
if(count($arPrice)>1){ | |
$OLD_PRICE = $arPrice[0]; | |
} | |
$arBasketItem = __OrderHelp::getBasketItemArray($arBasketItem, array('BASE_PRICE'=>$OLD_PRICE)); // внести изменения | |
} | |
} | |
unset($arBasketItem); | |
$arResult =__OrderHelp::setResultBasket($arResult, $arBasketList); | |
$arResult =__OrderHelp::obtainTotalArray($arResult,$arParams); | |
} | |
//https://github.com/ramsey/array_column/issues | |
if(!function_exists("array_reindex")){ | |
function array_reindex($array, $index_key){ | |
return array_column($array, null, $index_key); | |
} | |
} | |
// собираем введенные но неактивные купоны | |
Bitrix\Main\EventManager::getInstance()->addEventHandler( | |
'sale', | |
'OnSaleBasketSaved', | |
'collectUnusedCoupons' | |
); | |
function collectUnusedCoupons(Bitrix\Main\Event $event) | |
{ | |
$request = \Bitrix\Main\Context::getCurrent()->getRequest(); | |
if(!$request->isAdminSection()) | |
{ | |
/** @var Basket $basket */ | |
$basket = $event->getParameter("ENTITY"); | |
$allCoupons = SaleBasketHelp::getAllBasketCoupons(); | |
$all = array(); | |
if(is_array($allCoupons) && count($allCoupons)>0){ | |
$all = array_keys(array_reindex($allCoupons, 'ID')); | |
} | |
$activeCoupons = SaleBasketHelp::getBasketCoupons(); | |
$active = array(); | |
if(is_array($activeCoupons) && count($activeCoupons)>0) { | |
$active = array_keys(array_reindex($activeCoupons, 'ID')); | |
} | |
$add = false; | |
$non_active = array_diff($all,$active); | |
if(is_array($non_active) && count($non_active)>0) { | |
if(is_array($allCoupons) && count($allCoupons)>0){ | |
$allCoupons = array_reindex($allCoupons, 'ID'); | |
$arSave = array(); | |
foreach ($non_active as $couponId){ | |
$arSave[] = $allCoupons[$couponId]['COUPON']; | |
} | |
if(count($arSave)>0){ | |
$strSave = implode(",",$arSave); | |
$_SESSION['SALE_UNUSED_COUPONS'] = $strSave; | |
$add = true; | |
} | |
} | |
} | |
if(!$add){ | |
unset($_SESSION['SALE_UNUSED_COUPONS']); | |
} | |
} | |
} | |
Bitrix\Main\EventManager::getInstance()->addEventHandler( | |
'sale', | |
'OnSaleOrderSaved', | |
'saveUnusedCoupons' | |
); | |
// сохраняем введенные но неактивные купоны в заказ | |
function saveUnusedCoupons(Bitrix\Main\Event $event) | |
{ | |
/** @var Order $order */ | |
$order = $event->getParameter("ENTITY"); | |
$isNew = $event->getParameter("IS_NEW"); | |
if ($isNew) | |
{ | |
if(!empty($_SESSION['SALE_UNUSED_COUPONS'])){ | |
SaleBasketHelp::setSalePropertyD7($order, 'UNUSED_COUPONS', $_SESSION['SALE_UNUSED_COUPONS'], true); | |
unset($_SESSION['SALE_UNUSED_COUPONS']); | |
} | |
} | |
unset($_SESSION['USE_SALE_CUSTOM_DISCOUNT_ACTIONS']); | |
unset($_SESSION['DISABLE_SALE_CUSTOM_DISCOUNT_ACTIONS']); | |
unset($_SESSION['SALE_CUSTOM_DISCOUNT_ACTIONS_NAME']); | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? | |
$arProductDiscounts = __IblockCatalogHelp::getComponentDiscounts(false, array('ID'=>'39006', 'IBLOCK_ID'=>17) , array('PRICE_CODE'=>array('BASE')), array('VMESTE10')); | |
pre($arProductDiscounts); | |
?> | |
<? | |
$settings = HBUtils::GetSettings("settings"); | |
$arCoupons = $settings['CATALOG_VISIBLE_COUPONS']['VALUE']; | |
if(is_array($arCoupons)){ | |
$arCoupons = array_map('trim', $arCoupons); | |
$arCoupons = array_filter($arCoupons); | |
}else{ | |
$arCoupons = array(); | |
} | |
$arResult['ICON_DISCOUNTS'] = array(); | |
$arResult['COUPON_DISCOUNTS'] = array(); | |
$arProductDiscounts = __IblockCatalogHelp::getComponentDiscounts($this, $arResult , $arParams, $arCoupons); | |
if($arProductDiscounts && is_array($arProductDiscounts)){ | |
$arProductDiscount = $arProductDiscounts[$arResult['ID']]; | |
foreach($arProductDiscount as $discount){ | |
if(in_array('show_icon',$discount['TAGS'])){ | |
$arResult['ICON_DISCOUNTS'][$discount['ID']] = $discount; | |
} | |
if("Y" == $discount['COUPON_ACTIVE']){ | |
if(in_array($discount['COUPON'], $arCoupons) ){ | |
if($discount['ACTIVE_TO']){ | |
$discount['ACTIVE_TO_DATE'] = DateTimeFromDBToCustom($discount['ACTIVE_TO'],"d.m.Y"); | |
} | |
$arResult['COUPON_DISCOUNTS'][$discount['ID']] = $discount; | |
} | |
} | |
} | |
} | |
?> | |
<? | |
$arResult['ICON_DISCOUNTS'] = array(); | |
$arProductDiscounts = __IblockCatalogHelp::getComponentDiscounts($this, $arResult , $arParams); | |
if($arProductDiscounts && is_array($arProductDiscounts)){ | |
foreach($arResult['ITEMS'] as &$arItem){ | |
$arProductDiscount = $arProductDiscounts[$arItem['ID']]; | |
foreach($arProductDiscount as $discount){ | |
if(in_array('show_icon',$discount['TAGS'])){ | |
$arItem['ICON_DISCOUNTS'][$discount['ID']] = $discount; | |
} | |
} | |
} | |
unset($arItem); | |
} | |
$settings = HBUtils::GetSettings("settings"); | |
$arCoupons = $settings['CATALOG_VISIBLE_COUPONS']['VALUE']; | |
if(is_array($arCoupons)){ | |
$arCoupons = array_map('trim', $arCoupons); | |
$arCoupons = array_filter($arCoupons); | |
}else{ | |
$arCoupons = array(); | |
} | |
$arProductDiscounts = __IblockCatalogHelp::getComponentDiscounts($this, $arResult , $arParams, $arCoupons); | |
if($arProductDiscounts && is_array($arProductDiscounts)){ | |
foreach($arResult['ITEMS'] as &$arItem){ | |
$arItem['ICON_DISCOUNTS'] = array(); | |
$arItem['COUPON_DISCOUNTS'] = array(); | |
$arProductDiscount = $arProductDiscounts[$arItem['ID']]; | |
foreach($arProductDiscount as $discount){ | |
if(in_array('show_icon',$discount['TAGS'])){ | |
$arItem['ICON_DISCOUNTS'][$discount['ID']] = $discount; | |
} | |
if("Y" == $discount['COUPON_ACTIVE']){ | |
if(in_array($discount['COUPON'], $arCoupons) ){ | |
if($discount['ACTIVE_TO']){ | |
$discount['ACTIVE_TO_DATE'] = DateTimeFromDBToCustom($discount['ACTIVE_TO'],"d.m.Y"); | |
} | |
$arItem['COUPON_DISCOUNTS'][$discount['ID']] = $discount; | |
} | |
} | |
} | |
} | |
unset($arItem); | |
} | |
$settings = HBUtils::GetSettings("settings"); | |
$arCoupons = $settings['CATALOG_VISIBLE_COUPONS']['VALUE']; | |
if(is_array($arCoupons)){ | |
$arCoupons = array_map('trim', $arCoupons); | |
$arCoupons = array_filter($arCoupons); | |
}else{ | |
$arCoupons = array(); | |
} | |
$arActiveCoupons = calcCouponDiscount::checkActivity($arCoupons); | |
?> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? | |
class __WebSiteHelp{ | |
public static function getComponent($object){ | |
$component = false; | |
if($object instanceof CBitrixComponentTemplate){ | |
$component = $object->getComponent(); | |
}elseif($object instanceof CBitrixComponent){ | |
$component = $object; | |
} | |
return $component; | |
} | |
public static function getSiteId($object=false){ | |
$site_id = false; | |
if(!empty($object)){ | |
$component = self::getComponent($object); | |
if($component){ | |
if(method_exists($component,'getSiteId')){ | |
$site_id = $component->getSiteId(); | |
} | |
} | |
} | |
if(empty($site_id)){ | |
$context = \Bitrix\Main\Application::getInstance()->getContext(); | |
return $context->getSite(); | |
}else{ | |
return $site_id; | |
} | |
} | |
public static function getUserId(){ | |
/** @global \CUser $USER */ | |
global $USER; | |
$result = array(2); | |
if (isset($USER) && $USER instanceof \CUser) | |
{ | |
$result = $USER->GetId(); | |
} | |
return $result; | |
} | |
public static function getUserGroups() | |
{ | |
/** @global \CUser $USER */ | |
global $USER; | |
$result = array(2); | |
if (isset($USER) && $USER instanceof \CUser) | |
{ | |
$result = $USER->GetUserGroupArray(); | |
Bitrix\Main\Type\Collection::normalizeArrayValuesByInt($result, true); | |
} | |
return $result; | |
} | |
public static function getSiteCurrency() | |
{ | |
if(\Bitrix\Main\Loader::includeModule('sale')){ | |
$result = \Bitrix\Sale\Internals\SiteCurrencyTable::getCurrency(self::getSiteId()); | |
if (is_array($result)) | |
return $result['CURRENCY']; | |
$result = (string)\Bitrix\Main\Config\Option::get('sale', 'default_currency'); | |
if ($result !== '') | |
return $result; | |
} | |
if(\Bitrix\Main\Loader::includeModule('currency')){ | |
$result = \Bitrix\Currency\CurrencyManager::getBaseCurrency(); | |
if ($result !== '') | |
return $result; | |
} | |
return null; | |
} | |
public static function isItemsComponent($arResult = array(), $arParams = array(), $object=false) | |
{ | |
if(is_array($arResult) && !empty($arResult)){ | |
if(array_key_exists('ITEMS',$arResult)){ | |
return true; | |
} | |
} | |
$component = self::getComponent($object); | |
if($component){ | |
if(is_array($component->arResult) && !empty($component->arResult)){ | |
if(array_key_exists('ITEMS',$component->arResult)){ | |
return true; | |
} | |
} | |
} | |
return false; | |
} | |
} | |
class __IblockCatalogHelp{ | |
public static function getPricesForDiscount($arResult = array(), $arParams = array(), $object=false){ | |
\Bitrix\Main\Loader::includeModule('iblock'); | |
$component = __WebSiteHelp::getComponent($object); | |
$storage = array(); | |
if($component){ | |
$storage['PRICES'] = \CIBlockPriceTools::GetCatalogPrices( | |
isset($component->arParams['IBLOCK_ID']) && $component->arParams['IBLOCK_ID'] > 0 ? $component->arParams['IBLOCK_ID'] : false, | |
$component->arParams['PRICE_CODE'] | |
); | |
}elseif(!empty($arParams['PRICE_CODE'])){ | |
$storage['PRICES'] = \CIBlockPriceTools::GetCatalogPrices( | |
isset($arParams['IBLOCK_ID']) && $arParams['IBLOCK_ID'] > 0 ? $arParams['IBLOCK_ID'] : false, | |
$arParams['PRICE_CODE'] | |
); | |
}elseif(!empty($arResult['PRICE_CODE'])){ | |
$storage['PRICES'] = \CIBlockPriceTools::GetCatalogPrices( | |
isset($arResult['IBLOCK_ID']) && $arResult['IBLOCK_ID'] > 0 ? $arResult['IBLOCK_ID'] : false, | |
$arResult['PRICE_CODE'] | |
); | |
}else{ | |
\Bitrix\Main\Loader::includeModule('catalog'); | |
//$arDefaultPrice = \CCatalogGroup::GetBaseGroup(); | |
$arDefaultPrice = \Bitrix\Catalog\GroupTable::getBasePriceType(); | |
$storage['PRICES'] = \CIBlockPriceTools::GetCatalogPrices( | |
false, | |
array($arDefaultPrice['NAME']) | |
); | |
} | |
$storage['PRICES_ALLOW'] = \CIBlockPriceTools::GetAllowCatalogPrices($storage['PRICES']); | |
return $storage; | |
} | |
public static function getAllDiscounts(){ | |
\Bitrix\Main\Loader::includeModule('sale'); | |
$arDiscount = array(); | |
$res = \Bitrix\Sale\Internals\DiscountTable::getList(); | |
while($ar = $res->fetch()){ | |
$arDiscount[$ar['ID']] = $ar; | |
$arDiscount[$ar['ID']]['REAL_DISCOUNT_ID'] = $ar['ID']; | |
} | |
return $arDiscount; | |
} | |
public static function getReformattedDiscounts(array $finalDiscountList, array $calcResults, $siteId, $isRenewal = false) | |
{ | |
//bitrix/modules/catalog/general/discount.php //getReformattedDiscounts | |
$reformatList = array(); | |
foreach($finalDiscountList as $discount) | |
{ | |
if($discount['SHORT_DESCRIPTION_STRUCTURE']) | |
{ | |
$actionConfiguration = $discount['SHORT_DESCRIPTION_STRUCTURE']; | |
} | |
else | |
{ | |
$actionConfiguration = \Bitrix\Sale\Discount\Actions::getActionConfiguration($discount); | |
} | |
if(!$actionConfiguration || $actionConfiguration['VALUE_TYPE'] === \Bitrix\Sale\Discount\Actions::VALUE_TYPE_SUMM) | |
{ | |
continue; | |
} | |
if($actionConfiguration['TYPE'] == 'Extra') | |
{ | |
continue; | |
} | |
if ($actionConfiguration['TYPE'] == 'Closeout') | |
$actionConfiguration['VALUE_TYPE'] = \CAllCatalogDiscount::TYPE_SALE; | |
$reformattedDiscount = array( | |
'ID' => $discount['ID'], | |
'XML_ID'=> $discount['XML_ID'], | |
'TYPE' => CCatalogDiscount::ENTITY_ID, | |
'SITE_ID' => $siteId, | |
'ACTIVE' => 'Y', | |
'ACTIVE_FROM' => empty($discount['ACTIVE_FROM']) ? '' : $discount['ACTIVE_FROM']->toString(), | |
'ACTIVE_TO' => empty($discount['ACTIVE_TO']) ? '' : $discount['ACTIVE_TO']->toString(), | |
'RENEWAL' => $isRenewal? 'Y' : 'N', | |
'NAME' => $discount['NAME'], | |
'SORT' => $discount['SORT'], | |
'MAX_DISCOUNT' => $actionConfiguration['LIMIT_VALUE'], | |
'VALUE_TYPE' => $actionConfiguration['VALUE_TYPE'], | |
'VALUE' => $actionConfiguration['VALUE'], | |
'CURRENCY' => $discount['CURRENCY'], | |
'PRIORITY' => $discount['PRIORITY'], | |
'LAST_DISCOUNT' => $discount['LAST_DISCOUNT'], | |
'LAST_LEVEL_DISCOUNT' => $discount['LAST_LEVEL_DISCOUNT'], | |
'COUPON' => '', | |
'COUPON_ONE_TIME' => null, | |
'COUPON_ACTIVE' => '', | |
'UNPACK' => $discount['UNPACK'], | |
'CONDITIONS' => serialize($discount['CONDITIONS']), | |
'HANDLERS' => array( | |
'MODULES' => array(), | |
'EXT_FILES' => array(), | |
), | |
'MODULE_ID' => 'sale', //or catalog? | |
); | |
if($discount['USE_COUPONS'] === 'Y') | |
{ | |
foreach($calcResults['COUPON_LIST'] as $coupon) | |
{ | |
if($coupon['DATA']['DISCOUNT_ID'] != $discount['REAL_DISCOUNT_ID']) | |
{ | |
continue; | |
} | |
$reformattedDiscount['COUPON'] = $coupon['COUPON']; | |
$reformattedDiscount['COUPON_ACTIVE'] = $coupon['DATA']['ACTIVE']; | |
if($coupon['TYPE'] == \Bitrix\Sale\Internals\DiscountCouponTable::TYPE_BASKET_ROW) | |
{ | |
$reformattedDiscount['COUPON_ONE_TIME'] = 'Y'; | |
} | |
elseif($coupon['TYPE'] == \Bitrix\Sale\Internals\DiscountCouponTable::TYPE_ONE_ORDER) | |
{ | |
$reformattedDiscount['COUPON_ONE_TIME'] = 'O'; | |
} | |
elseif($coupon['TYPE'] == \Bitrix\Sale\Internals\DiscountCouponTable::TYPE_MULTI_ORDER) | |
{ | |
$reformattedDiscount['COUPON_ONE_TIME'] = 'N'; | |
} | |
} | |
} | |
$reformatList[$discount['ID']] = $reformattedDiscount; | |
} | |
return $reformatList; | |
} | |
public static function getComponentDiscounts($object=false, $arResult = array(), $arParams = array(), $arCoupons = array()){ | |
$arReturn = array(); | |
\Bitrix\Main\Loader::includeModule('catalog'); | |
if (\CIBlockPriceTools::isEnabledCalculationDiscounts()) | |
{ | |
$storage = self::getPricesForDiscount($arResult, $arParams, $object); | |
$arAllDiscount = self::getAllDiscounts(); | |
$isItemsComponent = __WebSiteHelp::isItemsComponent( $arResult, $arParams, $object); | |
if($isItemsComponent) { | |
$arItemsList = array(); | |
$arItemToIblock = array(); | |
$arItemToOffer = array(); | |
foreach ($arResult['ITEMS'] as $arItem) { | |
$arItemsList[] = $arItem['ID']; | |
$arItemToIblock[$arItem['ID']] = $arItem['IBLOCK_ID']; | |
if(!empty($arItem['OFFERS'])){ | |
foreach($arItem['OFFERS'] as $arOffer){ | |
$arItemsList[] = $arOffer['ID']; | |
$arItemToIblock[$arOffer['ID']] = $arOffer['IBLOCK_ID']; | |
$arItemToOffer[$arItem['ID']][] = $arOffer['ID']; | |
} | |
} | |
} | |
}else{ | |
$arItemsList = array($arResult['ID']); | |
$arItemToIblock = array( | |
$arResult['ID'] => $arResult['IBLOCK_ID'], | |
); | |
$arItemToOffer = array(); | |
$arSKUExt = CCatalogSku::GetInfoByProductIBlock($arResult['IBLOCK_ID']); | |
$boolSKU = !empty($arSKUExt); | |
if(!empty($arResult['OFFERS'])){ | |
foreach($arResult['OFFERS'] as $arOffer){ | |
$arItemsList[] = $arOffer['ID']; | |
$arItemToIblock[$arOffer['ID']] = $arOffer['IBLOCK_ID']; | |
$arItemToOffer[$arResult['ID']][] = $arOffer['ID']; | |
} | |
}elseif($boolSKU){ | |
$mxResult = CCatalogSKU::getOffersList( | |
$arResult['ID'], | |
$arResult['IBLOCK_ID'] | |
); | |
if($mxResult){ | |
foreach($mxResult[$arResult['ID']] as $arOffer){ | |
$arItemsList[] = $arOffer['ID']; | |
$arItemToIblock[$arOffer['ID']] = $arOffer['IBLOCK_ID']; | |
$arItemToOffer[$arResult['ID']][] = $arOffer['ID']; | |
} | |
} | |
} | |
} | |
\Bitrix\Catalog\Discount\DiscountManager::preloadPriceData($arItemsList, $storage['PRICES_ALLOW']); | |
\Bitrix\Catalog\Discount\DiscountManager::preloadProductDataToExtendOrder($arItemsList, __WebSiteHelp::getUserGroups()); | |
\CCatalogDiscountSave::Disable(); | |
foreach($arItemsList as $Id){ | |
$discounts = \CCatalogDiscount::GetDiscount( | |
$Id, | |
$arItemToIblock[$Id], | |
$storage['PRICES_ALLOW'], | |
__WebSiteHelp::getUserGroups(), | |
'N', | |
__WebSiteHelp::getSiteId($object), | |
array() | |
); | |
if(empty($discounts)){ | |
$discounts = array(); | |
} | |
if(is_array($arCoupons) && !empty($arCoupons)){ | |
//TODO multiple prices PRICES_ALLOW | |
$arCouponsDiscounts = calcCouponDiscount::calc($arCoupons, $Id, array_values($storage['PRICES_ALLOW'])[0]); | |
foreach($arCouponsDiscounts as $discount){ | |
$arDiscount = $arAllDiscount[$discount['DISCOUNT_ID']]; | |
$coupon_discounts = self::getReformattedDiscounts(array($arDiscount), $discount,__WebSiteHelp::getSiteId($object)); | |
if(!empty($coupon_discounts) && is_array($coupon_discounts)) { | |
$discounts = $discounts+$coupon_discounts; | |
} | |
} | |
} | |
foreach($discounts as &$discount){ | |
$discount['XML_ID'] = $arAllDiscount[$discount['ID']]['XML_ID']; | |
$discount['TAGS'] = explode("|", $discount['XML_ID']); | |
} | |
unset($discount); | |
$arReturn[$Id] = $discounts; | |
} | |
foreach($arItemToOffer as $itemId=>$arOfferIds){ | |
$arOffersDiscounts = array(); | |
foreach($arOfferIds as $offerId){ | |
$arOffersDiscounts[] = array_keys($arReturn[$offerId]); | |
} | |
if(count($arOffersDiscounts)>1){ | |
$commonOfferDiscounts = call_user_func_array ('array_intersect',$arOffersDiscounts); | |
}else{ | |
$commonOfferDiscounts = $arOffersDiscounts[0]; | |
} | |
foreach($commonOfferDiscounts as $discountId){ | |
$arReturn[$itemId][$discountId] = $arReturn[$arOfferIds[0]][$discountId]; | |
} | |
} | |
\CCatalogDiscountSave::Enable(); | |
} | |
return $arReturn; | |
} | |
} | |
class calcCouponDiscount{ | |
public static function calc($coupon, $arOneProduct = false, $PriceCodeOrId = false){ | |
if(!$coupon){ | |
return false; | |
} | |
\Bitrix\Main\Loader::includeModule('sale'); | |
\Bitrix\Main\Loader::includeModule('catalog'); | |
$DISCOUNT_ID = array(); | |
$arIdToCoupon = array(); | |
$arFilter = array( | |
'@COUPON' => $coupon, | |
"ACTIVE"=>"Y", | |
); | |
$dbCoupon = \Bitrix\Sale\Internals\DiscountCouponTable::GetList( | |
array('filter'=>$arFilter) | |
); | |
while($arCoupon = $dbCoupon->Fetch()) | |
{ | |
$DISCOUNT_ID[] = $arCoupon['DISCOUNT_ID']; | |
$arIdToCoupon[$arCoupon['DISCOUNT_ID']] = $arCoupon; | |
} | |
$arReturn = array(); | |
if(!empty($DISCOUNT_ID)){ | |
$orderData = self::createOrderData($arOneProduct, $PriceCodeOrId); | |
$orderData = self::extendOrderData($DISCOUNT_ID, $orderData); //add 'CATALOG' key to $orderData | |
$objDateTime = new \Bitrix\Main\Type\DateTime(); | |
$resDiscount = \Bitrix\Sale\Internals\DiscountTable::getList(array( | |
'filter'=>array( | |
'ID'=>$DISCOUNT_ID, | |
"ACTIVE"=>"Y", | |
array( | |
"LOGIC" => "OR", | |
array( | |
"<=ACTIVE_FROM"=>$objDateTime, | |
">=ACTIVE_TO"=>$objDateTime, | |
), | |
array( | |
"=ACTIVE_FROM"=>false, | |
">=ACTIVE_TO"=>$objDateTime, | |
), | |
array( | |
"<=ACTIVE_FROM"=>$objDateTime, | |
"=ACTIVE_TO"=>false | |
), | |
array( | |
"=ACTIVE_FROM"=>false, | |
"=ACTIVE_TO"=>false | |
), | |
) | |
) | |
)); | |
while($arDiscount = $resDiscount->Fetch()) | |
{ | |
if(strpos($arDiscount['APPLICATION'], "\Bitrix\Sale\Discount\Actions::applyToBasket") !== false){ | |
$arDiscount['APPLICATION'] = str_replace("\Bitrix\Sale\Discount\Actions::applyToBasket", "calcCouponDiscount::applyToBasket",$arDiscount['APPLICATION']); | |
$discountEval = NULL; | |
$evalCode = '$discountEval = '.$arDiscount['APPLICATION'].';'; | |
unset($orderData['APPLIED_COUPON'], $orderData['TOTAL_COUPON_DISCOUNT']); | |
try | |
{ | |
eval($evalCode); | |
} | |
catch (\ParseError $e) | |
{ | |
} | |
if(is_callable($discountEval)){ | |
$discountEval($orderData); | |
} | |
if($orderData['APPLIED_COUPON']){ | |
$arReturn[$arIdToCoupon[$arDiscount['ID']]["COUPON"]] = array( | |
"COUPON"=>$arIdToCoupon[$arDiscount['ID']]["COUPON"], | |
"DISCOUNT_ID"=>$arDiscount['ID'], | |
"DISCOUNT_VALUE"=>$orderData['TOTAL_COUPON_DISCOUNT'], | |
'COUPON_LIST'=>array( | |
array( | |
'COUPON'=>$arIdToCoupon[$arDiscount['ID']]["COUPON"], | |
'DATA'=>$arIdToCoupon[$arDiscount['ID']], | |
), | |
), | |
); | |
} | |
} | |
} | |
} | |
return $arReturn; | |
} | |
static $entityResultCache = array(); | |
public static function checkActivity($coupon){ | |
if(!$coupon){ | |
return array(); | |
} | |
\Bitrix\Main\Loader::includeModule('sale'); | |
\Bitrix\Main\Loader::includeModule('catalog'); | |
$DISCOUNT_ID = array(); | |
$arIdToCoupon = array(); | |
$arFilter = array( | |
'@COUPON' => $coupon, | |
"ACTIVE"=>"Y", | |
); | |
$dbCoupon = \Bitrix\Sale\Internals\DiscountCouponTable::GetList( | |
array('filter'=>$arFilter) | |
); | |
while($arCoupon = $dbCoupon->Fetch()) | |
{ | |
$DISCOUNT_ID[] = $arCoupon['DISCOUNT_ID']; | |
$arIdToCoupon[$arCoupon['DISCOUNT_ID']] = $arCoupon; | |
} | |
$arReturn = array(); | |
if(!empty($DISCOUNT_ID)){ | |
$objDateTime = new \Bitrix\Main\Type\DateTime(); | |
$resDiscount = \Bitrix\Sale\Internals\DiscountTable::getList(array( | |
'filter'=>array( | |
'ID'=>$DISCOUNT_ID, | |
"ACTIVE"=>"Y", | |
array( | |
"LOGIC" => "OR", | |
array( | |
"<=ACTIVE_FROM"=>$objDateTime, | |
">=ACTIVE_TO"=>$objDateTime, | |
), | |
array( | |
"=ACTIVE_FROM"=>false, | |
">=ACTIVE_TO"=>$objDateTime, | |
), | |
array( | |
"<=ACTIVE_FROM"=>$objDateTime, | |
"=ACTIVE_TO"=>false | |
), | |
array( | |
"=ACTIVE_FROM"=>false, | |
"=ACTIVE_TO"=>false | |
), | |
) | |
) | |
)); | |
while($arDiscount = $resDiscount->Fetch()) | |
{ | |
$arReturn[] = $arIdToCoupon[$arDiscount['ID']]['COUPON']; | |
} | |
} | |
return $arReturn; | |
} | |
public static function createOrderData($arOneProduct=false, $PriceCodeOrId = false) | |
{ | |
//bitrix/modules/sale/lib/discountbase.php | |
//loadOrderData | |
//fillEmptyOrderData | |
//loadBasket | |
$siteId = __WebSiteHelp::getSiteId(); | |
$orderData = [ | |
'ID' => 0, | |
'USER_ID' => __WebSiteHelp::getUserId(), | |
'USER_GROUPS' => __WebSiteHelp::getUserGroups(), | |
'SITE_ID' => __WebSiteHelp::getSiteId(), | |
'LID' => $siteId, // compatibility only | |
'ORDER_PRICE' => '', | |
'ORDER_WEIGHT' => '', | |
'CURRENCY' => __WebSiteHelp::getSiteCurrency(), | |
'PERSON_TYPE_ID' => 0, | |
'RECURRING_ID' => null, | |
'BASKET_ITEMS' => [], | |
'ORDER_PROP' => [] | |
]; | |
if(is_numeric($arOneProduct)){ | |
$CURRENCY = __WebSiteHelp::getSiteCurrency(); | |
$obBasket = self::createBasketFromCatalog($arOneProduct,$PriceCodeOrId); | |
foreach($obBasket as $basketItem){ | |
$CURRENCY = $basketItem->getField('CURRENCY'); | |
} | |
$arBasket = __OrderHelp::getOrderableBasketArrayFromObj($obBasket); | |
$orderData['BASKET_ITEMS'] = $arBasket; | |
$orderData['CURRENCY'] = $CURRENCY; | |
$orderData['ORDER_PRICE'] = $obBasket->getBasePrice(); | |
$orderData['ORDER_WEIGHT'] = $obBasket->getWeight(); | |
}elseif(empty($arOneProduct)){ | |
$arOneProduct = __OrderHelp::getCurUserBasketObj(); | |
$arBasket = __OrderHelp::getOrderableBasketArrayFromObj($arOneProduct); | |
$orderData['BASKET_ITEMS'] = $arBasket; | |
$orderData['ORDER_PRICE'] = $arOneProduct->getBasePrice(); | |
$orderData['ORDER_WEIGHT'] = $arOneProduct->getWeight(); | |
}elseif($arOneProduct instanceof Bitrix\Sale\Basket){ | |
$arBasket = __OrderHelp::getOrderableBasketArrayFromObj($arOneProduct); | |
$orderData['BASKET_ITEMS'] = $arBasket; | |
$orderData['ORDER_PRICE'] = $arOneProduct->getBasePrice(); | |
$orderData['ORDER_WEIGHT'] = $arOneProduct->getWeight(); | |
}elseif($arOneProduct instanceof Bitrix\Sale\Order){ | |
/* | |
$order = $this->getOrder(); | |
$this->orderData['ID'] = $order->getId(); | |
$this->orderData['USER_ID'] = $order->getUserId(); | |
$this->orderData['ORDER_PRICE'] = $order->getBasePrice(); | |
$this->orderData['PERSON_TYPE_ID'] = $order->getPersonTypeId(); | |
$this->orderData['RECURRING_ID'] = $order->getField('RECURRING_ID'); | |
$propertyCollection = $order->getPropertyCollection(); | |
foreach ($propertyCollection as $orderProperty) | |
$this->orderData['ORDER_PROP'][$orderProperty->getPropertyId()] = $orderProperty->getValue(); | |
unset($orderProperty); | |
foreach ($this->getOrderPropertyCodes() as $propertyCode => $attribute) | |
{ | |
$this->orderData[$propertyCode] = ''; | |
$orderProperty = $propertyCollection->getAttribute($attribute); | |
if ($orderProperty instanceof PropertyValue) | |
$this->orderData[$propertyCode] = $orderProperty->getValue(); | |
unset($orderProperty); | |
} | |
*/ | |
} | |
return $orderData; | |
} | |
public static function createBasketProductFromCatalog($ProductId, $PriceCodeOrId){ | |
$arBasketData = array(); | |
$arFilter = array( | |
'PRODUCT_ID'=>$ProductId | |
); | |
if(is_numeric($PriceCodeOrId)){ | |
$arFilter['CATALOG_GROUP.ID'] = $PriceCodeOrId; | |
}else{ | |
$arFilter['CATALOG_GROUP.NAME'] = $PriceCodeOrId; | |
} | |
$rsPrice = \Bitrix\Catalog\Model\Price::getList(array( | |
'filter'=>$arFilter | |
)); | |
$arPrice = $rsPrice->fetch(); | |
if($arPrice){ | |
$arBasketData = array( | |
"MODULE"=>'catalog', | |
'BASE_PRICE'=>$arPrice['PRICE'], | |
'CAN_BUY'=>'Y', | |
'CUSTOM_PRICE'=>'N', | |
'PRODUCT_ID'=>$ProductId, | |
'XML_ID'=>'', | |
'LID'=>__WebSiteHelp::getSiteId(), | |
'SORT'=>100, | |
'QUANTITY'=>1, | |
'PRODUCT_PRICE_ID'=>$arPrice['ID'], | |
'PRICE'=>$arPrice['PRICE'], | |
'DISCOUNT_PRICE' => 0, | |
'CURRENCY' => $arPrice['CURRENCY'], | |
'DELAY' => 'N', | |
'PRICE_TYPE_ID' => $arPrice['CATALOG_GROUP_ID'], | |
'ACTION_APPLIED'=>'N', | |
'PROPERTIES'=>array(), | |
); | |
} | |
return $arBasketData; | |
} | |
public static function createBasketFromCatalog($ProductId, $PriceCodeOrId){ | |
// getSaleDiscountsByProduct | |
//\modules\catalog\general\discount.php | |
$registry = Bitrix\Sale\Registry::getInstance(Bitrix\Sale\Registry::REGISTRY_TYPE_ORDER); | |
// @var Bitrix\Sale\Basket $basketClass | |
$basketClass = $registry->getBasketClassName(); | |
$basket = $basketClass::create($siteId); | |
$basketItem = $basket->createItem('catalog', $ProductId); | |
$arFilter = array( | |
'PRODUCT_ID'=>$ProductId | |
); | |
if(is_numeric($PriceCodeOrId)){ | |
$arFilter['CATALOG_GROUP.ID'] = $PriceCodeOrId; | |
}else{ | |
$arFilter['CATALOG_GROUP.NAME'] = $PriceCodeOrId; | |
} | |
$rsPrice = \Bitrix\Catalog\Model\Price::getList(array( | |
'filter'=>$arFilter | |
)); | |
$priceRow = $rsPrice->fetch(); | |
$config = Bitrix\Catalog\Product\Price\Calculation::getConfig(); | |
if ($config['CURRENCY'] !== null && $config['CURRENCY'] != $priceRow['CURRENCY']) | |
{ | |
$priceRow['PRICE'] = \CCurrencyRates::ConvertCurrency( | |
$priceRow['PRICE'], | |
$priceRow['CURRENCY'], | |
$config['CURRENCY'] | |
); | |
$priceRow['CURRENCY'] = $config['CURRENCY']; | |
} | |
$fields = array( | |
'PRODUCT_ID' => $ProductId, | |
'QUANTITY' => 1, | |
'LID' => $siteId, | |
'PRODUCT_PRICE_ID' => $PriceCodeOrId, | |
'PRICE' => $priceRow['PRICE'], | |
'BASE_PRICE' => $priceRow['PRICE'], | |
'DISCOUNT_PRICE' => 0, | |
'CURRENCY' => $priceRow['CURRENCY'], | |
'CAN_BUY' => 'Y', | |
'DELAY' => 'N', | |
'PRICE_TYPE_ID' => (int)$priceRow['CATALOG_GROUP_ID'] | |
); | |
$basketItem->setFieldsNoDemand($fields); | |
return $basket; | |
} | |
public static function extendOrderData($discountIds, $OrderData){ | |
// bitrix/modules/sale/lib/discountbase.php //extendOrderData | |
if (empty($discountIds)) | |
return; | |
$entityCacheKey = md5(serialize($discountIds)); | |
//if (!isset(self::$entityResultCache[$entityCacheKey])) | |
//{ | |
//self::$entityResultCache[$entityCacheKey] = array(); | |
$entityList = \Bitrix\Sale\Discount\RuntimeCache\DiscountCache::getInstance()->getDiscountEntities($discountIds); | |
if (empty($entityList)) | |
return; | |
$event = new \Bitrix\Main\Event( | |
'sale', | |
Bitrix\Sale\DiscountBase::EVENT_EXTEND_ORDER_DATA, | |
array( | |
'ORDER' => $OrderData, | |
'ENTITY' => $entityList | |
) | |
); | |
$event->send(); | |
$resultList = $event->getResults(); | |
// } | |
//$resultList = self::$entityResultCache[$entityCacheKey]; | |
if (empty($resultList) || !is_array($resultList)) | |
return; | |
/** @var Main\EventResult $eventResult */ | |
foreach ($resultList as &$eventResult) | |
{ | |
if ($eventResult->getType() != \Bitrix\Main\EventResult::SUCCESS) | |
continue; | |
$newData = $eventResult->getParameters(); | |
if (empty($newData) || !is_array($newData)) | |
continue; | |
self::recursiveMerge($OrderData, $newData); | |
} | |
unset($newData, $eventResult, $resultList); | |
return $OrderData; | |
} | |
public static function recursiveMerge(&$dest, $src) | |
{ | |
if (!is_array($dest) || !is_array($src)) | |
return; | |
if (empty($dest)) | |
{ | |
$dest = $src; | |
return; | |
} | |
foreach ($src as $key => $value) | |
{ | |
if (!isset($dest[$key])) | |
{ | |
$dest[$key] = $value; | |
continue; | |
} | |
if (is_array($dest[$key])) | |
self::recursiveMerge($dest[$key], $value); | |
} | |
unset($value, $key); | |
} | |
public static function calculateDiscountPrice($value, $unit, array $basketRow, $limitValue, $maxBound) | |
{ | |
//bitrix/modules/sale/lib/discount/actions.php calculateDiscountPrice | |
$calculateValue = $value; | |
if ($unit == \Bitrix\Sale\Discount\Actions::VALUE_TYPE_PERCENT) | |
$calculateValue = \Bitrix\Sale\Discount\Actions::percentToValue($basketRow, $calculateValue); | |
$calculateValue = \Bitrix\Sale\Discount\Actions::roundValue($calculateValue, $basketRow['CURRENCY']); | |
if ($unit == \Bitrix\Sale\Discount\Actions::VALUE_TYPE_CLOSEOUT) | |
{ | |
if ($calculateValue < $basketRow['PRICE']) | |
{ | |
$result = $calculateValue; | |
$calculateValue = $result - $basketRow['PRICE']; | |
} | |
else | |
{ | |
$result = -1; | |
} | |
} | |
else | |
{ | |
if (!empty($limitValue) && $limitValue + $calculateValue <= 0) | |
$calculateValue = -$limitValue; | |
$result = \Bitrix\Sale\Discount\Actions::roundZeroValue($basketRow['PRICE'] + $calculateValue); | |
if ($maxBound && $result < 0) | |
{ | |
$result = 0; | |
$calculateValue = -$basketRow['PRICE']; | |
} | |
} | |
return [$calculateValue, $result]; | |
} | |
public static function applyToBasket(array &$order, array $action, $filter) | |
{ | |
//bitrix/modules/sale/lib/discount/actions.php applyToBasket | |
if (!isset($action['VALUE']) || !isset($action['UNIT'])) | |
return; | |
$orderCurrency = \Bitrix\Sale\Discount\Actions::getCurrency(); | |
$value = (float)$action['VALUE']; | |
$limitValue = (int)$action['LIMIT_VALUE']; | |
$unit = (string)$action['UNIT']; | |
$currency = (isset($action['CURRENCY']) ? $action['CURRENCY'] : $orderCurrency); | |
$maxBound = false; | |
if ($unit == \Bitrix\Sale\Discount\Actions::VALUE_TYPE_FIX && $value < 0) | |
$maxBound = (isset($action['MAX_BOUND']) && $action['MAX_BOUND'] == 'Y'); | |
$valueAction = ( | |
$value < 0 | |
? Bitrix\Sale\Discount\Formatter::VALUE_ACTION_DISCOUNT | |
: Bitrix\Sale\Discount\Formatter::VALUE_ACTION_EXTRA | |
); | |
$actionDescription = array( | |
'ACTION_TYPE' => Bitrix\Sale\Discount\Formatter::TYPE_VALUE, | |
'VALUE' => abs($value), | |
'VALUE_ACTION' => $valueAction | |
); | |
switch ($unit) | |
{ | |
case \Bitrix\Sale\Discount\Actions::VALUE_TYPE_SUMM: | |
$actionDescription = [ | |
'ACTION_TYPE' => Bitrix\Sale\Discount\Formatter::TYPE_VALUE, | |
'VALUE' => abs($value), | |
'VALUE_ACTION' => ($value < 0 ? Bitrix\Sale\Discount\Formatter::VALUE_ACTION_DISCOUNT : Bitrix\Sale\Discount\Formatter::VALUE_ACTION_EXTRA), | |
'VALUE_TYPE' => Bitrix\Sale\Discount\Formatter::VALUE_TYPE_SUMM, | |
'VALUE_UNIT' => $currency | |
]; | |
break; | |
case \Bitrix\Sale\Discount\Actions::VALUE_TYPE_PERCENT: | |
$actionDescription = [ | |
'ACTION_TYPE' => Bitrix\Sale\Discount\Formatter::TYPE_VALUE, | |
'VALUE' => abs($value), | |
'VALUE_ACTION' => ($value < 0 ? Bitrix\Sale\Discount\Formatter::VALUE_ACTION_DISCOUNT : Bitrix\Sale\Discount\Formatter::VALUE_ACTION_EXTRA), | |
'VALUE_TYPE' => Bitrix\Sale\Discount\Formatter::VALUE_TYPE_PERCENT | |
]; | |
break; | |
case \Bitrix\Sale\Discount\Actions::VALUE_TYPE_FIX: | |
$actionDescription = [ | |
'ACTION_TYPE' => ($maxBound ? Bitrix\Sale\Discount\Formatter::TYPE_MAX_BOUND : Bitrix\Sale\Discount\Formatter::TYPE_VALUE), | |
'VALUE' => abs($value), | |
'VALUE_ACTION' => ($value < 0 ? Bitrix\Sale\Discount\Formatter::VALUE_ACTION_DISCOUNT : Bitrix\Sale\Discount\Formatter::VALUE_ACTION_EXTRA), | |
'VALUE_TYPE' => Bitrix\Sale\Discount\Formatter::VALUE_TYPE_CURRENCY, | |
'VALUE_UNIT' => $currency | |
]; | |
break; | |
case \Bitrix\Sale\Discount\Actions::VALUE_TYPE_CLOSEOUT: | |
$actionDescription = [ | |
'ACTION_TYPE' => Bitrix\Sale\Discount\Formatter::TYPE_FIXED, | |
'VALUE' => abs($value), | |
'VALUE_ACTION' => Bitrix\Sale\Discount\Formatter::VALUE_ACTION_DISCOUNT, | |
'VALUE_TYPE' => Bitrix\Sale\Discount\Formatter::VALUE_TYPE_CURRENCY, | |
'VALUE_UNIT' => $currency | |
]; | |
break; | |
default: | |
return; | |
break; | |
} | |
$valueAction = $actionDescription['VALUE_ACTION']; | |
if (empty($order['BASKET_ITEMS']) || !is_array($order['BASKET_ITEMS'])) | |
return; | |
$filteredBasket = (is_callable($filter) ? array_filter($order['BASKET_ITEMS'], $filter) : $order['BASKET_ITEMS']); | |
if (empty($filteredBasket)) | |
return; | |
$applyBasket = array_filter($filteredBasket, '\Bitrix\Sale\Discount\Actions::filterBasketForAction'); | |
unset($filteredBasket); | |
if (empty($applyBasket)) | |
return; | |
if ($unit == \Bitrix\Sale\Discount\Actions::VALUE_TYPE_SUMM || $unit == \Bitrix\Sale\Discount\Actions::VALUE_TYPE_FIX) | |
{ | |
if ($currency != $orderCurrency) | |
$value = \CCurrencyRates::ConvertCurrency($value, $currency, $orderCurrency); | |
if ($unit == \Bitrix\Sale\Discount\Actions::VALUE_TYPE_SUMM) | |
{ | |
$value = \Bitrix\Sale\Discount\Actions::getPercentByValue($applyBasket, $value); | |
if ( | |
($valueAction == Bitrix\Sale\Discount\Formatter::VALUE_ACTION_DISCOUNT && ($value >= 0 || $value < -100)) | |
|| | |
($valueAction == Bitrix\Sale\Discount\Formatter::VALUE_ACTION_EXTRA && $value <= 0) | |
) | |
return; | |
$unit = \Bitrix\Sale\Discount\Actions::VALUE_TYPE_PERCENT; | |
} | |
} | |
$value = \Bitrix\Sale\Discount\Actions::roundZeroValue($value); | |
if ($value == 0) | |
return; | |
$order['APPLIED_COUPON'] = true; | |
$TotalCouponDiscount = 0; | |
foreach ($applyBasket as $basketCode => $basketRow) | |
{ | |
list($calculateValue, $result) = self::calculateDiscountPrice( | |
$value, | |
$unit, | |
$basketRow, | |
$limitValue, | |
$maxBound | |
); | |
if($calculateValue<0){ | |
$calculateValue = (-1*$calculateValue); | |
} | |
if ($calculateValue >= 0) | |
{ | |
$TotalCouponDiscount += $calculateValue*$basketRow['QUANTITY']; | |
} | |
unset($result); | |
} | |
unset($basketCode, $basketRow); | |
$order['TOTAL_COUPON_DISCOUNT'] = $TotalCouponDiscount; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment