Возврат заказа (сторнирование)
[v8preview7
v8
]
Теперь появилась возможность делать возврат заказов не только из UI iikoFront,
но и из API V8Preview7. Для этого необходимо вызвать метод StornoOrder.
Таким образом, мы замкнули контур оплат из API, в котором теперь доступен полный набор действий:
- Внесение предоплаты:
ProcessPrepay - Возврат предоплаты / проведенной оплаты:
UnprocessPayment - Оплата заказа:
PayOrder,PayOrderAndPayOutOnUser - Возврат оплаты заказа / сторнирование:
StornoOrder
Для возврата заказа необходимо, чтобы плагин поддерживал оплатные операции.
У сотрудника, чьи
ICredentials
мы передаем в метод сторнирования заказа, должно быть право F_STRN (Производить возврат оплаты).
Кассовая смена, в которой заказ оплачивался, должна быть открыта и принадлежать текущему терминалу, т.к. сторнирование производится локально.
Наличности в кассе должно хватать, если при оплате заказа была оплата наличными.
Все оплаты, подлежащие возврату, должны поддерживать тихую оплату.
Подробности о неуспешном сторнировании, в случае которого может быть выброшен PaymentActionFailedException,
были объединены с подробностями о неуспешной оплате,
соответственно, поле PaymentActionFailedException.Reason
заполняется теперь и в методе StornoOrder.
Список PaymentActionFailedExceptionReason
пополнился на пункты:
SomeOfCafeSessionsIsClosed,StornoOrderFailed,StornoNotSupported,OrderStatusIsNotClosed,OrderCloseAndStornoOnDifferentTerminalNotSupported,DeliveryOrderStatusIsCanceled
Из которых
PaymentsProcessingCanceled,PaymentsProcessingFailed,BeforeDoChequeOperationFailed,ChequeTaskProcessorFailed,CashRegisterOperationFailed
имеют указанное свойство PaymentActionFailedException.Details,
в котором будет сообщение эксепшена, генерируемое другим плагином в
IPaymentProcessor.ReturnPaymentSilently,INotificationService.BeforeDoCheque,IChequeTaskProcessor.BeforeDoCheckAction,ICashRegister.DoCheque.
Причина неудачного сторнирования (PaymentActionFailedException.Reason)
CashForChangeNotEnough была переименована в CashNotEnough.
Также хочется отметить, что теперь есть возможность удалить оплаченный заказ. Примерная схема вызовов для закрытого заказа будет выглядеть так:
var order = PluginContext.Operations.GetOrders().Last(o => o.Status == OrderStatus.Closed);
var credentials = PluginContext.Operations.AuthenticateByPin("777");
// Сторнируем заказ, возвращаем оплаты
order = PluginContext.Operations.StornoOrder(order, credentials);
// Возвращаем предоплаты, если они были в заказе
foreach (var orderPayment in order.Payments)
{
PluginContext.Operations.UnprocessPayment(order, orderPayment, credentials);
order = PluginContext.Operations.GetOrderById(order.Id);
}
// Удаляем отпечатанные позиции заказа
if (order.Items.Count > 0)
{
PluginContext.Operations.DeletePrintedOrderItems(
"reason",
WriteoffOptions.WriteoffToCafe(PluginContext.Operations.GetActiveRemovalTypes().First(rt => rt.WriteoffType.HasFlag(WriteoffType.Cafe))),
order,
order.Items,
credentials);
order = PluginContext.Operations.GetOrderById(order.Id);
}
// Удаляем заказ
PluginContext.Operations.DeleteOrder(order, credentials);