iikoFront API SDK

Расширение функционала фискального регистратора

Введение

Команды фискального регистратора могут быть дополнены любыми другими операциями. Например, если нужно сделать предварительные работы перед печатью чека оплаты заказа или выполнить операции после печати данного чека. Схематично, это можно представить так:

DoCheque

Если плагину необходимо получать управление в процессе печати фискального чека оплаты или возврата заказа, а также в процессе внесения, изъятия, печать 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 выведет сообщение об ошибке и заказ останется открытым:

BeforeDoChequeException

Пример реализации интерфейса IChequeTaskProcessor и его регистрация есть в проекте SDK SamplePlugin.

Интерфейс IChequeTaskProcessor

Рассмотрим подробнее команды IChequeTaskProcessor.

1. BeforeDoCheckAction

BeforeDoCheckAction() - команда, которая выполняется перед операцией фискализации чека. Это может быть закрытие заказа, возврат заказа, пречек, отмена пречека, возврат товаров. Основное ее назначение проверить возможность выполнения операции, а также добавить в чек дополнительную информацию.

Как добавить в чек дополнительную информацию?

Есть 2 способа добавить в чек дополнительную информацию:

AddChequeExtensionsIikoOffice

Аргументы функции BeforeDoCheckAction():

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. Это сделано для того, чтобы при закрытии КС плагин мог регулировать сумму изъятия.