iikoFront API SDK

Возврат заказа (сторнирование)

[ v8preview7  v8  ]

Теперь появилась возможность делать возврат заказов не только из UI iikoFront, но и из API V8Preview7. Для этого необходимо вызвать метод StornoOrder.

Таким образом, мы замкнули контур оплат из API, в котором теперь доступен полный набор действий:

Для возврата заказа необходимо, чтобы плагин поддерживал оплатные операции. У сотрудника, чьи ICredentials мы передаем в метод сторнирования заказа, должно быть право F_STRN (Производить возврат оплаты). Кассовая смена, в которой заказ оплачивался, должна быть открыта и принадлежать текущему терминалу, т.к. сторнирование производится локально. Наличности в кассе должно хватать, если при оплате заказа была оплата наличными. Все оплаты, подлежащие возврату, должны поддерживать тихую оплату.

Подробности о неуспешном сторнировании, в случае которого может быть выброшен PaymentActionFailedException, были объединены с подробностями о неуспешной оплате, соответственно, поле PaymentActionFailedException.Reason заполняется теперь и в методе StornoOrder. Список PaymentActionFailedExceptionReason пополнился на пункты:

Из которых

имеют указанное свойство PaymentActionFailedException.Details, в котором будет сообщение эксепшена, генерируемое другим плагином в

Причина неудачного сторнирования (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);