Налаштування продажу подарункових карт на 1С-Бітрикс
Подарунковий сертифікат — це товар, оплата якого створює купон на суму, рівну номіналу карти. Покупець отримує код, повертається, вводить код, і з його балансу списується сума замовлення. Три точки відмови: некоректне створення купона, неправильне списання, подвійне використання.
Сертифікат як товар типу SERVICE
У Бітриксі подарункова карта реалізується як товар з типом TYPE_SERVICE (значення 7) у b_catalog_product.TYPE, або через модуль sale.gift.certificate якщо він активований в редакції. Розглянемо реалізацію через тип SERVICE — вона доступна в Business та Enterprise без додаткових модулів.
Товар-сертифікат створюється як звичайний елемент інфоблока каталога. На нього встановлюється тип 7:
\Bitrix\Catalog\ProductTable::update($productId, [
'TYPE' => \Bitrix\Catalog\ProductTable::TYPE_SERVICE,
'QUANTITY_TRACE' => 'N',
'CAN_BUY_ZERO' => 'Y',
]);
При TYPE_SERVICE Бітрикс не враховує залишки та не створює складських рухів при покупці.
Створення купона при оплаті
Після оплати замовлення з сертифікатом потрібно створити купон на відповідну суму. Це робиться в обработчику OnSaleOrderPaid:
AddEventHandler('sale', 'OnSaleOrderPaid', function(\Bitrix\Main\Event $event) {
$order = $event->getParameter('ENTITY');
foreach ($order->getBasket() as $item) {
if ($item->getField('TYPE') == \Bitrix\Catalog\ProductTable::TYPE_SERVICE) {
// Перевірити що це сертифікат за властивістю товара
$isCert = checkIsGiftCertificate($item->getProductId());
if (!$isCert) continue;
$code = generateCertificateCode();
$amount = $item->getPrice() * $item->getQuantity();
// Створити купон
\Bitrix\Sale\DiscountCouponsManager::add([
'COUPON' => $code,
'TYPE' => \Bitrix\Sale\DiscountCouponsManager::TYPE_ONE_ORDER,
'ACTIVE' => 'Y',
'ACTIVE_FROM' => new \Bitrix\Main\Type\DateTime(),
'MAX_USE' => 1,
'COUPON_APPLY' => \Bitrix\Sale\DiscountCouponsManager::COUPON_APPLY_ANY,
]);
// Зберегти зв'язок: код → сума → користувач
saveCertificateToCustomTable($code, $amount, $order->getUserId());
// Відправити код на email покупця
sendCertificateEmail($code, $amount, $order);
}
}
});
Скидка на суму сертифіката
Купон у Бітриксі прив'язується до скидки через b_sale_discount. Стандартний механізм купонів підтримує скидку у відсотках або фіксованою сумою. Для сертифіката потрібна фіксована скидка на повну суму номіналу.
Створення скидки під сертифікат:
$discountResult = \Bitrix\Sale\Internals\DiscountTable::add([
'LID' => 's1',
'ACTIVE' => 'Y',
'NAME' => 'Подарункова карта ' . $code,
'TYPE' => 'D', // скидка
'COUPON_TYPE' => \Bitrix\Sale\DiscountCouponsManager::TYPE_ONE_ORDER,
'MAX_DISCOUNT' => $amount,
'VALUE_TYPE' => 'F', // фіксована сума
'VALUE' => $amount,
'CURRENCY' => 'BYN',
'SORT' => 100,
]);
Купон додається до створеної скидки через \Bitrix\Sale\DiscountCouponsManager::add() з DISCOUNT_ID = $discountResult->getId().
Захист від подвійного використання
Поле MAX_USE в купоні обмежує кількість застосувань. Після використання Бітрикс збільшує лічильник USE_COUNT у b_sale_discount_coupon. При USE_COUNT >= MAX_USE купон деактивується.
Але є race condition: два замовлення можуть одночасно застосувати один купон до того, як перше буде оплачено. Захист — перевід купона в неактивний статус (ACTIVE = 'N') відразу при застосуванні до замовлення, а не при оплаті. Це робиться в обработчику OnSaleOrderBeforeSaved.
Часткове використання
Якщо сума замовлення менше номіналу сертифіката, залишок зберігається. Стандартний механізм скидок Бітрикс не підтримує частковий баланс — сертифікат списується повністю. Для залишку потрібна кастомна таблиця (certificate_code, initial_amount, remaining_amount) та обработчик, який після оплати створює новий купон на залишок з новим кодом або оновлює старий.







