Расширение функционала фискального регистратора
Введение
Команды фискального регистратора могут быть дополнены любыми другими операциями. Например, если нужно сделать предварительные работы перед печатью чека оплаты заказа или выполнить операции после печати данного чека. Схематично, это можно представить так:
Если плагину необходимо получать управление в процессе печати фискального чека оплаты или возврата заказа, а также в процессе внесения, изъятия, печать X и Z отчетов, достаточно реализовать интерфейс IChequeTaskProcessor
и зарегистрировать его посредством вызова метода API RegisterChequeTaskProcessor()
:
var chequeTaskProcessor = new ChequeTaskProcessor()
PluginContext.Operations.RegisterChequeTaskProcessor(chequeTaskProcessor);
Все команды интерфейса IChequeTaskProcessor
могут прервать выполнение основной операции: фискализация чека, внесение, изъятие, печать X и Z отчета. Для этого в теле команды нужно бросить любого вида исключение.
Например, сделаем условие — нельзя закрывать заказы на виртуальном фискальном регистраторе (ФР):
public BeforeDoCheckActionResult BeforeDoCheckAction(ChequeTask chequeTask, ICashRegisterInfo device, CashRegisterChequeExtensions chequeExtensions, IViewManager viewManager)
{
// Для примера: разрешать печатать чеки оплаты и предоплаты только на реальном устройстве.
if (device.IsVirtual)
throw new Exception("Cash register is virtual. Please close order only on real device.");
PluginContext.Log.InfoFormat("Before do cheque on cash register: {0} ({1})", device.FriendlyName, device.Id);
...
}
Тогда при оплате заказа на виртуальном ФР iikoFront выведет сообщение об ошибке и заказ останется открытым:
Пример реализации интерфейса IChequeTaskProcessor
и его регистрация есть в проекте SDK SamplePlugin.
Интерфейс IChequeTaskProcessor
Рассмотрим подробнее команды IChequeTaskProcessor
.
1. BeforeDoCheckAction
BeforeDoCheckAction()
- команда, которая выполняется перед операцией фискализации чека. Это может быть закрытие заказа, возврат заказа, пречек, отмена пречека, возврат товаров.
Основное ее назначение проверить возможность выполнения операции, а также добавить в чек дополнительную информацию.
Как добавить в чек дополнительную информацию?
Есть 2 способа добавить в чек дополнительную информацию:
- Путем добавления шаблона чека «Дополнение к фискальному чеку»: iikoOffice => «Администрирование» => «Шаблоны чеков» => «Добавить» => «Тип: Дополнение к фискальному чеку».
Написанный здесь шаблон будет добавлен в конец чека
chequeTask.TextAfterCheque
. Этот способ не связан с расширением функционала ФРа, используя его не нужно регистрировать свойIChequeTaskProcessor
.
- Плагин имеет возможность добавить свои значения в
chequeTask.TextBeforeCheque
,chequeTask.TextAfterCheque
, а так же изменить имя кассираchequeTask.cashierName
. Эти данные будут переданы в ФР для печати. Для этого необходимо заполнить соотвествующие поля в возращаемом значении типаBeforeDoCheckActionResult
. Если модификация полей не требуется, нужно вернуть просто null.public BeforeDoCheckActionResult BeforeDoCheckAction(ChequeTask chequeTask, ICashRegisterInfo device, CashRegisterChequeExtensions chequeExtensions, IViewManager viewManager) { var beforeCheque = new List<Data.Print.Document>(); var documentBefore = new Data.Print.Document(); documentBefore.Markup.Add(new XElement(Tags.LargeFont, "Welcome")); documentBefore.Markup.Add(new XElement(Tags.SmallFont, "tel. 555-123456")); beforeCheque.Add(documentBefore); var afterCheque = new List<Data.Print.Document>(); var documentAfter = new Data.Print.Document(); documentBefore.Markup.Add(new XElement(Tags.SmallFont, "Thank you for shopping")); documentBefore.Markup.Add(new XElement(Tags.QRCode, "iiko.ru")); beforeCheque.Add(documentAfter); return new BeforeDoCheckActionResult { BeforeCheque = beforeCheque, AfterCheque = afterCheque, CashierName = "CashierName" }; }
Аргументы функции BeforeDoCheckAction()
:
chequeTask
— информация по заказу. Вся информация по позициям заказа, скидкам/надбавкам, оплатах и прочее (см. статью API внешние фискальные регистраторы).device
— информация по фискальному регистратору, на котором происходит закрытие заказа.chequeExtensions
— дополнительныя информация по чеку. Хранит разметку для добавления в начало и конец чека (chequeExtensions.BeforeCheque
,chequeExtensions.AfterCheque
). Также хранит идентификаторchequeExtensions.PastOrderId
и номерchequeExtensions.PastOrderNumber
заказа, закрытого в прошлой КС. Эти поля заполняются при возврате заказа из прошлой КС.viewManager
— менеджер окон. Позволяет показывать предопределённый набор встроенных в iikoFront диалоговых окон (см. статью API диалоговые окна).
2. AfterDoCheckAction
AfterDoCheckAction()
— команда, которая выполняется после операции фискализации чека.
Основное ее назначение — выполнить завершающие действия после печати чека. Например, добавить в очередь операцию выгрузки во внешнюю систему.
Аргумент result
описывает результат выполнения операции на ФР.
result.Success = true
— операция выполнена успешно, иначе — неуспех.
Если операция выполнена неуспешно result.Success = false
, текст ошибки можно будет увидеть в result.Message
.
3. BeforeXReport
BeforeXReport()
— команда, которая выполняется перед печатью X-отчета.
В качестве параметров также передаются фискальный регистратор, на котором проводится операция, IViewManager
для показа сообщений или ввода данных и пользователь authUser
, инициирующий печать X-отчета.
4. AfterXReport
AfterXReport()
— команда, которая выполняется после печати X-отчета.
Аргументы аналогичны команде AfterDoCheckAction
.
5. BeforeZReport
BeforeZReport
— команда, которая выполняется перед печатью Z-отчета.
Параметрами передаются: ФР, пользователь и менеджер окон IViewManager
.
6. AfterPayIn
AfterPayIn
— команда, которая выполняется после внесения денежный средств в кассу.
В функцию передаются: ФР, ответ фискального регистратора при выполнении внесения, менеджер окон IViewManager
и сумма денежных средств, которую вносили в кассу.
7. AfterPayOut
AfterPayOut
— команда, которая выполняется после изъятия денежных средств из кассы.
В функцию передаются: ФР, ответ фискального регистратора при выполнении изъятия, менеджер окон IViewManager
и сумма денежных средств, которую изымали из кассы.
Дополнительные интерфейсы IReadonlyChequeTaskProcessor
и IEditableChequeTaskProcessor
Наряду с вышеописанным интерфейсом IChequeTaskProcessor
, также есть расширяющие его интерфейсы IReadonlyChequeTaskProcessor
и IEditableChequeTaskProcessor
, которые позволяют выполнять свои задачи перед выполнением внесения и изъятия на кассе.
Регистрируются они точно также, как родительский интерфейс.
Разница между ними лишь в том, что используя интерфейс IReadonlyChequeTaskProcessor
плагин при изъятии денежных средств не может отредактировать сумму изъятия, а используя интерфейс IEditableChequeTaskProcessor
— может, за счет параметра ref estimatedSum
.
Это сделано для того, чтобы при закрытии КС плагин мог регулировать сумму изъятия.