//Подключаем модуль "Интернет-магазин"
if (!CModule::IncludeModule("sale")) return;
//Подключаем модуль "Информационные блоки"
if (!CModule::IncludeModule("iblock")) return;
//получаем актуальную корзину пользователя
$dbBasketItems = CSaleBasket::GetList(
array(),
array(
"FUSER_ID" => CSaleBasket::GetBasketUserID(),
"LID" => SITE_ID,
"ORDER_ID" => "NULL"
),
false,
false,
array("ID", "CALLBACK_FUNC", "MODULE",
"PRODUCT_ID", "QUANTITY", "DELAY",
"CAN_BUY", "PRICE", "WEIGHT")
);
while ($arItems = $dbBasketItems->Fetch())
{
if (strlen($arItems["CALLBACK_FUNC"]) > 0)
{
CSaleBasket::UpdatePrice($arItems["ID"],
$arItems["CALLBACK_FUNC"],
$arItems["MODULE"],
$arItems["PRODUCT_ID"],
$arItems["QUANTITY"]);
$arItems = CSaleBasket::GetByID($arItems["ID"]);
}
$arBasketItems[] = $arItems;
}
//Вычилсяем стоимость заказа с учетом скидок
if (count($arBasketItems>0)) {
foreach ($arBasketItems as $arItem) {
$quantity += intval($arItem['QUANTITY']);
$sum += $arItem['QUANTITY'] * $arItem['PRICE'];
$curr = $arItem['CURRENCY'];
}
}
//заполняем свойства заказа:
//1)имя (покупателя)
$IDnPropertyNAME = getPropertyID("NAME");
//2)фамилия (покупателя)
$IDnPropertyFAMILY = getPropertyID("FAMILY");
//3)E-mail (покупателя)
$IDnPropertyEMAIL = getPropertyID("EMAIL");
//4)Регион доставки
$IDnPropertyREGION = getPropertyID("REGION");
//5)Телефон
$IDnPropertyPHONE = getPropertyID("PHONE");
//6)Улица
$IDnPropertySTREET = getPropertyID("street");
//7)Дом
$IDnPropertyHOUSE = getPropertyID("house");
//8)Корпус
$IDnPropertyKORPUS = getPropertyID("korpus");
//9)Квартира
$IDnPropertyFLAT = getPropertyID("flat");
//10)Время доставки
$IDnPropertyTIME = getPropertyID("TIME");
//11)Дата доставки
$IDnPropertyDATE_DELIVERY = getPropertyID("DATE_DELIVERY");
$orderProps = array(
$IDnPropertyNAME => $_SESSION["CUSTOMER"]["NAME"],
$IDnPropertyFAMILY => $_SESSION["CUSTOMER"]["FAMILY"],
$IDnPropertyEMAIL => $_SESSION["CUSTOMER"]["EMAIL"],
$IDnPropertyREGION => $_SESSION["CUSTOMER"]["REGION"],
$IDnPropertyPHONE => $_SESSION["CUSTOMER"]["PHONE"],
$IDnPropertySTREET => $_SESSION["CUSTOMER"]["STREET"],
$IDnPropertyHOUSE => $_SESSION["CUSTOMER"]["HOUSE"],
$IDnPropertyKORPUS => $_SESSION["CUSTOMER"]["KORPUS"],
$IDnPropertyFLAT => $_SESSION["CUSTOMER"]["FLAT"],
$IDnPropertyTIME =>$_SESSION["CUSTOMER"]["TIME"],
$IDnPropertyDATE_DELIVERY =>$_SESSION["CUSTOMER"]["DATE_DELIVERY"]
);
$arErrors = array();
$arWarnings = array();
// Данный метод вызывает события из списка вплоть до OnSaleCalculateOrder
// $arShoppingCart - может содержать не всю корзину, а только те элементы которые необходимо добавить.
$arOrderDat = CSaleOrder::DoCalculateOrder(
SITE_ID,
IntVal($USER->GetID()),
$arBasketItems,
1, //Тип плательщика = Физлицо
$orderProps,
$_SESSION["CUSTOMER"]["DELIVERY_ID"], //Служба доставки
$_SESSION["CUSTOMER"]["PAY_SYSTEM_ID"], //Способ оплаты
array(),
$arErrors,
$arWarnings
);
$arOrderFields = array(
"LID" => $arOrderDat['LID'],
"PERSON_TYPE_ID" => $arOrderDat['PERSON_TYPE_ID'],
"PAYED" => "N",
"CANCELED" => "N",
"STATUS_ID" => "N",
"PRICE" => $arOrderDat['PRICE'],
"CURRENCY" => $arOrderDat['CURRENCY'],
"USER_ID" => $arOrderDat['USER_ID'],
"USER_DESCRIPTION" => "",
"ADDITIONAL_INFO" => ""
);
//Создание заказа и привязка корзин к заказу
$nOrderId = CSaleOrder::DoSaveOrder($arOrderDat, $arOrderFields, 0, $errors, $arCoupons, $arStoreBarcodeOrderFormData, $bSaveBarcodes);
//если cтоимость заказа больше или равно 5000, далее: в заказе лежит новогоднее меню
if($sum>=5000) {
//получаем раздел первого товара в заказе
$arGroups = array();
$objGroups = CIBlockElement::GetElementGroups($arBasketItems[0]["PRODUCT_ID"]);
while($arGroupDescr = $objGroups->Fetch())
{
$arGroups[]=$arGroupDescr["ID"];
}
//первый товар принадлежит разделу "Новогоднее меню 2018"
if(in_array(35,$arGroups))
{
//добавляем в корзину подарок (и сразу связываем ее с заказом) - это творожный десерт с ID=33043 в количестве равном $_SESSION["PERSON_COUNTER"] штук, а цена каждого такого подарочного товара 0 руб.
$idPresent = Add2BasketByProductID(33043,$_SESSION["PERSON_COUNTER"]);
CSaleBasket::Update($idPresent, array("ORDER_ID"=>$nOrderId));
}
}
$_SESSION["CUSTOMER"]["COUPON"] = "SL-1J5R8-BW2JVQ8";
//Добавление купона пользователю: добавляем код купона coupon в массив доступных для получения скидки купонов текущего покупателя
if($_SESSION["CUSTOMER"]["COUPON"]!="") CCatalogDiscountCoupon::SetCoupon($_SESSION["CUSTOMER"]["COUPON"]);
//Применение скидок на товары в корзинах, применение купонов, если он установлен (см. предыдущую строку). Система вычисляет минимальную для данного покупателя цену товаров в корзине с учётом всех его скидок и купонов.
$arOrder = array(
'SITE_ID' => $siteId,
'USER_ID' => IntVal($USER->GetID()),
'BASKET_ITEMS' => $arBasketItems
);
$arOptions = array();
$arErrors = array();
CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors);
Проверка сайта не диагностирует проблем: не известно
Текст ошибки или описание проблемы:
CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors); срабатывает только когда пользователь сначала аторизовался, потом положил товары в корзину и завершил заказ.
В том случае, если товары в корзину кладет неавторизованный пользователь, а перед тем как оформить заказ он авторизуется, купон правил корзины не применяется
if (!CModule::IncludeModule("sale")) return;
//Подключаем модуль "Информационные блоки"
if (!CModule::IncludeModule("iblock")) return;
//получаем актуальную корзину пользователя
$dbBasketItems = CSaleBasket::GetList(
array(),
array(
"FUSER_ID" => CSaleBasket::GetBasketUserID(),
"LID" => SITE_ID,
"ORDER_ID" => "NULL"
),
false,
false,
array("ID", "CALLBACK_FUNC", "MODULE",
"PRODUCT_ID", "QUANTITY", "DELAY",
"CAN_BUY", "PRICE", "WEIGHT")
);
while ($arItems = $dbBasketItems->Fetch())
{
if (strlen($arItems["CALLBACK_FUNC"]) > 0)
{
CSaleBasket::UpdatePrice($arItems["ID"],
$arItems["CALLBACK_FUNC"],
$arItems["MODULE"],
$arItems["PRODUCT_ID"],
$arItems["QUANTITY"]);
$arItems = CSaleBasket::GetByID($arItems["ID"]);
}
$arBasketItems[] = $arItems;
}
//Вычилсяем стоимость заказа с учетом скидок
if (count($arBasketItems>0)) {
foreach ($arBasketItems as $arItem) {
$quantity += intval($arItem['QUANTITY']);
$sum += $arItem['QUANTITY'] * $arItem['PRICE'];
$curr = $arItem['CURRENCY'];
}
}
//заполняем свойства заказа:
//1)имя (покупателя)
$IDnPropertyNAME = getPropertyID("NAME");
//2)фамилия (покупателя)
$IDnPropertyFAMILY = getPropertyID("FAMILY");
//3)E-mail (покупателя)
$IDnPropertyEMAIL = getPropertyID("EMAIL");
//4)Регион доставки
$IDnPropertyREGION = getPropertyID("REGION");
//5)Телефон
$IDnPropertyPHONE = getPropertyID("PHONE");
//6)Улица
$IDnPropertySTREET = getPropertyID("street");
//7)Дом
$IDnPropertyHOUSE = getPropertyID("house");
//8)Корпус
$IDnPropertyKORPUS = getPropertyID("korpus");
//9)Квартира
$IDnPropertyFLAT = getPropertyID("flat");
//10)Время доставки
$IDnPropertyTIME = getPropertyID("TIME");
//11)Дата доставки
$IDnPropertyDATE_DELIVERY = getPropertyID("DATE_DELIVERY");
$orderProps = array(
$IDnPropertyNAME => $_SESSION["CUSTOMER"]["NAME"],
$IDnPropertyFAMILY => $_SESSION["CUSTOMER"]["FAMILY"],
$IDnPropertyEMAIL => $_SESSION["CUSTOMER"]["EMAIL"],
$IDnPropertyREGION => $_SESSION["CUSTOMER"]["REGION"],
$IDnPropertyPHONE => $_SESSION["CUSTOMER"]["PHONE"],
$IDnPropertySTREET => $_SESSION["CUSTOMER"]["STREET"],
$IDnPropertyHOUSE => $_SESSION["CUSTOMER"]["HOUSE"],
$IDnPropertyKORPUS => $_SESSION["CUSTOMER"]["KORPUS"],
$IDnPropertyFLAT => $_SESSION["CUSTOMER"]["FLAT"],
$IDnPropertyTIME =>$_SESSION["CUSTOMER"]["TIME"],
$IDnPropertyDATE_DELIVERY =>$_SESSION["CUSTOMER"]["DATE_DELIVERY"]
);
$arErrors = array();
$arWarnings = array();
// Данный метод вызывает события из списка вплоть до OnSaleCalculateOrder
// $arShoppingCart - может содержать не всю корзину, а только те элементы которые необходимо добавить.
$arOrderDat = CSaleOrder::DoCalculateOrder(
SITE_ID,
IntVal($USER->GetID()),
$arBasketItems,
1, //Тип плательщика = Физлицо
$orderProps,
$_SESSION["CUSTOMER"]["DELIVERY_ID"], //Служба доставки
$_SESSION["CUSTOMER"]["PAY_SYSTEM_ID"], //Способ оплаты
array(),
$arErrors,
$arWarnings
);
$arOrderFields = array(
"LID" => $arOrderDat['LID'],
"PERSON_TYPE_ID" => $arOrderDat['PERSON_TYPE_ID'],
"PAYED" => "N",
"CANCELED" => "N",
"STATUS_ID" => "N",
"PRICE" => $arOrderDat['PRICE'],
"CURRENCY" => $arOrderDat['CURRENCY'],
"USER_ID" => $arOrderDat['USER_ID'],
"USER_DESCRIPTION" => "",
"ADDITIONAL_INFO" => ""
);
//Создание заказа и привязка корзин к заказу
$nOrderId = CSaleOrder::DoSaveOrder($arOrderDat, $arOrderFields, 0, $errors, $arCoupons, $arStoreBarcodeOrderFormData, $bSaveBarcodes);
//если cтоимость заказа больше или равно 5000, далее: в заказе лежит новогоднее меню
if($sum>=5000) {
//получаем раздел первого товара в заказе
$arGroups = array();
$objGroups = CIBlockElement::GetElementGroups($arBasketItems[0]["PRODUCT_ID"]);
while($arGroupDescr = $objGroups->Fetch())
{
$arGroups[]=$arGroupDescr["ID"];
}
//первый товар принадлежит разделу "Новогоднее меню 2018"
if(in_array(35,$arGroups))
{
//добавляем в корзину подарок (и сразу связываем ее с заказом) - это творожный десерт с ID=33043 в количестве равном $_SESSION["PERSON_COUNTER"] штук, а цена каждого такого подарочного товара 0 руб.
$idPresent = Add2BasketByProductID(33043,$_SESSION["PERSON_COUNTER"]);
CSaleBasket::Update($idPresent, array("ORDER_ID"=>$nOrderId));
}
}
$_SESSION["CUSTOMER"]["COUPON"] = "SL-1J5R8-BW2JVQ8";
//Добавление купона пользователю: добавляем код купона coupon в массив доступных для получения скидки купонов текущего покупателя
if($_SESSION["CUSTOMER"]["COUPON"]!="") CCatalogDiscountCoupon::SetCoupon($_SESSION["CUSTOMER"]["COUPON"]);
//Применение скидок на товары в корзинах, применение купонов, если он установлен (см. предыдущую строку). Система вычисляет минимальную для данного покупателя цену товаров в корзине с учётом всех его скидок и купонов.
$arOrder = array(
'SITE_ID' => $siteId,
'USER_ID' => IntVal($USER->GetID()),
'BASKET_ITEMS' => $arBasketItems
);
$arOptions = array();
$arErrors = array();
CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors);
Проверка сайта не диагностирует проблем: не известно
Текст ошибки или описание проблемы:
CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors); срабатывает только когда пользователь сначала аторизовался, потом положил товары в корзину и завершил заказ.
В том случае, если товары в корзину кладет неавторизованный пользователь, а перед тем как оформить заказ он авторизуется, купон правил корзины не применяется