Skip to content

Instantly share code, notes, and snippets.

@EscApp2
Last active May 17, 2024 12:39
Show Gist options
  • Save EscApp2/e8de07e1ed2c1b889cd8a410c41aca69 to your computer and use it in GitHub Desktop.
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
<?
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;
}
}
<?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;
}
}
// при нажатии галочки отключить акцию для использования промокода или дисконтной карты
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];
}
}
<?
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']);
}
<?
$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);
?>
<?
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