Sokana - инновационный стартап, сервис готовой еды.
Задача: разработать накопительную программу лояльности для постоянных покупателей с возможностью оплаты до 20% заказа бонусами.
В битриксе есть внутренние счета покупателей, на которые можно начислять и списывать средства. В настройках платежной системы "Внутренний счет" можно поставить ограничение на процент оплаты.
Это решает часть задачи, поэтому за основу взяли внутренний счет покупателя.
Условия начисления бонусов:
Решение: наш модуль после оплаты заказа проверяет - это первый заказ покупателя? Если да, то +500 бонусов. Если не первый, то проверяем, есть ли в корзине товары без скидок, и получаем сумму, с которой будем считать бонусы.
Далее делаем запрос к базе данных и получаем все оплаченные заказы покупателя прошлого месяца. Запрос кэшируемый, в API D7 есть возможность кэшировать запросы.
В зависимости от общей суммы покупок получаем % бонусов для начисления. Полученную сумму бонусов зачисляем на бонусный счет покупателя.
Так как программа лояльности внедрялась в уже работающем магазине, все старые покупатели получили 500 приветственных бонусов.
Решение: перед включением бонусной программы мы запустили скрипт, который начислил бонусы всем нашим покупателям.
Добавили шаблон письма, которое отправляется покупателю после начисления бонусов
Для покупателей создали страницу в личном кабинете, что он может видеть количество бонусов, свой бонусный процент и историю начислений и списаний бонусов.
Решение: взяли компонент bitrix:sale.personal.account, который отображает состояние внутреннего счета текущего пользователя. Кастомизировали его шаблон и добавили историю начислений и расходов.
Чтобы покупатель видел возможность оплаты бонусами, добавили уведомления в корзину и на страницу оформления заказа.
Решение: для получения доступной суммы бонусов использовали тот же компонент bitrix:sale.personal.account
Процент начисляемых бонусов редактируется на странице настроек модуля программы лояльности.
По условиям программы неиспользованные бонусы сгорают через 60 дней.
Решение: мы написали скрипт, который работает по крону.