Реализовал примерно следующим образом:
- добавил платежную систему под названием "промокод"
- создал инфоблок, где хранятся промокоды в виде элементов.
- добавил новое свойство заказа(вернее для каждого сайта свое свойство, но с одинаковым кодом, например PROMOCODE). Это свойство на странице оформления заказа через JS вывожу в нужном мне месте, например там же, где штатный ввод промокода(а штатный скрываю на странице корзины и оформления заказа). После ввода промокода через AJAX(создал файлик php, куда отправляется ) делаю проверку, соответствует ли промокод условиям его применения. Если да, то ввыводиться ссобшение что промокод применен. Или же ошибку, если промокода такого нет или не соответствует условиям. Т.е. этот файл нужен только для того, чтобы сообщить пользователю применен ли будет промокод.
- уже непосредственно в момент оформления заказа сума заказа разделяется на два платежа - основной и промокод. Платеж Промокод добавляется уже со статусом "оплачен"
В файле init.php, обработчик функции OnSaleComponentOrderCreated
Код |
---|
\Bitrix\Main\EventManager::getInstance()->addEventHandler("sale", "OnSaleComponentOrderCreated", "OrderPropsChangePrice");
function OrderPropsChangePrice($order, &$arUserResult, $request, &$arParams, &$arResult, &$arPaySystemServiceAll, &$arDeliveryServiceAll)
{
$site_id = $order->getSiteId();
/////////////////////////////////////////////
//////////////// PROMOCODE //////////////////
/////////////////////////////////////////////
if ($site_id == "s1" or $site_id == "s4") $promocode = $arUserResult["ORDER_PROP"]["67"];
if ($site_id == "s2" or $site_id == "s5") $promocode = $arUserResult["ORDER_PROP"]["69"];
if ($site_id == "s3" or $site_id == "s6") $promocode = $arUserResult["ORDER_PROP"]["71"];
if ($promocode != ""){
$b_promocode_applicable = false;
$b_promocode_cond_new_client = true;
$b_promocode_cond_total_from = true;
$b_promocode_cond_period_to = true;
$arPromocodeFilter = Array("IBLOCK_ID" => 45, "PROPERTY_PROMOCODE" => $promocode, "ACTIVE" => "Y");
$resPromocode = CIBlockElement::GetList(Array(), $arPromocodeFilter, false, false, array());
if ($obPromocode = $resPromocode->GetNextElement())
{
$arFields = $obPromocode->GetFields();
$arProps = $obPromocode->GetProperties();
$promocode_el_id = $arFields["ID"];
$o_price = $order->getPrice();
$amount = $arProps["AMOUNT"]["VALUE"];
$amount_type = $arProps["AMOUNT_TYPE"]["VALUE"];
$cond_new_client = $arProps["COND_FORNEWCUSTOMERS"]["VALUE"];
$cond_total_from = $arProps["COND_TOTAL_FROM"]["VALUE"];
$cond_period_to = $arFields["DATE_ACTIVE_TO"];
// DISCOUNT //
if ($amount_type == "процент")
$discount = floor($amount*$o_price/100);
else
$discount = $amount;
// DISCOUNT //
// B TOTAL FROM //
if (floor($cond_total_from) > 0){
if (floor($o_price) < floor($cond_total_from)) $b_promocode_cond_total_from = false;
}
// B TOTAL FROM //
// B CURRENT USER //
if ($cond_new_client == "yes"){
global $USER;
$ar_current_user_groups = $USER->GetUserGroupArray();
if (!in_array(14, $ar_current_user_groups)) $b_promocode_cond_new_client = false;
}
// B CURRENT USER //
// B PERIOD TO //
if ($cond_period_to != ""){
if (strtotime(date("Y-m-d H:i:s")) > strtotime($cond_period_to)){
$b_promocode_cond_period_to = false;
}
}
// B PERIOD TO //
if ($b_promocode_cond_total_from and $b_promocode_cond_new_client and $b_promocode_cond_period_to) $b_promocode_applicable = true;
if ($o_price >= $discount and $b_promocode_applicable){
$paymentCollection = $order->getPaymentCollection();
if ($site_id == "s1" or $site_id == "s4") $promocode_payment_name = "Промокод";
if ($site_id == "s2" or $site_id == "s5") $promocode_payment_name = "Промокод";
if ($site_id == "s3" or $site_id == "s6") $promocode_payment_name = "Promocode";
$promocode_payment = $paymentCollection->createItem();
$paySystemService = \Bitrix\Sale\PaySystem\Manager::getObjectById(23);
$promocode_payment->setFields(array(
'PAY_SYSTEM_ID' => $paySystemService->getField("PAY_SYSTEM_ID"),
'PAY_SYSTEM_NAME' => $promocode_payment_name,
));
foreach ($paymentCollection as $payment) {
$sum = $payment->getSum();
$id = $payment->getPaymentSystemId();
if ($id==23){
if ($amount_type == "процент"){
$new_sum = floor($amount*$o_price/100);
}else{
$new_sum = $amount;
}
$payment->setFields(array('SUM' => $new_sum));
$payment->setPaid("Y");
}else{
if ($amount_type == "процент"){
$new_sum = $sum-floor($amount*$o_price/100);
}else{
$new_sum = $sum-$amount;
}
$payment->setFields(array('SUM' => $new_sum));
}
}
}
}
}
/////////////////////////////////////////////
//////////////// PROMOCODE //////////////////
/////////////////////////////////////////////
} |