Ответы пользователя по тегу 1С-Битрикс
  • Как пересчитать заказ с учетом всех скидок с использованием события OnSaleOrderSaved?

    @tgarl Автор вопроса
    Я был не прав что отказался от before. Нужно все же на событии до сохранения. Но беда остается, что нет пересчета окончательной цены с учетом скидок на доставку. По логике пересчет должен производится сам, но этого не происходит. Заказ по своей цене, доставка по своей.
    Ответ написан
    Комментировать
  • Как для getlist получить все элементы кроме + исключая?

    @tgarl Автор вопроса
    я нашел причину, ошибка написании фильтра - лишняя вложенность в массив
    правильный вариант:

    $GLOBALS[$arParams['FILTER_NAME']][]=[
            "LOGIC"=>"OR",
            
                ['PROPERTY_195'=>[1747], 'PROPERTY_362'=>[1753,1754]], //элементы принадлежат сетям, но относятся к бренду
                ['!PROPERTY_362'=>[1753,1754]], // или все элементы не принадлежащие сетям
         
        ];
    Ответ написан
    Комментировать
  • Как изменить состав отгрузки в заказе?

    @tgarl
    Понимаю что тема старая, но в итоге какое решение?
    //собираем 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();


    вот мой код, но отгрузка пустая и не могу понять в чем именно проблема
    Ответ написан
    Комментировать
  • Узнать купоны введенные пользователем в Bitrix?

    @tgarl
    Я список купонов перед заказом получаю так:
    $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){
    ...
    тут проводим манипуляцую с купоном
    ...
    }

    Примерно как нужно я показал, дальше отталкивайтесь от своей задачи.
    Ответ написан
    4 комментария
  • Как сделать акцию в битриксе 3 товара по цене 2?

    @tgarl Автор вопроса
    Приведу итоговое решение для того кто будет искать.
    Некоторые вещи нужно будеть немного адаптировать, но в целом вот решение:
    public static function OnBasketUpdateHandler($ID, $arItem)
        {
            global $USER;
    	if(!is_object($USER)){
    		$USER = new CUser();
    	}
    	$userId=$USER->GetID();
    	$strGroups = $USER->GetUserGroupString();
    	$arUserGroups = explode(',', $strGroups); 
    
    
        $productID = $arItem['PRODUCT_ID'];
        $quantity = $arItem['QUANTITY'];
    
    		
    	if ($userId=="81035" ){//Пока выводим только для меня
    		\Bitrix\Main\Loader::IncludeModule('iblock');
    		\Bitrix\Main\Loader::IncludeModule('catalog');
    		\Bitrix\Main\Loader::IncludeModule('sale');
    
    		$fuser=\Bitrix\Sale\Fuser::getId();
    		$basket = \Bitrix\Sale\Basket::loadItemsForFUser( $fuser, \Bitrix\Main\Context::getCurrent()->getSite() );
    		
    		$res=[];
    		$tovar=[];
    		foreach ($basket as $basketItem) {
    			if(!$basketItem->isDelay()){
    				$mxResult=[];
    				$aa = \CCatalogSku::GetProductInfo($basketItem->getProductId())['ID'];
    				$mxResult[$aa] = $aa;
    				\CIBlockElement::GetPropertyValuesArray($mxResult, 26, array(
    					'ID' => $mxResult,
    					'IBLOCK_ID' => 26,
    				));
    				$raschet='';
    				if(in_array($mxResult[$aa]['ROZNICHNAYA_SET']['VALUE_ENUM_ID'], [1753,1754]) && $mxResult[$aa]['RASPRODAZHA']['VALUE']=='true'){$raschet='raschet';}
    								
    				$basketPropertyCollection = $basketItem->getPropertyCollection(); 				
    				$res[]=[$basketItem->getProductId(),$basketItem->getPrice(), $basketItem->getQuantity(), $basketItem->getFinalPrice(), $basketPropertyCollection->getPropertyValues()['BAR_CODE']['VALUE'], $raschet];
    				$tovar[]=$basketPropertyCollection->getPropertyValues()['BAR_CODE']['VALUE'];
    					
    			}
    		}
    		
    		$coli=[];
    		$coli0=[];
    		foreach($res as $vl){
    			if($vl[5]=='raschet'){
    			for ($x=1; $x<=$vl[2]; $x++){
    				$coli[]=[$vl[0],$vl[1],$vl[5]];
    			}
    			}else{
    				$coli0[]=[$vl[0],$vl[1],$vl[5]];
    			}
    		}
    		$cont=count($coli);
    		usort($coli, function($a, $b){
    			return $a['1'] <=> $b['1'];
    		});
    		$skidka = floor($cont / 3);
    		for ($x=0; $x<$skidka; $x++){
    			$coli[$x][1]=0;
    		}
    		$coli = array_reverse($coli)+$coli0;
    		$arFilter = Array( "IBLOCK_ID"=>27, "PROPERTY_CML2_BAR_CODE"=>$tovar );
    		$res = \CIBlockElement::GetList(Array("SORT"=>"ASC",), $arFilter, false,false,array('ID',"PROPERTY_CML2_BAR_CODE",'CATALOG_QUANTITY','PROPERTY_CML2_LINK','IBLOCK_EXTERNAL_ID','XML_ID'));
    		$productsId=[];
    		$productsIdXml=[];
    		
    		while($ar_fields = $res->GetNext())
    		{
    			$productsId[$ar_fields["PROPERTY_CML2_BAR_CODE_VALUE"]]=$ar_fields['ID'];
    			$productsIdXml[$ar_fields["PROPERTY_CML2_BAR_CODE_VALUE"]]=['IBLOCK_EXTERNAL_ID'=>$ar_fields['IBLOCK_EXTERNAL_ID'],'XML_ID'=>$ar_fields['XML_ID']];
    			$productsIdXml2[$ar_fields["ID"]]=['IBLOCK_EXTERNAL_ID'=>$ar_fields['IBLOCK_EXTERNAL_ID'],'XML_ID'=>$ar_fields['XML_ID']];
    		}
    		$itogTovar=[];
    		
    		foreach($coli as $val){
    			$itogTovar[$val[0]][$val[1]]++;
    		}
    				
    		$itogo=[];	
    		foreach($itogTovar as $productID0=>$value){
    			$itogo[$productID0]['price']=0;
    			$itogo[$productID0]['quantity']=0;
    			$itogo[$productID0]['custom']='N';
    			foreach($value as $price0=>$qunt0){
    				if($price0>0){
    					$arPrice0 = \bh\catalog\tools::getPrc($productID0);
    					$itogo[$productID0]['price']=$itogo[$productID0]['price']+$arPrice0*$qunt0;
    					$itogo[$productID0]['quantity']=$itogo[$productID0]['quantity']+$qunt0;
    				}else{
    					$itogo[$productID0]['quantity']=$itogo[$productID0]['quantity']+$qunt0;
    					$itogo[$productID0]['custom']='Y';
    				}
    			}
    			$itogo[$productID0]['price']=floor($itogo[$productID0]['price']/$itogo[$productID0]['quantity']);
    		}
    		foreach ($basket as $basketItem) {
    			$id=$basketItem->getField('PRODUCT_ID');
    			if($itogo[$id]['custom']=='Y'){
    				$basketItem->setFields(array(
    						'CUSTOM_PRICE' => 'Y',
    						'PRICE' => $itogo[$id]['price'],
    						'CATALOG_XML_ID'=>$productsIdXml2[$id]['IBLOCK_EXTERNAL_ID'],
    						'PRODUCT_XML_ID'=>$productsIdXml2[$id]['XML_ID']
    					));
    				$basketItem->save();
    				$basketPropertyCollection = $basketItem->getPropertyCollection(); 
    				$basketPropertyCollection->setProperty(array(
    					'ACTION'=>array(
    					   'NAME' => 'Акция',
    					   'CODE' => 'ACTION',
    					   'VALUE' => 'Товар по акции 2=3',
    					   'SORT' => 1000,
    					),
    					'CATALOG_XML_ID'=>array(
    							'NAME' => 'Catalog XML_ID',
    							'CODE' => 'CATALOG.XML_ID',
    							'VALUE' => $productsIdXml2[$id]['IBLOCK_EXTERNAL_ID']
    						),
    					'PRODUCT_XML_ID'=>array(
    							"NAME" => "Product XML_ID",
    							"CODE" => "PRODUCT.XML_ID",
    							"VALUE" => $productsIdXml2[$id]['XML_ID']
    						)
    				));
    				$basketPropertyCollection->save();
    			}else{
    				$basketItem->setFields(array(
    						'CATALOG_XML_ID'=>$productsIdXml2[$id]['IBLOCK_EXTERNAL_ID'],
    						'PRODUCT_XML_ID'=>$productsIdXml2[$id]['XML_ID']
    					));
    				$basketItem->save();
    				$basketPropertyCollection = $basketItem->getPropertyCollection(); 
    				$basketPropertyCollection->setProperty(array(
    					'CATALOG_XML_ID'=>array(
    							'NAME' => 'Catalog XML_ID',
    							'CODE' => 'CATALOG.XML_ID',
    							'VALUE' => $productsIdXml2[$id]['IBLOCK_EXTERNAL_ID']
    						),
    					'PRODUCT_XML_ID'=>array(
    							"NAME" => "Product XML_ID",
    							"CODE" => "PRODUCT.XML_ID",
    							"VALUE" => $productsIdXml2[$id]['XML_ID']
    						)
    				));
    				$basketPropertyCollection->save();
    			}
    		}
    		
    	}
    		
        }
    Ответ написан
    Комментировать