Przejdź do głównej zawartości

Edytowanie zamówienia przed finalizacją

Od wersji API V7Preview5 możliwe stało się edytowanie zamówienia tuż przed wystawieniem rachunku.

Przed przekazaniem zamówienia do rachunku wywoływane jest powiadomienie BeforeOrderBill. Wcześniej pozwalało ono anulować przekazanie zamówienia do statusu Bill poprzez wyrzucenie wyjątku OperationCanceledException w odpowiednim subskrybencie. Pozwalało to również na interakcję z użytkownikiem (jeśli to możliwe) za pomocą IViewManager, umożliwiając wyświetlanie różnych okien w SyrvePOS.

Teraz, oprócz tego wszystkiego, dodano możliwość zmiany zamówienia za pomocą IOperationService, udostępnionego w argumentach powiadomienia. Dzięki temu przed zatwierdzeniem kosztu można edytować skład potraw lub rabatów w zamówieniu.

Płatność za zamówienie dostawy z API

Począwszy od API V7Preview5, możliwe stało się opłacenie zamówienia dostawy bezpośrednio z wtyczki, bez wchodzenia na ekran realizacji zamówienia.

Za zamówienie dostawy można zapłacić, wywołując metodę PayOrder. W takim przypadku koszt zamówienia dostawy musi być w pełni pokryty przez płatności. Jeśli dostawa jest realizowana przez kuriera i nie została jeszcze wysłana, ta metoda automatycznie zmieni status dostawy na „Oczekuje na wysyłkę”. Jeśli jest to odbiór osobisty, to opłacenie zamówienia dostawy z wtyczki automatycznie zamknie taką dostawę. Przeniesienie dostawy kurierskiej ze statusu „Dostarczono” do statusu „Zamknięte” zostanie zaimplementowane później.

Dodano więcej informacji do metod płatności wtyczek

W V7Preview5 w metodach
Pay oraz
PaySilently
zastąpiono kilka argumentów.

Teraz metoda Pay przyjmuje IPaymentItem paymentItem zamiast Guid paymentTypeId.
A metoda PaySilently zamiast Guid orderId, Guid paymentTypeId przyjmuje IOrder order, IPaymentItem paymentItem.
Dzięki temu, podczas dokonywania płatności wtyczką, gdy Syrve POS przekazuje kontrolę do jednej z wymienionych metod w wtyczce, można określić, czy płatność jest dokonywana przy zamykaniu zamówienia, czy jest to płatność zaliczkowa: dostępna jest właściwość IPaymentItem paymentItem
IsPrepay.

Gdy zwracane są zamówienia z zamkniętych zmian kasy, dostępny staje się identyfikator zamówienia

W V7Preview5 w metodzie
ReturnPaymentWithoutOrder
dodano nowy argument Nullable<Guid> orderId.

Metoda ta jest zaimplementowana w kodzie wtyczki i wywoływana z SyrvePOS, gdy podejmowana jest próba zwrotu zamówienia, które zostało opłacone przez typ wtyczki podczas zmiany kasy, która jest aktualnie zamknięta.
Podczas zwrotu towarów oddzielnie od zamówień, podany argument ma wartość null.
Więcej informacji o zwrotach zamówień z zamkniętych zmian kasy można znaleźć w artykule "Zwroty zakupów".
Więcej informacji o metodzie ReturnPaymentWithoutOrder znajduje się w artykule "Zewnętrzne typy płatności", w sekcji "Metody zwrotów".

Dodano możliwość interakcji między wtyczkami przez sieć

Od wersji V7Preview5 za pomocą metody CallExternalOperation wtyczka może wywołać operację zaimplementowaną przez inną wtyczkę na innym terminalu.

Wcześniej interakcja między wtyczkami była dostępna tylko w obrębie jednego terminala.
Metoda CallExternalOperation ma teraz opcjonalny argument terminal, który pozwala określić, na którym terminalu operacja ma zostać wykonana.
Jeśli pozostawisz ten argument jako null, operacja zostanie wykonana na terminalu lokalnym.
W każdym przypadku terminal, na którym operacja ma być wykonana, musi mieć wtyczkę, która zarejestrowała tę zewnętrzną operację za pomocą RegisterExternalOperation.

Możliwość zdalnego wykonywania operacji zewnętrznych ułatwi tworzenie wtyczek wymagających wymiany danych między kopiami zainstalowanymi na różnych terminalach.
Wcześniej takie wtyczki musiały same odnajdywać się w sieci, wykonywać i przetwarzać zapytania sieciowe; odpowiednio podczas instalacji należało konfigurować uprawnienia do otwierania/nasłuchiwania portów itp.
Dodatkowo, wtyczki pomocnicze, które udostępniają innym wtyczkom dostęp do danych z systemów zewnętrznych, mogą teraz być instalowane tylko w jednej kopii na terminalu głównym.

Aby umożliwić określenie terminala, na którym operacja ma być wykonana, do API dodano słownik terminali.
Powiązane zmiany:

Teraz można wyświetlić przycisk na ekranie edycji zamówienia

Począwszy od V7Preview5, wtyczka będzie miała możliwość dodania własnego przycisku do dolnego panelu ekranu edycji zamówienia (z wyjątkiem dostaw).

Dodano metodę AddButtonToOrderEditScreen z następującymi parametrami:

  • caption — tekst przycisku,
  • iconGeometry — ikona w formacie Path Markup (możliwe bez ikony),
  • callback — obsługa kliknięcia przycisku, w której można wyświetlać okna dialogowe i wprowadzać zmiany w zamówieniu.

Ograniczenia obecnej wersji:

  • Metoda musi być wywołana z wyprzedzeniem, przed przejściem do ekranu edycji zamówienia, na przykład podczas uruchamiania wtyczki. Po dodaniu przycisk pojawi się za każdym razem, gdy ekran edycji będzie odwiedzany podczas sesji, aż do momentu, gdy wtyczka usunie przycisk wywołując Dispose na obiekcie zwróconym przez metodę. Jeśli w momencie dodawania lub usuwania przycisku ekran edycji zamówienia jest już otwarty, zmiana nie zostanie zastosowana od razu, lecz przy następnym przejściu do tego ekranu. W związku z tym na razie przycisk można dodać tylko do wszystkich zamówień jednocześnie. W przyszłych wersjach zmiany będą stosowane na bieżąco, także do aktualnego ekranu, co pozwoli na wyświetlanie przycisku z uwzględnieniem bieżącego stanu konkretnego zamówienia.
  • W zależności od ustawień w dolnym panelu ekranu edycji zamówienia może być wyświetlana różna liczba standardowych przycisków, ale obecnie wyświetlany jest tylko jeden przycisk z wtyczek, nawet jeśli byłoby miejsce na więcej. Jeśli jest kilka przycisków wtyczek, wyświetlany będzie ogólny przycisk „Dodatki”; kliknięcie go otworzy okno dialogowe do wyboru konkretnego przycisku wtyczki. Zostanie to naprawione w przyszłych wersjach – przyciski zajmą całą wolną przestrzeń, a okno wyboru będzie potrzebne tylko, jeśli nadal nie zmieszczą się wszystkie przyciski.
  • Na razie przycisk można dodać tylko do ekranu edycji zamówienia w restauracjach i fast foodach. Ekran edycji zamówienia dostawy różni się tym, że nie zapisuje zmian, dopóki użytkownik nie zakończy edycji klikając „Zapisz”; w związku z tym wtyczka nie widzi pośredniego, niezapisanego stanu i nie może wprowadzać w nim zmian. Przycisk wtyczki bez możliwości zmiany zamówienia dostawy nie ma sensu, dlatego na razie nie ma go na ekranie dostawy.

Dodatkowo, przyciski można już dodawać do następujących ekranów:

Teraz możliwe jest dodawanie i usuwanie płatności fiskalizowanych na zewnętrznej kasie

W V7Preview4 stało się możliwe obsługiwanie płatności fiskalizowanych na zewnętrznej kasie. Mają one zastosowanie, gdy na miejscu przyjmowana jest przedpłata, a paragon fiskalny jest drukowany na drukarce chmurowej na miejscu. Przy realizacji takiej płatności wszystkie transakcje odpowiadające zewnętrznej płatności fiskalnej zostaną utworzone w Syrve POS, ale paragon fiskalny nie zostanie wydrukowany, ponieważ paragon został już wcześniej wydrukowany na zewnętrznej kasie.

Dodane metody:

Przykład

var order = PluginContext.Operations.GetOrders().Last(o => (o.Status == OrderStatus.New));
var paymentType = PluginContext.Operations.GetPaymentTypes().Last(x => x.Kind == PaymentTypeKind.Card && x.Name.ToUpper() == "DINERS");
var additionalData = new CardPaymentItemAdditionalData { CardNumber = "123456" };
var credentials = PluginContext.Operations.GetCredentials();
var paymentItem = PluginContext.Operations.AddExternalFiscalizedPaymentItem(50, additionalData, paymentType, order, credentials);
// Aby zamienić taką płatność na przedpłatę z natychmiastowym utworzeniem odpowiadających transakcji w Syrve POS,
// można wywołać metodę IOperationService.ProcessPrepay
order = PluginContext.Operations.GetOrderById(order.Id);
PluginContext.Operations.ProcessPrepay(credentials, order, paymentItem);

Ekran edycji zamówienia pozwala na wprowadzanie zmian inicjowanych przez wtyczkę

Począwszy od V7Preview5, wtyczka może edytować bieżące zamówienie za pomocą API bez otrzymywania EntityAlreadyInUseException :-)

Wcześniej, w V7Preview4 dodano możliwość edycji bieżącego zamówienia podczas obsługi karty lub kodu kreskowego ([więcej szczegółów]({% post_url 2020-07-24-order-edit-card-barcode-handlers%})). Teraz podobna funkcja jest dostępna w dowolnym momencie, gdy nie są wykonywane inne operacje.

Aby wprowadzić zmiany w zamówieniu otwartym na ekranie edycji, wtyczka musi wywołać metodę TryEditCurrentOrder i przekazać do niej odwołanie do callbacku, który Syrve POS wywoła, gdy tylko pojawi się taka możliwość. Jeśli nie ma żadnej akcji, stanie się to natychmiast, a jeśli w tym momencie wykonywane są inne operacje, callback zostanie wywołany zaraz po ich zakończeniu. W każdym przypadku metoda TryEditCurrentOrder zwróci kontrolę po wywołaniu callbacku. Jeśli callback rzuci wyjątek, zostanie on rzucony z metody TryEditCurrentOrder. Jeśli w momencie wywołania TryEditCurrentOrder trwała inna operacja, która ostatecznie doprowadziła do opuszczenia ekranu edycji zamówienia, callback nie zostanie wywołany ani natychmiast, ani z opóźnieniem, a metoda TryEditCurrentOrder wygeneruje wyjątek OperationCanceledException.

Na razie metoda TryEditCurrentOrder jest obsługiwana tylko na ekranie edycji zamówienia w trybie fast food lub restauracyjnym (IOrderEditScreen). Później pojawi się wsparcie dla ekranów edycji dostaw, bankietów, płatności itp.

Podczas działania callbacku wyświetlany jest pasek postępu. Do callbacku zostaną przesłane bieżące zamówienie oraz lokalna wersja IOperationService do edycji bieżącego zamówienia, a także IViewManager z możliwością wyświetlania okien dialogowych oraz zmiany tekstu na pasku postępu.

W oknie EditorTester dołączonym do SamplePlugin, gdzie zebrano przykłady edycji zamówień, dodano pole wyboru „Zastosuj zmiany do zamówienia otwartego w Syrve POS”; po jego zaznaczeniu zmiany są stosowane do aktualnie otwartego na ekranie zamówienia.

Dodano możliwość pobrania listy dostępnych grup oraz listy oddziałów każdej grupy.

W V7Preview4 stało się możliwe pobranie listy wszystkich grup, a także listy oddziałów dowolnej grupy, nie tylko bieżącej.

Dodane metody:

Dodatkowo oddział ma teraz odnośnik do grupy nadrzędnej: IRestaurantSection.TerminalsGroup

W V7Preview4 nie będzie metody GetRestaurantSections do pobierania oddziałów bieżącej grupy. Możesz zamiast tego użyć

// Pobierz wszystkie oddziały bieżącej grupy
var currentGroupSections = PluginContext.Operations.GetRestaurantSectionsByTerminalsGroup(PluginContext.Operations.GetHostTerminalsGroup());