Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * скидка, акция 1+1=3,
- * разделение корзины
- * создание коппи пункта корзины,
- * копирование свойств пункта корзины,
- * извление свойств пункта корзины
- */
- namespace App\Discounts;
- use \Bitrix\Main\Loader;
- class Specials {
- private static $Bypass = false;
- // public static function applyDiscountMark_test($_=0,$__=0,$___=0)
- // {
- // $Div = \Bitrix\Main\Config\Option::get('.app', 'specdiscount');
- // //\Bitrix\Main\Config\Option::set('.app', 'specdiscount','Y');
- // if ($Div != 'Y') return;
- // if (self::$Bypass) return;
- // self::$Bypass = true;
- // \Bitrix\Main\Loader::includeModule('sale');
- // $basket = \Bitrix\Sale\Basket::loadItemsForFUser(
- // \Bitrix\Sale\Fuser::getId(),
- // \Bitrix\Main\Context::getCurrent()->getSite()
- // );
- // // очищаем от всех SPECIALDISCOUNT
- // self::clear($basket);
- // //
- // self::Dicqount403020($basket);
- // self::$Bypass = false;
- // return;
- // }
- public static function applyDiscountMark($_=0,$__=0,$___=0)
- {
- //return;
- $Div = \Bitrix\Main\Config\Option::get('.app', 'specdiscount');
- //\Bitrix\Main\Config\Option::set('.app', 'specdiscount','Y');
- if ($Div != 'Y') return;
- if (self::$Bypass) return;
- self::$Bypass = true;
- \Bitrix\Main\Loader::includeModule('sale');
- $basket = \Bitrix\Sale\Basket::loadItemsForFUser(
- \Bitrix\Sale\Fuser::getId(),
- \Bitrix\Main\Context::getCurrent()->getSite()
- );
- // очищаем от всех SPECIALDISCOUNT
- self::clear($basket);
- //
- self::SecondProduct40($basket);
- //self::OnePlusOneEq3($basket); // до 13,06
- //self::Dicqount403020($basket);
- self::$Bypass = false;
- return;
- }
- /**
- * 40% на второй продукт
- */
- private static function SecondProduct40 ($basket)
- {
- if (!$basket) $basket = \Bitrix\Sale\Basket::loadItemsForFUser(
- \Bitrix\Sale\Fuser::getId(),
- \Bitrix\Main\Context::getCurrent()->getSite()
- );
- // получаем список товаров которые подходят под условие
- $lstItem = [];
- $Q = 0;
- foreach ($basket as $item) {
- $ProductId = $item->getProductId();
- $dctCatalogElement = \App\Catalog::getElement(
- ['ID'=>$ProductId],
- ['PROPERTY_SEZON','PROPERTY__DISCOUNTCODE']
- );
- if (defined('HUMAN_DEBUG') && HUMAN_DEBUG) {
- \Kint\Kint::dump($dctCatalogElement);
- }
- if (!$dctCatalogElement['GOODS']['PROPERTY__DISCOUNTCODE_VALUE']
- && ($dctCatalogElement['GOODS']['PROPERTY_SEZON_VALUE'] == 'AW24/25'
- || $dctCatalogElement['GOODS']['PROPERTY_SEZON_VALUE'] == 'Demi-season'
- )
- ) { // проверка условия
- $lstItem[$item->getId()] = [
- 'item' => $item,
- 'price' => $item->getPrice(),
- 'quantity' => $item->getQuantity(),
- ];
- $Q = $Q + $item->getQuantity();
- }
- }
- usort($lstItem,function($a, $b) {
- if ($a['price'] == $b['price']) {
- return 0;
- }
- return ($a['price'] < $b['price']) ? -1 : 1;
- });
- if (defined('HUMAN_DEBUG') && HUMAN_DEBUG) {
- \Kint\Kint::dump($lstItem);
- }
- if ($Q > 1) {
- // расчет количества
- $K = floor($Q/2);
- self::apply($lstItem[0]['item'], $K,'second40');
- }
- }
- /**
- * Скикда 1+1=3
- */
- private static function OnePlusOneEq3 ($basket)
- {
- if (!$basket) $basket = \Bitrix\Sale\Basket::loadItemsForFUser(
- \Bitrix\Sale\Fuser::getId(),
- \Bitrix\Main\Context::getCurrent()->getSite()
- );
- // получаем список товаров которые подходят под условие
- $lstItem = [];
- $Q = 0;
- foreach ($basket as $item) {
- $ProductId = $item->getProductId();
- $dctCatalogElement = \App\Catalog::getElement(
- ['ID'=>$ProductId],
- ['PROPERTY_SEZON','PROPERTY__DISCOUNTCODE']
- );
- if ($dctCatalogElement['GOODS']['PROPERTY_SEZON_VALUE'] == 'SS23'
- || $dctCatalogElement['GOODS']['PROPERTY_SEZON_VALUE'] == 'SS22'
- || $dctCatalogElement['GOODS']['PROPERTY_SEZON_VALUE'] == 'SS21'
- || $dctCatalogElement['GOODS']['PROPERTY_SEZON_VALUE'] == 'SS20'
- ) { // проверка условия
- $lstItem[$item->getId()] = [
- 'item' => $item,
- 'price' => $item->getPrice(),
- 'quantity' => $item->getQuantity(),
- ];
- $Q = $Q + $item->getQuantity();
- }
- }
- usort($lstItem,function($a, $b) {
- if ($a['price'] == $b['price']) {
- return 0;
- }
- return ($a['price'] < $b['price']) ? -1 : 1;
- });
- if ($Q > 2) {
- // расчет количества
- $K = floor($Q/3);
- self::apply($lstItem[0]['item'], $K,'1+1=3');
- }
- }
- /**
- * Скикда 40% на самый дешевый товар, 30 на следующий и 20 на следующий
- */
- private static function Dicqount403020 ($basket)
- {
- if (!$basket) $basket = \Bitrix\Sale\Basket::loadItemsForFUser(
- \Bitrix\Sale\Fuser::getId(),
- \Bitrix\Main\Context::getCurrent()->getSite()
- );
- // получаем список товаров которые подходят под условие
- $lstItem = [];
- $Q = 0;
- foreach ($basket as $item) {
- $ProductId = $item->getProductId();
- $dctCatalogElement = \App\Catalog::getElement(
- ['ID'=>$ProductId],
- ['PROPERTY_SEZON','PROPERTY__DISCOUNTCODE']
- );
- if (!$dctCatalogElement['GOODS']['PROPERTY__DISCOUNTCODE_VALUE']
- && ($dctCatalogElement['GOODS']['PROPERTY_SEZON_VALUE'] == 'SS24'
- || $dctCatalogElement['GOODS']['PROPERTY_SEZON_VALUE'] == 'Demi-season'
- )
- ) { // проверка условия
- $lstItem[$item->getId()] = [
- 'item' => $item,
- 'price' => $item->getPrice(),
- 'quantity' => $item->getQuantity(),
- ];
- $Q = $Q + $item->getQuantity();
- }
- }
- usort($lstItem,function($a, $b) {
- if ($a['price'] == $b['price']) {
- return 0;
- }
- return ($a['price'] < $b['price']) ? -1 : 1;
- });
- if ($Q) {
- if ($Q > 3) $Q=3;
- $I = 0;
- for ($Q=$Q; $Q; $Q--) {
- $Disqount = 10*($Q+1);
- if (!$lstItem[$I]['quantity']) {
- $I++;
- }
- $lstItem[$I]['quantity']--;
- self::apply($lstItem[$I]['item'], 1,'Скидка '.$Disqount.'%');
- }
- }
- }
- /**
- * разделяет $item корзины на два item'a и пременят к остатку спецакцию $Action
- * @param $item - запись которую надо разделить
- * @param $Quantity - количество которое надо оставить в этой записи
- */
- public static function apply ($item, $Quantity, $Action)
- {
- $basket = $item->getBasket();
- if ($item->getQuantity() > $Quantity) { // необходимо отделение!
- $QuantityNewItem = $item->getQuantity() - $Quantity;
- $newItem = $basket->createItem('catalog', $item->getField('PRODUCT_ID')); //создаём новый товар в корзине
- $newItem->setFields(array(
- 'QUANTITY' => $QuantityNewItem,
- 'CURRENCY' => $item->getField('CURRENCY'),
- 'LID' => $item->getField('LID'),
- 'PRODUCT_PROVIDER_CLASS' => $item->getField('PRODUCT_PROVIDER_CLASS')
- ));
- // перенос свойств
- $propCollectionNewItem = $newItem->getPropertyCollection();
- $refPropsNewItem = self::extractProps($item);
- $propCollectionNewItem->setProperty($refPropsNewItem);
- // конец переноса свойств
- $item->setField('QUANTITY',$Quantity);
- }
- $propCollection = $item->getPropertyCollection();
- $propCollection->setProperty(['SPECIALDISCOUNT' => [
- 'NAME' => 'Акция',
- 'CODE' => 'SPECIALDISCOUNT',
- 'VALUE' => $Action,
- 'SORT' => 500
- ]]);
- $propCollection->save();
- if ($newItem) {
- $basket->addItem($newItem);
- }
- $basket->save();
- }
- /**
- * Очищает SPECIALDISCOUNT на товарах
- */
- public static function clear ($basket=false)
- {
- if (!$basket) $basket = \Bitrix\Sale\Basket::loadItemsForFUser(
- \Bitrix\Sale\Fuser::getId(),
- \Bitrix\Main\Context::getCurrent()->getSite()
- );
- // сбросим все значения SPECIALDISCOUNT и вычислим хэши
- $refItems = []; // карта хэшПункта => СписокIdсЭтимХэшем
- foreach ($basket as $item) {
- $refProps = self::extractProps($item);
- if ($refProps['SPECIALDISCOUNT']) {
- unset($refProps['SPECIALDISCOUNT']); // это свойство не надо учитывать в хэше
- // его надо удалить
- $propCollection = $item->getPropertyCollection();
- foreach ($propCollection as $I=>$prop) {
- $Code = $prop->getField('CODE');
- if ($Code == 'SPECIALDISCOUNT') {
- $propCollection->deleteItem($I);
- $propCollection->save();
- break;
- }
- }
- }
- $arHash = [
- 'PRODUCT_ID' => $item->getField('PRODUCT_ID'),
- 'PRICE' => $item->getField('PRICE'),
- 'CURRENCY' => $item->getField('CURRENCY'),
- 'LID' => $item->getField('LID'),
- 'PRODUCT_PROVIDER_CLASS' => $item->getField('PRODUCT_PROVIDER_CLASS'),
- 'PROPS' => $refProps
- ];
- $Hash = md5(serialize($arHash));
- $refItems[$Hash][] = $item->getId();
- $arDebug[$Hash] = ['hash'=>$arHash,'id'=>$item->getId()];
- }
- if (defined('HUMAN_DEBUG')) {
- \Kint\Kint::dump('пункты для объединения',$arDebug,$refItems);
- } else {
- unset($arDebug);
- }
- // объединим пункты с одинаковым хэшем
- foreach ($refItems as $lstItemsId) {
- if (count($lstItemsId) > 1) {
- $Quantity = 0;
- for ($I=count($lstItemsId)-1; $I>-1; $I--) {
- $item = $basket->getItemById($lstItemsId[$I]);
- $Quantity = $Quantity+$item->getQuantity();
- if ($I) {
- $item->setField('QUANTITY',0);
- $item->delete();
- } else {
- $item->setField('QUANTITY',$Quantity);
- $item->save();
- }
- }
- }
- }
- $basket->save();
- }
- // извлекает свойства из item корзины
- public static function extractProps ($item): array
- {
- $propCollection = $item->getPropertyCollection();
- $refProps = [];
- foreach ($propCollection as $prop) {
- $Code = $prop->getField('CODE');
- $refProps[$Code] = [
- 'NAME' => $prop->getField('NAME'),
- 'CODE' => $Code,
- 'VALUE' => $prop->getField('VALUE'),
- 'SORT' => $prop->getField('SORT'),
- ];
- }
- return $refProps;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement