Akcje płatności
Dodawanie płatności
Do dodawania płatności używane są następujące metody:
-
IEditSession.AddPaymentItem — dodaj płatność
-
IEditSession.AddExternalPaymentItem — dodaj płatność zewnętrzną
-
IEditSession.AddPreliminaryPaymentItem — dodaj płatność zaliczkową (przydatne tylko dla zamówień dostawczych)
Możesz również użyć metod rozszerzeń o tych samych nazwach, gdzie sesja edycji jest tworzona niejawnie (w przeciwieństwie do wielu akcji zamówienia. Jeśli oprócz płatności potrzebujesz np. dodać gościa, użyj metod w ramach sesji edycji). Aby skonfigurować i zarejestrować typy płatności zewnętrznych, zobacz artykuł Typy płatności zewnętrznych.
Ograniczenia dotyczące płatności:
Płatność można dodać tylko jeśli zamówienie jest Nowe lub Rachunek gościa jest wydrukowany, w przeciwnym razie metoda rzuca wyjątek ConstraintViolationException. Ponadto nie można dodać kilku niezaksięgowanych płatności tego samego typu (UWAGA: planowane jest zniesienie tego ograniczenia).
Przykłady
- Dodawanie płatności gotówkowych
var order = PluginContext.Operations.GetOrders().Last(o => o.Status == OrderStatus.New);
var paymentType = PluginContext.Operations.GetPaymentTypes().Last(x => x.Kind == PaymentTypeKind.Cash);
var credentials = PluginContext.Operations.GetCredentials();
var paymentItem = PluginContext.Operations.AddPaymentItem(100m, null, paymentType, order);
- Dodawanie płatności kartą do zamówień dostawczych
var deliveryOrder = PluginContext.Operations.GetDeliveryOrders().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" };
PluginContext.Operations.AddPreliminaryPaymentItem(150, additionalData, paymentType, deliveryOrder, PluginContext.Operations.GetCredentials());
- Dodawanie zewnętrznych niezaksięgowanych płatności
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" };
PluginContext.Operations.AddExternalPaymentItem(150, false, additionalData, paymentType, order, PluginContext.Operations.GetCredentials());
Komentarze:
W przykładach użyto wyrażenia PluginContext.Operations.GetOrders().Last(...), co oznacza pobranie ostatniego zamówienia z listy. Użyj odpowiedniego kryterium wyboru, aby rozwiązać zadania biznesowe.
PluginContext.Operations.GetCredentials() — dalej w przykładach pokazano metodę rozszerzającą udostępnioną w przykładzie SamplePlugin.
Realizacja płatności zamówień
Do opłacenia zamówień używane są następujące metody:
-
IOperationService.PayOrder — płatność zamówienia
-
IOperationService.PayOrderAndPayOutOnUser — płatność zamówienia na kelnera
istnieje również metoda konwertująca płatność na przedpłatę w POS
- IOperationService.ProcessPrepay
Jeśli płatność jest dokonana za pomocą fiskalnej metody gotówkowej, to użytkownik, w imieniu którego wykonano IOperationService.PayOrderAndPayOutOnUser, będzie miał zarejestrowany fiskalny wypływ.
Przykłady
Realizacja zamówień opłaconych w całości
Załóżmy, że istnieje zamówienie IOrder, które należy zamknąć w Syrve POS. To zamówienie ma wystarczającą liczbę zaksięgowanych płatności: przedpłaty dokonane na ekranie kasy POS lub płatności inicjowane przez wtyczkę za pomocą metody AddExternalPaymentItem z flagą isProcessed ustawioną na true. Dla tego zamówienia można wywołać następującą metodę:
operationService.PayOrder(credentials, order);
Realizacja zamówień opłaconych gotówką na kelnera
Załóżmy, że istnieje zamówienie IOrder, które należy w pełni opłacić gotówką i zamknąć w Syrve POS. W tym celu wybierz odpowiedni paymentType. Następnie wywołaj metodę IOperationService.PayOrderAndPayOutOnUser. W poniższym przykładzie zamówienie jest w pełni opłacone gotówką:
var order = PluginContext.Operations.GetOrders().Last(o => o.Status == OrderStatus.New || o.Status == OrderStatus.Bill);
var credentials = PluginContext.Operations.AuthenticateByPin("777");
var paymentType = operationService.GetPaymentTypesToPayOutOnUser().First(x => x.IsCash);
PluginContext.Operations.PayOrderAndPayOutOnUser(credentials, order, paymentType, order.ResultSum);
Realizacja zamówień za pomocą wtyczek
Załóżmy, że istnieje zamówienie IOrder, które należy opłacić za pomocą metody płatności wtyczki.
var order = PluginContext.Operations.GetOrders().Last(o => o.Status == OrderStatus.New);
var paymentType = PluginContext.Operations.GetPaymentTypes().Single(i => i.Kind== PaymentTypeKind.External && i.Name == "SamplePaymentType");
var credentials = PluginContext.Operations.GetCredentials();
PluginContext.Operations.PayOrderAndPayOutOnUser(credentials, order, paymentType, order.ResultSum);
Komentarze:
Podczas płacenia zamówień na głównej kasie (w trakcie głównej zmiany kasy) za pomocą metod IOperationService.PayOrder lub IOperationService.PayOrderAndPayOutOnUser, zamówienie zostanie zamknięte i umieszczone na odpowiedniej liście w Syrve POS, a wszystkie wymagane paragony i rachunki fiskalne zostaną wydrukowane.
Zwroty
Na razie zwroty i zwroty zamówień nie mogą być inicjowane przez wtyczkę, dlatego powinny być wykonywane przez użytkowników na terminalach z Syrve POS.
Przetwarzanie płatności
Dodawanie płatności przetworzonych zewnętrznie
Czasami wymagane jest dodanie płatności przetworzonych poza Syrve POS. Do tego służy metoda AddExternalPaymentItem. Parametr isProcessed jest ustawiony na true. W takim przypadku Syrve POS traktuje wymagane transakcje płatnicze jako przetworzone zewnętrznie. W związku z tym nie przetwarza ich, lecz oznacza jako zaksięgowane.
var order = PluginContext.Operations.GetOrders().Last(o => o.Status == OrderStatus.New);
var paymentType = PluginContext.Operations.GetPaymentTypes().Last(x => x.Kind == PaymentTypeKind.Cash);
PluginContext.Operations.AddExternalPaymentItem(150, true, null, paymentType, order, PluginContext.Operations.GetCredentials());
Dodawanie przetworzonych płatności i konwertowanie ich na przedpłaty Syrve POS
Od czasu do czasu takie płatności muszą zostać dodane do zamówienia i wyświetlone w raportach Syrve Instance przed zamknięciem zamówienia. Wtedy należy dodać płatność AddExternalPaymentItem z parametrem isProcessed ustawionym na true. Następnie wywołać metodę IOperationService.ProcessPrepay.
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.AddExternalPaymentItem(150, true, additionalData, paymentType, order, credentials);
order = PluginContext.Operations.GetOrderById(order.Id);
PluginContext.Operations.ProcessPrepay(credentials, order, paymentItem);
Dodawanie płatności zaliczkowych i konwertowanie ich na przedpłaty Syrve POS
Aby rozliczyć zamówienia dostawcze, najpierw dodaj płatność zaliczkową za pomocą metody IEditSession.AddPreliminaryPaymentItem, a następnie wywołaj metodę IOperationService.ProcessPrepay.
var order = PluginContext.Operations.GetDeliveryOrders().Last(o => o.Status == OrderStatus.New || o.Status == OrderStatus.Bill);
var paymentType = PluginContext.Operations.GetPaymentTypes().Last(i => i.Kind == PaymentTypeKind.Cash);
var credentials = PluginContext.Operations.GetCredentials();
var paymentItem = PluginContext.Operations.AddPreliminaryPaymentItem(order.ResultSum, null, paymentType, order, credentials);
PluginContext.Operations.ProcessPrepay(credentials, PluginContext.Operations.GetDeliveryOrderById(order.Id), paymentItem);
Typy płatności obsługujące ciche przetwarzanie (Silent Payment)
Od czasu do czasu klienci muszą dokonać przedpłat i dodać napiwki za pomocą wtyczki (bez korzystania z funkcjonalności Syrve POS) jako nieprzetworzone płatności do dalszego przetworzenia na POS. Nieprzetworzona lub niezaksięgowana płatność oznacza, że została utworzona z fałszywym flagą isProcessed. Aby płatności mogły być przetwarzane przez wtyczkę, powinny obsługiwać tzw. cichą płatność — gdy przetwarzanie nie wymaga interakcji z interfejsem użytkownika Syrve POS (np. w celu zebrania danych). Zakłada się, że wszystkie niezbędne dane zostały zebrane. Niektóre typy płatności domyślnie obsługują cichą płatność:
-
Gotówka
-
Karty bankowe, których system płatności jest ustawiony na „Zewnętrzny”. System płatności musi być skonfigurowany w instancji Syrve w następujący sposób:
Cicha płatność może być również udostępniona dla typu wtyczki zewnętrznej. Szczegóły znajdują się w artykule Metody Płatności Zewnętrznych.
Inne ustawienia:
-
Usuwanie płatności
-
I_EditSession.DeletePaymentItem — usuń płatność
-
IEditSession.DeleteExternalPaymentItem — usuń płatność zewnętrzną
-
IEditSession.DeletePreliminaryPaymentItem — usuń przedpłatę (jest przydatne tylko dla zamówień na dowóz)
-
Usuwanie płatności zewnętrznych z zamówienia
var order = PluginContext.Operations.GetOrders().Last(o => o.Status == OrderStatus.New);
var paymentItem = order.Payments.FirstOrDefault(i => i.IsExternal);
if (paymentItem != null)
PluginContext.Operations.DeleteExternalPaymentItem(paymentItem, order, PluginContext.Operations.GetCredentials());
Więcej przykładów można znaleźć w projekcie SDK SamplePaymentPlugin.