iikoFront предоставляет возможность для создания плагинов, работающих с заказами, банкетами/резервами и доставками.

Важно!

1. Все интерфейсы API v1 находятся в сборке iikoRMS/Front.Net Resto.Front.Api.V1.dll

2. Для подключения плагина к iikoFront достаточно положить сборку в каталог iikoRMS/Front.Net/Plugins и перезапустить iikoFront.

3. Поскольку каждый плагин работает в своем отдельном процессе, то для отладки плагина необходимо подключиться дебаггером к процессуResto.CashServer.OutOfProcHost.exe Процессов будет столько же, сколько загружено плагинов.

Входной точкой для плагина является интерфейс IFrontPlugin:

public interface IFrontPlugin : IDisposable

{

Guid Id { get; }

void Init([NotNull] IServiceProvider serviceProvider);

void Dispose();

}

Свойство Id должно возвращать уникальный идентификатор плагина. Идентификатор должен быть константным и не меняться в процессе работы плагина.

Метод Init вызывается в момент инициализации плагина. Он предназначен для подписки на события iikoFront, восстановления сохраненных ранее данных, а также сохранения ссылок на сервисы для дальнейшего использования. Сервис-провайдер, передающийся в метод, позволяет получить доступ к следующим сервисам:

1. Resto.Front.Api.V1.InCurrentUser.IOperationService – предоставляет доступ к методам API, выполняемых от имени пользователя, залогиненного в iikoFront в момент их выполнения.

2. Resto.Front.Api.V1.OutCurrentUser.IOperationService – предоставляет доступ к методам API, выполняемых от имени пользователя, чей токен аутентификации был передан в вызываемый метод.

3. Resto.Front.Api.V1.InCurrentUser.INotificationService – предоставляет доступ к событиям iikoFront, доступным залогиненному в момент срабатывания события в iikoFront пользователю.

4. Resto.Front.Api.V1.OutCurrentUser.INotificationService – предоставляет доступ к событиям iikoFront, доступным пользователю на основании токена аутентификации.

5. Resto.Front.Api.V1.IPluginEnvironmentService – позволяет доступ к каталогу,  созданному для хранения собственных данных плагина.

Метод Dispose вызывается перед остановкой процесса плагина и предназначен для отписки от событий и освобождения прочих ресурсов. Важно понимать, что в случае некорректного закрытия iikoFront нельзя гарантировать, что метод Dispose будет вызван.

Поскольку каждый плагин запускается в отдельном процессе, то для взаимодействия с iikoFront класс, реализующий IFrontPlugin, должен быть унаследован от MarshalByRefObject. А кроме того, такой класс должен иметь конструктор без параметров, чтобы iikoFront мог создать его экземпляр:

namespace MyNamespace

{

using InCurrentUser = Resto.Front.Api.V1.InCurrentUser;

using OutCurrentUser = Resto.Front.Api.V1.OutCurrentUser;

 [UsedImplicitly]

public class MyPlugin : MarshalByRefObject, IFrontPlugin

 {

    private static readonly Guid id = new Guid("F3AB38C2-DF81-E603-A134-1234567890AB");

    public Guid Id { get { return id; } }

    private CompositeDisposable unsubscribe;

    private OutCurrentUser.IOperationService operationService;

    private InCurrentUser.INotificationService notificationService;

    public void Init(IServiceProvider serviceProvider)

     {

         unsubscribe = new CompositeDisposable();

         operationService = (OutCurrentUser.IOperationService) serviceProvider.GetService(typeof(OutCurrentUser.IOperationService));

         notificationService = (InCurrentUser.INotificationService) serviceProvider.GetService(typeof(InCurrentUser.INotificationService));

     }

    public void Dispose()

     {

         unsubscribe.Dispose();

     }

 }

}

В интерфейсе IOperationService можно выделить несколько основных групп методов:

-Методы вида GetSomeEntities – позволяют получить полный набор сущностей типа SomeEntity, актуальный для iikoFront на момент вызова.

-Методы вида GetSomeEntityById / TryGetSomeEntityById – позволяют получить сущность типа SomeEntity по ее идентификатору. Если сущность более недоступна, то первый вид методов падает с исключением, а второй возвращает false.

-Методы вида GetSomeEntitiesBySomeOtherEntity – позволяют получить набор  сущностей типа SomeEntity по сущности типа SomeOtherEntity. Если сущность типа SomeOtherEntity более недоступна или не существует, метод падает с исключением.

-Метод AuthenticateByPin – позволяют получить токен аутентификации по пинкоду пользователя. Токен требуется для большинства операций на редактирование и для некоторых операций на получение данных. В случае если аутентификация оказалась неудачной, метод возвращает null.

-Метод CreateEditSession – создает объект типа IEditSession, позволяющий выполнять несколько действий в рамках одной транзакции.

public void CreateOrderWithTwoProducts()

{

var credentials = operationService.AuthenticateByPin("1234");

if (credentials == null)

    return;

var section = operationService.GetRestaurantSections().First();

var table = section.Tables.Last();

var editSession = operationService.CreateEditSession();

var newOrder = editSession.CreateOrder(table.ToEntityStub());

var guest = editSession.AddOrderGuest("Guest Name", newOrder);

var result = operationService.SubmitChanges(credentials, editSession);

var previouslyCreatedOrder = result.Get(newOrder);

var previouslyAddedGuest = result.Get(guest);

var product1 = operationService.GetProducts().First();

var product2 = operationService.GetProducts().Last();

 operationService.AddOrderItemProduct(Guid.NewGuid(), 17.3d, product1, previouslyCreatedOrder, previouslyAddedGuest, credentials);

 operationService.AddOrderItemProduct(Guid.NewGuid(), 17.3d, product2, previouslyCreatedOrder, previouslyAddedGuest, credentials);

return;

}

INotificationService предоставляет возможность подписаться на события изменения объектов iikoFront, произошедшие в результате действий пользователя или других плагинов. События реализованы с использованием фреймворка Reactive Extensions:

unsubscribe.Add(notificationService.ProductChanged.Subscribe(OnProductChanged));

Поскольку внутри iikoFront действует механизм пессимистических блокировок для объектов, то полученные обработчиком событий объекты в большинстве случаев в этот момент недоступны для изменений. Тем не менее, отдельные события предоставляют возможность для внесения изменений. Например,BillChequePrinted:

unsubscribe.Add(notificationService.BillChequePrinted.Subscribe(c =>

 {

     c.BeforeHeader = new XElement("center", "Hello from plugin!");

 }));

Для каждого плагина создается его собственный лог, используя библиотеку Log4Net. Плагин может писать свои сообщения в этот лог, используяResto.Framework.Common.LogFactory:

static readonly ILog Log = LogFactory.Instance.GetLogger(typeof(MyPlugin));

API v1 не позволяет плагинам напрямую управлять или изменять GUI iikoFront, однако плагины могут создавать свои собственные окна, используя WPF. Для получения доступа к UI-потоку используется класс Resto.Framework.Common.UiDispatcher:

UiDispatcher.Execute(() => MessageBox.Show("Sample text"));

API v1 позволяет выводить в iikoFront немодальные сообщения

- Вывести сообщение об ошибке:

operationService.AddErrorMessage("Error message");

- Вывести предупреждение:

operationService.AddWarningMessage("Warning message");

- Вывести предупреждение, которое закроется само через 15 секунд:

operationService.AddWarningMessage(

"Warning message", TimeSpan.FromSeconds(15));

- Вывести обычное сообщение:

operationService.AddNotificationMessage("Simple message");

- Вывести обычное сообщение, которое закроется само через 15 секунд:

operationService.AddNotificationMessage(

"Simple message", TimeSpan.FromSeconds(15));