Прайс лист

Описание

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.