public static function Generate($arConditions, $arParams, $control, $subs = false)
{
$resultValues = array();
$arValues = false;
if (is_string($arControl))
{
$arControl = static::GetControls($arControl);
}
$boolError = !is_array($arControl);
if (!$boolError)
{
$arValues = static::Check($arOneCondition, $arOneCondition, $arControl, false);
$boolError = (false === $arValues);
}
if($arOneCondition['logic']=='Equal')
{
$logic='true';
}
else
{
$logic='false';
}
$strResult = '(SaleActionDeactivateDiscount::qDiscAction('.$arParams['BASKET_ROW'].','.$arConditions['value'].'))=='.$logic;
return $strResult;
}
public static function qDiscAction($row,$arCond)
{
//пришлось использовать \Bitrix\Sale\Basket::loadItemsForFUser, т.к. кроме $arParams['BASKET_ROW'] другие параметры по какой-то причине пустые и при попытке их передать в свою функцию напрочь ломают скидки
$basket = \Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId(), 's1');
$linia=[];
foreach ($basket as $basketItem) {
$mxResult = \CCatalogSku::GetProductInfo($basketItem->getProductId())['ID'];
$dbEl = \CIBlockElement::GetList(array('sort' => 'asc'), array('ID' => $mxResult), false, false, Array('ID','PROPERTY___2'));
while($obEl = $dbEl->Fetch())
{
$linia[$obEl['PROPERTY___2_VALUE']]['ID'][]=$basketItem->getProductId();
$linia[$obEl['PROPERTY___2_VALUE']]['CNT']+=$basketItem->getQuantity();
}
}
foreach($linia as $ln=>$massa){
if($massa['CNT']>=$arCond && in_array($row['PRODUCT_ID'],$massa['ID'])){
return false;
}
}
return true;
}
$GLOBALS[$arParams['FILTER_NAME']][]=[
"LOGIC"=>"OR",
['PROPERTY_195'=>[1747], 'PROPERTY_362'=>[1753,1754]], //элементы принадлежат сетям, но относятся к бренду
['!PROPERTY_362'=>[1753,1754]], // или все элементы не принадлежащие сетям
];
//собираем id которые нужно снести с корзины
foreach ($basket as $basketItem) {
$zapjmnimID[] = $basketItem->getField('ID');
}
//добавляем новый товар
$item = $basket->createItem('catalog', $obEl['ID']); //создаём новый товар в корзине
$item->setFields(array(
'QUANTITY' => 1,
'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(),
'LID' => 's1',
'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
"CATALOG_XML_ID" => $obEl['IBLOCK_EXTERNAL_ID'],
"PRODUCT_XML_ID" => $obEl['XML_ID'],
'CUSTOM_PRICE'=>'Y',
'PRICE' => $PlProductInfo['PRICE'],
'NAME'=>$arParams['NAME']['VALUE']
));
$item->getPropertyCollection()->setProperty($arParams);
//удаляем не нужные товары
foreach($zapjmnimID as $delitem){
$basket->getItemById($delitem)->delete();
}
//сохраняем корзину
$basket->save();
//отгрузка, доставка
$shipmentCollection = $order->getShipmentCollection();
удаляем текущую отгрузку
foreach ($shipmentCollection as $shipment) {
$shipment->delete();
}
//добавляем доставку под другой тип
$shipment = $shipmentCollection->createItem();
$service = \Bitrix\Sale\Delivery\Services\Manager::getById(15);
$shipment->setFields(array(
'DELIVERY_ID' => $service['ID'],
'DELIVERY_NAME' => $service['NAME'],
));
$shipmentItemCollection = $shipment->getShipmentItemCollection();
//добавляем товары в отгрузку
foreach ($basket as $basketItem)
{
$item = $shipmentItemCollection->createItem($basketItem);
$item->setQuantity($basketItem->getQuantity());
}
//сохраняем заказ
$result = $order->save();
$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){
...
тут проводим манипуляцую с купоном
...
}