Налаштування продажу подарункових карток на 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування продажу подарункових карток на 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Налаштування продажу подарункових карт на 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) та обработчик, який після оплати створює новий купон на залишок з новим кодом або оновлює старий.