Прайс лист
Описание
SHM имеет встроенный модуль price_list, позволяющий получать список доступных услуг для регистрации клиентам.
Получить список услуг для регистрации (прайс лист) можно:
- Через API:
/shm/v1/service/price_list - Из шаблонов:
service.price_list( АРГУМЕНТЫ )
service.price_list() возвращает массив услуг каталога с уже рассчитанной стоимостью,
скидкой и применимыми бонусами для текущего пользователя.
Метод используется как базовый источник данных для построения выпадающего списка доступных услуг в личном кабинете пользователя и для проверки разрешенных услуг при их регистрации
Метод учитывает:
- фильтрацию доступных для заказа услуг
- составные услуги (
is_composite) - пользовательскую скидку
- доступные бонусы
- ограничение
order_only_once(если услуга уже была использована)
Сигнатура
{{ arr = service.price_list() }}
{{ arr = service.price_list(service_id = N) }}
{{ arr = service.price_list(filter = { category = 'web%' }) }}
Аргументы
| Параметр | Описание |
|---|---|
| service_id | Вернуть данные только по одной услуге с указанным ID |
| filter | Дополнительная фильтрация списка услуг |
Возвращаемые поля
Каждый элемент массива содержит стандартные поля услуги и дополнительные вычисленные поля:
| Поле | Описание |
|---|---|
| cost | Итоговая стоимость услуги (для составной услуги - с учетом дочерних) |
| discount | Примененный процент скидки |
| cost_discount | Размер скидки в деньгах |
| real_cost | Стоимость после скидки, до применения бонусов |
| real_cost_with_bonuses | Стоимость после применения бонусов |
| cost_bonus | Сколько бонусов будет списано |
| partial_renew | Признак частичного продления (из config.allow_partial_period) |
Примеры
Пример 1: вывести прайс-лист
{{ arr = service.price_list() }}
{{ FOR item IN arr }}
- {{ item.name }}: {{ item.real_cost_with_bonuses }}
{{ END }}
Пример 2: получить цену конкретной услуги
{{ arr = service.price_list(service_id = 5) }}
{{ IF arr.size }}
Стоимость: {{ arr.first.real_cost_with_bonuses }}
{{ END }}
Пример 3: сортировка и выборка нужных полей
{{ arr = service.price_list().sort_by_key('real_cost_with_bonuses' => 'asc') }}
{{ prices = arr.pluck('real_cost_with_bonuses') }}
{{ prices.join(', ') }}
Изменение стандартного поведения через шаблон
Стандартную логику формирования списка услуг можно переопределить шаблоном. Для этого включите шаблонный режим в конфигурации биллинга:
- параметр
billing.price_list_template_idдолжен содержать ID шаблона
Шаблон должен вернуть JSON-массив идентификаторов услуг из каталога (service_id) в том порядке, в котором необходимо отобразить их клиенту.
Пример шаблона:
{{ services = [] }}
{{ FOR service IN user.us.services.items }}
{{ NEXT UNLESS service.allow_to_order }}
{{# NEXT IF service.is_ever_used }}
{{# NEXT IF service.was_previously_used }}
{{# NEXT IF service.is_currently_used }}
{{# добавьте сюда любую другую логику для исключения услуг из списка }}
{{ services.push( service ) }}
{{ END }}
{{ toJson( services.sort_by_key( cost = 'asc', category = 'asc' ).pluck('id') ) }}
Примечание:
service.price_list()иservice.api_price_list()будут использовать результат этого шаблона как источник списка услуг.
Проверка доступности услуги для заказа
service.price_list_check_allow_to_order проверяет, входит ли текущая услуга в
актуальный список услуг для регистрации пользователя.
Данную проверку можно выполнить и так:
service.price_list(service_id = N), ноprice_list_check_allow_to_orderработает значительно быстрее, так как не вычисляет скидки и бонусы
Метод возвращает:
1- услуга доступна для заказа0- услуга недоступна для заказа
Логика проверки опирается на тот же источник, что и service.price_list():
- стандартная фильтрация каталога (
allow_to_order,deleted,filterи т.д.) - либо список из шаблона при включенном
billing.price_list_template_id
Пример использования:
{{ IF service.id(5).price_list_check_allow_to_order }}
Услуга доступна для регистрации
{{ ELSE }}
Услуга недоступна для регистрации
{{ END }}
Этот метод используется в процессе регистрации услуги при check_allow_to_order = 1.