Wstęp
Wtyczka może być zaprogramowana w dowolnym języku programowania z rodziny .Net, co skutkuje kompilacją do wersji .Net 4.7.2, która zostanie załadowana przez Syrve POS podczas uruchamiania. Syrve POS tworzy oddzielny kontener procesu do załadowania każdej wtyczki. Pozwala to uniknąć konfliktów zależności i zapewnia niezawodność systemu (awaria jednej z wtyczek nie wpłynie na resztę systemu). Każda wtyczka powinna być zainstalowana w osobnym podfolderze folderu Plugins, znajdującym się w C:\Program Files\<folder Syrve POS>. Kompilacja wtyczki musi zawierać klasę, która posiada domyślny publiczny konstruktor (bez parametrów) i implementuje interfejs IFrontPlugin. Procesy wtyczek i Syrve POS komunikują się za pomocą kanału IPC; obiekty są przekazywane przez referencję (takie obiekty powinny dziedziczyć po MarshalByRefObject) lub przez wartość (klasy danych; powinny być serializowalne).
Punktem wejścia jest klasa wtyczki. Po uruchomieniu wtyczki tworzona jest kopia tej klasy; jej konstruktor może załadować wymagane dane, nawiązać połączenia, zasubskrybować interesujące zdarzenia itd. Przed zatrzymaniem działania i wyeksportowaniem wtyczki wywoływana jest metoda Dispose. Służy ona do wypisania się z subskrypcji zdarzeń, zamknięcia połączeń i zwolnienia innych zasobów.
Interakcja z API rozpoczyna się od statycznej klasy PluginContext, która gromadzi wszystkie funkcje i usługi:
PluginContext.Operations— usługa operacji,PluginContext.Notifications— usługa powiadomień,PluginContext.Licensing— licencjonowanie,PluginContext.Services— wszystkie dostępneusługi, w tym wszystkie wymienione powyżej, a także usługi innych wersji API,PluginContext.Log—logowanie,PluginContext.Shutdown()—zamknięciewtyczki.
Główne kontrakty
Struktura danych
Dane są gromadzone w przestrzeni nazw Resto.Front.Api.Data i są pogrupowane w następujący sposób:
Organization— struktura firmy i ustawienia,Assortment— pozycje menu,Orders— zamówienia, w tym goście, pozycje, modyfikatory, rabaty itd.,Kitchen— zamówienia kuchenne,Brd— skrót od Bankiety, Rezerwacje i Dostawy,Security— dane uwierzytelniające wtyczkę,- ...
Obiekty danych są głównie obiektami tylko do odczytu: mają opublikowany interfejs z właściwościami tylko do odczytu, dlatego wtyczka nie może tworzyć nowych kopii takich obiektów ani zmieniać wartości pól istniejących. Większość obiektów, na przykład IProduct, ITable lub IUser, nie może być w ogóle edytowana, ponieważ są to bazy danych tworzone w Syrve Office. Niektóre typy obiektów można edytować pośrednio, stosując określone akcje. Na koniec istnieje specjalna kategoria obiektów w przestrzeni nazw Resto.Front.Api.Data.DataTransferObjects, które mogą być tworzone i edytowane po stronie wtyczki.
Usługa operacji
Praktycznie wszystkie działania są wykonywane za pomocą IOperationService. Metody tego interfejsu można podzielić na następujące grupy:
- odczyt danych — pobieranie wszystkich obiektów danego typu (
GetProductGroups), pobieranie konkretnego obiektu (GetProductGroupById), pobieranie powiązanych obiektów (GetChildGroupsByProductGroup), - edycja danych — pojedyncze akcje (
PrintBillCheque), akcje pakietowe (używającCreateEditSession), - inne operacje — wyświetlanie komunikatów (
AddWarningMessage), sprawdzanie uprawnień (CheckCanEditOrder) i tak dalej.
Gdy używana jest usługa IOperationService, wtyczka ma pierwszeństwo.
Usługa powiadomień
INotificationService umożliwia subskrypcję interesujących zdarzeń. Powiadomienia o zmianach danych są realizowane za pomocą biblioteki Reactive Extensions (Rx), zdarzenia są publikowane jako sekwencje IObservable<T>, gdzie T jest argumentem zdarzenia (zmienionym obiektem). Rx obsługuje przepływ zdarzeń tak wygodnie, jak LINQ obsługuje IEnumerable<T>. Aby zapoznać się z programowaniem reaktywnym, sprawdź ten przydatny zasób: Wprowadzenie do Rx. Tutaj można również zasubskrybować takie operacje jak otwieranie lub zamykanie zmiany kasy, drukowanie paragonu serwisowego lub kasowego itd. Oprócz powiadomień o bieżących operacjach mogą być dostępne inne dodatkowe funkcje, na przykład przy zamykaniu zmiany kasy można wydrukować dodatkowy raport, przy drukowaniu paragonu można dodać informacje marketingowe, przy przejściu do ekranu kasy można dodać do zamówienia prezent lub płatność z konta lojalnościowego, natomiast niektóre operacje mogą być całkowicie anulowane przez wygenerowanie wyjątku OperationCanceledException.
Podczas obsługi INotificationService inicjatorem akcji jest Syrve POS, natomiast wtyczka jest obserwatorem.
Przykłady
Między innymi SDK zawiera kilka przykładów kodu źródłowego wtyczek. Zalecamy zapoznanie się z nimi przed rozpoczęciem tworzenia własnych wtyczek.
SamplePlugin
Ten przykład pokazuje różne przypadki użycia API:
- Dodawanie informacji promocyjnych do paragonów,
- Obsługa zamówień (tworzenie zamówień, dodawanie gości, dodawanie i usuwanie pozycji oraz modyfikatorów, zmiana liczby porcji, drukowanie biletów kuchennych i rachunków gości, rozliczenie i tak dalej),
- Obsługa dostaw,
- Obsługa bankietów i rezerwacji,
- Obsługa baz danych klientów, baz danych ulic,
- Wyświetlanie powiadomień niemodalnych na ekranie terminala,
- Przeglądanie struktury restauracji (sale, stoliki, pracownicy),
- Przeglądanie hierarchii menu,
- Przeglądanie statystyk kuchni,
- Zarządzanie połączeniami licencjonowanymi,
- Rejestrowanie dodatkowych operacji w menu Syrve POS,
- …
CustomerScreenPlugin
Ten przykład przedstawia gotowy do użycia plugin ekranu klienta dla terminali z dwoma wyświetlaczami, gdzie wyświetlacz kasjera pokazuje interfejs Syrve POS, a wyświetlacz klienta pokazuje logo firmy i filmy promocyjne oraz pozycje zamówienia.
Resto.Front.Api.SampleScalePlugin
To jest przykład pluginu integrującego wagę. Pokazuje, jak można użyć pluginu do podłączenia i korzystania z wag, które nie są obsługiwane natywnie.
Resto.Front.Api.SampleCashRegisterPlugin
Pokazuje, jak obsługiwać niestandardową kasę fiskalną