Оплатные действия
Добавление оплат
Для добавления оплаты в заказ существуют методы:
-
IEditSession.AddPaymentItem — добавить оплату
-
IEditSession.AddExternalPaymentItem — добавить внешнюю оплату
-
IEditSession.AddPreliminaryPaymentItem — добавить предварительную оплату (имеет смысл только для заказов доставки)
Также можно использовать одноименные методы сервиса операций–расширений, в которых неявно создаётся сессия редактирования (отличие в необходимости выполнения нескольких действий над заказом. Если помимо добавления оплаты требуется, например, добавить гостя к заказу, то нужно использовать методы в рамках сессии редактирования). Для настройки и регистрации внешних типов оплаты см. статью Интеграция с внешними типами оплаты.
Ограничения добавления оплат:
Платеж может быть добавлен в заказ, только если заказ находится в статусе новый (New
) или пречек (Bill
), иначе метод выбрасывает исключение ConstraintViolationException
.
Кроме того нельзя добавить в заказ несколько непроведенных элементов оплаты одного типа
(NOTE: планируется разрешить добавлять несколько непроведенных элементов оплаты в заказ).
Примеры
- Добавление в заказ оплаты наличными
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);
- Добавление в доставочный заказ оплаты картой
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());
- Добавить в заказ внешнюю непроведенную оплату
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());
Комментарии:
- В примерах используется выражение
PluginContext.Operations.GetOrders().Last(...)
— получение последнего попавшегося заказа из списка. Для решения бизнес–задач следует использовать соответствующий критерий отбора. PluginContext.Operations.GetCredentials()
— здесь и далее в примерах приводится метод–расширение, реализованный в примере проекта SamplePlugin.
Оплата заказа
Для оплаты заказа существуют методы:
-
IOperationService.PayOrder — оплата заказа
-
IOperationService.PayOrderAndPayOutOnUser — оплата заказа в расчет официанту
также существует метод, с помощью которого можно превратить элемент оплаты в предоплату iikoFront
Если оплата производится фискальным наличным типом, то на пользователя, от чьего имени производится операция оплаты методом IOperationService.PayOrderAndPayOutOnUser
, будет оформлено фискальное изъятие.
Примеры
Оплата заказа, в котором достаточно внесенных денежных средств
Пусть существует заказ IOrder order, который необходимо закрыть в iikoFront и в заказ уже внесено достаточно проведенных оплат
(проведенные элементы оплаты это либо предоплаты, внесенные на экране кассы iikoFront, либо оплаты, добавленные по инициативе плагина методом AddExternalPaymentItem
с флагом isProcessed
равным true
).
Для такого заказа можно вызвать метод:
operationService.PayOrder(credentials, order);
Оплата заказа наличными с расчетом официанту
Пусть существует заказ IOrder order
, который необходимо оплатить наличными на всю сумму заказа и закрыть в iikoFront.
Для этого нужно выбрать соответствующий paymentType
.
Затем вызывается метод IOperationService.PayOrderAndPayOutOnUser
.
В примере ниже заказ оплачивается наличными на всю сумму заказа:
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);
Оплата плагинным типом оплаты
Пусть существует IOrder order
который нужно оплатить плагинным типом оплаты.
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);
Комментарии:
- При оплате заказа на главной кассе (в кассовую смену главной кассы) с помощью методов IOperationService.PayOrder или IOperationService.PayOrderAndPayOutOnUser заказ закроется, распечатаются все необходимые квитанции, будет напечатан фискальный чек, а сам заказ окажется в закрытых в iikoFront (NOTE: дополнить раздел пояснением про фискальное изъятие в расчет официанту).
Возврат оплаты
Возврат оплаты и возврат заказов по инициативе плагина пока не реализован, поэтому должен выполняться со стационарных терминалов iikoFront пользователем системы.
Проведение оплаты
Добавление в заказ оплаты, проведенной на внешней стороне
В некоторых случаях требуется добавить такой элемент оплаты в заказ, обработка которого уже выполнена вне iikoFront.
Для этого используется метод AddExternalPaymentItem
, которому в параметре isProcessed
передается значение true
.
В данном случае iikoFront считает, что необходимые транзакции, связанные с элементом оплаты, были выполнены вовне.
Поэтому со своей стороны не предпринимает действий по обработке и помечает данный элемент оплаты проведенным.
Пример
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());
Добавление в заказ проведенной оплаты и превращение ее в предоплату iikoFront
Иногда требуется в заказ добавить такой элемент оплаты, чтобы он отображался в отчетах iikoOffice до закрытия заказа.
Тогда в заказ нужно добавить оплату методом AddExternalPaymentItem
с параметром isProcessed
равным true
, затем вызвать метод 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);
Добавление в заказ предварительного платежа с последующим превращением в предоплату iikoFront
Для оплаты доставочного заказа следует сначала добавить предварительную оплату с помощью метода IEditSession.AddPreliminaryPaymentItem, а после вызвать метод 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);
Типы оплат, которые поддерживают тихое проведение (Silent-оплата)
Порой клиентам нужна возможность проводить предоплату или вносить чаевые по инициативе плагина (без входа на попап предоплаты или чаевых iikoFront) непроведенным типом оплаты (для последующего проведения на стороне iikoFront).
Непроведенный тип оплаты подразумевает, что он был создан c флагом isProcessed
равным false
.
Проведение какой-либо оплаты по инициативе плагина требует, чтобы оплата поддерживала так называемую тихую оплату, когда для проведения не требуется взаимодействие с пользовательским интерфейсом iikoFront (например, для сбора данных), считается, что все необходимые данные уже собраны.
Среди типов оплат, поддерживающих тихую оплату, есть те, которые поддерживают ее по умолчанию:
- Наличные
- Банковские карты, платежная система которых в задана как “Внешняя”. Настройка платежной системы типа оплаты в iikoOffice должна быть следующей:
Также, поддержку тихой оплаты можно реализовать для внешнего плагинного типа. Подробнее см. в разделе Внешние типы оплаты.
Дополнительно:
- Добавление чаевых в заказ см. в разделе Чаевые.
Удаление оплат
-
IEditSession.DeletePaymentItem — удалить оплату
-
IEditSession.DeleteExternalPaymentItem — удалить внешнюю оплату
-
IEditSession.DeletePreliminaryPaymentItem — удалить предварительную оплату (имеет смысл только для доставочного заказа)
Пример
- Удаление внешнего элемента оплаты из заказа
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());
Больше примеров можно найти в проекте SDK SamplePaymentPlugin.