Модули онлайн-касс интегрируют платформу BILLmanager с фискальными регистраторами и облачными кассами для автоматической отправки чеков в ОФД. Каждый модуль состоит из XML-описания конфигурации и исполняемого скрипта, который обрабатывает команды платформы. Модуль отвечает за проверку подключения, формирование данных чека, отправку запроса во внешнюю систему и обновление статуса фискализации в базе данных BILLmanager.
Общие сведения
Модуль онлайн-касс обеспечивает автоматическую фискализацию расчетов и передачу данных о чеках оператору фискальных данных (ОФД)
Каталог установки: /usr/local/mgr5/cashregister/
Поддерживаемые возможности (из SDK billmgr.modules.cashregister):
check_connection— проверка подключения;send_receipt— отправка чека;check_receipt— проверка статуса чека;expense_receipt— поддержка расходных чеков;refund_receipt— поддержка чеков возврата;manual_monthly_send— ручная ежемесячная отправка.
Команды --command:
check_connection;send_receipt;check_receipt;- другие команды (например,
refund_receipt) — по необходимости.
/usr/local/mgr5/cashregister/crmodulkassa --command send_receipt --cash_register 1Возможности-флаги (не добавляют новых команд, только влияют на интерфейс BILLmanager):
Feature.EXPENSE_RECEIPT— поддержка чеков расхода (признак, что модуль умеет их регистрировать);Feature.REFUND_RECEIPT— поддержка чеков возврата для платежей без чека прихода;Feature.MANUAL_MONTHLY_SEND— поддержка ручной отправки чеков по услугам (чеки создаются в статусеPrepare).
Пояснения к XML-файлу модулей онлайн-касс
Команда features — выход (stdout)
Модуль возвращает XML-документ со списком поддерживаемых возможностей. Формируется автоматически через метод features() класса CashregisterModule, который собирает все возможности из self._features и self._commands.
<doc>
<features>
<feature name="check_connection"/>
<feature name="send_receipt"/>
<feature name="check_receipt"/>
<feature name="send_prepared_receipt"/>
<feature name="expense_receipt"/>
<feature name="refund_receipt"/>
<feature name="manual_monthly_send"/>
<feature name="form_tune"/>
</features>
</doc>Команда check_connection — вход (stdin)
При создании или редактировании онлайн-кассы BILLmanager вызывает модуль с этой командой, передавая на стандартный ввод XML-форму с текущими параметрами кассы (те, что описаны в metadata name="cashregister.edit.XXX"):
<doc>
<url>https://api.modulkassa.ru</url>
<username>test_user</username>
<password>secret</password>
<retailpointid>123</retailpointid>
</doc>Выход:
- при успешном подключении — пустой XML
<doc/>; - при ошибке:
- XML с описанием ошибки (стандартный формат):
<doc>
<error type="msg_error_*" value="*" object="*"/>
</doc>-
- XML для конкретного поля:
<doc>
<error type="value" object="url" value="" desc="desc_*"/>
</doc>Команда form_tune — вход и выход
Вызывается при открытии формы редактирования онлайн-кассы. Модуль получает на stdin текущий XML-файл формы и может изменить его (добавить поля, подсказки, атрибуты).
<doc>
<form>
<field name="url">
<input type="text" name="url" required="yes"/>
</field>
<field name="username">
<input type="text" name="username" required="yes"/>
</field>
<field name="password">
<input type="password" name="password" required="yes" private="yes"/>
</field>
</form>
</doc><doc>
<form>
<field name="url">
<input type="text" name="url" required="yes" placeholder="https://..."/>
</field>
<field name="username">
<input type="text" name="username" required="yes"/>
</field>
<field name="password">
<input type="password" name="password" required="yes" private="yes"/>
</field>
<field name="retailpointid">
<input type="text" name="retailpointid" required="yes"/>
</field>
</form>
</doc>Команды send_receipt, check_receipt, send_prepared_receipt
Команды не используют stdin или stdout для передачи данных чека. Вместо этого BILLmanager передаёт в командной строке параметры:
--cash_register <id>— идентификатор онлайн-кассы;--payment_receipt <id>— идентификатор чека (из таблицыpayment_receipt).
Модуль должен самостоятельно (через БД или через misc.Mgrctl("payment_receipt.info", elid=id)) получить все данные чека: позиции, суммы, налоги, контактные данные покупателя и т. д. После взаимодействия с внешним API модуль обновляет статус чека в BILLmanager с помощью вызовов:
payment_receipt.wait— чек поставлен в очередь на фискализацию;payment_receipt.success— чек успешно фискализирован (передаётfn_number,fiscal_document_number,fiscal_document_attribute,receiptdate,receiptdate_tz);payment_receipt.error— произошла ошибка (передаётerror_message).
/usr/local/mgr5/cashregister/crmodulkassa --command send_receipt --cash_register 1 --payment_receipt 123Важно:
send_receiptиспользуется для чеков со статусомReceiptStatus.New(обычные чеки прихода);send_prepared_receipt— для чеков со статусомReceiptStatus.Prepare(чеки, созданные вручную или отложенные);check_receipt— для чеков со статусомReceiptStatus.Wait(проверка состояния ранее отправленного чека).
Возможности без отдельных команд
- expense_receipt — BILLmanager разрешает создание расходных чеков (чеки с типом Buy, BuyRefund, BuyCorrection). Модуль обрабатывает их через
send_receipt,send_prepared_receipt, но в данных чека будет соответствующийReceiptType; refund_receipt— разрешает создание чеков возврата для платежей, у которых ещё нет чека прихода. Обрабатывается аналогичноexpense_receipt;manual_monthly_send— добавляет в интерфейсе возможность ручной отправки отложенных чеков (статусPrepare). Команда используетсяsend_prepared_receipt.
Примечания по разработке
- все callable-команды (кроме
features) должны быть добавлены через_add_callable_feature()или декоратор@callable_feature; - обязательные команды (по умолчанию в
__init__):check_connection,send_receipt,check_receipt. Остальные — опционально; - типы чеков и статусы определены в перечислениях
ReceiptTypeиReceiptStatus. При сохранении статуса черезpayment_receipt.successобязательно передавать фискальные атрибуты; - параметры кассы, помеченные в XML как
private="yes", хранятся зашифрованными, но вcheck_connectionпередаются открыто; - параметры подключения, содержащие чувствительные данные (например, API-ключи или пароли), должны быть помечены в XML-форме атрибутом
crypted="yes"; - BILLmanager хранит параметры в базе данных в зашифрованном виде, но передаёт их в модуль в открытом виде на
stdinисключительно при выполнении командыcheck_connectionдля возможности тестового подключения; - для логирования работы модуля рекомендуется использовать директорию /usr/local/mgr5/var/, а при разработке на Python — стандартный модуль
billmgr.logger.
Механизм работы модуля
Этапы работы с модулем онлайн-кассы в BILLmanager:
- Первоначальная настройка:
- Установка модуля.
- Добавление подключения к кассе.
- Процесс работы с чеками:
- Создание чека при оплате или вручную.
- Отправка чека во внешнюю систему.
- Обновление статуса чека в платформе.
Установите модуль:
- вручную, если он представлен набором файлов;
- из стандартного репозитория при помощи пакетного менеджера.
После установки модуль становится доступен для выбора при создании онлайн-кассы в BILLmanager.
Платформа опрашивает каждый модуль при запуске, чтобы узнать о поддерживаемых возможностях. Это исключает неподдерживаемые вызовы и определяет поведение форм при настройке кассы.
Структура модуля
Стандартный набор файлов модуля выглядит следующим образом:
Где XXX — название модуля, указанное латиницей. Если основной скрипт имеет расширение файла, оно также включается в имя модуля. Например, если скрипт называется crmodulkassa.py, имя модуля — modulkassa.py.
Описание XML
Наименование файла должно иметь вид billmgr_mod_crXXX.xml, где XXX — имя модуля. Файл копируется в каталог /usr/local/mgr5/etc/xml/. Файл содержит описание самого модуля (описывается как плагин), а также описание дополнительных форм и сообщений:
В примере элемент plugin отвечает за описание самого модуля. Свойство name совпадает с именем модуля. Элемент group со значением cash_register указывает, что модуль используется для онлайн-касс.
Элемент metadata с именем cashregister.edit.XXX отвечает за дополнительные поля модуля при добавлении и настройке кассы. Разместите поля в элементе <page name="methodprops"> для корректного отображения на формах в BILLmanager. Атрибут private="yes" запрещает вывод значения в открытом виде при экспорте настроек и используется для секретных данных, таких как ключи API или пароли.
Блок <messages name="payment_cash_register.include"> задаёт отображаемое имя модуля в интерфейсе выбора касс.
Блок
<messages name="payment_cash_register.edit.crcustom">
содержит подписи и подсказки для полей формы настроек.
Блок
<messages name="msgerror">
определяет тексты ошибок, которые модуль может вернуть в ответе команды.
После создания или изменения XML-файла перезагрузите платформу для применения изменений:
/usr/local/mgr5/sbin/mgrctl -m billmgr exitПример модуля (Python)
Пример модуля онлайн-кассы BILLmanager для фискализации чеков через "Модулькасса" с использованием Python SDK доступен в открытом репозитории github.
Связанные статьи: