Возврат заказа (сторнирование)
[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);