iikoFront API SDK

Повременные услуги

Общее описание

Приложение iikoFront может использоваться для продажи не только товаров и блюд, но также услуг с повременной тарификацией. Это могут быть заведения с оплатой за проведённое время (аквапарки, антикафе), прокат инвентаря и многое другое, но классический пример — бильярд, именно он будет использован в данной статье для описания предметной области.

Запуск и остановка

Услугу можно запускать и останавливать. Когда услуга запущена, ведётся отсчёт времени, растёт «количество» и, соответственно, стоимость. Когда услуга остановлена, отсчёт времени приостанавливается, эти периоды не оплачиваются.

Услугу можно заказать на определённое время, в этом случае оплачивается всё заказанное время, даже если фактически услуга использовалась меньшее время. Например, посетитель может заказать бильярд на час, при этом стоимость изначально будет установлена за 1 час и не будет меняться, а «количество» будет расти с течением времени. При достижении заданного лимита времени услуга автоматически остановится. Другой вариант — оплата по факту, можно играть, пока не надоест, и заплатить за итоговое время, тогда лимит не задаётся, но услуга в любом случае остановится при достижении максимально возможной продолжительности в 12 часов.

Запуск и остановка услуги могут сопровождаться дополнительным действием, привязанным к столу, на котором расположен заказ. В случае бильярда это может быть включение освещения над столом на время игры: изначально свет выключен, запустили услугу — свет включился, остановили — погас. Отсюда возникает ограничение — не более одной запущенной услуги на столе. Пока это ограничение действует для всех столов независимо от того, настроены ли подобные дополнительные действия. В будущих версиях это ограничение не будет распространяться на столы или услуги, не имеющие привязок к внешним устройствам.

Тарификация

Стоимость услуги может зависеть от дня недели и меняться со временем. Возможны два варианта тарификации:

Учёт времени ведётся по следующим правилам:

Структуры данных

Услуга

IOrderServiceItem — элемент заказа, соответствующий повременной услуге. Расположен в коллекции IOrder.Items наряду с блюдами, которые можно готовить (IOrderCookingItem). В меню повременной услуге соответствует продукт (IProduct) с типом ProductType.Service и имеющий параметры тарификации IProduct.RateSchedule (если параметры тарификации не заданы, то это услуга без повременной тарификации, она добавляется в заказ и оплачивается как обычное блюдо).

Ключевые свойства повременной услуги:

Период услуги

IOrderServiceItemPeriod — период работы услуги по определённому тарифу, включает в себя все отрезки времени, когда соответствующий тариф был активен.

Ключевые свойства периода повременной услуги:

Настройки тарификации

RateSchedule — настройки повременной услуги, ключевые свойства:

Управление услугой

AddOrderServiceItem — добавление услуги в заказ.

StartService — запуск услуги.

StopService — остановка услуги. При пречеке или оплате заказа услуга остановится автоматически.

Примеры

В плагине SamplePlugin, входящем в состав SDK, появились примеры добавления услуги в заказ, запуска и остановки услуги — методы [StartService] и [StopService] в классе EditorTester:

private static void StartService()
{
    var order = PluginContext.Operations.GetOrders().Last(x => x.Status == OrderStatus.New);
    var serviceProduct = PluginContext.Operations.GetActiveProducts().Last(x => x.Type == ProductType.Service && x.RateSchedule != null);
    var credentials = PluginContext.Operations.GetCredentials();
    var service = PluginContext.Operations.AddOrderServiceItem(serviceProduct, order, order.Guests.Last(), credentials, TimeSpan.FromHours(2));
    PluginContext.Operations.StartService(credentials, order, service);
}

private static void StopService()
{
    var order = PluginContext.Operations.GetOrders().Last(x => x.Status == OrderStatus.New);
    var service = order.Items.OfType<IOrderServiceItem>().Last(x => x.IsStarted);
    PluginContext.Operations.StopService(PluginContext.Operations.GetCredentials(), order, service);
}