Zwrot zamówienia (anulowanie)
Obecnie możliwy jest zwrot zamówień nie tylko z poziomu UI Syrve POS,
ale także z API V8Preview7. W tym celu należy wywołać metodę StornoOrder.
W ten sposób zamknęliśmy pętlę płatności z poziomu API, w której dostępny jest teraz pełen zestaw działań:
- Dokonanie przedpłaty:
ProcessPrepay - Zwrot przedpłaty / dokonanej płatności:
UnprocessPayment - Płatność za zamówienie:
PayOrder,PayOrderAndPayOutOnUser - Zwrot/anulowanie zamówienia:
StornoOrder
Aby zwrócić zamówienie, wtyczka musi obsługiwać transakcje płatnicze.
Pracownik, którego
ICredentials
przekazujemy do metody odwracania zamówienia, musi posiadać prawo F_STRN (Wykonaj zwrot).
Zmiana kasy, w której zamówienie zostało opłacone, musi być otwarta i należeć do aktualnego terminala, ponieważ odwrócenie odbywa się lokalnie.
W kasie powinno być wystarczająco dużo gotówki, jeśli zamówienie zostało opłacone gotówką.
Wszystkie płatności podlegające zwrotowi muszą obsługiwać cichą płatność.
Szczegóły dotyczące nieudanego odwrócenia, które mogą skutkować odrzuceniem wyjątku PaymentActionFailedException,
zostały połączone ze szczegółami dotyczącymi nieudanej płatności,
w związku z czym pole PaymentActionFailedException.Reason
jest teraz wypełniane w metodzie StornoOrder.
Lista PaymentActionFailedExceptionReason
została rozszerzona o nowe elementy:
SomeOfCafeSessionsIsClosed,StornoOrderFailed,StornoNotSupported,OrderStatusIsNotClosed,OrderCloseAndStornoOnDifferentTerminalNotSupported,DeliveryOrderStatusIsCanceled
Spośród których
PaymentsProcessingCanceled,PaymentsProcessingFailed,BeforeDoChequeOperationFailed,ChequeTaskProcessorFailed,CashRegisterOperationFailed
posiadają określoną właściwość PaymentActionFailedException.Details,
która będzie zawierać komunikat wyjątku wygenerowany przez inną wtyczkę w
IPaymentProcessor.ReturnPaymentSilently,INotificationService.BeforeDoCheque,IChequeTaskProcessor.BeforeDoCheckAction,ICashRegister.DoCheque.
Powód nieudanego odwrócenia (PaymentActionFailedException.Reason)
CashForChangeNotEnough został przemianowany na CashNotEnough.
Chciałbym również zaznaczyć, że teraz możliwe jest usunięcie opłaconego zamówienia. Przykładowy schemat wywołań dla zamkniętego zamówienia wyglądałby następująco:
var order = PluginContext.Operations.GetOrders().Last(o => o.Status == OrderStatus.Closed);
var credentials = PluginContext.Operations.AuthenticateByPin("777");
// Anulujemy zamówienie i zwracamy płatność
order = PluginContext.Operations.StornoOrder(order, credentials);
// Zwrot przedpłat, jeśli były uwzględnione w zamówieniu
foreach (var orderPayment in order.Payments)
{
PluginContext.Operations.UnprocessPayment(order, orderPayment, credentials);
order = PluginContext.Operations.GetOrderById(order.Id);
}
// Usuwanie wydrukowanych pozycji zamówienia
if (order.Items.Count > 0)
{
PluginContext.Operations.DeletePrintedOrderItems(
"powód",
WriteoffOptions.WriteoffToCafe(PluginContext.Operations.GetActiveRemovalTypes().First(rt => rt.WriteoffType.HasFlag(WriteoffType.Cafe))),
order,
order.Items,
credentials);
order = PluginContext.Operations.GetOrderById(order.Id);
}
// Usuwanie zamówienia
PluginContext.Operations.DeleteOrder(order, credentials);