TicketRequest) и отчётов соответствуют этому протоколу.Оглавление
№ п.п. | Наименование разделов/подразделов | Номера страницe |
Общая информация | 3 | |
Структура сообщений | 3 | |
Сообщения | 3 | |
Заголовки сообщений | 3-5 | |
Коды команд | 5 | |
Коды ответов | 5-9 | |
Структура запроса к серверу | 9-10 | |
Структура ответа сервера | 10-11 | |
Сообщения | 11 | |
Служебный обмен | 11 | |
Инициализация | 11-12 | |
Обработка чека | 12-15 | |
Отраслевые реквизиты | 15-16 | |
Товары, работы, услуги | 16-22 | |
Дополнительные сервисные поля | 22 | |
Открытие смены | 22-23 | |
Закрытие смены | 23-26 | |
Внесение и снятие денег | 25-26 | |
Отправка и получение отчетов | 26-33 | |
Получение номенклатуры | 33-35 | |
Служебная часть сообщений | 35-40 | |
Авторизация | 41-42 | |
Типы данных | 42 | |
Дата | 42 | |
Время | 42-43 | |
Дата и время | 43 | |
Деньги | 43 | |
Вид отрасли | 43 | |
Операции с чеком | 43 | |
Типы оплат | 44 | |
Виды налогообложение | 44 | |
Типы налогов | 44 | |
Роли пользователей | 44 | |
Типы рекламных текстов для чека | 44 | |
Информация о рекламных текстах для чека | 44 | |
Процедуры установления связи | 45 | |
Работа в нормальном режиме | 45 | |
Работа в режиме блокировки | 46-47 | |
Работа в режиме серверной блокировки | 47-48 | |
Приложение | 49-52 |
Обмен контрольно-кассовых машин с функцией фиксации и (или) передачи данных (далее - устройство) с сервером оператора фискальных данных (далее-ОФД) осуществляется по TCP/IP протоколу. Инициатором всех сеансов связи является устройство. При обращении устройства к серверу ОФД устанавливается TCP соединение и производится обмен сообщениями. Поскольку TCP гарантирует доставку данных в неизменном виде. использование контрольных сумм не требуется.
В качестве основы для кодирования и декодирования (сериализации) информации предметной области предлагается использование Protocol Buffers, далее - protobuf. Особенности данного подхода:
В этом документе типы данных описаны в терминах protobuf. Если для конкретных случаев не сказано иное, диапазоны значений беззнаковых типов ограничиваются максимально допустимыми положительными значениями соответствующих знаковых чисел:
uint32 | 0 – 2 147 483 647 |
uint64 | 0 – 9 223 372 036 854 775 807 |
Все строковые переменные должны быть в кодировке UTF-8.
Сообщения, посылаемые клиентом, и ответы от сервера структурированы идентично. Шесть полей заголовка, описанного ниже, предваряют байты сериализованной с помощью protobuf структуры.
HEADER | PAYLOAD | |||||
APPCODE | VERSION | SIZE | ID | TOKEN | REQNUM | Protocol buffer bytes |
В заголовке передаются следующие обязательные поля:
Наименование | Тип данных | Длина, байт | Описание |
APPCODE | word | 2 | Код обозначения протокола, всегда равен 81A2h |
VERSION | word | 2 | Номер версии протокола. Нумеруется последовательно, начиная с 1. Соответствует текстовой версии протокола вида X.Y.Z, где:
Например, версия 101 эквивалентна «1.0.1». При достижении младшего разряда версии значения 9 следующее увеличение версии возможно только путем увеличения старшего разряда. Например: 139->140 («1.3.9» -> «1.4.0»), 194 -> 200 («1.9.4» -> «2.0.0») |
SIZE | double word | 4 | Общая длина всего сообщения, включая заголовок |
ID | double word | 4 | Идентификатор устройства, выданный ему во время регистрации |
TOKEN | double word | 4 | Cменяемый ключ обмена данными, предотвращающий компрометацию устройства. Сервер может прислать измененный токен в ответ на любую из команд COMMAND_TICKET, COMMAND_CLOSE_SHIFT, COMMAND_RESERVED, COMMAND_MONEY_PLACEMENT, COMMAND_CANCEL_TICKET описанных ниже. Сервер не может прислать измененный токен в ответ на любую из команд COMMAND_SYSTEM, COMMAND_REPORT, COMMAND_AUTH. |
REQNUM | word | 2 | Порядковый номер обращения к серверу. Инкрементный счетчик с шагом 1 с обнулением при достижении максимума. |
Все числа заголовка передаются в little-endian виде – сначала следуют младшие байты, затем старшие. Данный формат заголовка используется в обоих направлениях. Перед отправкой запроса устройство инкрементирует REQNUM и далее передает свой ID, последний TOKEN и новый REQNUM. Сервер отвечает устройству с теми же ID и REQNUM и может создать новый TOKEN или ответить с прежним. Устройство должно запомнить новое значение TOKEN, если он изменился, и в следующем обращении использовать его.
Функционал взаимодействия устройства и сервера описывается набором команд.
Название команды | Код команды | Значение | Описание |
Системный обмен | 0 | COMMAND_SYSTEM | Отправка серверу служебного пакета. |
Фискализация | 1 | COMMAND_TICKET | Отправка данных чека на сервер и обратное получение номера чека. |
Закрытие смены | 2 | COMMAND_CLOSE_SHIFT | Фиксация факта перехода смены |
Запрос отчета | 3 | COMMAND_REPORT | Команда на получение X, Z или иных отчетов |
Запрос номенклатуры | 4 | COMMAND_NOMENCLATURE | Запрос на загрузку текущей версии номенклатуры |
Инициализация | 5 | COMMAND_INFO | Запрос на получение информации о кассе |
Внесение/снятие денег | 6 | COMMAND_MONEY_PLACEMENT | Внесение и снятие наличных денежных средств |
Авторизация | 8 | COMMAND_AUTH | Запрос на авторизацию в системе |
Зарезервировано | 127 | COMMAND_RESERVED | Зарезервировано |
Сервер отвечает всегда с тем же кодом команды, с которым устройство обратилось к нему. Дополнительно сервер отсылает специальную структуру данных, содержащую код ответа и данные, специфичные для данного кода, если они необходимы. Список кодов ответа общего характера перечислен в данном разделе. Специфические коды ответов для конкретных команд описаны в соответствующих разделах.
Код ответа | Значение | Наименование | Описание |
0 | RESULT_TYPE_OK | Команда выполнена успешно | Аппарат работает в штатном режиме |
1 | RESULT_TYPE_UNKNOWN_ID | Неизвестный ID устройства | Аппарат не зарегистрирован в системе. Устройство должно заблокироваться. |
2 | RESULT_TYPE_INVALID_TOKEN | Неверный токен | Отправка данных невозможна, необходимо произвести сброс токена. Устройство блокируется до момента ввода корректного токена. |
3 | RESULT_TYPE_PROTOCOL_ERROR | Ошибка протокола | Ошибка протокола, обратитесь в сервисную службу. Устройство не должно проводить никаких операций до устранения проблемы. |
4 | RESULT_TYPE_UNKNOWN_COMMAND | Неизвестная команда | Ошибка протокола, обратитесь в сервисную службу. Устройство не должно проводить никаких операций до устранения проблемы. |
5 | RESULT_TYPE_UNSUPPORTED_COMMAND | Команда не поддерживается | Данная команда не поддерживается сервером, обратитесь в сервисную службу. Устройство не должно проводить никаких операций до устранения проблемы. |
6 | RESULT_TYPE_INVALID_CONFIGURATION | Неверные настройки устройства | сейчас не используется |
7 | RESULT_TYPE_SSL_IS_NOT_ALLOWED | Использование SSL не разрешено | Использование защищенного соединения запрещено. Подключите услугу или используйте открытый канал связи. Устройство должно перейти в аварийный режим до момента исправления конфигурации. |
8 | RESULT_TYPE_INVALID_REQUEST_NUMBER | Неправильный номер запроса | Порядковый номер запроса REQNUM тот же, что и в предыдущем запросе, но токен другой. Необходимо устранить эту проблему, и только потом продолжать обрабатывать другие операции. |
9 | RESULT_TYPE_INVALID_RETRY_REQUEST | Неправильная попытка отправки повторного запроса | REQNUM и TOKEN имеют те же значения, что и в предыдущем запросе, но код команды отличается. Необходимо устранить эту проблему, и только потом продолжать обрабатывать другие операции. |
11 | RESULT_TYPE_OPEN_SHIFT_TIMEOUT _EXPIRED | Время открытой смены истекло | Если истек период, в течение которого смена может быть открыта, то сервер будет возвращать эту ошибку, пока не закроется смена соответствующей командой. Сервер не будет возвращать такой код в ответ на досылку сообщений при выходе из автономного режима. |
12 | RESULT_TYPE_INVALID_LOGIN_PASSWORD (DEPRECATED) | Неправильное имя или пароль | |
13 | RESULT_TYPE_INCORRECT_REQUEST_DATA | Неверные входные данные | Данные корректны с точки зрения протокола, но неверны в конкретном контексте. Необходимо устранить эту проблему, и только потом продолжать обрабатывать другие операции. |
14 | RESULT_TYPE_NOT_ENOUGH_CASH | Недостаточно наличных | Указывает на недостаточность наличных в кассе во время расходных операций. |
15 | RESULT_TYPE_BLOCKED | Касса заблокирована | Если касса была заблокирована на сервере ОФД или Касса была снята с учета или Касса в команде COMMAND_TICKET не передала какой-либо из обязательных параметров, сервер ОФД вернет данную ошибку. Устройство должно перейти в режим блокировки. (см. п. 5.4) |
17 | RESULT_TYPE_SAME_TAXPAYER_AND_CUSTOMER | Совпадает значение ИИН/БИН покупателя и продавца | Необходимо устранить совпадение ИИН/БИН в чеке и отправить его повторно |
254 | RESULT_TYPE_SERVICE_TEMPORARILY | Сервис временно недоступен | Устройство должно разорвать соединение, и далее пытаться соединяться и отправлять данные в течение общего времени на обработку транзакции (см. п.50), по истечении которого устройство должно разорвать соединение и перейти в автономный режим. |
255 | RESULT_TYPE_UNKNOWN_ERROR | Неизвестная ошибка | Устройство должно разорвать соединение, и далее пытаться соединяться и отправлять данные в течение общего времени на обработку транзакции (см. п.50), по истечении которого устройство должно разорвать соединение и перейти в автономный режим. |
Запрос устройства к серверу описан в таблице.
Request | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
command | Код команды | Да | см. п. 2.3. 0данного документа | |
ticket | Чековая транзакция | да, если command = COMMAND_TICKET игнорируется в остальных случаях | ||
close_shift | Закрытие смены | да, если command = COMMAND_CLOSE_SHIFT игнорируется в остальных случаях | ||
report | Запрос отчета | да, если command = COMMAND_REPORT игнорируется в остальных случаях | ||
nomenclature | Синхронизация номенклатуры | да, если command = COMMAND_NOMENCLATURE игнорируется в остальных случаях | ||
service | Системная часть | обязательно для протокола 2.0.3 | см. п.0 3.10. | |
money_placement | Снятие/внесение наличных | да, если command = COMMAND_MONEY_PLACEMENT игнорируется в остальных случаях | ||
auth | Авторизация | да, если command = COMMAND_AUTH игнорируется в остальных случаях | ||
Ответ сервера на запрос устройства описан в таблице.
Response | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
command | Код команды | да | Тот же код, который был в запросе | |
result | Статус ответа | да | ||
ticket | Ответ на COMMAND_TICKET | обязательно только в ответ на указанную команду, игнорируется в остальных случаях | ||
report | Ответ на COMMAND_REPORT, COMMAND_CLOSE_SHIFT, COMMAND_INFO | обязательно только в ответ на указанные команды, игнорируется в остальных случаях | ||
nomenclature | Ответ на COMMAND_NOMENCLATURE | обязательно только в ответ на указанную команду, игнорируется в остальных случаях | ||
service | Системная часть | Нет | см. п.03.9. | |
auth | Ответ на COMMAND_AUTH | обязательно только в ответ на указанную команду, игнорируется в остальных случаях | ||
Поле | Наименование | Тип данных | Обязательно | Примечания |
result_code | Код ответа | uint32 | да | Тип uint32 позволяет использовать весь диапазон значений этого типа, что дает возможность не ломать бинарную совместимость при расширении набора кодов ответов. Однако для каждой конкретной версии протокола данное поле должно иметь значения из диапазона, задаваемого типом ResultTypeEnum. |
result_text | Строка ответа | string | нет | Строка с текстом системного характера для обработки ошибок |
Код команды | COMMAND_SYSTEM |
Служебный обмен предназначен для случаев, когда на сервер нужно отправить данные, не относящиеся к предметной области. Может рассматриваться как ping или keep-alive пакет. При низкой активности устройство может проводить регулярный служебный обмен с сервером для мониторинга его доступности. Специфичных данных не имеет, однако, как и все другие пакеты может содержать служебную информацию, описанную в пункте 3.9.0
Устройство может игнорировать ответ от сервера, так как сервер гарантированно не меняет текущий токен обмена в ответ на эту команду.
Устройство должно начинать работу с посылки запроса на инициализацию. При этом производится первичный обмен данными с сервером и последний подтверждает, что устройство зарегистрировано в системе и на нем установлен правильный токен.
В свою очередь устройство получает с сервера всю необходимую информацию для работы: текущее состояние счетчиков (X-отчет), рекламные тексты, регистрационную информацию и параметры налогообложения, установленные на серверной стороне.
Код команды | COMMAND_INFO |
Данных не предусмотрено
Заполнены два поля ответа. Более подробно поля описаны в п. 3.7. и 0п. 3.9.
ReportResponse | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
report | Тип отчета | Да |
| |
zx_report | Данные X\Z отчета | Да | Текущий X отчет, если смена открыта (report = REPORT_X), или же последний снятый Z отчёт, если открытой смены нет (report = REPORT_Z) | |
Служебный ответ (ServiceResponse) | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
ticket_ads | Рекламные тексты | List<TicketAd> | 0…n | Версии и типы рекламных текстов, распечатанных на чеке n==TicketAdTypeEnum::size |
reg_info | Регистрационная информация | Да | Информация об организации, кассе и торговой точке | |
last_document_info | Информация о последнем принятом документе | Нет | Сервер передает номер смены и номер последнего принятого документа | |
binded_taxation | Привязанное налогообложение | ServiceResponse::BindedTaxation | нет | |
Процедура обработки чека заключается в передаче данных о чеке на сервер и получении от него номера чека.
Код команды | COMMAND_TICKET |
Чек записывается в поле ticket запроса0.
Поле | Наименование | Тип данных | Обязательно | Примечания |
operation | Код операции с чеком | Да | ||
date_time | Дата и время операции | Да | ||
operator | Оператор-кассир | Да | ||
domain | Вид отрасли | Нет | ||
items | Список товаров, работ,услуг | List<TicketRequest::Item> | 1…n | |
payments | Список платежей разных типов | List<TicketRequest::Payment> | 0…n | Не более одного платежа каждого типа. См также |
taxes | Список налогов на сумму чека | List<TicketRequest::Tax> | 0…n | Налоги на позиции и налог на весь чек являются взаимоисключающими. При формировании чека можно указывать налоги либо для каждого элемента списка товаров, работ, услуг – items или на всю сумму чека в данном поле с разбивкой по типам налогов. Процент налога – уникальное поле (налог с определённым процентом должен встречаться не более одного раза). |
amounts | Итоги по чеку | да | ||
extension_options | Дополнительные сведения о покупателе | нет | ||
offline_ticket_ number | OFFLINE номер чека | uint32 | нет | Номер чека, сгенерированный устройством при работе в автономном режиме |
printed_document_ number | Номер печатного документа | uint64 | нет |
|
printed_ticket | Напечатанный чек, представленный одной строкой | string | нет | |
fr_shift_number | Номер текущей смены, считанный с ФР | uint32 | нет | Если поле отсутствует, сервер самостоятельно вычисляет номер смены |
parent_Ticket | Родительский чек | TicketRequest::ParentTicket | Нет | Поля содержат данные чека продажи или покупки, на основании которого оформляется возврат. (*) Обязательно при OperationTypeEnum == OPERATION_BUY_RETURN или OperationTypeEnum == OPERATION_SELL_RETURN |
Сфера деятельности (TicketRequest::Domain) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
type | Вид отрасли | Нет | ||
services | Атрибуты сферы услуг | Обазательно только если type == [DOMAIN_SERVICES | DOMAIN_HOTELS], игнорируется в остальных случаях | ||
gasoil | Атрибуты сферы обеспечения нефтепродуктами | Обазательно только при type == DOMAIN_GASOIL, игнорируется в остальных случаях | ||
taxi | Атрибуты такси | Обазательно при type == DOMAIN_TAXI, игнорируется в остальных случаях | ||
parking | Атрибуты стоянок | Обазательно при type == DOMAIN_PARKING, игнорируется в остальных случаях | ||
Поле | Наименование | Тип данных | Обязательно | Примечания |
type | Тип элемента | TicketRequest::Item:: ItemTypeEnum | Да | |
commodity | Предмет потребления | Обязательно только если type == ITEM_TYPE_COMMODITY игнорируется в остальных случаях | ||
storno_commodity | Сторно предмета потребления | TicketRequest::Item:: StornoCommodity | Обязательно только если type == ITEM_TYPE_STORNO_COMMODITY игнорируется в остальных случаях | |
markup | Наценка | Обязательно, только если type == ITEM_TYPE_MARKUP игнорируется в остальных случаях | ||
storno_markup | Сторно наценки | Обязательно, только если type == ITEM_TYPE_STORNO_MARKUP игнорируется в остальных случаях | ||
discount | Скидка | Обязательно, только если type == ITEM_TYPE_DISCOUNT игнорируется в остальных случаях | ||
storno_discount | Сторно скидки | Обязательно, только если type == ITEM_TYPE_STORNO_DISCOUNT игнорируется в остальных случаях | ||
Тип элемента списка товаров, работ, услуг (TicketRequest::Item::ItemTypeEnum) | ||
Значение | Описание | |
1 | ITEM_TYPE_COMMODITY | Предмет потребления |
2 | ITEM_TYPE_STORNO_COMMODITY | Сторно предмета потребления |
3 | ITEM_TYPE_MARKUP | Наценка |
4 | ITEM_TYPE_STORNO_MARKUP | Сторно наценки |
5 | ITEM_TYPE_DISCOUNT | Скидка |
6 | ITEM_TYPE_STORNO_DISCOUNT | Сторно скидки |
Элемент списка товаров, работ, услуг (TicketRequest::Item::Commodity) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
code | Код товара, работ, услуги | uint64 | нет | (*) Обязательно, если нет наименования товара, работы, услуги. Данное поле используется только в том случае, если касса работает с номенклатурой ОФД. |
name | Наименование товара, работ, услуги | string | да | |
section_code | Код секции или отдела | string | да | Сюда также входят: - номер раздаточного крана для бензоколонок; - тип услуги или подразделения для отелей и ресторанов. |
quantity | Количество товара, работы, услуги | Uint64 | да | В тысячных долях, например 1000 == 1,0, 2500 == 2,5 Сюда также входит оплаченный пробег для такси |
price | Цена товара, работы, услуги | да | Стоимость единицы товара, работы, услуги | |
sum | Итоговая сумма товара, работы, услуги | да | Итоговая сумма товара, работы, или услуги с учетом количества и исчисляемых налогов | |
taxes | Список налогов | List<TicketRequest::Tax> | 0…n | Налоги на позиции и налог на весь чек являются взаимоисключающими. При формировании чека нельзя указывать налоги в обеих секциях. Налог с определённым процентом должен встречаться не более одного раза. |
list_excise_stamp | Список кодов | List<string> | нет | Поле содержит список кодов DataMatrix из информационной системы маркировки и прослеживаемости товаров при его наличии для товаров имеющих одинаковый штрихкод (gtin/ntin). |
physical_label | Серия и номер акцизной марки | string | нет | Поле содержит серию и номер акцизной марки при её наличии. |
product_id | Сквозной идентификатор товара | uint64 | нет | (*) Обязательно для товаров модуля Виртуальный склад ИС ЭСФ, если не задано поле barcode. |
barcode | Штрих-код | string | нет | Поле содержит штрих-код GTIN при его наличии. (*) Обязательно для товаров модуля Виртуальный склад ИС ЭСФ, если не задано поле product_id. |
Ntin | Штрих-код | string | нет | Поле содержит штрих-код NTIN при его наличии. (*) Обязательно для товаров модуля Виртуальный склад ИС ЭСФ, если не задано поле product_id. |
measure_unit_code | Код единицы измерения | string | Нет – для версии протокола 2.0.2 и ниже Да – для версии протокола выше 2.0.0 | Код единицы измерения в ИС ЭСФ |
auxiliary | Дополнительная информация | 0…n | ||
Элемент списка товаров, работ, услуг(TicketRequest::Item::StornoCommodity) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
name | Наименование операции сторно | string | нет | |
section_code | Код секции или отдела | string | да | Сюда также входят: - номер раздаточного крана для бензоколонок; - тип услуги или подразделения для отелей и ресторанов. |
quantity | Количество товара, работы, услуги | uint64 | да | В тысячных долях, например 1000 == 1,0, 2500 == 2,5 Сюда также входит оплаченный пробег для такси |
price | Цена товара, работы, услуги | да | Стоимость единицы товара, работы, услуги | |
sum | Итоговая сумма товара, работы, услуги | да | Итоговая сумма товара или услуги с учетом количества и исчисляемых налогов | |
taxes | Список налогов | List<TicketRequest::Tax> | 0…n | Налоги на позиции и налог на весь чек являются взаимоисключающими. При формировании чека нельзя указывать налоги в обеих секциях. Налог с определённым процентом должен встречаться не более одного раза. |
list_excise_stamp | Список кодов | List<string> | нет | Поле содержит список кодов DataMatrix из информационной системы маркировки и прослеживаемости товаров при его наличии для товаров имеющих одинаковый штрихкод (gtin/ntin). |
physical_label | Серия и номер акцизной марки | string | нет | Поле содержит серию и номер акцизной марки при её наличии. |
product_id | Сквозной идентификатор товара | uint64 | нет | (*) Обязательно для товаров модуля Виртуальный склад ИС ЭСФ, если не задано поле barcode. |
barcode | Штрих-код | string | нет | Поле содержит штрих-код GTIN при его наличии. (*) Обязательно для товаров модуля Виртуальный склад ИС ЭСФ, если не задано поле product_id. |
ntin | Штрих-код | string | нет | Поле содержит штрих-код Ntin при его наличии. (*) Обязательно для товаров модуля Виртуальный склад ИС ЭСФ, если не задано поле product_id. |
measure_unit_code | Код единицы измерения | string | Да – для версии протокола выше 2.0.3 | Код единицы измерения в ИС ЭСФ |
auxiliary | Дополнительная информация | 0…n | ||
Модификатор стоимости (скидка/надбавка/сторно) (TicketRequest::Modifier) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
name | Наименование | string | да | |
sum | Сумма | да | ||
taxes | Список налогов | List<TicketRequest::Tax> | 0…n | Налог с определённым процентом должен встречаться не более одного раза. |
auxiliary | Дополнительная информация | 0…n | ||
Оплата(TicketRequest::Payment) | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
type | Вид оплаты | да | ||
sum | Уплаченная сумма | да | ||
card_payment_fields | Реквизиты оплаты картой | CardPaymentFields | нет | |
mobile_payments_fields | Реквизиты мобильного платежа | MobilePaymentFields | нет | |
Реквизиты оплаты картой (TicketRequest::Payment::CardPaymentFields) | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
pos_terminal_id | Уникальный идентификатор терминала | String | Нет | |
Тип карты | String | Нет | ||
pos_autorization_code | Код авторизации | Uint32 | Нет | |
pos_rrn | Уникальное значения номера операции (Reference Number) | Uint64 | Нет | |
pos_receipt_number | Номер чека в системе банка | Uint32 | Нет | |
Реквизиты мобильного платежа(TicketRequest::Payment::MobilePaymentFields) | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
qr_type | Тип оплаты QR | String | Нет | |
qr_id | Уникальный идентификатор платежа QR | String | Нет | |
Итоги по чеку (TicketRequest::Amounts) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
total | Общая сумма чека | да | ||
taken | Полученная сумма | нет* | (*) Обязательно при наличной оплате | |
change | Сумма сдачи | нет* | (*) Обязательно при наличной оплате | |
markup | Общая сумма наценки | нет* | (*) Это поле должно отсутствовать, если указана сумма скидок | |
discount | Общая сумма скидки | нет* | (*) Это поле должно отсутствовать, если указана сумма наценок | |
Родительский чек (TicketRequest::ParentTicket) | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
parent_ticket_number | Фискальный признак чека основания для возврата | String | Нет* | Поля содержат данные чека продажи или покупки, на основании которого оформляется возврат. (*) Обязательно при OperationTypeEnum == OPERATION_BUY_RETURN или OperationTypeEnum == OPERATION_SELL_RETURN |
parent_ticket_data_time | Дата и время операции родительского чека (чека основаия) | Нет* | ||
kgd_kkm_id | Регистрационный номер ККМ КГД чека основания для возврата | string | Нет* | |
parent_ticket_total | Общая сумма покупки или продажи чека основания для возврата | Нет* | ||
parent_ticket_is_offline | Флаг того, что чека основания для возврата был автономным. | bool | Нет* | |
Поле | Наименование | Тип данных | Обязательно | Примечания |
ticket_number | Номер чека | String | Да | |
qr_code | QR код | байтовый массив | Да | Для определенных видов устройств |
Код команды | COMMAND_CLOSE_SHIFT |
Поле | Наименование | Тип данных | Обязательно | Примечания |
close_time | Дата и время закрытия | Да | ||
is_offline | Происходило ли закрытие смены в автономном режиме | bool | Нет | Если поле отсутствует, считается, что закрытие смены происходило в нормальном режиме |
fr_shift_number | Номер текущей (закрываемой) смены, считанный с ФР | uint32 | Нет | Если поле отсутствует, сервер самостоятельно вычисляет номер смены |
withdraw_money | Производить автоматическое изъятие (COMMAND_MONEY_PLACEMENT) всей наличности из кассы перед закрытием смены | bool | Нет | Если поле отсутствует, изъятие не производится |
z_report | Данные Z отчета | Да — для версии протокола 2.0.2 и выше | Если поле отсутствует, сервер самостоятельно формирует Z-отчет | |
printed_document_number | Номер печатного документа | uint64 | нет | Номер, определяемый в рамках собственной пользовательской нумерации печатных документов. |
operator | Оператор-кассир | Да — для версии протокола 2.0.2 и выше | ||
В ответ присылается Z отчет. См. также Ошибка! Источник ссылки не найден.
ReportResponse | ||||
Поле | Наименование | Тип данных | Обяз. | Примечания |
report | Тип отчета | Да | REPORT_Z | |
zx_report | Данные Z отчета | Да | Отчет по закрываемой смене | |
При закрытии смены в автономном режиме результирующий Z-отчёт должен быть сформирован клиентской стороной самостоятельно на основании локально вычисляемых счётчиков. Когда устройство перейдёт в нормальный режим локально вычисляемые счётчики должны быть синхронизированы с Z-отчётом, полученным с сервера.
Код | Значение | Описание |
0 | MONEY_PLACEMENT_DEPOSIT | Внесение денег в кассу |
1 | MONEY_PLACEMENT_WITHDRAWAL | Снятие денег из кассы |
Код команды | COMMAND_MONEY_PLACEMENT |
Поле | Наименование | Тип данных | Обязательно | Примечания |
datetime | Дата и время операции | да | ||
operation | Тип операции | да | ||
sum | Сумма | да | ||
is_offline | Происходила ли операция внесения/снятия в автономном режиме | bool | нет | Если поле отсутствует, то считается, что операция происходила в нормальном режиме |
fr_shift_number | Номер текущей смены, считанный с ФР | uint32 | нет | Если поле отсутствует, сервер самостоятельно вычисляет номер смены |
printed_document_number | Номер печатного документа | uint64 | нет | Номер, определяемый в рамках собственной пользовательской нумерации печатных документов. |
operator | Оператор-кассир | Да — для версии протокола 2.0.2 и выше | ||
Данных не предусмотрено.
Отправка на сервер текущего X отчета или последнего Z отчет и получение данные от сервера для формирования и вывода стандартных отчетов по закрытиям смен и переходным остаткам.
Код | Значение | Описание |
0 | REPORT_Z | Z-отчет |
1 | REPORT_X | X-отчет |
Код команды | COMMAND_REPORT |
Поле | Наименование | Тип данных | Обязательно | Примечания |
report | Тип отчета | Да | Возможные значения: - REPORT_Z для запроса последнего Z отчета; - REPORT_X для запроса текущего X отчета | |
date_time | Дата и время | Да | Дата и время совершения запроса. | |
is_offline | Происходил ли запрос в автономном режиме | bool | Нет | Если поле отсутствует, значит, запрос происходил в нормальном режиме. |
zx_report | Данные X или Z отчета | Да, для версии протокола 1.2.5 и выше. | ||
Поле | Наименование | Тип данных | Обязательно | Примечания |
report | Тип отчета | Да | То же значение, что и при отправке на сервер | |
zx_report | Данные X или Z отчета | Да | В этом поле всегда будет отчет. Если был запрошен Z-отчёт, но это первая смена и еще нет ни одного Z отчета, то в ответ будет возвращён пустой отчёт, у которого проставлен номер смены 0 и дата, скопированные из запроса. | |
Устройство может игнорировать ответ от сервера, так как сервер гарантированно не меняет текущий токен обмена в ответ на эту команду.
Z-отчет и X-отчет имеют одинаковую структуру.
Основная часть ZX-отчета (ZXReport) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
date_time | Дата и время отчета | да | ||
open_shift_time | Дата и время открытия смены | DateTime | Да, для протокола версии 2.0. и выше. | |
close_shift_time | Дата и время закрытия смены | DateTime | Да, для Z-отчета и для протокола версии 2.0.2 и выше. | |
shift_number | Номер смены | uint32 | да | Сквозной номер смены с момента регистрации кассы |
sections | Итоги по операциям в каждом отделе | List<ZXReport::Section> | 0…n | Без учета скидок и надбавок |
operations | Итоги по операциям суммарно по всем отделам | List<ZXReport::Operation> | n | Без учета скидок и надбавок n == OperationTypeEnum::size |
discounts | Итоги по скидкам | List<ZXReport::Operation> | n | n == OperationTypeEnum::size |
markups | Итоги по наценкам | List<ZXReport::Operation> | n | n == OperationTypeEnum::size |
total_result | Окончательные итоги по операциям | List<ZXReport::Operation> | n | С учетом скидок и надбавок n == OperationTypeEnum::size |
taxes | Итоги по налогам | List<ZXReport::Tax> | 0…n | Налог с определённым процентом должен встречаться не более одного раза. |
start_shift_ non_nullable_sums | Необнуляемые суммы на начало смены | List<ZXReport::NonNullableSum> | n | Список с необнуляемыми суммами по операциям на начало смены n == OperationTypeEnum::size |
ticket_operations | Итоги по чекам по каждой операции | List<ZXReport::TicketOperation> | n | n == OperationTypeEnum::size |
money_placements | Итоги по операциям с наличными | List<ZXReport::MoneyPlacement> | n | n == MoneyPlacementEnum::size |
cash_sum | Сумма наличных в кассе | да | ||
revenue | Выручка | да | ||
non_nullable_sums | Необнуляемые суммы на момент снятия отчёта (для Z-отчёта – на конец смены) | List<ZXReport::NonNullableSum> | n | Список с необнуляемыми суммами по операциям n == OperationTypeEnum::size |
checksum | Контрольная сумма | string | Да, для протокола 2.0.2 и выше. | |
Итоги по отделу(ZXReport::Section) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
section_code | Номер/название отдела | string | да | |
operations | Итоги по видам операций | List<ZXReport::Operation> | n | n == OperationTypeEnum::size |
Итоги по виду операции (продажа, покупка, возвраты) ZXReport::Operation | ||||
Наименование | Тип данных | Обязательно | Примечания | |
operation | Тип операции | да | ||
count | Количество операций | uint32 | да | |
sum | Операций на сумму | да | ||
Итоги по налогу (ZXReport::Tax) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
type | Тип налога | да | ||
percent | Значение налога в процентах | uint32 | да | В тысячных долях, например 12000 == 12,0% |
operations | Итоги по операциям по данному налогу | List<ZXReport::Tax::TaxOperation> | n | n == OperationTypeEnum::size |
Итоги по виду операции в рамках налога (продажа, покупка, возвраты) (ZXReport::Tax::TaxOperation) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
operation | Тип операции | да | ||
turnover | Итоговая сумма по операциям, облагаемым налогом | да | ||
turnover_without_tax | Итоговая сумма по операциям, без учета налога | да | ||
sum | Сумма налога | да | ||
Необнуляемая сумма (ZXReport::NonNullableSum) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
operation | Тип операции | да | ||
sum | Сумма | да | ||
Итоги по операциям с чеками (ZXReport::TicketOperation) | |||||
Наименование | Тип данных | Обязательно | Примечания | ||
operation | Тип операции | да | |||
tickets_total_count | Общее количество чеков по данной операции | uint32 | да | ||
tickets_count | Количество чеков по данной операции за смену | uint32 | да | ||
tickets_sum | Сумма по чекам по данной операции за смену | да | |||
payments | Итоги по видам расчетов | List<ZXReport::TicketOperation::Payment> | n | n == PaymentTypeEnum::size | |
offline_count | Количество чеков за смену в автономном режиме | uint32 | Да, для протокола версии 2.0.2 и выше. | ||
discount_sum | Сумма скидки по всем чекам за смену | ||||
markup_sum | Сумма наценки по всем чекам за смену | ||||
change_sum | Сумма сдачи по всем чекам за смену | ||||
Итоги по виду расчетов (ZXReport::TicketOperation::Payment) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
payment | Вид расчетов | да | То же, что «Вид оплаты» в чеке. | |
sum | Сумма по данному виду расчетов | да | ||
count | Количество платежей | uint32 | Да, для протокола версии 2.0.2 и выше. | |
Итоги по виду операций с наличными (ZXReport::MoneyPlacement) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
operation | Вид операции | да | ||
operations_total_count | Общее количество операций данного вида | uint32 | да | |
operations_count | Количество операций данного вида за смену | uint32 | да | |
operations_sum | Сумма денег по операции данного вида за смену | да | ||
offline_count | Количество операций данного вида за смену в автономном режиме | uint32 | Да, для протокола версии 2.0.2 и выше. | |
Выручка(ZXReport::Revenue) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
sum | Сумма выручки | да | ||
is_negative | Является ли сумма выручки отрицательной | bool | да | |
При снятии отчёта в автономном режиме клиентская сторона генерирует соответствующий отчёт на основании локально вычисляемых счётчиков. При возврате в нормальный режим, значения счетчиков синхронизируется с X отчетом, получаемым в процессе инициализации, описанном в п.3.2. 0
Загрузка и обновление номенклатуры в ККМ устройствах. Касса обращается к серверу, передавая номер версии номенклатуры, загруженной в нее. Если на сервере версия номенклатуры отличается, то на кассу будет произведена загрузка всей номенклатуры текущей версии. Если Касса передает GTIN либо NTIN в поле barcode, то сервер отправляет актуальную информацию по данному товару согласно сведений государственной база данных национального каталога товаров.
Код команды | COMMAND_NOMENCLATURE |
NomenclatureRequest | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
current_version | Текущая версия | uint32 | Да | Если номенклатуры на устройстве нет, то current_version=0 |
barcode | Штрих код | string | Нет | В данном поле ККМ передаёт либо GTIN либо NTIN. |
NomenclatureResponse | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
version | Версия номенклатуры | uint32 | Да, нет с версии 2.0.3 | |
created_time | Дата и время создания версии номенклатуры | нет | ||
elements | Список номенклатурных единиц (группа или товар) | 0…n | Если актуальная версия номенклатуры совпадает с текущей версией на кассе, то список пуст. | |
result | Статус ответа | да | ||
Код ответа (NomenclatureResponse ::NomenclatureResultTypeEnum) | ||
Код | Значение | Описание |
0 | RESULT_TYPE_OK | Номенклатура найдена, и все её элементы загружены на кассу. |
1 | RESULT_TYPE_VERSION_IS_ACTUAL | Актуальная версия номенклатуры совпадает с версией, загруженной на кассу. |
2 | RESULT_TYPE_NO_VERSION | Не найдены версии номенклатуры, готовые к загрузке |
3 | RESULT_TYPE_ELEMENT_NOT_FOUND_BY_BARCODE | Товар в НКТ отсутствует |
Поле | Наименование | Тип данных | Обязательно | Примечания |
type | Тип элемента | Да | ||
title | Название товара, работы, услуги/группы | string | Да | На русском языке |
title_kk | Название товара, работы, услуги/группы | string | Нет | На казахском языке |
parent_group_id | ID родительской группы | uint64 | Нет | id родительской группы, у корневого элемента отсутствует. |
id | ID элемента | uint64 | да | |
item | описание товара | Нет (см. примечания) | если type== ITEM, то обязательно | |
Тип элемента номенклатуры (NomenclatureResponse::ElementTypeEnum) | ||
Код | Значение | Описание |
0 | GROUP | Элемент является группой |
1 | ITEM | Элемент является товаром, работ, услуг |
Поле | Наименование | Тип данных | Обязательно | Примечания |
article | Артикул | string | нет | |
barcode | Штрих код | string | нет | Обязательно при ntin== null |
ntin | Штрих код | string | нет | Обязательно при barcode == null |
description | Описание позиции | string | нет | |
purchase_price | Цена закупки | Да, нет версии 2.0.3 | ||
sell_price | Цена продажи | Да, нет с версии 2.0.3 | ||
taxes | Налоги | 0…n | n == TaxTypeEnum::size | |
measure_count | Количество единиц измерения | uint32 | нет | В тысячных долях Например, если имеется товар, расфасованный по 100 грамм, тогда: - если measure_title= «граммы», то measure_count=100000 - если measure_title= «килограммы», то measure_count=1000 |
measure_title | Наименование единицы измерения | string | нет | |
measure_fractional | Признак, является ли единица измерения дробной | bool | нет | Например, килограммы – дробная, штуки – нет. |
measure_unit_code | Код единицы измерения | string | нет | Код единицы измерения в ИС ЭСФ |
is_markedeac | Признак маркировки | bool | Нет | Для товаров подлежащих обязательной маркировки |
is_social | Признак социально значимого потребительского товара | bool | Нет | Для товаров относящихся к СЗПТ |
Поле | Наименование | Тип данных | Обязательно | Примечания |
taxation_type | Вид налогообложения | да | ||
tax_type | Тип налога | да | ||
tax_percent | Значение налога в процентах | uint32 | да | В тысячных долях процента, например 12000 == 12,0% |
Служебная часть предназначена для контроля состояния ККМ и его обслуживания. Возможна передача системных пакетов при каждом обращении к серверу. Задачи:
Код команды | COMMAND_SYSTEM если команда идет в отдельном запросе, иначе код основной команды запроса. |
Поле | Наименование | Тип данных | Обязательно | Примечания |
comm_quality | Качество связи | нет | ||
software_information | Информация о среде исполнения | ServiceRequest::SoftwareInformation | нет | |
security_stats | Безопасность и статистика | ServiceRequest::SecurityStats | нет* | Обязательно для команд; COMMAND_TICKET COMMAND_CLOSE_SHIFT COMMAND_REPORT COMMAND_MONEY_PLACEMENT |
offline_period | Автономный режим | да | Время перехода в автономный режим и возврата в нормальный режим | |
nomenclature_version | Версия номенклатуры | uint32 | нет | Текущая версия номенклатуры, загруженной в кассу |
ticket_ad_infos | Информация о рекламных текстах | List<TicketAdInfo> | 0…n | Версии и типы рекламных текстов, загруженных на ККМ n==TicketAdTypeEnum::size |
get_reg_info | Признак получения регистрационной информации | bool | да | С помощью этого флага ККМ может запросить информацию об организации, кассе и/или торговой точке |
get_binded_taxation | Признак получения привязанного налогообложения | bool | нет | Устройство может получить привязанное налогообложение, выставив это флаг в true |
auxiliary | Дополнительная информация | 0…n | ||
reg_info | Регистрационные данные | ServiceRequest::RegInfo | да | Устройство должно отправлять эти данные в каждом фискальном запросе |
Качество соединения (ServiceRequest::CommQuality) | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
avg_connect_time | uint32 | да | ||
avg_ping | uint32 | нет | ||
loss_ratio | uint32 | нет | ||
Информация о среде исполнения (ServiceRequest::SoftwareInformation) | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
module_infos | Информация о программном модуле | ServiceRequest::SoftwareInformation::ModuleInformation | 0…n | |
hardware_arch | Архитектура процессора | string | нет | |
os_family | Семейство ОС | string | нет | |
os_version | Версия ОС | string | нет | |
os_extended_info | Дополнинельная информация об ОС | string | нет | |
runtime_version | версия платформы для Java и C# библиотек | string | нет | |
partner_id | Id партнера | uint32 | нет | |
Информация о модуле ПО (ServiceRequest::SoftwareInformation::ModuleInformation) | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
name | Название модуля | uint32 | да | |
version | Версия модуля | uint32 | да | |
build_info | Информация о сборке | uint32 | нет | |
device_info | Информация об устройстве | ServiceRequest::SoftwareInformation::ModuleInformation:: DeviceInformation | нет | |
extended_info | Дополнительная информация | 0…n | ||
build_arch | Архитектура сборки | string | нет | |
Информация об устройстве (ServiceRequest::SoftwareInformation::ModuleInformation::DeviceInformation) | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
manufacturer | Производитель | string | нет | |
model | Модель | string | нет | |
firmware_version | Версия прошивки | string | нет | |
Безопасность и статистика (ServiceRequest::SecurityStats) | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
geo_position | Геопозиция | ServiceRequest::SecurityStats::GeoPosition | Да | |
Геоданные (ServiceRequest::SecurityStats::GeoPosition) | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
latitude | Широта | uint32 | да | в 10000 долях |
longitude | Долгота | uint32 | да | в 10000 долях |
source | Источник геолокации | string | да | Источник геолокационных полученных от оператора связи |
Регистрационные данные (ServiceRequest::RegInfo) | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
kkm | Информация о ККМ | да | ||
org | Информация об организации | да | ||
Служебный ответ (ServiceResponse) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
ticket_ads | Рекламные тексты | List<TicketAd> | 0…n | Версии и типы рекламных текстов, распечатанных на чеке n==TicketAdTypeEnum::size |
reg_info | Регистрационная информация | да | Информация об организации, кассе и торговой точке | |
binded_taxation | Привязанное налогообложение | ServiceResponse::BindnedTaxation | нет | |
auxiliary | Дополнительная информация | KeyValuePair | 0…n | |
Дополнительная информация (ServiceResponse::RegInfo) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
kkm | Информация о ККМ | да | ||
pos | Информация о торговой точке | нет | ||
org | Информация об организации | да | ||
Информация о последнем принятом документе (ServiceResponse::LastDocumentInfo) | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
fr_shift_number | Номер смены | uint32 | да | |
printed_document_number | Номер документа | uint64 | да | |
Регистрационные данные ККМ (KkmRegInfo) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
point_of_payment_number | Регистрационный номер (код) точки приема платежей | string | нет | |
terminal_number | Номер платежного терминала | string | нет | |
fns_kkm_id | Регистрационный номер ККМ, выданный КГД | string | Да, начиная с версии протокола 2.0.2 обязательно для команд COMMAND_CLOSE_SHIFT и COMMAND_REPORT | |
serial_number | Заводской номер ККМ | string | ||
kkm_id | Идентификационный номер ККМ | string | ||
Регистрационные данные торговой точки (PosRegInfo) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
title | Название торговой точки | string | да | |
address | Адрес торговой точки | string | да | |
address_kz | Адрес торговой точки на гос языке | string | да | |
latitude | Широта | uint32 | Да | в 10000 долях |
longitude | Долгота | uint32 | Да | в 10000 долях |
Регистрационные данные организации (OrgRegInfo) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
title | Название организации или ФИО индивидуального предпринимателя | string | да | |
address | Юридический адрес организации | string | да | |
address_kz | Юридический адрес организации на гос языке | string | да | |
iin | ИИН/БИН | string | да | |
oked | Общий классификатор экономической деятельности (далее - ОКЭД) | string | да | |
BindedTaxation | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
type | Тип налогообложения | TaxationTypeEnum | да | |
taxes | Ставки для каждого налога | List<BindedTax> | 0..n | Не более одной структуры для каждого налога |
BindedTaxation::BindedTax | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
type | Тип налога | TaxTypeEnum | да | |
percent | Значение налога в процентах | uint32 | да | В тысячных долях процента, например 1500 == 1,5% |
При возврате из автономного режима по процедуре, описанной в0, устройство сообщает об общем времени нахождения в автономном режиме, добавляя ко всем сообщениям эту структуру.
Данных не предусмотрено.
ККМ может присылать версию номенклатуры, которая загружена у него в настоящий момент.
ККМ заполняет поле ServiceRequest::nomenclature_version своим значением версии.
Данных не предусмотрено.
В чеках могут содержаться текстовые блоки рекламного или информационного характера. Значения этих текстовых блоков синхронизируются в соответствующих полях служебного пакета. ККМ может добавлять в запрос информацию о версиях текстов, которые у него имеются, а сервер, при необходимости, возвращает новые версии.
ККМ заполняет поле ServiceRequest::ticket_ad_infos своими значениями.
Рекламный текстовый блок (TicketAd) | ||||
Наименование | Тип данных | Обязательно | Примечания | |
info | Информация о текстовом блоке | да | ||
text | Текст | string | да | |
Система позволяет авторизовать кассира путем проверки его имени и пароля. В случае успешной авторизации кассе возвращаются код и имя оператора. В случае неудачи кассе вернется код ответа RESULT_TYPE_INVALID_LOGIN_PASSWORD.
Необходимо заметить, что этот вызов не создает никаких сессий и является опциональным, то есть устройства, которые заинтересованы в парольной аутентикации оператора и в получении информации об его или её ролях и профиле могут им воспользоваться. Другие устройства или системы, которые могут сами однозначно ассоциировать текущего оператора с его operator_id могут не делать этот вызов. Сервер будет доверять клиенту в вопросе аутентикации, то есть будет верить в правильность присылаемых во всех других вызовах operator_id. Однако сервер будет всегда проверять клиента в вопросах авторизации, то есть определять валидность выполнения конкретной операции именно этим оператором на данной кассе.
Устройство может игнорировать ответ от сервера, так как сервер гарантированно не меняет текущий токен обмена в ответ на эту команду.
Код команды | COMMAND_AUTH |
Поле | Наименование | Тип данных | Обязательно | Примечания |
login | Имя пользователя | string | да | |
password | Пароль | string | да | |
AuthResponse | ||||
Наименование | Тип данных | Обязательно | Примечания | |
result | Результат авторизации | да | ||
operator_code | Код оператора-кассира | uint32 | нет* | (*)Обязательно при result == RESULT_TYPE_OK |
operator_name | Наименование оператора-кассира | string | нет* | (*)Обязательно при result == RESULT_TYPE_OK |
roles | Роли пользователя | List<UserRoleEnum> | 0…n | Список ролей, назначенных пользователю n==UserRoleEnum::size |
Код результата авторизации (AuthResponse::ResultTypeEnum) | ||
Значение | Описание | |
0 | RESULT_TYPE_OK | Успешно |
1 | RESULT_TYPE_INVALID_LOGIN_PASSWORD | Не успешно |
Поле | Наименование | Тип данных | Обязательно | Примечания |
year | Год | uint32 | да | Четыре цифры, например: 2013 |
month | Месяц | uint32 | да | Диапазон 1-12 |
day | День | uint32 | да | Диапазон 1-31 |
Сервер сохраняет значения дат в том виде, в котором он их принимает с устройства без учета часового пояса.
Поле | Наименование | Тип данных | Обязательно | Примечания |
hour | Час | uint32 | да | Диапазон 0-23 |
minute | Минута | uint32 | да | Диапазон 0-59 |
second | Секунда | uint32 | нет | Диапазон 0-59 |
Поле | Наименование | Тип данных | Обязательно | Примечания |
date | Дата | да | ||
time | Время | да | ||
Поле | Наименование | Тип данных | Обязательно | Примечания |
bills | Основных единиц | uint64 | да | Количество основных денежных единиц |
coins | Разменных единиц | uint32 | да | Количество разменных денежных единиц |
Код | Значение | Описание |
0 | DOMAIN_TRADING | Торговая сфера |
1 | DOMAIN_SERVICES | Сфера услуг |
2 | DOMAIN_GASOIL | Сфера обеспечения нефтепродуктами |
3 | DOMAIN_HOTELS | Отели и рестораны |
4 | DOMAIN_TAXI | Такси |
5 | DOMAIN_PARKING | Стоянки |
Код | Значение | Описание |
0 | OPERATION_BUY | Покупка |
1 | OPERATION_BUY_RETURN | Возврат покупки |
2 | OPERATION_SELL | Продажа |
3 | OPERATION_SELL_RETURN | Возврат продажи |
Код | Значение | Описание |
0 | PAYMENT_CASH | Наличные |
1 | PAYMENT_CARD | Банковская карта |
4 | PAYMENT_MOBILE | Мобильные |
Код | Значение | Описание |
100 | STS | СНР на основе упрощенной декларации |
101 | RTS | Общеустановленный режим налогообложения |
102 | TRFF | СНР для крестьянских или фермерских хозяйств |
103 | TRBP | СНР на основе патента |
Код | Значение | Описание |
100 | VAT | НДС |
UserRoleEnum | ||
Значение | Описание | |
1 | USER_ROLE_PAYMASTER | Кассир |
2 | USER_ROLE_CHIEF_PAYMASTER | Старший кассир |
3 | USER_ROLE_ADMINISTRATOR | Администратор |
TicketAdTypeEnum | ||
Значение | Описание | |
0 | TICKET_AD_OFD | Текст оператора фискальных данных |
1 | TICKET_AD_ORG | Текст организации |
2 | TICKET_AD_POS | Текст точки продажи |
3 | TICKET_AD_KKM | Текст ККМ |
4 | TICKET_AD_INFO | Информационное сообщение |
TicketAdInfo | ||||
Наименование | Тип данных | Обязательно | Примечания | |
type | Тип текста | да | ||
version | Версия текста | uint64 | да | |
KeyValuePair | ||||
Наименование | Тип данных | Обязательно | Примечания | |
key | Ключ | string | да | |
value | Значение | string | нет | |
4.14. Сведения об операторе-кассире
Оператор-кассир (Operator) | ||||
Поле | Наименование | Тип данных | Обязательно | Примечания |
code | Код оператора-кассира | uint32 | да | Сюда также входят: - номер оператора для бензоколонок; - шифр официанта или портье для отелей и ресторанов - идентификатор водителя для такси. |
name | ФИО оператора-кассира | string | нет | |
Для проведения сеанса связи устройство должно соединиться с сервером, используя его сетевой адрес. При успешном соединении с сервером устройство работает в штатном режиме в соответствии с протоколом. Для разрешения случаев неуспешных сеансов связи вводятся следующие понятия:
Следует иметь в виду, что общее время на обработку транзакции учитывает все вышеперечисленные случаи. Например, при обрыве интернет-канала сначала может произойти разрыв соединения с сервером (b.), а затем серия безуспешных попыток соединений (c.). Все эти действия происходят в пределах общего времени на обработку транзакции.
При отсутствии связи, неполучении ответа от сервера или получении от сервера некоторых кодов ошибок (см 0) устройство должно перейти в автономный режим. При этом:
При восстановлении связи ККМ устройство должно выполнить следующие действия:
Время автономной работы рассчитывается с момента первой неудавшейся попытки отправить чек до момента успешного соединения.
В этот режим устройство должно переходить, если какое либо из OFFLINE сообщений при успешной передаче на сервер вызывает устойчивую ошибку. Такая ситуация не может быть разрешена автоматически и требует вмешательства человека.
В этом режиме никакая работа не разрешена, до тех пор, пока сообщение, вызывающее проблемы не будет удалено из очереди после соответствующего анализа.
В этот режим устройство должно переходить, если от сервера приходит ответ с RESULT_CODE_BLOCKED. Устройство должно напечатать и/или вывести на экран ранее полученное от сервера информационное сообщение — ServiceResponse.ticket_ads (тип TICKET_AD_INFO).
В этом режиме никакая работа не разрешена. Устройство должно периодически отправлять на сервер запрос COMMAND_SYSTEM с заполненным данными service.reg_info.
Устройство выходит из режима блокировки когда получит от сервера ответ с RESULT_CODE_OK.
Версия | Дата | Описание изменений |
2.0.3 | 29.08.2025 | 1) Повышение разрядности поля quantity в типе TicketRequest::Item::Commodity и TicketRequest::Item::StornoCommodity с uint32 до uint64. 2) Повышение разрядности поля pos_rrn в типе TicketRequest::Item::Payment::CardPaymentFields с uint32 до uint64 3) В NomenclatureRequest добавлено поле barcode для получения данных из НКТ по GTIN или NTIN. |
18.06.2025 | 1) В подпункте 3.3.3. «Дополнительные сервисные поля» добавлены поля, которые необходимы при возврате товаров, работ и услуг: - Фискальный признак чека основания для возврата - Дата и время чека основания для возврата - Общая сумма покупки или продажи чека основания для возврата - Флаг того, что чека основания для возврата был автономным. 2) Исключена команды и операция аннулированию чека подпункты 2.3, 2.4, 3) В пункте (TicketRequest::Item::Commodity) изменено описание «list_excise_stamp» 4) Добавлена новая структура: Безопасность и статистика (ServiceRequest::SecurityStats) Геоданные (ServiceRequest::SecurityStats::GeoPosition) 5) В структуре (TicketRequest::Item::Commodity) (Nomenclature Response::Item) добавлено поле NTIN. | |
2.0.2 | 18.05.2021 | Исключена команда OpenShift и все связанные с ней поля; Добавлена ошибка с с кодом 17 ошибка RESULT_TYPE_SAME_TAXPAYER_AND_CUSTOMER Добвлен подраздел 4.13 «Дополнительная информация в формате key, value»; Сведения по оператору-кассиру перенесены из раздела TicketRequest в в раздел 4 «Типы данных»; Из служебного запросы исключено поле security_stats; В MoneyPlacementRequest добавлено поле содержащие информацию об операторе-кассире. |
2.0.1 | 01.03.2021 12.02.2021 | В пункте 3.3.3. «Дополнительные сервисные поля» дополнено поле ИИН/БИН покупателя, с обозначением «не обязательно»; Добавлено в пункте в пункте 4.7 «Типы оплаты», оплата «мобильные»; Исключено в пункте в пункте 4.7 «Типы оплаты», оплата тарой и оплата в кредит; |
2.0.0 | 25.12.2020 29.09.2020 | 1. Изменено описание обязательности полей в части содержания чека в соответствии с пунктом 6 статьи 166 Налогового кодекса, передачи данных сведений от устройства на сервер ОФД и передачи сервера ОФД в ИС КГД. 2. Приведен в соответствие п. 3.7 Итоги по виду операции в рамках налога (продажа, покупка, возвраты)/ ZXReport::Tax::TaxOperation, с учетом дополнения поля «turnover_without_tax». 3. 3. В Служебный ответ (ServiceResponse) добавлено необязательное поле last_document_info и соответствующий тип данных LastDocumentInfo. 4. Тип поля printed_document_number изменен на uint64. 5. В структуру запроса к серверу добавлено поле open_shift для передачи данных по команде OpenShift. 6. В команду MoneyPlacement добавлено поле printed_document_number. 7. В команду OpenShift добавлено поле printed_document_number. 8. В команду CloseShift добавлено поле printed_document_number. 9. При использовании команды OpenShift поле printed_document_number становится обязательным для команд: Ticket, MoneyPlacement, CloseShift, OpenShift. 10. При использовании команды OpenShift поле fr_shift_number становится обязательным для команд: Ticket, MoneyPlacement, CloseShift. Сервер не вычисляет номер смены. 11. Описание использования параметров printed_document_number (номер документа) и fr_shift_number (номер смены) в Системе. 12. Устройство ответственно за ведение этих номеров. Сервер ОФД номера не вычисляет, ведет следующий контроль: 1) номер открываемой смены должен быть всегда на 1 больше предыдущей, в противном случае - ошибка. 2) номер документа должен быть всегда больше номера предыдущего документа. Если меньше или равен - ошибка. 3) сообщение с номером смены не равному номеру текущей смены не обрабатывается - ошибка. Номер документа, таким образом, отменяет использование в качестве идентификатора сообщения номер запроса(reqnum) и соответственно решается проблема дублей. Все эти механизмы будут работать, только для моделей, поддерживающих команду OpenShift. В ИС ОФД будет вестись учет моделей касс, которые используют эти расширения Протокола. |
1.2.5. | 23.08.2016 | п. 3.7. В структуру ZXReport::TicketOperation::Payment добавлено поля count п. 3.7. В структуру ZXReport::MoneyPlacement добавлены поля offline_count п. 3.7. В структуру ZXReport::TicketOperation добавлены поля offline_count, discount_sum, withdraw_sum, change_sum п. 3.7. В структуру ZXRepоrt добавлены поля opens_shift_time, close_shift_time, checksum п. 3.9: - В структуру KkmRegInfo добавлено поле kkm_id - Изменено описание обязательности полей fns_kkm_id, serial_number для структуры KkmRegInfo - Изменено описание обязательности поля inn для структуры OrgRegInfo п. 2.5.: Изменено описание обязательности поля ServiceRequest п. 3.7.: В структуре ReportRequest добавлено поле zx_report для передачи Z отчета от устройства к серверу. Для версии протокола 1.2.5 и выше это поле обязательно. п. 3.5.: В структуре CloseShiftRequestдобавлено поле z_report для передачи Z отчета от устройства к серверу. Для версии протокола 1.2.5 и выше это поле обязательно. п. 3.5.: В структуре CloseShiftRequestдобавлено поле operator. Для версии протокола 1.2.5 и выше это поле обязательно. п. 3.3.: В структуре TicketRequest::Item::Commodity, TicketRequest::Item::StornoCommodity, TicketRequest::Item::StornoCommodity, TicketRequest::Modifier и TicketRequest::ExtensionOptions добавлены поля auxiliary для передачи дополнительной информации п. 3.3, 3.5, 3.6.: В структуре TicketRequest, CloseShiftRequest и MoneyPlaementRequest добавлено поле shift_document_number |
1.2.4 | 02.12.2015 | п. 3.3: в структуры TicketRequest::Item::Commodity и TicketRequest::Item::StornoCommodity добавлены поля для передачи номера акцизной марки |
1.2.3 | 10.06.2015 | п. 2.4: добавлен код ответа RESULT_CODE_BLOCKED
п. 4.11: добавлено новое значение TICKET_AD_INFO для перечисляемого типа TicketAdTypeEnum п. 5.4: добавлен режим серверной блокировки |
1.2.2 | 10.03.2015 | п. 3.9: добавлены поля ServiceRequest::auxiliary, ServiceResponse::auxiliary |
03.03.2015 | п. 3.9: ServiceRequest::SoftwareInfo -> ServiceRequest::SoftwareInformation, переделана информация о ПО, добавлены ServiceRequest::CommQuality, ServiceRequest::CommQuality::loss_ratio, ServiceRequest::SoftwareInformation::ModuleInformation, ServiceRequest::SoftwareInformation::ModuleInformation::DeviceInformation п. 4.13: добавлено поле KeyValuePair | |
04.02.2015 |
| |
27.01.2015 |
| |
1.2.1 | 30.10.2014 |
|
1.2.0 | 12.08.2014 |
|
26.06.2014 |
| |
25.06.2014 |
| |
16.06.2014 |
| |
10.06.2014 |
| |
02.06.2014 |
| |
1.1.0. | 29.05.2014 |
|
19.05.2014 |
| |
07.04.2014 |
| |
01.04.2014 |
| |
07.03.2014 |
| |
14.02.2014 |
| |
1.0.1 | 23.01.2014 |
|
100 | 15.01.2014 |
|