1. Описание
1.1. Цель
Обеспечить возможность фискализации онлайн платежей, сделанных Интернет-магазином.
1.2. Термины и определения
- Инициатор фискализации оплаты
-
Внешний сервис, который создает документ на оплату, инициирует процесс его фискализации и ожидает его успешного завершения.
Например, это может быть Интернет-магазин, платежный шлюз, CMS система либо 1C интеграция. - Сервер фискализации
-
Сервер МодульКассы выступающий в роли посредника обмена данными между приложением МодульКасса на кассовом аппарате и
инициаторами фискализации оплаты - Касса
-
Программно-аппаратный комплекс в который входит кассовый аппарат на операционной системе Андроид, с установленным приложением МодульКасса, с подключенной к нему ККМ с фискальным накопителем (ФН).
- Оператор фискальных данных (ОФД)
-
Операторы, на которых возлагается обязанность сбора, подтверждения, систематизации и отправки кассовых чеков в налоговые органы
- Фискальный регистратор (ККМ, ККТ)
-
Контрольно-кассовая машина, служащая для регистрации приобретения товара и печати кассового чека.
Может быть двух типов:-
Физическая касса с встроенным ФН-ом (вариант с подключаемым дополнительно принтером), предназначенная для приема наличных и безналичных платежей непосредственно в розничной точке
-
Физическая касса с встроенным ФН без чекопечатающего устройства, предназначена для установки в стойки (ЦОД) или самостоятельно.
Предназначены для приема только безналичных платежей.
-
1.3. Работа со сменами
Подразумевается возможность одновременной работы онлайн кассы МодульКасса и сервиса фискализации онлайн чеков интернет-магазинов.
Для этого необходимо понимать, что будет существовать разделение смен в онлайн кассе и смен в фискальном регистраторе, а именно:
-
Смена фискального накопителя открывается кассой по мере необходимости.
Общий алгоритм работы приложения со сменой ФН такой - при получении документа для фискализации приложение проверяет текущий статус смены.
Если текущая смена превысила 24 часа, приложение закрывает ее и открывает новую.
Таким образом обеспечивается минимальное возможное количество смен, при этом закон не нарушается - в одной смене зарегистрированы только документы созданные в течении 24 часов от открытия смены. -
Все смены онлайн кассы МодульКасса - программные, то есть не вызывающие закрытие смены в ККТ и, следовательно, печать Z-отчета.
В целом, если торговая точка настроена на режим работы с Интернет-магазином, то учитывая специфику работы Интернет-магазина (а это означает доступность 24/7),
смена в ККТ будет вестись на основе смен Интернет-магазина с продолжительностью 24 часа.
Смены, которые ведутся в онлайн-кассе, будут вестись независимо от смены в ККТ и никак не фиксироваться в фискальном регистраторе.
1.5. Описание процесса фискализации
Весь процесс можно разделить на несколько шагов:
-
Оформление чека в Интернет-магазине
-
заполнение корзины, то есть процесс, предваряющий оплату, и переход к процессу оплаты.
-
-
Отправка документа на сервер интеграции. Документу присваивается уникальный идентификатор (UUID) для последующего опроса состояния документа на сервере
-
Приемка документа сервером фискализации
-
Постановка документов в очередь на обработку кассой.
-
-
Получение документов кассой
-
Опрос сервера фискализации на наличие документов на обработку раз в 5 секунд.
-
Проведение продажи и ее фискализация
-
Касса регистрирует продажу в ФН. ФН отправляет данные в ОФД, который
отправляет покупателю на электронную почту письмо чеком.
-
-
Касса отправляет на сервер фискализации уведомление о результате
фискализации - успешно или ошибка. В случае успеха касса также отправляет
на сервер фискальную информацию зарегистрированного документа (номер
чека ФН, номер смены, фискальный признак документа и т.д.) -
Сервер фискализации оповещает Интернет-магазин (если требовалось) о результате фискализации.
1.6. Подключение к API
Существуют два базовых URL сервиса - один для тестирования, другой для реального использования.
Для тестирования используется базовый URL: https://demo-fn.avanpos.com/fn
Его особенность заключается в том, что все документы на него виртуально “фискализируются” всегда, без ошибок.
Учетные данные используются с реального сервиса МодульКасса, зарегистрировать аккаунт можно на https://my.modulkassa.ru,
но связки с розничными точками (полученные методом /associate) собственные, т.е. учетные данные полученные от /associate на этом URL не подойдут для настоящего использования.
Так же в этом случае разделяются и документы - все проведенные документы на этом сервере не будут фигурировать в реальном, их нельзя будет увидеть в личном кабинете.
Для реального использования базовым URL является https://my.modulkassa.ru/api/fn
Учетные записи в нем используются с реального сервиса МодульКасса, зарегистрировать аккаунт можно на https://my.modulkassa.ru.
Этот URL используют кассы для отправки чеков в фискальный накопитель и ОФД, поэтому на него нужно отправлять уже реально оплаченные клиентами документы.
2. Описание методов
2.1. Создание авторизационных данных для отправки чеков на фискализацию для определенной точки продаж
POST /fn/v1/associate/{retailPointId}
2.1.1. Описание
Запрос выполняется с логином-паролем, полученными при включении сервиса "Чеки интернет-магазина". При повторном выполнении запроса пароль обновляется.
2.1.2. Параметры
Тип | Имя | Описание | Схема |
---|---|---|---|
Path |
retailPointId |
ID точки продаж |
string |
Query |
clientId |
ID клиентского приложения Параметр заполняется, если есть несколько приложений, отправляющих документы для одной точки продаж. Если приложение одно, то можно не передавать этот параметр |
string |
2.1.3. Ответы
HTTP код | Описание | Схема |
---|---|---|
200 |
OK |
|
401 |
Запрос не авторизован |
Без содержимого |
403 |
У пользователя недостаточно прав для работы с указанной точкой продаж |
Без содержимого |
404 |
Точка продаж не найдена |
Без содержимого |
2.1.4. Пример запроса
POST https://my.modulkassa.ru/api/fn/v1/associate/12345678-90ab-cdef-1234-000000000000?clientId=my_crm
Тело ответа
{
"userName" : "4f4c789c-3863-41d3-aea9-c35b5a9e7f18",
"password" : "12345AbcDe",
"name" : "ТЦ \"Европа\"",
"address" : "г.Москва"
}
2.2. Удаление авторизационных данных для отправки чеков на фискализацию
DELETE /fn/v1/associate
2.2.1. Описание
Запрос выполняется с логином/паролем, полученными при выполнении запроса associate.
2.2.2. Ответы
HTTP код | Описание | Схема |
---|---|---|
200 |
Авторизационные данные успешно удалены |
Без содержимого |
401 |
Запрос не авторизован |
Без содержимого |
403 |
У пользователя недостаточно прав |
Без содержимого |
2.3. Опрос готовности сервиса фискализации
GET /fn/v1/status
2.3.1. Описание
Запрос выполняется с логином/паролем, полученными при выполнении запроса associate.
2.3.2. Ответы
HTTP код | Описание | Схема |
---|---|---|
200 |
OK |
|
401 |
Запрос не авторизован |
Без содержимого |
403 |
У пользователя недостаточно прав |
Без содержимого |
2.4. Отправка документа на фискализацию
POST /fn/v2/doc
2.4.1. Описание
Запрос выполняется с логином/паролем, полученными при выполнении запроса associate.
2.4.2. Параметры
Тип | Имя | Описание | Схема |
---|---|---|---|
Body |
Тело запроса |
Данные документа |
2.4.3. Ответы
HTTP код | Описание | Схема |
---|---|---|
200 |
OK |
|
400 |
Некорректный запрос |
Без содержимого |
401 |
Запрос не авторизован |
Без содержимого |
403 |
У пользователя недостаточно прав |
Без содержимого |
2.4.4. Пример запроса
POST https://my.modulkassa.ru/api/fn/v2/doc
Тело запроса
{
"id" : "4f4c789c-3863-41d3-aea9-c35b5a9e7f18",
"docNum" : "SALE-12345",
"docType" : "SALE",
"checkoutDateTime" : "2020-02-26T06:41:04+07:00",
"email": "client@myshop.ru",
"cashierName": "Иванова А.А.",
"cashierInn": "0123456789",
"cashierPosition": "Кассир",
"taxMode": "COMMON",
"textToPrint": "Текст для печати на чеке",
"clientName": "Заказчик",
"clientInn": "9876543210",
"inventPositions" : [ {
"barcode" : "123456789",
"name" : "Товар 1",
"description" : "Описание товара",
"paymentObject" : "service",
"paymentMethod" : "partial_payment",
"price" : 100.00,
"quantity" : 1.0,
"vatTag" : 1102,
"customsDeclarationNumber" : "123456",
"originCountryCode" : "643",
"supplierInfo": {
"phones": ["+79999999999"],
"name": "Название организации поставщика",
"inn": "8233362424"
}
}, {
"inventCode" : "GOOD-124",
"barcode" : "987654321",
"name" : "Товар 2",
"paymentObject" : "commodity",
"paymentMethod" : "full_payment",
"price" : 100.00,
"vatTag" : 1102,
"quantity" : 1.0
} ],
"moneyPositions": [ {
"paymentType": "CASH",
"sum": 200.00
} ],
"responseURL" : "https://your-callback-service.com/complete-doc?id=1",
"agentInfo": {
"types": [
"another"
],
"payingAgent": {
"operation": "Наименование операции",
"phones": ["+79999999999"]
},
"receivePaymentsOperator": {
"phones": ["+79999999999"]
},
"moneyTransferOperator": {
"phones": ["+79999999999"],
"name": "Наименование оператора перевода",
"address": "г. Москва, ул. Пушкина, д. 1",
"inn": "8233362424"
}
}
}
Тело ответа
{
"status": "COMPLETED",
"fnState": "READY",
"fiscalInfo" : {
"shiftNumber": 29,
"checkNumber": 77,
"kktNumber": "99921192",
"fnNumber": "92",
"fnDocNumber": 46,
"fnDocMark": 92,
"date": "2020-02-26T00:31:19.000+0000",
"sum": "57.00",
"checkType": "SALE",
"qr": "t=20200226T073119&s=57.00&fn=92&i=0000000046&fp=92&n=1"
},
"failureInfo": null,
"message": "Document queued for printing",
"timeStatusChanged": "2020-02-26T07:32:19+07:00"
}
2.4.5. Проведение продажи
Касса с периодичностью в 5 секунд опрашивает сервер фискализации о наличии документов для фискализации.
Если такой документ есть, сервер передает его кассе и ставит документу статус PENDING
.
Получив документ, сервис выполняет проведение продажи/возврата и его фискализацию через фискальный регистратор в порядке очереди размещения документов, то есть самый старший документ в списке будет обработан самым первым.
Фискализация проводится по возможности без применения печати на бумажном чеке, статус выполнения каждой задачи регистрируется отдельно и отсылается на сервер фискализации.
2.4.6. Отправка сообщения об успешной операции в Интернет-магазин
Интернет-магазин, если нужно, может указать о необходимости сообщить ему результат фискализации по конкретному документу (установить параметр responseURL
в документе), иначе ему придется опрашивать сервер фискализации с какой-либо периодичностью для отслеживания статуса документа.
2.5. Получение статуса документа
GET /fn/v1/doc/{id}/status
2.5.1. Описание
Запрос выполняется с логином/паролем, полученными при выполнении запроса associate.
2.5.2. Параметры
Тип | Имя | Описание | Схема |
---|---|---|---|
Path |
id |
ID документа |
string |
2.5.3. Ответы
HTTP код | Описание | Схема |
---|---|---|
200 |
OK |
|
400 |
Некорректный запрос |
Без содержимого |
401 |
Запрос не авторизован |
Без содержимого |
403 |
У пользователя недостаточно прав |
Без содержимого |
2.5.4. Пример запроса
GET https://my.modulkassa.ru/api/fn/v1/doc/12345678-90ab-cdef-1234-000000000000/status
Тело ответа
{
"status": "QUEUED",
"fnState": "READY",
"fiscalInfo": null,
"failureInfo": null,
"message": "Document queued for printing",
"timeStatusChanged": "2019-09-16T14:01:08+00:00"
}
2.6. Повторное проведение документа
PUT /fn/v1/doc/{id}/re-queue
2.6.1. Описание
Возможность перепровести документ со статусом FAILED (ошибка). Запрос выполняется с логином/паролем, полученными при выполнении запроса associate.
2.6.2. Параметры
Тип | Имя | Описание | Схема |
---|---|---|---|
Path |
id |
ID документа |
string |
2.6.3. Ответы
HTTP код | Описание | Схема |
---|---|---|
200 |
OK |
|
400 |
Некорректный запрос |
Без содержимого |
401 |
Запрос не авторизован |
Без содержимого |
403 |
У пользователя недостаточно прав |
Без содержимого |
3. Модель данных
3.1. RetailPointAssociation
Имя | Описание | Схема |
---|---|---|
userName |
Имя пользователя |
string |
password |
Пароль |
string |
name |
Название точки продаж |
string |
address |
Адрес точки продаж |
string |
3.2. FNStatus
Имя | Описание | Схема |
---|---|---|
status |
Статус сервиса фискализации:
|
enum (ASSOCIATED, READY, DISABLED, FAILED) |
dateTime |
Дата установки статуса. Если касса длительное время не присылала состояние ФН, это может сигнализировать о наличии у нее каких-то проблем (нет связи с сервером, удалили приложение МодульКасса). Клиент должен проверять дату статуса, если дата последней установки статуса отстает на продолжительное время, сигнализировать в службу поддержки. |
string (date-time) |
3.3. Document
Имя | Описание | Схема |
---|---|---|
id |
ID документа по внешней системе |
string |
docNum |
Номер документа |
string |
documentType |
Тип документа:
|
enum (SALE, RETURN, BUY, BUY_RETURN) |
checkoutDateTime |
Время создания документа на оплату |
string (date-time) |
printReceipt |
Печатать ли бумажный чек на кассе при фискализации |
boolean |
textToPrint |
Текст для печати на кассе |
string |
cashierName |
Комментарий для печати на чеке был изменён |
string |
cashierInn |
Валидный ИНН кассира |
string |
cashierPosition |
Должность кассира |
string |
email |
Адрес электронной почты или телефон покупателя |
string |
responseURL |
URL для подтверждения успешной фискализации на стороне Интернет-магазина |
string |
taxMode |
Режим налогообложения:
|
enum (COMMON, SIMPLIFIED, SIMPLIFIED_WITH_EXPENSE, ENVD, COMMON_AGRICULTURAL, PATENT) |
clientName |
Наименование организации или ФИО клиента, серия и номер паспорта покупателя (клиента) |
string |
clientInn |
Валидный ИНН организации или покупателя (клиента) |
string |
inventPositions |
Позиции документа |
< InventPosition > array |
moneyPositions |
Список оплат |
< MoneyPosition > array |
agentInfo |
Атрибуты агента |
3.4. MoneyPosition
Имя | Описание | Схема |
---|---|---|
paymentType |
Тип оплаты:
|
enum (CARD, CASH, PREPAID, POSTPAY, OTHER) |
sum |
Сумма оплаты |
number |
3.5. InventPosition
Имя | Описание | Схема |
---|---|---|
inventCode |
Код товара |
string |
barcode |
Штрихкод товара |
string |
name |
Наименование товара |
string |
price |
Цена за единицу товара |
number |
quantity |
Количество единиц товара |
number |
discSum |
Сумма скидки, примененной на позицию |
number |
originCountryCode |
Код страны происхождения товара (из ОКСМ) |
string |
customsDeclarationNumber |
Номер таможенной декларации |
string |
vatTag |
Признак налогообложения:
|
integer (int32) |
vatSum |
Сумма НДС за предмет расчета |
number |
paymentObject |
Предмет расчета. Список доступных значений:
По умолчанию : "commodity"
|
enum (commodity, excise, job, service, gambling_bet, gambling_prize, lottery, lottery_prize, intellectual_activity, payment, agent_commission, composite, another, property_right, non-operating_gain, insurance_premium, sales_tax, resort_fee) |
paymentMethod |
Признак расчета. Список доступных значений:
По умолчанию : "full_payment"
|
enum (full_prepayment, prepayment, advance, full_payment, partial_payment, credit, credit_payment) |
nomenclatureCode |
Код товара в шестнадцатеричном представлении с пробелами. Максимальная длина – 32 байта. |
string |
productMark |
Товарная марка |
string |
agentInfo |
Атрибуты агента |
|
supplierInfo |
Атрибуты поставщика |
3.6. AgentInformation
Имя | Описание | Схема |
---|---|---|
types |
Признак агента по предмету расчёта (ограничен агентами, введенными в ККТ при фискализации). Возможные значения:
|
< enum (bank_paying_agent, bank_paying_subagent, paying_agent, paying_subagent, attorney, commission_agent, another) > array |
payingAgent |
Атрибуты платежного агента |
|
receivePaymentsOperator |
Атрибуты оператора по приему платежей |
|
moneyTransferOperator |
Атрибуты оператора перевода |
3.7. PayingAgent
Имя | Описание | Схема |
---|---|---|
operation |
Наименование операции |
string |
phones |
Телефоны платежного агента. Номер телефона необходимо передать вместе с кодом страны без пробелов и дополнительных символов, кроме символа |
< string > array |
3.8. ReceivePaymentsOperator
Имя | Описание | Схема |
---|---|---|
phones |
Телефоны оператора по приему платежей. Номер телефона необходимо передать вместе с кодом страны без пробелов и дополнительных символов, кроме символа |
< string > array |
3.9. MoneyTransferOperator
Имя | Описание | Схема |
---|---|---|
phones |
Телефоны оператора по приему платежей. Номер телефона необходимо передать вместе с кодом страны без пробелов и дополнительных символов, кроме символа |
< string > array |
3.10. SupplierInformation
Имя | Описание | Схема |
---|---|---|
phones |
Телефоны поставщика. Номер телефона необходимо передать вместе с кодом страны без пробелов и дополнительных символов, кроме символа |
< string > array |
name |
Наименование поставщика |
string |
inn |
ИНН поставщика |
string |
3.11. DocumentStatus
Имя | Описание | Схема |
---|---|---|
status |
Статус документа:
|
enum (QUEUED, PENDING, PRINTED, WAIT_FOR_CALLBACK, COMPLETED, FAILED, REQUEUED) |
fnState |
Статус сервиса фискализации:
|
enum (ASSOCIATED, READY, DISABLED, FAILED) |
fiscalInfo |
Фискальная информация чека |
|
failureInfo |
Информация об ошибке |
|
message |
Результат фискализации документа / сообщение об ошибке |
string |
timeStatusChanged |
Время последнего изменения статуса документа |
string (date-time) |
3.12. FiscalInfo
Имя | Описание | Схема |
---|---|---|
shiftNumber |
Номер смены в фискальном накопителе |
integer (int32) |
checkNumber |
Номер документа в фискальном накопителе |
integer (int32) |
kktNumber |
Заводской номер ККТ |
string |
fnNumber |
Заводской номер фискального накопителя |
string |
fnDocNumber |
Номер документа в фискальном накопителе (ФД) |
integer (int32) |
fnDocMark |
Фискальный признак документа (ФПД) |
integer (int64) |
date |
Дата и время фискализации документа |
string (date-time) |
sum |
Сумма документа |
number |
checkType |
Тип документа |
enum (SALE, RETURN, PURCHASE, RETURN_PURCHASE, SALE_CORRECTION, RETURN_CORRECTION, PURCHASE_CORRECTION, RETURN_PURCHASE_CORRECTION) |
qr |
Содержимое QR кода (печатается на кассе) |
string |
ecrRegistrationNumber |
Заводской номер ККТ |
string |
3.13. FailureInfo
Ошибка фискализации документа
Имя | Описание | Схема |
---|---|---|
type |
Тип ошибки |
enum (FN_MEMORY_OVERFLOW, FN_EXPIRED, FN_GENERIC_FAILURE, NON_FN_FAILURE) |
message |
Сообщение об ошибке |
string |