Начало работы с драйвером
Подключение к проекту
C/C++
Для использования драйвера из проекта, написанного на C/C++, нужно добавить к нему в зависимости библиотеку fiscal_core_driver.dll (в случае Linux: libfiscal_core_driver.so) соответствующей архитектуры и подключить заголовочный файл libfptr10.h. Для C++ можно использовать отдельную обертку.
С++-обёртке можно передать путь к библиотеке драйвера (до каталога или до файла). Если путь не передан (или он пустой), обёртка будет искать драйвер в следующих каталогах по очереди:
- Рядом с исполняемым файлом приложения;
- В каталоге, указанном при установке драйвера с инсталлятора;
- В системных каталогах ОС.
Поддерживается работа на Windows и Linux.
Java
Для подключения драйвера к Java-проекту необходимо подключить библиотеку libfiscal_core_driver.jar.
При работе на Windows и Linux обёртке можно передать путь к библиотеке драйвера (до каталога или до файла). Если путь не передан (или он пустой), обёртка будет искать драйвер в следующих каталогах по очереди:
- В java.library.path и системных каталогах;
- В каталоге, указанном при установке драйвера с инсталлятора.
Поддерживается работа на Windows и Linux.
COM-объект
Для подключения драйвера как COM-объект необходимо зарегистрировать в системе библиотеку fiscal_core_driver_com.dll с помощью команды regsvr32.exe. Библиотека может сама обнаружить установленный через инсталлятор драйвер. Также инсталлятор автоматически регистрирует компонент заданной архитектуры в процессе установки. В проекте необходимо создать объект типа ActiveX (или OLE) класса AddIn.FiscalCore1.
Поддерживается работа только на Windows.
Инициализация драйвера
Инициализация драйвера
#include "libfptr10.h"
libfptr_handle fptr;
libfptr_create(&fptr);
#include "libfptr10.h"
// Можно загрузить обертку с указанием пути к библиотеке драйвера
Fptr fptr_lib("C:\\path\\to\\libraries\\directory\\fiscal_core_driver.dll");
// А можно без, чтобы обертка нашла драйвер по стандартным путям
Fptr fptr_common;
import ru.neva.drivers.fptr.Fptr;
import ru.neva.drivers.fptr.IFptr;
// Можно загрузить обертку с указанием пути к библиотеке драйвера
IFptr fptr_lib = new Fptr("C:\\path\\to\\libraries\\directory\\fptr10.dll");
// Можно - с указанием каталога библиотеки
IFptr fptr_dir = new Fptr("C:\\path\\to\\libraries\\directory");
// А можно без, чтобы обертка нашла драйвер по стандартным путям
IFptr fptr_common = new Fptr();
import ru.atol.drivers10.fptr.Fptr;
import ru.atol.drivers10.fptr.IFptr;
IFptr fptr = new Fptr(getApplicationContext());
Инициализация драйвера с указанием идентификатора (KKT1)
#include "fptr10.h"
libfptr_handle fptr;
libfptr_create_with_id(&fptr, L"KKT1");
#include "fptr10.h"
// Можно загрузить обертку с указанием пути к библиотеке драйвера
Fptr fptr_lib(fptr_id_t(L"KKT1"), L"C:\\path\\to\\libraries\\directory\\fptr10.dll");
// Можно - с указанием каталога библиотеки
Fptr fptr_path(fptr_id_t(L"KKT1"), L"C:\\path\\to\\libraries\\directory");
// А можно без, чтобы обертка нашла драйвер по стандартным путям
Fptr fptr_common(fptr_id_t(L"KKT1"));
import ru.neva.drivers.fptr.Fptr;
import ru.neva.drivers.fptr.IFptr;
// Можно загрузить обертку с указанием пути к библиотеке драйвера
IFptr fptr_lib = new Fptr("KKT1", "C:\\path\\to\\libraries\\directory\\fptr10.dll");
// Можно - с указанием каталога библиотеки
IFptr fptr_dir = new Fptr("KKT1", "C:\\path\\to\\libraries\\directory");
// А можно без, чтобы обертка нашла драйвер по стандартным путям
IFptr fptr_common = new Fptr("KKT1", null);
import ru.atol.drivers10.fptr.Fptr;
import ru.atol.drivers10.fptr.IFptr;
IFptr fptr = new Fptr(getApplicationContext(), "KKT1");
В начале работы необходимо инициализировать рабочий экземпляр драйвера.
Все дальнейшие операции производятся именно над этим экземпляром.
В случае использования варианта с передачей идентификатора все записанные драйвером логи будут разделяться по разным файлам. Строка идентификатора может содержать только строчные и заглавные латинские буквы и цифры, а также символы тире и подчеркивания ([a-zA-Z0-9_-]). Если идентификатор не удовлетворяет требованиям, драйвер вернёт код результата -2, а языковые обертки вернут ошибки/выбросят исключения средствами соответствующего языка. При передаче пустого идентификатора создание объекта отрабатывает аналогично созданию без идентификатора.
Рекомендации по работе с экземпляром драйвера
- рекомендуется пользоваться идеологией "Одна ККТ - один экземпляр драйвера";
- рекомендуется работа с одним экземпляром драйвера строго в одном потоке, если есть необходимость, пользователь должен позаботиться о потокобезопасном использовании экземпляра драйвера;
- при пересоздании экземпляра драйвера следует не забывать удалять старый экземпляр (см. Деинициализация драйвера), в противном случае это приведёт к утечке памяти;
- при потере связи с ККТ рекомендуется не пересоздавать экземпляр драйвера, а переподключиться к ККТ, используя методы open() и close().
Запрос версии драйвера
Запрос версии драйвера
char *version = libfptr_get_version_string();
std::string version = fptr.version();
String version = fptr.version();
String version = fptr.version();
Драйвер позволяет получить свою версию в виде строки.
Деинициализация драйвера
Деинициализация драйвера
libfptr_destroy(&fptr);
// Деинициализируется автоматически в деструкторе
fptr.destroy();
fptr.destroy();
Когда работа с ККТ более не требуется, можно уничтожить рабочий экземпляр. При этом автоматически разорвется соединение с ККТ. После выполнения метода дальнейшая работа с данным экземпляром драйвера невозможна.
Настройка драйвера
Настройка драйвера, способ первый
wchar_t settings[1024] = {0};
swprintf(&settings[0], 1024, L"{\"%ls\": %d, \"%ls\": %d, \"%ls\": \"%ls\", \"%ls\": %d}",
LIBFPTR_SETTING_MODEL, LIBFPTR_MODEL_NEVA_AUTO,
LIBFPTR_SETTING_PORT, LIBFPTR_PORT_COM,
LIBFPTR_SETTING_COM_FILE, L"COM5",
LIBFPTR_SETTING_BAUDRATE, LIBFPTR_PORT_BR_115200);
libfptr_set_settings(fptr, settings);
wchar_t settings[1024] = {0};
swprintf(&settings[0], 1024, L"{\"%ls\": %d, \"%ls\": %d, \"%ls\": \"%ls\", \"%ls\": %d}",
LIBFPTR_SETTING_MODEL, LIBFPTR_MODEL_NEVA_AUTO,
LIBFPTR_SETTING_PORT, LIBFPTR_PORT_COM,
LIBFPTR_SETTING_COM_FILE, L"COM5",
LIBFPTR_SETTING_BAUDRATE, LIBFPTR_PORT_BR_115200);
fptr.setSettings(settings);
settings = String.format("{\"%s\": %d, \"%s\": %d, \"%s\": \"%s\", \"%s\": %d}",
IFptr.LIBFPTR_SETTING_MODEL, IFptr.LIBFPTR_MODEL_NEVA_AUTO,
IFptr.LIBFPTR_SETTING_PORT, IFptr.LIBFPTR_PORT_COM,
IFptr.LIBFPTR_SETTING_COM_FILE, "COM5",
IFptr.LIBFPTR_SETTING_BAUDRATE, IFptr.LIBFPTR_PORT_BR_115200);
fptr.setSettings(settings);
settings = String.format("{\"%s\": %d, \"%s\": %d, \"%s\": \"%s\", \"%s\": %d}",
IFptr.LIBFPTR_SETTING_MODEL, IFptr.LIBFPTR_MODEL_NEVA_AUTO,
IFptr.LIBFPTR_SETTING_PORT, IFptr.LIBFPTR_PORT_COM,
IFptr.LIBFPTR_SETTING_COM_FILE, "COM5",
IFptr.LIBFPTR_SETTING_BAUDRATE, IFptr.LIBFPTR_PORT_BR_115200);
fptr.setSettings(settings);
Настройка драйвера, способ второй
libfptr_set_single_setting(fptr, LIBFPTR_SETTING_MODEL, std::to_wstring(LIBFPTR_MODEL_NEVA_AUTO).c_str());
libfptr_set_single_setting(fptr, LIBFPTR_SETTING_PORT, std::to_wstring(LIBFPTR_PORT_COM).c_str());
libfptr_set_single_setting(fptr, LIBFPTR_SETTING_COM_FILE, L"COM5");
libfptr_set_single_setting(fptr, LIBFPTR_SETTING_BAUDRATE, LIBFPTR_PORT_BR_115200);
libfptr_apply_single_settings(fptr);
fptr.setSingleSetting(LIBFPTR_SETTING_MODEL, std::to_wstring(LIBFPTR_MODEL_NEVA_AUTO));
fptr.setSingleSetting(LIBFPTR_SETTING_PORT, std::to_wstring(LIBFPTR_PORT_COM));
fptr.setSingleSetting(LIBFPTR_SETTING_COM_FILE, L"COM5");
fptr.setSingleSetting(LIBFPTR_SETTING_BAUDRATE, LIBFPTR_PORT_BR_115200);
fptr.applySingleSettings();
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_MODEL, String.valueOf(IFptr.LIBFPTR_MODEL_NEVA_AUTO));
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_PORT, String.valueOf(IFptr.LIBFPTR_PORT_COM));
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_COM_FILE, "COM5");
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_BAUDRATE, String.valueOf(IFptr.LIBFPTR_PORT_BR_115200));
fptr.applySingleSettings();
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_MODEL, String.valueOf(IFptr.LIBFPTR_MODEL_NEVA_AUTO));
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_PORT, String.valueOf(IFptr.LIBFPTR_PORT_COM));
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_COM_FILE, "COM5");
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_BAUDRATE, String.valueOf(IFptr.LIBFPTR_PORT_BR_115200));
fptr.applySingleSettings();
Настройка через вызов окна настройки
libfptr_show_properties(fptr, LIBFPTR_GUI_PARENT_NATIVE, <дескриптор окна>);
fptr.showProperties(LIBFPTR_GUI_PARENT_HATIVE, <дескриптор окна>);
fptr.showProperties(IFptr.LIBFPTR_GUI_PARENT_NATIVE, <дескриптор окна>);
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final int REQUEST_SHOW_SETTINGS = 1;
private IFptr fptr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ....
// Создание объекта драйвера
fptr = new Fptr(getApplication());
// Вызываем Activity настройки
findViewById(R.id.btnShowSettings).setOnClickListener(new View.OnClickListener {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplication(), SettingsActivity.class);
// Передаем текущие настройки в SettingsActivity.
// Если не передать - будет показана SettingsActivity с настройками по умолчанию
intent.putExtra(SettingsActivity.DEVICE_SETTINGS, fptr.getSettings());
startActivityForResult(intent, REQUEST_SHOW_SETTINGS);
}
}
);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_SHOW_SETTINGS && resultCode == Activity.RESULT_OK) {
// Записываем настройки в объект
fptr.setSettings(data.getStringExtra(SettingsActivity.DEVICE_SETTINGS));
}
}
}
Для того, чтобы начать работу с ККТ, требуется настроить соединение с устройством. Есть несколько способов передать в драйвер настройки.
Первый способ - передача всех настроек в виде JSON методом драйвера setSettings(...), аргументом которого является строка с настройками в формате JSON. Способ удобен тем, что настройки в таком виде можно запросить у драйвера, сохранить, и при следующей работе с ККТ передать их в драйвер заново как есть. При передаче настроек драйвер разорвет связь с ККТ, если она установлена, изменит настройки и подключится заново. Если по новым настройкам подключиться не удаётся, то драйвер попробует восстановить связь по старым настройкам и вернёт ошибку. Есть некоторая вероятность, что подключиться по старым настройкам также не удастся. В этом случае будет возвращена ошибка, соединение сброшено, а метод isOpened() будет возвращать false.
Второй способ - передача настроек по одной с их применением в конце. Результат и поведение будут идентичны первому способу. Настройки подаются методом setSingleSetting(...), аргументами которого является идентификатор настройки и сама настройка в строковом представлении. По завершении поданные настройки необходимо применить, подав метод applySingleSettings().
Третий способ - вызов окна настройки связи с ККТ. В случае использования метода showProperties() требуется передать дескриптор родительского окна для отображения модального диалога и указать его тип.
Для передачи дескриптора родительского окна типа QWidget (Qt) требуется указать тип окна LIBFPTR_GUI_PARENT_QT.
Для передачи дескриптора родительского окна типа HWND (WinApi) требуется указать тип окна LIBFPTR_GUI_PARENT_NATIVE. Использование типа окна LIBFPTR_GUI_PARENT_NATIVE на Linux на данный момент не поддерживается.
При передаче нулевого дескриптора диалог настройки будет немодальным.
Метод возвращает следующие значения:
- -1, если открыть диалог не удалось;
- 0, если пользователь нажал кнопку OK;
- 1, если пользователь покинул диалог любым другим способом (нажал кнопку Отмена, закрыл диалог крестиком и т.п.).
Выгрузка настроек
Первый способ
std::vector<wchar_t> settings(1024);
int size = libfptr_get_settings(fptr, &settings[0], settings.size());
if (size > settings.size())
{
settings.resize(size);
libfptr_get_settings(fptr, &settings[0], settings.size());
}
std::wstring settings = fptr.getSettings();
String settings = fptr.getSettings();
String settings = fptr.getSettings();
Выгрузка настроек, способ второй (на примере получения IP-адреса и порта)
String ipAddress = fptr.getSingleSetting(IFptr.LIBFPTR_SETTING_IPADDRESS);
String ipPort = fptr.getSingleSetting(IFptr.LIBFPTR_SETTING_IPPORT);
Второй способ
std::wstring ipAddress, ipPort;
std::vector<wchar_t> setting(1024);
int size = libfptr_get_single_setting(fptr, LIBFPTR_SETTING_IPADDRESS, &setting[0], setting.size());
if (size > settings.size())
{
setting.resize(size);
libfptr_get_single_setting(fptr, LIBFPTR_SETTING_IPADDRESS, &setting[0], setting.size());
}
ipAddress = std::wstring(&setting[0]);
int size = libfptr_get_single_setting(fptr, LIBFPTR_SETTING_IPPORT, &setting[0], setting.size());
if (size > settings.size())
{
setting.resize(size);
libfptr_get_single_setting(fptr, LIBFPTR_SETTING_IPPORT, &setting[0], setting.size());
}
ipPort = std::wstring(&setting[0]);
std::wstring ipAddress = fptr.getSingleSetting(LIBFPTR_SETTING_IPADDRESS);
std::wstring ipPort = fptr.getSingleSetting(LIBFPTR_SETTING_IPPORT);
String ipAddress = fptr.getSingleSetting(IFptr.LIBFPTR_SETTING_IPADDRESS);
String ipPort = fptr.getSingleSetting(IFptr.LIBFPTR_SETTING_IPPORT);
Выгрузить настройки также можно двумя способами.
Первый позволяет получить все настройки разом в виде JSON.
Используя второй способ, можно получить отдельно значение каждой настройки.
Список настроек
Все настройки можно поделить на несколько категорий.
К первой относятся общие настройки драйвера, которые отвечают непосредственно за его поведение.
Это следующие настройки:
LIBFPTR_SETTING_LIBRARY_PATH - путь к каталогу с библиотеками-зависимостями, подгружаемым по-надобности. К таким библиотекам относятся libusb и libudev для работы с ККТ по USB на Linux. Может быть списком каталогов, аналогично java.library.path. Не актуально для случая, когда используется драйвер, установленный с помощью дистрибутива;
LIBFPTR_SETTING_MODEL - код модели ККТ. Определяет способ работы драйвера с устройством. Может принимать следующие значения:
- LIBFPTR_MODEL_NEVA_AUTO - автоматическое определение модели(НЕВА);
- LIBFPTR_MODEL_NEVA_3F - НЕВА-03-Ф.
LIBFPTR_SETTING_ACCESS_PASSWORD - пароль доступа ККТ. Требуется для взаимодействия с ККТ. Если не указан или пуст, используется стандартный пароль в зависимости от настройки LIBFPTR_SETTING_MODEL;
LIBFPTR_SETTING_USER_PASSWORD - пароль пользователя по умолчанию. Требуется для доступа к специфичным командам и режимам ККТ. Если не указан или пуст, используется пароль по умолчанию с максимальными правами в зависимости от настройки LIBFPTR_SETTING_MODEL;
LIBFPTR_SETTING_OFD_CHANNEL - канал для обмена с ОФД. По умолчанию - LIBFPTR_OFD_CHANNEL_AUTO. Для корректной работы требуется дополнительная настройка ККТ (настройка #276, см. Настройки ККТ). Возможные значения:
- LIBFPTR_OFD_CHANNEL_NONE - не активировать обмен с ОФД средствами драйвера;
- LIBFPTR_OFD_CHANNEL_AUTO - драйвер автоматически активирует для ККТ канал обмена с ОФД через транспортный протокол ККТ, если значение настройки #276 в ККТ равно EthernetOverTransport.
LIBFPTR_SETTING_SCRIPTS_PATH - путь к внешним, пользовательским, скриптам (подробнее в Скрипты драйвера);
LIBFPTR_SETTING_INVERT_CASH_DRAWER_STATUS - инвертировать состояние денежного ящика или нет. По умолчанию - не инвертировать;
LIBFPTR_SETTING_VALIDATE_MARK_WITH_FNM_ONLY - выполнять проверку КМ средствами драйвера. По умолчанию - нет. Подробнее в Работа с марками в ФФД 1.2;
LIBFPTR_SETTING_AUTO_MEASUREMENT_UNIT - автоматически подавать реквизит "Мера количества" (2108) на позицию, если реквизит 2003 != 2, 4;
Ко второй относятся настройки связи с ККТ.
- LIBFPTR_SETTING_PORT - способ связи с ККТ. Остальные настройки связи зависят от значения этой настройки. Может принимать следующие значения:
- LIBFPTR_PORT_COM - работа с ККТ либо через физический COM-порт, либо через виртуальные COM-порт и TTY-файл. Доступно для Windows и Linux К данному каналу также относятся настройки LIBFPTR_SETTING_BAUDRATE, LIBFPTR_SETTING_BITS, LIBFPTR_SETTING_STOPBITS, LIBFPTR_SETTING_PARITY, LIBFPTR_SETTING_COM_FILE;
- LIBFPTR_PORT_TCPIP - работа с ККТ по TCP/IP (Ethernet, Wi-Fi). Доступно для Windows и Linux. К данному каналу также относятся настройки LIBFPTR_SETTING_IPADDRESS и LIBFPTR_SETTING_IPPORT;
- LIBFPTR_SETTING_BAUDRATE - скорость работы ККТ по RS232. Может принимать значение:
- LIBFPTR_PORT_BR_1200 - 1200 бод;
- LIBFPTR_PORT_BR_2400 - 2400 бод;
- LIBFPTR_PORT_BR_4800 - 4800 бод;
- LIBFPTR_PORT_BR_9600 - 9600 бод;
- LIBFPTR_PORT_BR_19200 - 19200 бод;
- LIBFPTR_PORT_BR_38400 - 38400 бод;
- LIBFPTR_PORT_BR_57600 - 57600 бод;
- LIBFPTR_PORT_BR_115200 - 115200 бод;
- LIBFPTR_PORT_BR_230400 - 230400 бод;
- LIBFPTR_PORT_BR_460800 - 460800 бод;
- LIBFPTR_PORT_BR_921600 - 921600 бод.
- LIBFPTR_SETTING_BITS - количество бит в байте канала RS232:
- LIBFPTR_PORT_BITS_7 - 7 бит;
- LIBFPTR_PORT_BITS_8 - 8 бит.
- LIBFPTR_SETTING_STOPBITS - количество стоп-битов канала RS232:
- LIBFPTR_PORT_SB_1 - 1 бит;
- LIBFPTR_PORT_SB_1_5 - 1.5 бита;
- LIBFPTR_PORT_SB_2 - 2 бита.
LIBFPTR_SETTING_PARITY - четность канала RS232:
- LIBFPTR_PORT_PARITY_NO - нет;
- LIBFPTR_PORT_PARITY_ODD - четность;
- LIBFPTR_PORT_PARITY_EVEN - нечетность;
- LIBFPTR_PORT_PARITY_MARK - установлена;
- LIBFPTR_PORT_PARITY_SPACE - сброшена.
LIBFPTR_SETTING_COM_FILE - идентификатор порта. Для Windows - номер COM-порта (например, "15" или "COM15"). Для Linux - путь к TTY-файлу (например, "/dev/ttyS5" или "/dev/ttyACM0");
LIBFPTR_SETTING_IPADDRESS - IP-адрес ККТ. Может быть как ip-адресом, так и hostname-ом;
LIBFPTR_SETTING_IPPORT - IP-порт ККТ;
LIBFPTR_SETTING_MACADDRESS - Bluetooth MAC-адрес ККТ. Устройство должно быть предварительно сопряжено с хостом средствами ОС;
LIBFPTR_SETTING_AUTO_RECONNECT - автоматически восстанавливать связь с ККТ при обрыве соединения. В случае, если значение false, драйвер не будет автоматически пытаться восстановить связь после обнаружения отключения устройства или получения ошибки "Нет связи", а будет сразу возвращать ошибку LIBFPTR_ERROR_CONNECTION_LOST (Соединение с ККТ потеряно). Значение по умолчанию - true.
Методы и параметры драйвера
Установка целочисленного параметра
libfptr_set_param_int(fptr, LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
fptr.setParam(LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
Установка дробного параметра
libfptr_set_param_double(fptr, LIBFPTR_PARAM_PRICE, 123.45);
fptr.setParam(LIBFPTR_PARAM_PRICE, 123.45);
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 123.45);
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 123.45);
Установка строкового параметра
libfptr_set_param_str(fptr, LIBFPTR_PARAM_COMMODITY_NAME, L"Товар");
fptr.setParam(LIBFPTR_PARAM_COMMODITY_NAME, L"Товар");
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Товар");
String settings = fptr.getSettings();
Выгрузка настроек, способ второй (на примере получения IP-адреса и порта)
String ipAddress = fptr.getSingleSetting(IFptr.LIBFPTR_SETTING_IPADDRESS);
String ipPort = fptr.getSingleSetting(IFptr.LIBFPTR_SETTING_IPPORT);
Установка параметра дата / время
time_t t = time(NULL);
struct tm tm = *localtime(&t);
libfptr_set_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
std::time_t t = time(nullptr);
std::tm tm = *localtime(&t);
fptr.setParam(LIBFPTR_PARAM_DATE_TIME, tm);
Calendar c = Calendar.getInstance();
fptr.setParam(IFptr.LIBFPTR_PARAM_DATE_TIME, c.getTime());
String settings = fptr.getSettings();
Выгрузка настроек, способ второй (на примере получения IP-адреса и порта)
String ipAddress = fptr.getSingleSetting(IFptr.LIBFPTR_SETTING_IPADDRESS);
String ipPort = fptr.getSingleSetting(IFptr.LIBFPTR_SETTING_IPPORT);
Установка массива байтов
uchar command[] = {0x91, 0x13, 0x00, 0x00};
libfptr_set_param_bytearray(fptr, LIBFPTR_PARAM_COMMAND_BUFFER,
&command[0], sizeof(command) / sizeof(command[0]));
fptr.setParam(LIBFPTR_PARAM_COMMAND_BUFFER, {0x91, 0x13, 0x00, 0x00});
fptr.setParam(LIBFPTR_PARAM_COMMAND_BUFFER, std::vector<uchar>{0x91, 0x13, 0x00, 0x00});
uchar command[] = {0x91, 0x13, 0x00, 0x00};
fptr.setParam(LIBFPTR_PARAM_COMMAND_BUFFER, &command[0], sizeof(command) / sizeof(command[0]));
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMAND_BUFFER, new byte[]{0x91, 0x13, 0x00, 0x00});
Получение целочисленного параметра
uint lineLength = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPT_LINE_LENGTH);
uint lineLength = fptr.getParamInt(LIBFPTR_PARAM_RECEIPT_LINE_LENGTH);
// На самом деле драйвер возвращает unsigned int, но, из-за отсутствия в Java unsigned-типов, возвращается long
long lineLength = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_LINE_LENGTH);
Получение дробного параметра
double cashSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_SUM);
double cashSum = fptr.getParamDouble(LIBFPTR_PARAM_SUM);
double cashSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
Получение строкового параметра
std::vector<wchar_t> str(64);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_UNIT_VERSION, &str[0], str.size());
if (size > str.size())
{
unitVersion.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_UNIT_VERSION, &str[0], str.size());
}
std::wstring unitVersion = std::wstring(&str[0]);
std::wstring unitVersion = fptr.getParamString(LIBFPTR_PARAM_UNIT_VERSION);
String unitVersion = fptr.getParamString(IFptr.LIBFPTR_PARAM_UNIT_VERSION);
Получение параметра дата / время
int year, month, day, hour, minute, second;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
Получение массива байтов
std::vector<uchar> commandAnswer(32);
int size = libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_ANSWER_BUFFER,
&commandAnswer[0], commandAnswer.size());
if (size > commandAnswer.size())
{
commandAnswer.resize(size);
libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_ANSWER_BUFFER,
&commandAnswer[0], commandAnswer.size());
}
commandAnswer.resize(size);
std::vector<uchar> commandAnswer = fptr.getParamByteArray(LIBFPTR_PARAM_ANSWER_BUFFER);
byte[] commandAnswer = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_ANSWER_BUFFER);
Работа с ККТ производится с помощью методов и их параметров.
Каждый метод, в зависимости от своих параметров, выполняет определенные операции с устройством. Параметры бывают входные и выходные. Входные параметры влияют на выполняемую операцию, а выходные - это её результат.
Список входных параметров очищается сразу после выполнения метода. Список выходных - перед выполнением следующего.
Каждый метод возвращает 0, если метод выполнился удачно, и -1, если произошла ошибка. Метод showProperties() может вернуть также значение 1. Метод isOpened() не возвращает признак результата, вместо этого он возвращает признак установленного соединения с ККТ.
Параметры бывают следующих типов:
- int - целое беззнаковое число. Принимает значение от 0 до 4294967295 (MAX_UINT, 0xFFFFFFFF);
- double - число с плавающей точкой. Принимает значение от -1.79769e+308 до 1.79769e+308;
- bool - логическое число. Принимает значения 0 (false) и 1 (true);
- string - unicode-строка;
- datetime - дата и время;
- bytearray - массив байтов.
Описания параметров представлены в описании каждого метода.
При работе в JavaScript (Duktape) у методов setParam(), setNonPrintableParam() и setUserParam() добавлен необязательный параметр - флаги. Туда можно передать константу IGNORE_IF_EMPTY, которая отключит передачу параметра в драйвер, если он принимает одно из следующих значений:
- пустая строка;
- пустой массив байтов;
- любой неподдерживаемый тип параметра (например, undefined).
Обработка ошибок
Вызов метода
if (libfptr_print_text(fptr) < 0)
{
int errorCode = libfptr_error_code(fptr);
std::vector<wchar_t> errorDescription(32);
int size = libfptr_error_description(fptr, &errorDescription[0], errorDescription.size());
if (size > errorDescription.size())
{
errorDescription.resize(size);
libfptr_error_description(fptr, &errorDescription[0], errorDescription.size());
}
std::wcout << L"Ошибка - "
<< errorCode
<< L" [" << std::wstring(&errorDescription[0]) << L"]"
<< std::endl;
}
if (fptr.printText() < 0)
{
std::wcout << L"Ошибка - "
<< fptr.errorCode()
<< L" [" << fptr.errorDescription() << L"]"
<< std::endl;
}
if (fptr.printText() < 0) {
System.out.println(String.format("%d [%s]", fptr.errorCode(), fptr.errorDescription()));
}
Каждый метод драйвера возвращает индикатор результата выполнения. Этот индикатор может принимать значения 0 и -1.
В случае, если индикатор не равен 0, выполнение метода завершится с ошибкой и есть возможность получить подробности о ней. Для этого у драйвера можно запросить код последней ошибки (метод errorCode()) и её текстовое описание (метод errorDescription()).
Драйвер хранит информацию об ошибке до следующего вызова метода - после него информация об ошибке обновляется. Для явного сброса информации о последней ошибки нужно использовать метод resetError().
Список кодов ошибок приведен в приложении Список кодов ошибок.
Соединение с ККТ
Установка соединения с ККТ
libfptr_open(fptr);
fptr.open();
fptr.open();
fptr.open();
Проверка состояния логического соединения
bool isOpened = (libfptr_is_opened(fptr) != 0);
bool isOpened = fptr.isOpened();
boolean isOpened = fptr.isOpened();
boolean isOpened = fptr.isOpened();
Завершение соединения с ККТ
libfptr_close(fptr);
fptr.close();
fptr.close();
fptr.close();
После настройки рабочего экземпляра можно подключиться к ККТ. Для этого требуется вызвать метод open(). После подключения к ККТ можно выполнять различные операции с ККТ, а также, при соответствующих настройках, драйвер организует для ККТ канал для обмена с ОФД. До вызова данного метода все другие операции с ККТ будет завершаться с ошибкой LIBFPTR_ERROR_CONNECTION_DISABLED.
Чтобы узнать состояние соединения, нужно использовать метод isOpened(). Результат метода не отражает текущее состояние подключения - если с ККТ была разорвана связь, то метод все также будет возвращать true, но методы, выполняющие какие-либо операции над ККТ, будут возвращать ошибку LIBFPTR_ERROR_NO_CONNECTION.
Для завершения соединения с ККТ нужно вызвать метод close(). Драйвер вернется в изначальное состояние, как до вызова open(). Канал с ОФД, установленный с его помощью, будет закрыт и отправка документов в ОФД будет прервана.
Запрос информации о ККТ
Общая информация и статус
Запрос общей информации и статуса ККТ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_STATUS);
libfptr_query_data(fptr);
uint operatorID = libfptr_get_param_int(fptr, LIBFPTR_PARAM_OPERATOR_ID);
uint logicalNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_LOGICAL_NUMBER);
uint shiftState = libfptr_get_param_int(fptr, LIBFPTR_PARAM_SHIFT_STATE);
uint model = libfptr_get_param_int(fptr, LIBFPTR_PARAM_MODEL);
uint mode = libfptr_get_param_int(fptr, LIBFPTR_PARAM_MODE);
uint submode = libfptr_get_param_int(fptr, LIBFPTR_PARAM_SUBMODE);
uint receiptNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPT_NUMBER);
uint documentNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENT_NUMBER);
uint shiftNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_SHIFT_NUMBER);
uint receiptType = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE);
uint documentType = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENT_TYPE);
uint lineLength = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPT_LINE_LENGTH);
uint lineLengthPix = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPT_LINE_LENGTH_PIX);
double receiptSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_RECEIPT_SUM);
bool isFiscalDevice = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_FISCAL) != 0);
bool isFiscalFN = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_FN_FISCAL) != 0);
bool isFNPresent = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_FN_PRESENT) != 0);
bool isInvalidFN = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_INVALID_FN) != 0);
bool isCashDrawerOpened = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_CASHDRAWER_OPENED) != 0);
bool isPaperPresent = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_RECEIPT_PAPER_PRESENT) != 0);
bool isPaperNearEnd = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_PAPER_NEAR_END) != 0);
bool isCoverOpened = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_COVER_OPENED) != 0);
bool isPrinterConnectionLost= (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_PRINTER_CONNECTION_LOST) != 0);
bool isPrinterError = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_PRINTER_ERROR) != 0);
bool isCutError = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_CUT_ERROR) != 0);
bool isPrinterOverheat = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_PRINTER_OVERHEAT) != 0);
bool isDeviceBlocked = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_BLOCKED) != 0)
int year, month, day, hour, minute, second;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
std::vector<wchar_t> str(1024);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_SERIAL_NUMBER, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_SERIAL_NUMBER, &str[0], str.size());
}
std::wstring serialNumber = std::wstring(&str[0]);
size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_MODEL_NAME, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_MODEL_NAME, &str[0], str.size());
}
std::wstring modelName = std::wstring(&str[0]);
size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_UNIT_VERSION, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_UNIT_VERSION, &str[0], str.size());
}
std::wstring firmwareVersion = std::wstring(&str[0]);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_STATUS);
fptr.queryData();
uint operatorID = fptr.getParamInt(LIBFPTR_PARAM_OPERATOR_ID);
uint logicalNumber = fptr.getParamInt(LIBFPTR_PARAM_LOGICAL_NUMBER);
uint shiftState = fptr.getParamInt(LIBFPTR_PARAM_SHIFT_STATE);
uint model = fptr.getParamInt(LIBFPTR_PARAM_MODEL);
uint mode = fptr.getParamInt(LIBFPTR_PARAM_MODE);
uint submode = fptr.getParamInt(LIBFPTR_PARAM_SUBMODE);
uint receiptNumber = fptr.getParamInt(LIBFPTR_PARAM_RECEIPT_NUMBER);
uint documentNumber = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENT_NUMBER);
uint shiftNumber = fptr.getParamInt(LIBFPTR_PARAM_SHIFT_NUMBER);
uint receiptType = fptr.getParamInt(LIBFPTR_PARAM_RECEIPT_TYPE);
uint documentType = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENT_TYPE);
uint lineLength = fptr.getParamInt(LIBFPTR_PARAM_RECEIPT_LINE_LENGTH);
uint lineLengthPix = fptr.getParamInt(LIBFPTR_PARAM_RECEIPT_LINE_LENGTH_PIX);
double receiptSum = fptr.getParamDouble(LIBFPTR_PARAM_RECEIPT_SUM);
bool isFiscalDevice = fptr.getParamBool(LIBFPTR_PARAM_FISCAL);
bool isFiscalFN = fptr.getParamBool(LIBFPTR_PARAM_FN_FISCAL);
bool isFNPresent = fptr.getParamBool(LIBFPTR_PARAM_FN_PRESENT);
bool isInvalidFN = fptr.getParamBool(LIBFPTR_PARAM_INVALID_FN);
bool isCashDrawerOpened = fptr.getParamBool(LIBFPTR_PARAM_CASHDRAWER_OPENED);
bool isPaperPresent = fptr.getParamBool(LIBFPTR_PARAM_RECEIPT_PAPER_PRESENT);
bool isPaperNearEnd = fptr.getParamBool(LIBFPTR_PARAM_PAPER_NEAR_END);
bool isCoverOpened = fptr.getParamBool(LIBFPTR_PARAM_COVER_OPENED);
bool isPrinterConnectionLost = fptr.getParamBool(LIBFPTR_PARAM_PRINTER_CONNECTION_LOST);
bool isPrinterError = fptr.getParamBool(LIBFPTR_PARAM_PRINTER_ERROR);
bool isCutError = fptr.getParamBool(LIBFPTR_PARAM_CUT_ERROR);
bool isPrinterOverheat = fptr.getParamBool(LIBFPTR_PARAM_PRINTER_OVERHEAT);
bool isDeviceBlocked = fptr.getParamBool(LIBFPTR_PARAM_BLOCKED);
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
std::wstring serialNumber = fptr.getParamString(LIBFPTR_PARAM_SERIAL_NUMBER);
std::wstring modelName = fptr.getParamString(LIBFPTR_PARAM_MODEL_NAME);
std::wstring firmwareVersion = fptr.getParamString(LIBFPTR_PARAM_UNIT_VERSION);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_STATUS);
fptr.queryData();
long operatorID = fptr.getParamInt(IFptr.LIBFPTR_PARAM_OPERATOR_ID);
long logicalNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_LOGICAL_NUMBER);
long shiftState = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SHIFT_STATE);
long model = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MODEL);
long mode = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MODE);
long submode = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SUBMODE);
long receiptNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_NUMBER);
long documentNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER);
long shiftNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SHIFT_NUMBER);
long receiptType = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE);
long documentType = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_TYPE);
long lineLength = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_LINE_LENGTH);
long lineLengthPix = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_LINE_LENGTH_PIX);
double receiptSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_RECEIPT_SUM);
boolean isFiscalDevice = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FISCAL);
boolean isFiscalFN = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FN_FISCAL);
boolean isFNPresent = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FN_PRESENT);
boolean isInvalidFN = fptr.getParamBool(IFptr.LIBFPTR_PARAM_INVALID_FN);
boolean isCashDrawerOpened = fptr.getParamBool(IFptr.LIBFPTR_PARAM_CASHDRAWER_OPENED);
boolean isPaperPresent = fptr.getParamBool(IFptr.LIBFPTR_PARAM_RECEIPT_PAPER_PRESENT);
boolean isPaperNearEnd = fptr.getParamBool(IFptr.LIBFPTR_PARAM_PAPER_NEAR_END);
boolean isCoverOpened = fptr.getParamBool(IFptr.LIBFPTR_PARAM_COVER_OPENED);
boolean isPrinterConnectionLost = fptr.getParamBool(IFptr.LIBFPTR_PARAM_PRINTER_CONNECTION_LOST);
boolean isPrinterError = fptr.getParamBool(IFptr.LIBFPTR_PARAM_PRINTER_ERROR);
boolean isCutError = fptr.getParamBool(IFptr.LIBFPTR_PARAM_CUT_ERROR);
boolean isPrinterOverheat = fptr.getParamBool(IFptr.LIBFPTR_PARAM_PRINTER_OVERHEAT);
boolean isDeviceBlocked = fptr.getParamBool(IFptr.LIBFPTR_PARAM_BLOCKED);
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
String serialNumber = fptr.getParamString(IFptr.LIBFPTR_PARAM_SERIAL_NUMBER);
String modelName = fptr.getParamString(IFptr.LIBFPTR_PARAM_MODEL_NAME);
String firmwareVersion = fptr.getParamString(IFptr.LIBFPTR_PARAM_UNIT_VERSION);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_STATUS);
fptr.queryData();
long operatorID = fptr.getParamInt(IFptr.LIBFPTR_PARAM_OPERATOR_ID);
long logicalNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_LOGICAL_NUMBER);
long shiftState = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SHIFT_STATE);
long model = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MODEL);
long mode = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MODE);
long submode = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SUBMODE);
long receiptNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_NUMBER);
long documentNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER);
long shiftNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SHIFT_NUMBER);
long receiptType = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE);
long documentType = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_TYPE);
long lineLength = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_LINE_LENGTH);
long lineLengthPix = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_LINE_LENGTH_PIX);
double receiptSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_RECEIPT_SUM);
boolean isFiscalDevice = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FISCAL);
boolean isFiscalFN = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FN_FISCAL);
boolean isFNPresent = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FN_PRESENT);
boolean isInvalidFN = fptr.getParamBool(IFptr.LIBFPTR_PARAM_INVALID_FN);
boolean isCashDrawerOpened = fptr.getParamBool(IFptr.LIBFPTR_PARAM_CASHDRAWER_OPENED);
boolean isPaperPresent = fptr.getParamBool(IFptr.LIBFPTR_PARAM_RECEIPT_PAPER_PRESENT);
boolean isPaperNearEnd = fptr.getParamBool(IFptr.LIBFPTR_PARAM_PAPER_NEAR_END);
boolean isCoverOpened = fptr.getParamBool(IFptr.LIBFPTR_PARAM_COVER_OPENED);
boolean isPrinterConnectionLost = fptr.getParamBool(IFptr.LIBFPTR_PARAM_PRINTER_CONNECTION_LOST);
boolean isPrinterError = fptr.getParamBool(IFptr.LIBFPTR_PARAM_PRINTER_ERROR);
boolean isCutError = fptr.getParamBool(IFptr.LIBFPTR_PARAM_CUT_ERROR);
boolean isPrinterOverheat = fptr.getParamBool(IFptr.LIBFPTR_PARAM_PRINTER_OVERHEAT);
boolean isDeviceBlocked = fptr.getParamBool(IFptr.LIBFPTR_PARAM_BLOCKED);
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
String serialNumber = fptr.getParamString(IFptr.LIBFPTR_PARAM_SERIAL_NUMBER);
String modelName = fptr.getParamString(IFptr.LIBFPTR_PARAM_MODEL_NAME);
String firmwareVersion = fptr.getParamString(IFptr.LIBFPTR_PARAM_UNIT_VERSION);
Для запроса общей информации и статуса необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_STATUS.
Результатом этого запроса будет следующая информация
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_OPERATOR_ID | Номер кассира | int |
LIBFPTR_PARAM_LOGICAL_NUMBER | Номер ККТ в магазине | int |
LIBFPTR_PARAM_DATE_TIME | Дата и время ККТ | datetime |
LIBFPTR_PARAM_FISCAL | Флаг регистрации ККТ | bool |
LIBFPTR_PARAM_FN_FISCAL | Флаг фискализации ФН | bool |
LIBFPTR_PARAM_FN_PRESENT | Флаг наличия ФН в ККТ | bool |
LIBFPTR_PARAM_INVALID_FN | Флаг корректности ФН | bool |
LIBFPTR_PARAM_SHIFT_STATE | Состояние смены | int |
LIBFPTR_PARAM_CASHDRAWER_OPENED | Денежный ящик открыт | bool |
LIBFPTR_PARAM_RECEIPT_PAPER_PRESENT | Наличие бумаги | bool |
LIBFPTR_PARAM_PAPER_NEAR_END | Бумага скоро закончится. Если датчика скорого окончания бумаги в ККТ нет, то будет всегда возвращаться false | bool |
LIBFPTR_PARAM_COVER_OPENED | Крышка открыта | bool |
LIBFPTR_PARAM_SERIAL_NUMBER | Заводской номер ККТ | string |
LIBFPTR_PARAM_MODEL | Номер модели ККТ | int |
LIBFPTR_PARAM_MODE | Режим ККТ | int |
LIBFPTR_PARAM_SUBMODE | Подрежим ККТ | int |
LIBFPTR_PARAM_RECEIPT_NUMBER | Номер чека (внутренний счетчик ККТ) | int |
LIBFPTR_PARAM_DOCUMENT_NUMBER | Номер документа (внутренний счетчик ККТ) | int |
LIBFPTR_PARAM_SHIFT_NUMBER | Номер открытой смены или номер последней закрытой смены + 1 | int |
LIBFPTR_PARAM_RECEIPT_TYPE | Тип открытого чека | int |
LIBFPTR_PARAM_DOCUMENT_TYPE | Тип открытого документа | int |
LIBFPTR_PARAM_RECEIPT_SUM | Сумма текущего чека | double |
LIBFPTR_PARAM_RECEIPT_LINE_LENGTH | Ширина чековой ленты, симв. | int |
LIBFPTR_PARAM_RECEIPT_LINE_LENGTH_PIX | Ширина чековой ленты, пикс. | int |
LIBFPTR_PARAM_MODEL_NAME | Название ККТ | string |
LIBFPTR_PARAM_UNIT_VERSION | Версия ПО ККТ | string |
LIBFPTR_PARAM_PRINTER_CONNECTION_LOST | Потеряно соединение с печатным механизмом | bool |
LIBFPTR_PARAM_PRINTER_ERROR | Невосстановимая ошибка печатного механизма | bool |
LIBFPTR_PARAM_CUT_ERROR | Ошибка отрезчика | bool |
LIBFPTR_PARAM_PRINTER_OVERHEAT | Перегрев печатного механизма | bool |
LIBFPTR_PARAM_BLOCKED | ККТ заблокирована из-за ошибок | bool |
Значение LIBFPTR_PARAM_CASH_DRAWER_STATUS может быть инвертировано по настройке LIBFPTR_SETTING_INVERT_CASH_DRAWER_STATUS.
Возможные значения для состояния смены (LIBFPTR_PARAM_SHIFT_STATE):
- LIBFPTR_SS_CLOSED - смена закрыта;
- LIBFPTR_SS_OPENED - смена открыта;
- LIBFPTR_SS_EXPIRED - смена истекла.
Возможные значения для типа открытого чека (LIBFPTR_PARAM_RECEIPT_TYPE):
- LIBFPTR_RT_CLOSED - чек закрыт;
- LIBFPTR_RT_SELL - чек прихода;
- LIBFPTR_RT_SELL_RETURN - чек возврата прихода;
- LIBFPTR_RT_SELL_CORRECTION - чек коррекции прихода;
- LIBFPTR_RT_SELL_RETURN_CORRECTION - чек коррекции возврата прихода;
- LIBFPTR_RT_BUY - чек расхода;
- LIBFPTR_RT_BUY_RETURN - чек возврата расхода;
- LIBFPTR_RT_BUY_CORRECTION - чек коррекции расхода;
- LIBFPTR_RT_BUY_RETURN_CORRECTION - чек коррекции возврата расхода.
Возможные значения для типа открытого документа (LIBFPTR_PARAM_DOCUMENT_TYPE):
- LIBFPTR_DT_CLOSED - документ закрыт;
- LIBFPTR_DT_RECEIPT_SELL - чек прихода;
- LIBFPTR_DT_RECEIPT_SELL_RETURN - чек возврата прихода;
- LIBFPTR_DT_RECEIPT_BUY - чек расхода;
- LIBFPTR_DT_RECEIPT_BUY_RETURN - чек возврата расхода;
- LIBFPTR_DT_OPEN_SHIFT - документ открытия смены;
- LIBFPTR_DT_CLOSE_SHIFT - документ закрытия смены;
- LIBFPTR_DT_REGISTRATION - документ пере/регистрации;
- LIBFPTR_DT_CLOSE_ARCHIVE - документ закрытия архива ФН;
- LIBFPTR_DT_OFD_EXCHANGE_STATUS - отчёт о состоянии расчётов;
- LIBFPTR_DT_RECEIPT_SELL_CORRECTION - чек коррекции прихода;
- LIBFPTR_DT_RECEIPT_BUY_CORRECTION - чек коррекции расхода;
- LIBFPTR_DT_RECEIPT_SELL_RETURN_CORRECTION - чек коррекции возврата прихода;
- LIBFPTR_DT_RECEIPT_BUY_RETURN_CORRECTION - чек коррекции возврата расхода;
- LIBFPTR_DT_DOCUMENT_SERVICE - сервисный документ;
- LIBFPTR_DT_DOCUMENT_COPY - копия документа.
Возможные значения для номера модели (LIBFPTR_PARAM_MODEL) представлены в разделе Список настроек.
Короткий запрос статуса ККТ
Короткий запрос статуса ККТ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_SHORT_STATUS);
libfptr_query_data(fptr);
bool isCashDrawerOpened = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_CASHDRAWER_OPENED) != 0);
bool isPaperPresent = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_RECEIPT_PAPER_PRESENT) != 0);
bool isPaperNearEnd = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_PAPER_NEAR_END) != 0);
bool isCoverOpened = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_COVER_OPENED) != 0);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_SHORT_STATUS);
fptr.queryData();
bool isCashDrawerOpened = fptr.getParamBool(LIBFPTR_PARAM_CASHDRAWER_OPENED);
bool isPaperPresent = fptr.getParamBool(LIBFPTR_PARAM_RECEIPT_PAPER_PRESENT);
bool isPaperNearEnd = fptr.getParamBool(LIBFPTR_PARAM_PAPER_NEAR_END);
bool isCoverOpened = fptr.getParamBool(LIBFPTR_PARAM_COVER_OPENED);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_SHORT_STATUS);
fptr.queryData();
boolean isCashDrawerOpened = fptr.getParamBool(IFptr.LIBFPTR_PARAM_CASHDRAWER_OPENED);
boolean isPaperPresent = fptr.getParamBool(IFptr.LIBFPTR_PARAM_RECEIPT_PAPER_PRESENT);
boolean isPaperNearEnd = fptr.getParamBool(IFptr.LIBFPTR_PARAM_PAPER_NEAR_END);
boolean isCoverOpened = fptr.getParamBool(IFptr.LIBFPTR_PARAM_COVER_OPENED);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_SHORT_STATUS);
fptr.queryData();
boolean isCashDrawerOpened = fptr.getParamBool(IFptr.LIBFPTR_PARAM_CASHDRAWER_OPENED);
boolean isPaperPresent = fptr.getParamBool(IFptr.LIBFPTR_PARAM_RECEIPT_PAPER_PRESENT);
boolean isPaperNearEnd = fptr.getParamBool(IFptr.LIBFPTR_PARAM_PAPER_NEAR_END);
boolean isCoverOpened = fptr.getParamBool(IFptr.LIBFPTR_PARAM_COVER_OPENED);
Для короткого запроса статуса ККТ необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_SHORT_STATUS.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_CASHDRAWER_OPENED | Денежный ящик открыт | bool |
LIBFPTR_PARAM_RECEIPT_PAPER_PRESENT | Наличие бумаги | bool |
LIBFPTR_PARAM_PAPER_NEAR_END | Бумага скоро закончится. Если датчика скорого окончания бумаги в ККТ нет, то будет всегда возвращаться false | bool |
LIBFPTR_PARAM_COVER_OPENED | Крышка открыта | bool |
Значение LIBFPTR_PARAM_CASH_DRAWER_STATUS может быть инвертировано по настройке LIBFPTR_SETTING_INVERT_CASH_DRAWER_STATUS.
Сумма наличных в денежном ящике
Запрос суммы наличных в денежном ящике
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CASH_SUM);
libfptr_query_data(fptr);
double cashSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_SUM);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CASH_SUM);
fptr.queryData();
double cashSum = fptr.getParamDouble(LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CASH_SUM);
fptr.queryData();
double cashSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CASH_SUM);
fptr.queryData();
double cashSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
Для запроса суммы наличности в денежном ящике необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_CASH_SUM.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SUM | Сумма наличных в ДЯ | double |
Параметры массива картинок
Запрос параметров картинок
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_PICTURES_ARRAY_INFO);
libfptr_query_data(fptr);
int count = libfptr_get_param_int(fptr, LIBFPTR_PARAM_COUNT);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_PICTURES_ARRAY_INFO);
fptr.queryData();
uint count = fptr.getParamInt(LIBFPTR_PARAM_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_PICTURES_ARRAY_INFO);
fptr.queryData();
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_PICTURES_ARRAY_INFO);
fptr.queryData();
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_COUNT);
Для запроса параметров массива картинок необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_PICTURES_ARRAY_INFO.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_COUNT | Количество картинок | int |
Параметры картинки в памяти
Запрос параметров картинки в памяти ККТ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_PICTURE_INFO);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_PICTURE_NUMBER, 1);
libfptr_query_data(fptr);
int width = libfptr_get_param_int(fptr, LIBFPTR_PARAM_WIDTH);
int height = libfptr_get_param_int(fptr, LIBFPTR_PARAM_HEIGHT);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_PICTURE_INFO);
fptr.setParam(LIBFPTR_PARAM_PICTURE_NUMBER, 1);
fptr.queryData();
uint width = fptr.getParamInt(LIBFPTR_PARAM_WIDTH);
uint height = fptr.getParamInt(LIBFPTR_PARAM_HEIGHT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_PICTURE_INFO);
fptr.setParam(IFptr.LIBFPTR_PARAM_PICTURE_NUMBER, 1);
fptr.queryData();
long width = fptr.getParamInt(IFptr.LIBFPTR_PARAM_WIDTH);
long height = fptr.getParamInt(IFptr.LIBFPTR_PARAM_HEIGHT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_PICTURE_INFO);
fptr.setParam(IFptr.LIBFPTR_PARAM_PICTURE_NUMBER, 1);
fptr.queryData();
long width = fptr.getParamInt(IFptr.LIBFPTR_PARAM_WIDTH);
long height = fptr.getParamInt(IFptr.LIBFPTR_PARAM_HEIGHT);
Для запроса параметров картинки из памяти ККТ необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_PICTURE_INFO и указать номер картинки в параметре LIBFPTR_PARAM_PICTURE_NUMBER.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_WIDTH | Ширина картинки, пикс. | int |
LIBFPTR_PARAM_HEIGHT | Высота картинки, пикс. | int |
Состояние подписки
Запрос состояния подписки
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_LICENSE_ACTIVATED);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_LICENSE_NUMBER, 4);
libfptr_query_data(fptr);
bool entered = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_LICENSE_ENTERED) != 0);
int yearFrom, monthFrom, dayFrom;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_LICENSE_VALID_FROM, &yearFrom, &monthFrom, &dayFrom);
int yearUntil, monthUntil, dayUntil;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_LICENSE_VALID_UNTIL, &yearUntil, &monthUntil, &dayUntil);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_LICENSE_ACTIVATED);
fptr.setParam(LIBFPTR_PARAM_LICENSE_NUMBER, 4);
fptr.queryData();
bool entered = fptr.getParamBool(LIBFPTR_PARAM_LICENSE_ENTERED);
std::tm dateFrom = fptr.getParamDateTime(LIBFPTR_PARAM_LICENSE_VALID_FROM);
std::tm dateUntil = fptr.getParamDateTime(LIBFPTR_PARAM_LICENSE_VALID_UNTIL);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_LICENSE_ACTIVATED);
fptr.setParam(IFptr.LIBFPTR_PARAM_LICENSE_NUMBER, 4);
fptr.queryData();
boolean entered = fptr.getParamBool(IFptr.LIBFPTR_PARAM_LICENSE_ENTERED);
Date dateFrom = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_LICENSE_VALID_FROM);
Date dateUntil = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_LICENSE_VALID_UNTIL);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_LICENSE_ACTIVATED);
fptr.setParam(IFptr.LIBFPTR_PARAM_LICENSE_NUMBER, 4);
fptr.queryData();
boolean entered = fptr.getParamBool(IFptr.LIBFPTR_PARAM_LICENSE_ENTERED);
Date dateFrom = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_LICENSE_VALID_FROM);
Date dateUntil = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_LICENSE_VALID_UNTIL);
Для запроса состояния подписки необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_LICENSE_ACTIVATED и указать номер кода подписки в параметре LIBFPTR_PARAM_LICENSE_NUMBER. После выполнения метода параметр LIBFPTR_PARAM_LICENSE_ENTERED примет значение true, если подписка введена, и false, если нет.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_LICENSE_ENTERED | Лицензия введена | bool |
LIBFPTR_PARAM_LICENSE_VALID_FROM | Дата начала действия подписки | datetime |
LIBFPTR_PARAM_LICENSE_VALID_UNTIL | Дата окончания действия подписки | datetime |
Если одну из дат получить не удалось, её значение будет равно 1970.01.01 00:00:00 (unixtime(0)).
Счетчики регистраций
Запрос суммы регистраций в чеках прихода (продажи)
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_REGISTRATIONS_SUM);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
libfptr_query_data(fptr);
double sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_SUM);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_REGISTRATIONS_SUM);
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
fptr.queryData();
double sum = fptr.getParamDouble(LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_REGISTRATIONS_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_REGISTRATIONS_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
Запрос количества регистраций в чеках расхода (покупки)
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_REGISTRATIONS_COUNT);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_BUY);
libfptr_query_data(fptr);
int count = libfptr_get_param_int(fptr, LIBFPTR_PARAM_COUNT);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_REGISTRATIONS_COUNT);
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_BUY);
fptr.queryData();
uint count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_REGISTRATIONS_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_BUY);
fptr.queryData();
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_REGISTRATIONS_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_BUY);
fptr.queryData();
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_COUNT);
Для запроса суммы регистраций необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_REGISTRATIONS_SUM и указать тип чека в параметре LIBFPTR_PARAM_RECEIPT_TYPE.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SUM | Сумма регистраций | double |
Для запроса количества регистраций необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_REGISTRATIONS_COUNT и указать тип чека в параметре LIBFPTR_PARAM_RECEIPT_TYPE.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_COUNT | Количество регистраций | int |
Тип чека (LIBFPTR_PARAM_RECEIPT_TYPE) может принимать следующие значения:
- LIBFPTR_RT_SELL - чек прихода (продажи);
- LIBFPTR_RT_SELL_RETURN - чек возврата прихода (продажи);
- LIBFPTR_RT_SELL_CORRECTION - чек коррекции прихода (продажи);
- LIBFPTR_RT_BUY - чек расхода (покупки);
- LIBFPTR_RT_BUY_RETURN - чек возврата расхода (покупки);
- LIBFPTR_RT_BUY_CORRECTION - чек коррекции расхода (покупки).
Счетчики оплат
Запрос суммы наличных платежей в чеках прихода (продажи)
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_PAYMENT_SUM);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_PAYMENT_TYPE, LIBFPTR_PT_CASH);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
libfptr_query_data(fptr);
double sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_SUM);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_PAYMENT_SUM);
fptr.setParam(LIBFPTR_PARAM_PAYMENT_TYPE, LIBFPTR_PT_CASH);
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
fptr.queryData();
double sum = fptr.getParamDouble(LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_PAYMENT_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_PAYMENT_TYPE, IFptr.LIBFPTR_PT_CASH);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_PAYMENT_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_PAYMENT_TYPE, IFptr.LIBFPTR_PT_CASH);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
Для запроса суммы платежей за смену необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_PAYMENT_SUM и указать тип чека в параметре LIBFPTR_PARAM_RECEIPT_TYPE и способ расчета в параметре LIBFPTR_PARAM_PAYMENT_TYPE.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SUM | Сумма оплат за смену | double |
Тип чека (LIBFPTR_PARAM_RECEIPT_TYPE) может принимать следующие значения:
- LIBFPTR_RT_SELL - чек прихода (продажи);
- LIBFPTR_RT_SELL_RETURN - чек возврата прихода (продажи);
- LIBFPTR_RT_SELL_CORRECTION - чек коррекции прихода (продажи);
- LIBFPTR_RT_BUY - чек расхода (покупки);
- LIBFPTR_RT_BUY_RETURN - чек возврата расхода (покупки);
- LIBFPTR_RT_BUY_CORRECTION - чек коррекции расхода (покупки).
Способ расчета (LIBFPTR_PARAM_PAYMENT_TYPE) может принимать следующие значения:
- LIBFPTR_PT_CASH - наличными;
- LIBFPTR_PT_ELECTRONICALLY - безналичными;
- LIBFPTR_PT_PREPAID - предварительная оплата (аванс);
- LIBFPTR_PT_CREDIT - последующая оплата (кредит);
- LIBFPTR_PT_OTHER - иная форма оплаты (встречное предоставление)
- LIBFPTR_PT_6 - способ расчета №6;
- LIBFPTR_PT_7 - способ расчета №7;
- LIBFPTR_PT_8 - способ расчета №8;
- LIBFPTR_PT_9 - способ расчета №9;
- LIBFPTR_PT_10 - способ расчета №10.
Счетчики внесений и выплат
Запрос суммы внесений
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CASHIN_SUM);
libfptr_query_data(fptr);
double sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_SUM);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CASHIN_SUM);
fptr.queryData();
double sum = fptr.getParamDouble(LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CASHIN_SUM);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CASHIN_SUM);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
Запрос суммы выплат
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CASHOUT_SUM);
libfptr_query_data(fptr);
double sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_SUM);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CASHOUT_SUM);
fptr.queryData();
double sum = fptr.getParamDouble(LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CASHOUT_SUM);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CASHOUT_SUM);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
Запрос количества внесений
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CASHIN_COUNT);
libfptr_query_data(fptr);
int count = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CASHIN_COUNT);
fptr.queryData();
uint count = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CASHIN_COUNT);
fptr.queryData;
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CASHIN_COUNT);
fptr.queryData;
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT);
Запрос количества выплат
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CASHOUT_COUNT);
libfptr_query_data(fptr);
int count = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CASHOUT_COUNT);
fptr.queryData();
uint count = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CASHOUT_COUNT);
fptr.queryData();
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CASHOUT_COUNT);
fptr.queryData();
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT);
Для запроса суммы внесений или выплат необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_CASHIN_SUM (или LIBFPTR_DT_CASHOUT_SUM соответственно).
Результатом этих запросов будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SUM | Сумма внесений/выплат | double |
Для запроса количества внесений или выплат необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_CASHIN_COUNT (или LIBFPTR_DT_CASHOUT_COUNT соответственно).
Результатом этих запросов будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DOCUMENTS_COUNT | Количество документов внесений/выплат | int |
Сумма выручки
Запрос суммы выручки
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_REVENUE);
libfptr_query_data(fptr);
double revenue = libfptr_get_param_double(fptr, LIBFPTR_PARAM_SUM);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_REVENUE);
fptr.queryData();
double revenue = fptr.getParamDouble(LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_REVENUE);
fptr.queryData();
double revenue = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_REVENUE);
fptr.queryData();
double revenue = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
Для запроса суммы выручки необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_REVENUE.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SUM | Сумма выручки | double |
Текущие дата и время ККТ
Запрос текущих даты и времени ККТ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_DATE_TIME);
libfptr_query_data(fptr);
int year, month, day, hour, minute, second;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_DATE_TIME);
fptr.queryData();
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_DATE_TIME);
fptr.queryData();
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_DATE_TIME);
fptr.queryData();
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
Для запроса текущих даты и времени в ККТ необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_DATE_TIME.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DATE_TIME | Текущие дата и время в ККТ | datetime |
Состояние смены
Запрос состояния смены
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_SHIFT_STATE);
libfptr_query_data(fptr);
int state = libfptr_get_param_int(fptr, LIBFPTR_PARAM_SHIFT_STATE);
int number = libfptr_get_param_int(fptr, LIBFPTR_PARAM_SHIFT_NUMBER);
int year, month, day, hour, minute, second;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_SHIFT_STATE);
fptr.queryData();
uint state = fptr.getParamInt(LIBFPTR_PARAM_SHIFT_STATE);
uint number = fptr.getParamInt(LIBFPTR_PARAM_SHIFT_NUMBER);
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_SHIFT_STATE);
fptr.queryData();
long state = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SHIFT_STATE);
long number = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SHIFT_NUMBER);
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_SHIFT_STATE);
fptr.queryData();
long state = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SHIFT_STATE);
long number = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SHIFT_NUMBER);
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
Для запроса состояния смены необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_SHIFT_STATE.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SHIFT_STATE | Состояние смены | int |
LIBFPTR_PARAM_SHIFT_NUMBER | Номер смены | int |
LIBFPTR_PARAM_DATE_TIME | Дата и время истечения текущей смены | datetime |
Состояние смены (LIBFPTR_PARAM_SHIFT_STATE) может принимать следующие значения:
- LIBFPTR_SS_CLOSED - смена закрыта;
- LIBFPTR_SS_OPENED - смена открыта;
- LIBFPTR_SS_EXPIRED - смена истекла (продолжительность смены больше 24 часов).
Значение параметра LIBFPTR_PARAM_SHIFT_NUMBER зависит от состояния смены. Если смена закрыта, то его значением будет номер последней закрытой смены. Если смена открыта или истекла, то его значением будет номер текущей смены.
Параметр LIBFPTR_PARAM_DATE_TIME имеет смысл только при открытой или истекшей смене.
Состояние чека
Запрос состояния чека
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_RECEIPT_STATE);
libfptr_query_data(fptr);
int receiptType = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE);
int receiptNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPT_NUMBER);
int documentNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENT_NUMBER);
int sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_RECEIPT_SUM);
int remainder = libfptr_get_param_double(fptr, LIBFPTR_PARAM_REMAINDER);
int change = libfptr_get_param_double(fptr, LIBFPTR_PARAM_CHANGE);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_RECEIPT_STATE);
fptr.queryData();
uint receiptType = fptr.getParamInt(LIBFPTR_PARAM_RECEIPT_TYPE);
uint receiptNumber = fptr.getParamInt(LIBFPTR_PARAM_RECEIPT_NUMBER);
uint documentNumber = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENT_NUMBER);
double sum = fptr.getParamDouble(LIBFPTR_PARAM_RECEIPT_SUM);
double remainder = fptr.getParamDouble(LIBFPTR_PARAM_REMAINDER);
double change = fptr.getParamDouble(LIBFPTR_PARAM_CHANGE);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_RECEIPT_STATE);
fptr.queryData();
long receiptType = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE);
long receiptNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_NUMBER);
long documentNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER);
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_RECEIPT_SUM);
double remainder = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_REMAINDER);
double change = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_CHANGE);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_RECEIPT_STATE);
fptr.queryData();
long receiptType = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE);
long receiptNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_NUMBER);
long documentNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER);
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_RECEIPT_SUM);
double remainder = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_REMAINDER);
double change = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_CHANGE);
Для запроса состояния чека необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_RECEIPT_STATE.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_RECEIPT_TYPE | Тип чека | int |
LIBFPTR_PARAM_RECEIPT_NUMBER | Номер чека | int |
LIBFPTR_PARAM_DOCUMENT_NUMBER | Номер документа | int |
LIBFPTR_PARAM_RECEIPT_SUM | Текущая сумма чека | double |
LIBFPTR_PARAM_REMAINDER | Неоплаченный остаток | double |
LIBFPTR_PARAM_CHANGE | Сдача по чеку | double |
Тип чека (LIBFPTR_PARAM_RECEIPT_TYPE) может принимать следующие значения:
- LIBFPTR_RT_CLOSED - чек закрыт;
- LIBFPTR_RT_SELL - чек прихода (продажи);
- LIBFPTR_RT_SELL_RETURN - чек возврата прихода (продажи);
- LIBFPTR_RT_SELL_CORRECTION - чек коррекции прихода (продажи);
- LIBFPTR_RT_SELL_RETURN_CORRECTION - чек коррекции возврата прихода (продажи);
- LIBFPTR_RT_BUY - чек расхода (покупки);
- LIBFPTR_RT_BUY_RETURN - чек возврата расхода (покупки);
- LIBFPTR_RT_BUY_CORRECTION - чек коррекции расхода (покупки);
- LIBFPTR_RT_BUY_RETURN_CORRECTION - чек коррекции возврата расхода (покупки).
Значения счетчиков LIBFPTR_PARAM_RECEIPT_NUMBER и LIBFPTR_PARAM_DOCUMENT_NUMBER не относятся к фискальному накопителю и содержат значения внутренних счетчиков ККТ. Данные счетчики могут увеличиваться вместе с печатью нефискальных и служебных документов. Для получения номеров фискальных документов нужно использовать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_LAST_DOCUMENT.
Значения параметров LIBFPTR_PARAM_RECEIPT_SUM, LIBFPTR_PARAM_REMAINDER и LIBFPTR_PARAM_CHANGE актуальны только при открытом чеке.
Заводской номер
Запрос заводского номера
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_SERIAL_NUMBER);
libfptr_query_data(fptr);
std::vector<wchar_t> str(1024);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_SERIAL_NUMBER, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_SERIAL_NUMBER, &str[0], str.size());
}
std::wstring serialNumber = std::wstring(&str[0]);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_SERIAL_NUMBER);
fptr.queryData();
std::wstring serialNumber = fptr.getParamString(LIBFPTR_PARAM_SERIAL_NUMBER);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_SERIAL_NUMBER);
fptr.queryData();
String serialNumber = fptr.getParamString(IFptr.LIBFPTR_PARAM_SERIAL_NUMBER);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_SERIAL_NUMBER);
fptr.queryData();
String serialNumber = fptr.getParamString(IFptr.LIBFPTR_PARAM_SERIAL_NUMBER);
Для запроса заводского номера ККТ необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_SERIAL_NUMBER.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SERIAL_NUMBER | Заводской номер | string |
Информация о модели ККТ
Запрос информации о модели ККТ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_MODEL_INFO);
libfptr_query_data(fptr);
int model = libfptr_get_param_int(fptr, LIBFPTR_PARAM_MODEL);
std::vector<wchar_t> str(1024);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_MODEL_NAME, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_MODEL_NAME, &str[0], str.size());
}
std::wstring modelName = std::wstring(&str[0]);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_UNIT_VERSION, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_UNIT_VERSION, &str[0], str.size());
}
std::wstring firmwareVersion = std::wstring(&str[0]);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_MODEL_INFO);
fptr.queryData();
uint model = fptr.getParamInt(LIBFPTR_PARAM_MODEL);
std::wstring modelName = fptr.getParamString(LIBFPTR_PARAM_MODEL_NAME);
std::wstring firmwareVersion = fptr.getParamString(LIBFPTR_PARAM_UNIT_VERSION);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_MODEL_INFO);
fptr.queryData();
long model = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MODEL);
String modelName = fptr.getParamString(IFptr.LIBFPTR_PARAM_MODEL_NAME);
String firmwareVersion = fptr.getParamString(IFptr.LIBFPTR_PARAM_UNIT_VERSION);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_MODEL_INFO);
fptr.queryData();
long model = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MODEL);
String modelName = fptr.getParamString(IFptr.LIBFPTR_PARAM_MODEL_NAME);
String firmwareVersion = fptr.getParamString(IFptr.LIBFPTR_PARAM_UNIT_VERSION);
Для запроса информации о модели ККТ необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_MODEL_INFO.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_MODEL | Номер модели ККТ | int |
LIBFPTR_PARAM_MODEL_NAME | Наименование ККТ | string |
LIBFPTR_PARAM_UNIT_VERSION | Версия ПО ККТ | string |
Возможные значения для номера модели (LIBFPTR_PARAM_MODEL) представлены в разделе Список настроек.
Ширина чековой ленты
Запрос ширины чековой ленты
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_RECEIPT_LINE_LENGTH);
libfptr_query_data(fptr);
int charLineLength = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPT_LINE_LENGTH);
int pixLineLength = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPT_LINE_LENGTH_PIX);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_RECEIPT_LINE_LENGTH);
fptr.queryData();
uint charLineLength = fptr.getParamInt(LIBFPTR_PARAM_RECEIPT_LINE_LENGTH);
uint pixLineLength = fptr.getParamInt(LIBFPTR_PARAM_RECEIPT_LINE_LENGTH_PIX);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_RECEIPT_LINE_LENGTH);
fptr.queryData();
long charLineLength = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_LINE_LENGTH);
long pixLineLength = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_LINE_LENGTH_PIX);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_RECEIPT_LINE_LENGTH);
fptr.queryData();
long charLineLength = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_LINE_LENGTH);
long pixLineLength = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_LINE_LENGTH_PIX);
Для запроса ширины чековой ленты необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_RECEIPT_LINE_LENGTH.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_RECEIPT_LINE_LENGTH | Ширина чековой ленты, симв. | int |
LIBFPTR_PARAM_RECEIPT_LINE_LENGTH_PIX | Ширина чековой ленты, пикс. | int |
Сумма налога за смену
Запрос суммы налога НДС 10% за смену для чеков прихода
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_SHIFT_TAX_SUM);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
libfptr_query_data(fptr);
double sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_SUM);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_SHIFT_TAX_SUM);
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
fptr.setParam(LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
fptr.queryData();
double sum = fptr.getParamDouble(LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_SHIFT_TAX_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_SHIFT_TAX_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
Для запроса суммы налога за смену необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_SHIFT_TAX_SUM и указать тип чека LIBFPTR_PARAM_RECEIPT_TYPE и тип налога LIBFPTR_PARAM_TAX_TYPE.
Тип чека (LIBFPTR_PARAM_RECEIPT_TYPE) может принимать следующие значения:
- LIBFPTR_RT_SELL - чек прихода (продажи);
- LIBFPTR_RT_SELL_RETURN - чек возврата прихода (продажи);
- LIBFPTR_RT_SELL_CORRECTION - чек коррекции прихода (продажи);
- LIBFPTR_RT_BUY - чек расхода (покупки);
- LIBFPTR_RT_BUY_RETURN - чек возврата расхода (покупки);
- LIBFPTR_RT_BUY_CORRECTION - чек коррекции расхода (покупки).
Тип налога (LIBFPTR_PARAM_TAX_TYPE) может принимать следующие значения:
- LIBFPTR_TAX_VAT10 - НДС 10%;
- LIBFPTR_TAX_VAT110 - НДС расчитанный 10/110;
- LIBFPTR_TAX_VAT0 - НДС 0%;
- LIBFPTR_TAX_NO - не облагается;
- LIBFPTR_TAX_VAT20 - НДС 20%;
- LIBFPTR_TAX_VAT120 - НДС расчитанный 20/120.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SUM | Сумма налога | double |
Сумма налога за чек
Запрос суммы налога НДС 10% последнего чека
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_RECEIPT_TAX_SUM);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
libfptr_query_data(fptr);
double sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_SUM);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_RECEIPT_TAX_SUM);
fptr.setParam(LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
fptr.queryData();
double sum = fptr.getParamDouble(LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_RECEIPT_TAX_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_RECEIPT_TAX_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
Для запроса суммы налога за чек необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_RECEIPT_TAX_SUM и указать тип налога LIBFPTR_PARAM_TAX_TYPE.
Тип налога (LIBFPTR_PARAM_TAX_TYPE) может принимать следующие значения:
- LIBFPTR_TAX_VAT10 - НДС 10%;
- LIBFPTR_TAX_VAT110 - НДС расчитанный 10/110;
- LIBFPTR_TAX_VAT0 - НДС 0%;
- LIBFPTR_TAX_NO - не облагается;
- LIBFPTR_TAX_VAT20 - НДС 20%;
- LIBFPTR_TAX_VAT120 - НДС расчитанный 20/120.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SUM | Сумма налога | double |
Необнуляемая сумма
Запрос необнуляемой суммы по чекам прихода
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_NON_NULLABLE_SUM);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
libfptr_query_data(fptr);
double sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_SUM);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_NON_NULLABLE_SUM);
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
fptr.queryData();
double sum = fptr.getParamDouble(LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_NON_NULLABLE_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_NON_NULLABLE_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
Запрос необнуляемой суммы по чекам прихода по оплатам наличными
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_NON_NULLABLE_SUM_BY_PAYMENTS);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_PAYMENT_TYPE, LIBFPTR_PT_CASH);
libfptr_query_data(fptr);
double sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_SUM);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_NON_NULLABLE_SUM_BY_PAYMENTS);
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
fptr.setParam(LIBFPTR_PARAM_PAYMENT_TYPE, LIBFPTR_PT_CASH);
fptr.queryData();
double sum = fptr.getParamDouble(LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_NON_NULLABLE_SUM_BY_PAYMENTS);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.setParam(IFptr.LIBFPTR_PARAM_PAYMENT_TYPE, IFptr.LIBFPTR_PT_CASH);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_NON_NULLABLE_SUM_BY_PAYMENTS);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.setParam(IFptr.LIBFPTR_PARAM_PAYMENT_TYPE, IFptr.LIBFPTR_PT_CASH);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
Для запроса необнуляемой суммы необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_NON_NULLABLE_SUM и указать тип чека LIBFPTR_PARAM_RECEIPT_TYPE.
Для запроса необнуляемой суммы по заданному типу оплаты необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_NON_NULLABLE_SUM_BY_PAYMENTS и указать тип чека LIBFPTR_PARAM_RECEIPT_TYPE.
Тип чека (LIBFPTR_PARAM_RECEIPT_TYPE) может принимать следующие значения:
- LIBFPTR_RT_SELL - чек прихода (продажи);
- LIBFPTR_RT_SELL_RETURN - чек возврата прихода (продажи);
- LIBFPTR_RT_SELL_CORRECTION - чек коррекции прихода (продажи);
- LIBFPTR_RT_BUY - чек расхода (покупки);
- LIBFPTR_RT_BUY_RETURN - чек возврата расхода (покупки);
- LIBFPTR_RT_BUY_CORRECTION - чек коррекции расхода (покупки).
Способ расчета (LIBFPTR_PARAM_PAYMENT_TYPE) может принимать следующие значения:
- LIBFPTR_PT_CASH - наличными;
- LIBFPTR_PT_ELECTRONICALLY - безналичными;
- LIBFPTR_PT_PREPAID - предварительная оплата (аванс);
- LIBFPTR_PT_CREDIT - последующая оплата (кредит);
- LIBFPTR_PT_OTHER - иная форма оплаты (встречное предоставление);
- LIBFPTR_PT_6 - способ расчета №6;
- LIBFPTR_PT_7 - способ расчета №7;
- LIBFPTR_PT_8 - способ расчета №8;
- LIBFPTR_PT_9 - способ расчета №9;
- LIBFPTR_PT_10 - способ расчета №10.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SUM | Необнуляемая сумма | double |
Количество чеков
Запрос количества чеков прихода
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_RECEIPT_COUNT);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
libfptr_query_data(fptr);
int count = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_RECEIPT_COUNT);
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
fptr.queryData();
uint count = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_RECEIPT_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.queryData();
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_RECEIPT_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.queryData();
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT);
Для запроса количества чеков необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_RECEIPT_COUNT и указать тип чека LIBFPTR_PARAM_RECEIPT_TYPE.
Тип чека (LIBFPTR_PARAM_RECEIPT_TYPE) может принимать следующие значения:
- LIBFPTR_RT_SELL - чек прихода (продажи);
- LIBFPTR_RT_SELL_RETURN - чек возврата прихода (продажи);
- LIBFPTR_RT_SELL_CORRECTION - чек коррекции прихода (продажи);
- LIBFPTR_RT_BUY - чек расхода (покупки);
- LIBFPTR_RT_BUY_RETURN - чек возврата расхода (покупки);
- LIBFPTR_RT_BUY_CORRECTION - чек коррекции расхода (покупки).
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DOCUMENTS_COUNT | Количество чеков | int |
Количество отмененных чеков
Запрос количества отмененных чеков прихода
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CANCELLATION_COUNT);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
libfptr_query_data(fptr);
int count = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CANCELLATION_COUNT);
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
fptr.queryData();
uint count = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CANCELLATION_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.queryData();
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CANCELLATION_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.queryData();
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT);
Запрос общего количества отмененных чеков
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CANCELLATION_COUNT_ALL);
libfptr_query_data(fptr);
int count = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CANCELLATION_COUNT_ALL);
fptr.queryData();
uint count = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CANCELLATION_COUNT_ALL);
fptr.queryData();
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CANCELLATION_COUNT_ALL);
fptr.queryData();
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT);
Для запроса количества отмененных чеков с заданным типом необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_CANCELLATION_COUNT и указать тип чека LIBFPTR_PARAM_RECEIPT_TYPE.
Тип чека (LIBFPTR_PARAM_RECEIPT_TYPE) может принимать следующие значения:
- LIBFPTR_RT_SELL - чек прихода (продажи);
- LIBFPTR_RT_SELL_RETURN - чек возврата прихода (продажи);
- LIBFPTR_RT_SELL_CORRECTION - чек коррекции прихода (продажи);
- LIBFPTR_RT_BUY - чек расхода (покупки);
- LIBFPTR_RT_BUY_RETURN - чек возврата расхода (покупки);
- LIBFPTR_RT_BUY_CORRECTION - чек коррекции расхода (покупки).
Для запроса общего количества отмененных чеков необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_CANCELLATION_COUNT_ALL.
Результатом этих запросов будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DOCUMENTS_COUNT | Количество чеков | int |
Сумма отмененных чеков
Запрос суммы отмененных чеков прихода
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CANCELLATION_SUM);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
libfptr_query_data(fptr);
double sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_SUM);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CANCELLATION_SUM);
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
fptr.queryData();
double sum = fptr.getParamDouble(LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CANCELLATION_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CANCELLATION_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
Запрос общей суммы отмененных чеков
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CANCELLATION_SUM_ALL);
libfptr_query_data(fptr);
double sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_SUM);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_CANCELLATION_SUM_ALL);
fptr.queryData();
double sum = fptr.getParamDouble(LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CANCELLATION_SUM_ALL);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_CANCELLATION_SUM_ALL);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
Для запроса суммы отмененных чеков с заданным типом необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_CANCELLATION_SUM и указать тип чека LIBFPTR_PARAM_RECEIPT_TYPE.
Тип чека (LIBFPTR_PARAM_RECEIPT_TYPE) может принимать следующие значения:
- LIBFPTR_RT_SELL - чек прихода (продажи);
- LIBFPTR_RT_SELL_RETURN - чек возврата прихода (продажи);
- LIBFPTR_RT_SELL_CORRECTION - чек коррекции прихода (продажи);
- LIBFPTR_RT_BUY - чек расхода (покупки);
- LIBFPTR_RT_BUY_RETURN - чек возврата расхода (покупки);
- LIBFPTR_RT_BUY_CORRECTION - чек коррекции расхода (покупки).
Для запроса общей суммы отмененных чеков необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_CANCELLATION_SUM_ALL.
Результатом этих запросов будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SUM | Сумма чеков | double |
Состояние источника питания
Запрос состояния аккумуляторов
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_POWER_SOURCE_STATE);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_POWER_SOURCE_TYPE, LIBFPTR_PST_BATTERY);
libfptr_query_data(fptr);
int charge = libfptr_get_param_int(fptr, LIBFPTR_PARAM_BATTERY_CHARGE);
double voltage = libfptr_get_param_double(fptr, LIBFPTR_PARAM_VOLTAGE);
bool useBattery = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_USE_BATTERY) != 0);
bool isCharging = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_BATTERY_CHARGING) != 0);
bool canPrint = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_CAN_PRINT_WHILE_ON_BATTERY) != 0);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_POWER_SOURCE_STATE);
fptr.setParam(LIBFPTR_PARAM_POWER_SOURCE_TYPE, LIBFPTR_PST_BATTERY);
fptr.queryData();
uint charge = fptr.getParamInt(LIBFPTR_PARAM_BATTERY_CHARGE);
double voltage = fptr.getParamDouble(LIBFPTR_PARAM_VOLTAGE);
bool useBattery = fptr.getParamBool(LIBFPTR_PARAM_USE_BATTERY);
bool isCharging = fptr.getParamBool(LIBFPTR_PARAM_BATTERY_CHARGING);
bool canPrint = fptr.getParamBool(LIBFPTR_PARAM_CAN_PRINT_WHILE_ON_BATTERY);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_POWER_SOURCE_STATE);
fptr.setParam(IFptr.LIBFPTR_PARAM_POWER_SOURCE_TYPE, IFptr.LIBFPTR_PST_BATTERY);
fptr.queryData();
long charge = fptr.getParamInt(IFptr.LIBFPTR_PARAM_BATTERY_CHARGE);
double voltage = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_VOLTAGE);
boolean useBattery = fptr.getParamBool(IFptr.LIBFPTR_PARAM_USE_BATTERY);
boolean isCharging = fptr.getParamBool(IFptr.LIBFPTR_PARAM_BATTERY_CHARGING);
boolean canPrint = fptr.getParamBool(IFptr.LIBFPTR_PARAM_CAN_PRINT_WHILE_ON_BATTERY);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_POWER_SOURCE_STATE);
fptr.setParam(IFptr.LIBFPTR_PARAM_POWER_SOURCE_TYPE, IFptr.LIBFPTR_PST_BATTERY);
fptr.queryData();
long charge = fptr.getParamInt(IFptr.LIBFPTR_PARAM_BATTERY_CHARGE);
double voltage = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_VOLTAGE);
boolean useBattery = fptr.getParamBool(IFptr.LIBFPTR_PARAM_USE_BATTERY);
boolean isCharging = fptr.getParamBool(IFptr.LIBFPTR_PARAM_BATTERY_CHARGING);
boolean canPrint = fptr.getParamBool(IFptr.LIBFPTR_PARAM_CAN_PRINT_WHILE_ON_BATTERY);
Для запроса состояния источника питания необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_POWER_SOURCE_STATE и указать тип источника LIBFPTR_PARAM_POWER_SOURCE_TYPE.
Тип источника (LIBFPTR_PARAM_POWER_SOURCE_TYPE) может принимать следующие значения:
- LIBFPTR_PST_POWER_SUPPLY - внешний блок питания;
- LIBFPTR_PST_RTC_BATTERY - батарея часов;
- LIBFPTR_PST_BATTERY - встроенные аккумуляторы.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_BATTERY_CHARGE | Заряд аккумулятора, проценты | int |
LIBFPTR_PARAM_VOLTAGE | Напряжения источника питания, В. | double |
LIBFPTR_PARAM_USE_BATTERY | Работа от аккумулятора | bool |
LIBFPTR_PARAM_BATTERY_CHARGING | Аккумуляторы заряжаются | bool |
LIBFPTR_PARAM_CAN_PRINT_WHILE_ON_BATTERY | ККТ может печатать при текущем заряде аккумулятора | bool |
Температура ТПГ
Запрос температуры ТПГ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_PRINTER_TEMPERATURE);
libfptr_query_data(fptr);
int temperature = libfptr_get_param_int(fptr, LIBFPTR_PARAM_PRINTER_TEMPERATURE);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_PRINTER_TEMPERATURE);
fptr.queryData();
uint temperature = fptr.getParamInt(LIBFPTR_PARAM_PRINTER_TEMPERATURE);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_PRINTER_TEMPERATURE);
fptr.queryData();
String temperature = fptr.getParamString(IFptr.LIBFPTR_PARAM_PRINTER_TEMPERATURE);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_PRINTER_TEMPERATURE);
fptr.queryData();
String temperature = fptr.getParamString(IFptr.LIBFPTR_PARAM_PRINTER_TEMPERATURE);
Для запроса температуры ТПГ необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_PRINTER_TEMPERATURE.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_PRINTER_TEMPERATURE | Температура ТПГ, градусы Цельсия | int |
MAC-адрес Ethernet
Запрос MAC-адреса Ethernet
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_MAC_ADDRESS);
libfptr_query_data(fptr);
std::vector<wchar_t> str(1024);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_MAC_ADDRESS, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_MAC_ADDRESS, &str[0], str.size());
}
std::wstring mac = std::wstring(&str[0]);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_MAC_ADDRESS);
fptr.queryData();
std::wstring mac = fptr.getParamString(LIBFPTR_PARAM_MAC_ADDRESS);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_MAC_ADDRESS);
fptr.queryData();
String mac = fptr.getParamString(IFptr.LIBFPTR_PARAM_MAC_ADDRESS);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_MAC_ADDRESS);
fptr.queryData();
String mac = fptr.getParamString(IFptr.LIBFPTR_PARAM_MAC_ADDRESS);
Для запроса MAC-адреса Ethernet необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_MAC_ADDRESS.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_MAC_ADDRESS | MAC-адрес | string |
Время работы ККТ
Запрос времени работы ККТ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_DEVICE_UPTIME);
libfptr_query_data(fptr);
uint uptime = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DEVICE_UPTIME);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_DEVICE_UPTIME);
fptr.queryData();
uint uptime = fptr.getParamInt(LIBFPTR_PARAM_DEVICE_UPTIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_DEVICE_UPTIME);
fptr.queryData();
long uptime = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DEVICE_UPTIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_DEVICE_UPTIME);
fptr.queryData();
long uptime = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DEVICE_UPTIME);
Для запроса времени работы ККТ необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_DEVICE_UPTIME.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DEVICE_UPTIME | Время работы ККТ, с. | int |
Суммы скидок и надбавок за смену
Запрос сумм скидок и надбавок за смену
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_DISCOUNT_AND_SURCHARGE_SUM);
libfptr_query_data(fptr);
double discountSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_DISCOUNT_SUM);
double surchargeSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_SURCHARGE_SUM);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_DISCOUNT_AND_SURCHARGE_SUM);
fptr.queryData();
double discountSum = fptr.getParamDouble(LIBFPTR_PARAM_DISCOUNT_SUM);
double surchargeSum = fptr.getParamDouble(LIBFPTR_PARAM_SURCHARGE_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_DISCOUNT_AND_SURCHARGE_SUM);
fptr.queryData();
double discountSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_DISCOUNT_SUM);
double surchargeSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SURCHARGE_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_DISCOUNT_AND_SURCHARGE_SUM);
fptr.queryData();
double discountSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_DISCOUNT_SUM);
double surchargeSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SURCHARGE_SUM);
Для сумм скидок и надбавок за смену необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_DISCOUNT_AND_SURCHARGE_SUM.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DISCOUNT_SUM | Сумма скидок за смену | double |
LIBFPTR_PARAM_SURCHARGE_SUM | Сумма надбавок за смену | double |
Код привязки к личному кабинету
Запрос кода привязки к ЛК
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_LK_USER_CODE);
libfptr_query_data(fptr);
std::vector<wchar_t> str(1024);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_LK_USER_CODE, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_LK_USER_CODE, &str[0], str.size());
}
std::wstring codeLK = std::wstring(&str[0]);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_LK_USER_CODE);
fptr.queryData();
std::wstring codeLK = fptr.getParamString(LIBFPTR_PARAM_LK_USER_CODE);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_LK_USER_CODE);
fptr.queryData();
String codeLK = fptr.getParamString(IFptr.LIBFPTR_PARAM_LK_USER_CODE);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_LK_USER_CODE);
fptr.queryData();
String codeLK = fptr.getParamString(IFptr.LIBFPTR_PARAM_LK_USER_CODE);
Для запроса кода привязки ККТ к ЛК необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_LK_USER_CODE.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_LK_USER_CODE | Код привязки к ЛК | string |
Дата и время последней успешной отправки документа в ОФД
Запрос даты и времени последней успешной отправки документа в ОФД
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_LAST_SENT_OFD_DOCUMENT_DATE_TIME);
libfptr_query_data(fptr);
int year, month, day, hour, minute, second;
ibfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_LAST_SENT_OFD_DOCUMENT_DATE_TIME);
fptr.queryData();
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_LAST_SENT_OFD_DOCUMENT_DATE_TIME);
fptr.queryData();
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_LAST_SENT_OFD_DOCUMENT_DATE_TIME);
fptr.queryData();
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
Для запроса даты и времени последней успешной отправки документа в ОФД необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_LAST_SENT_OFD_DOCUMENT_DATE_TIME.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DATE_TIME | Дата и время последней успешной отправки документа в ОФД | datetime |
Сменный итог
Запрос сменного итога по чекам прихода
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_SHIFT_TOTALS);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
libfptr_query_data(fptr);
double sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_SUM);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_SHIFT_TOTALS);
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
fptr.queryData();
double sum = fptr.getParamDouble(LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_SHIFT_TOTALS);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_SHIFT_TOTALS);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.queryData();
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_SUM);
Для запроса сменного итога необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_SHIFT_TOTALS и указать тип чека LIBFPTR_PARAM_RECEIPT_TYPE.
Тип чека (LIBFPTR_PARAM_RECEIPT_TYPE) может принимать следующие значения:
- LIBFPTR_RT_SELL - чек прихода (продажи);
- LIBFPTR_RT_SELL_RETURN - чек возврата прихода (продажи);
- LIBFPTR_RT_SELL_CORRECTION - чек коррекции прихода (продажи);
- LIBFPTR_RT_BUY - чек расхода (покупки);
- LIBFPTR_RT_BUY_RETURN - чек возврата расхода (покупки);
- LIBFPTR_RT_BUY_CORRECTION - чек коррекции расхода (покупки).
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SUM | Сумма налога | double |
Параметры шрифта
Запрос параметров шрифта
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_FONT_INFO);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FONT, 1);
libfptr_query_data(fptr);
int lineLength = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPT_LINE_LENGTH);
int fontWidth = libfptr_get_param_int(fptr, LIBFPTR_PARAM_FONT_WIDTH);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_FONT_INFO);
fptr.setParam(LIBFPTR_PARAM_FONT, 1);
fptr.queryData();
uint lineLength = fptr.getParamInt(LIBFPTR_PARAM_RECEIPT_LINE_LENGTH);
uint fontWidth = fptr.getParamInt(LIBFPTR_PARAM_FONT_WIDTH);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_FONT_INFO);
fptr.setParam(IFptr.LIBFPTR_PARAM_FONT, 1);
fptr.queryData();
long lineLength = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_LINE_LENGTH);
long fontWidth = fptr.getParamInt(IFptr.LIBFPTR_PARAM_FONT_WIDTH);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_FONT_INFO);
fptr.setParam(IFptr.LIBFPTR_PARAM_FONT, 1);
fptr.queryData();
long lineLength = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_LINE_LENGTH);
long fontWidth = fptr.getParamInt(IFptr.LIBFPTR_PARAM_FONT_WIDTH);
Для запроса параметров шрифта необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_FONT_INFO и указать номер шрифта в параметре LIBFPTR_PARAM_FONT.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_RECEIPT_LINE_LENGTH | Ширина чековой ленты для данного шрифта, симв. | int |
LIBFPTR_PARAM_FONT_WIDTH | Ширина символа данного шрифта, пикс. | int |
Дата и время последней успешной отправки уведомления в ИСМ
Запрос даты и времени последней успешной отправки уведомления в ИСМ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_LAST_SENT_ISM_NOTICE_DATE_TIME);
libfptr_query_data(fptr);
int year, month, day, hour, minute, second;
ibfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_LAST_SENT_ISM_NOTICE_DATE_TIME);
fptr.queryData();
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_LAST_SENT_ISM_NOTICE_DATE_TIME);
fptr.queryData();
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_LAST_SENT_ISM_NOTICE_DATE_TIME);
fptr.queryData();
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
Для запроса даты и времени последней успешной отправки уведомления в ИСМ необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_LAST_SENT_ISM_NOTICE_DATE_TIME.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DATE_TIME | Дата и время последней успешной отправки уведомления в ИСМ | datetime |
Статус информационного обмена с личным кабинетом
Запрос статуса информационного обмена с личным кабинетом
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_LK_EXCHANGE_STATUS);
libfptr_query_data(fptr);
int year, month, day, hour, minute, second;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
int connect_year, connect_month, connect_day, connect_hour, connect_minute, connect_second;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_CONNECT_DATE_TIME, &connect_year, &connect_month, &connect_day, &connect_hour, &connect_minute, &connect_second);
int submode = libfptr_get_param_int(fptr, LIBFPTR_PARAM_SUBMODE);
int error = libfptr_get_param_int(fptr, LIBFPTR_PARAM_NETWORK_ERROR);
bool is_connect = libfptr_get_param_bool(fptr, LIBFPTR_PARAM_IS_REQUEST_SENT);
std::vector<wchar_t> str(1024);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_NETWORK_ERROR_TEXT, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_NETWORK_ERROR_TEXT, &str[0], str.size());
}
std::wstring error_text = std::wstring(&str[0]);
fptr.setParam(LIBFPTR_PARAM_DATA_TYPE, LIBFPTR_DT_LK_EXCHANGE_STATUS);
fptr.queryData();
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
std::tm connect_date_time = fptr.getParamDateTime(LIBFPTR_PARAM_CONNECT_DATE_TIME);
int submode = fptr.getParamInt(LIBFPTR_PARAM_SUBMODE);
int error = fptr.getParamInt(LIBFPTR_PARAM_NETWORK_ERROR);
std::wstring error_text = fptr.getParamString(LIBFPTR_PARAM_NETWORK_ERROR_TEXT);
bool is_connect = fptr.getParamBool(LIBFPTR_PARAM_IS_REQUEST_SENT);
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_LK_EXCHANGE_STATUS);
fptr.queryData();
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
Date connectDateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_CONNECT_DATE_TIME);
long submode = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SUBMODE);
long error = fptr.getParamInt(IFptr.LIBFPTR_PARAM_NETWORK_ERROR);
String error_text = fptr.getParamString(IFptr.LIBFPTR_PARAM_NETWORK_ERROR_TEXT);
Boolean is_connect = fptr.getParamBool(IFptr.LIBFPTR_PARAM_IS_REQUEST_SENT);
Для запроса информации о работе с личным кабинетом и диагностики связи необходимо вызвать метод queryData() с типом запроса LIBFPTR_PARAM_DATA_TYPE равным LIBFPTR_DT_LK_EXCHANGE_STATUS.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DATE_TIME | Время последней синхронизации | datetime |
LIBFPTR_PARAM_CONNECT_DATE_TIME | Время последней попытки подключения | datetime |
LIBFPTR_PARAM_SUBMODE | Этап работы с личным кабинетом | int |
LIBFPTR_PARAM_NETWORK_ERROR | Код ошибки связи | int |
LIBFPTR_PARAM_NETWORK_ERROR_TEXT | Текстовое описание ошибки связи | string |
LIBFPTR_PARAM_IS_REQUEST_SENT | Результат проверки | bool |
Тип чека (LIBFPTR_PARAM_SUBMODE) может принимать следующие значения:
- 0 - Ожидание подключения;
- 1 - Подключение к серверу;
- 2 - Авторизация в личном кабинете;
- 3 - Запрос наличия данных для ККТ;
- 4 - Получение настроек;
- 5 - Получение подписки;
- 6 - Получение прошивки;
- 7 - Отправка информации о наличии данных для сервера;
- 8 - Отправка информации о ККТ;
- 9 - Отправка настроек.
Регистрация кассира
Регистрация кассира
libfptr_set_param_str(fptr, 1021, L"Кассир Иванов И.");
libfptr_set_param_str(fptr, 1203, L"123456789047");
libfptr_operator_login(fptr);
fptr.setParam(1021, L"Кассир Иванов И.");
fptr.setParam(1203, L"123456789047");
fptr.operatorLogin();
fptr.setParam(1021, "Кассир Иванов И.");
fptr.setParam(1203, "123456789047");
fptr.operatorLogin();
fptr.setParam(1021, "Кассир Иванов И.");
fptr.setParam(1203, "123456789047");
fptr.operatorLogin();
Для регистрации кассира необходимо вызвать метод operatorLogin().
Операции со сменой
Открыть смену
Открытие смены
libfptr_set_param_str(fptr, 1021, L"Кассир Иванов И.");
libfptr_set_param_str(fptr, 1203, L"123456789047");
libfptr_operator_login(fptr);
libfptr_open_shift(fptr);
libfptr_check_document_closed();
fptr.setParam(1021, L"Кассир Иванов И.");
fptr.setParam(1203, L"123456789047");
fptr.operatorLogin();
fptr.openShift();
fptr.checkDocumentClosed();
fptr.setParam(1021, "Кассир Иванов И.");
fptr.setParam(1203, "123456789047");
fptr.operatorLogin();
fptr.openShift();
fptr.checkDocumentClosed();
fptr.setParam(1021, "Кассир Иванов И.");
fptr.setParam(1203, "123456789047");
fptr.operatorLogin();
fptr.openShift();
fptr.checkDocumentClosed();
// ...
Для открытия смены необходимо вызвать метод openShift(). Метод возвращает ошибку, если смена уже открыта. Открывать смену необязательно, т.к. она будет открыта первой фискальной операцией автоматически.
На некоторых ККТ возможно отключить печать отчета об открытии смены с помощью установки параметра LIBFPTR_PARAM_REPORT_ELECTRONICALLY в true. Если ККТ не поддерживает такой функционал, параметр будет проигнорирован и отчет будет напечатан.
Закрыть смену
Закрытие смены
libfptr_set_param_str(fptr, 1021, L"Кассир Иванов И.");
libfptr_set_param_str(fptr, 1203, L"123456789047");
libfptr_operator_login(fptr);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_CLOSE_SHIFT);
libfptr_report(fptr);
libfptr_check_document_closed();
fptr.setParam(1021, L"Кассир Иванов И.");
fptr.setParam(1203, L"123456789047");
fptr.operatorLogin();
fptr.setParam(LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_CLOSE_SHIFT);
fptr.report();
fptr.checkDocumentClosed();
fptr.setParam(1021, "Кассир Иванов И.");
fptr.setParam(1203, "123456789047");
fptr.operatorLogin();
fptr.setParam(IFptr.LIBFPTR_PARAM_REPORT_TYPE, IFptr.LIBFPTR_RT_CLOSE_SHIFT);
fptr.report();
fptr.checkDocumentClosed();
fptr.setParam(1021, "Кассир Иванов И.");
fptr.setParam(1203, "123456789047");
fptr.operatorLogin();
fptr.setParam(IFptr.LIBFPTR_PARAM_REPORT_TYPE, IFptr.LIBFPTR_RT_CLOSE_SHIFT);
fptr.report();
fptr.checkDocumentClosed();
// ...
Для закрытия смены требуется вызвать метод report() с типом отчета LIBFPTR_PARAM_REPORT_TYPE равным LIBFPTR_RT_CLOSE_SHIFT Автоматически может напечататься так же и Z-отчет.
На некоторых ККТ возможно отключить печать отчета о закрытии смены с помощью установки параметра LIBFPTR_PARAM_REPORT_ELECTRONICALLY в true. Если ККТ не поддерживает такой функционал, параметр будет проигнорирован и отчет будет напечатан.
Операции с чеком
Общий алгоритм формирования чека
Формирование чека состоит из следующих операций:
- передача реквизитов чека;
- открытие чека;
- передача реквизитов позиции;
- регистрация позиций;
- регистрация итога (необязательный пункт - если регистрацию итога не провести, он автоматически расчитается из суммы всех позиций);
- регистрация налогов на чек (необязательный пункт - налоги могут быть подтянуты из позиций и суммированы);
- регистрация оплат;
- закрытие чека;
- проверка состояния чека.
Открыть чек
Открытие печатного чека
libfptr_set_param_str(fptr, 1021, L"Кассир Иванов И.");
libfptr_set_param_str(fptr, 1203, L"123456789047");
libfptr_operator_login(fptr);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
libfptr_open_receipt(fptr);
fptr.setParam(1021, L"Кассир Иванов И.");
fptr.setParam(1203, L"123456789047");
fptr.operatorLogin();
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
fptr.openReceipt();
fptr.setParam(1021, "Кассир Иванов И.");
fptr.setParam(1203, "123456789047");
fptr.operatorLogin();
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.openReceipt();
fptr.setParam(1021, "Кассир Иванов И.");
fptr.setParam(1203, "123456789047");
fptr.operatorLogin();
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.openReceipt();
Открытие электронного чека
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
libfptr_set_param_bool(fptr, LIBFPTR_PARAM_RECEIPT_ELECTRONICALLY, true);
libfptr_open_receipt(fptr);
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
fptr.setParam(LIBFPTR_PARAM_RECEIPT_ELECTRONICALLY, true);
fptr.openReceipt();
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_ELECTRONICALLY, true);
fptr.openReceipt();
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_ELECTRONICALLY, true);
fptr.openReceipt();
Открытие чека коррекции прихода (ФФД 1.05)
libfptr_set_param_datetime(fptr, 1178, 2018, 1, 2, 0, 0, 0);
libfptr_set_param_str(fptr, 1179, L"№1234");
libfptr_util_form_tlv(fptr);
std::vector<uchar> correctionInfo(128);
int size = libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_TAG_VALUE,
&correctionInfo[0], correctionInfo.size());
if (size > correctionInfo.size())
{
correctionInfo.resize(size);
libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_TAG_VALUE,
&correctionInfo[0], correctionInfo.size());
}
correctionInfo.resize(size);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL_CORRECTION);
libfptr_set_param_int(fptr, 1173, 1);
libfptr_set_param_bytearray(fptr, 1174, &correctionInfo[0], correctionInfo.size());
libfptr_open_receipt(fptr);
fptr.setParam(1178, std::tm{.tm_mday = 2, .tm_mon = 0, .tm_year = 2018 - 1900});
fptr.setParam(1179, L"№1234");
fptr.utilFormTlv();
std::vector<uchar> correctionInfo = fptr.getParamByteArray(LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL_CORRECTION);
fptr.setParam(1173, 1);
fptr.setParam(1174, correctionInfo);
fptr.openReceipt()
Calendar c = Calendar.getInstance();
c.set(2018, 1, 2);
fptr.setParam(1178, c.getTime());
fptr.setParam(1179, "№1234");
fptr.utilFormTlv();
byte[] correctionInfo = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL_CORRECTION);
fptr.setParam(1173, 1);
fptr.setParam(1174, correctionInfo);
fptr.openReceipt();
Calendar c = Calendar.getInstance();
c.set(2018, 1, 2);
fptr.setParam(1178, c.getTime());
fptr.setParam(1179, "№1234");
fptr.utilFormTlv();
byte[] correctionInfo = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL_CORRECTION);
fptr.setParam(1173, 1);
fptr.setParam(1174, correctionInfo);
fptr.openReceipt();
Открытие чека со сведениями о покупателе (ФФД 1.2)
libfptr_set_param_str(fptr, 1227, L"Покупатель А");
libfptr_set_param_str(fptr, 1228, L"112233445573");
libfptr_util_form_tlv(fptr);
std::vector<uchar> clientInfo(128);
int size = libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_TAG_VALUE,
&clientInfo[0], clientInfo.size());
if (size > clientInfo.size())
{
clientInfo.resize(size);
libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_TAG_VALUE,
&clientInfo[0], clientInfo.size());
}
clientInfo.resize(size);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
libfptr_set_param_bytearray(fptr, 1256, &clientInfo[0], clientInfo.size());
libfptr_open_receipt(fptr);
fptr.setParam(1227, L"Покупатель А");
fptr.setParam(1228, L"112233445573");
fptr.utilFormTlv();
std::vector<uchar> clientInfo = fptr.getParamByteArray(LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
fptr.setParam(1256, clientInfo);
fptr.openReceipt();
fptr.setParam(1227, "Покупатель А");
fptr.setParam(1228, "112233445573");
fptr.utilFormTlv();
byte[] clientInfo = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.setParam(1256, clientInfo);
fptr.openReceipt();
fptr.setParam(1227, "Покупатель А");
fptr.setParam(1228, "112233445573");
fptr.utilFormTlv();
byte[] clientInfo = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.setParam(1256, clientInfo);
fptr.openReceipt();
Открытие чека с отраслевым реквитом чека (тег 1261, ФФД 1.2)
libfptr_set_param_str(fptr, 1262, L"020");
libfptr_set_param_str(fptr, 1263, L"14.12.2018");
libfptr_set_param_str(fptr, 1264, L"1556");
libfptr_set_param_str(fptr, 1265, L"tm=mdlp&sid=00000000105200");
libfptr_util_form_tlv(fptr);
std::vector<uchar> industryInfo(128);
int size = libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_TAG_VALUE,
&industryInfo[0], industryInfo.size());
if (size > industryInfo.size())
{
industryInfo.resize(size);
libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_TAG_VALUE,
&industryInfo[0], industryInfo.size());
}
industryInfo.resize(size);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
libfptr_set_param_bytearray(fptr, 1261, &industryInfo[0]. industryInfo.size());
libfptr_open_receipt(fptr);
fptr.setParam(1262, L"020");
fptr.setParam(1263, L"14.12.2018");
fptr.setParam(1264, L"1556");
fptr.setParam(1265, L"tm=mdlp&sid=00000000105200");
fptr.utilFormTlv();
std::vector<uchar> industryInfo = fptr.getParamByteArray(LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.setParam(1261, industryInfo);
fptr.openReceipt();
fptr.setParam(1262, "020");
fptr.setParam(1263, "14.12.2018");
fptr.setParam(1264, "1556");
fptr.setParam(1265, "tm=mdlp&sid=00000000105200");
fptr.utilFormTlv();
byte[] industryInfo = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.setParam(1261, industryInfo);
fptr.openReceipt();
fptr.setParam(1262, "020");
fptr.setParam(1263, "14.12.2018");
fptr.setParam(1264, "1556");
fptr.setParam(1265, "tm=mdlp&sid=00000000105200");
fptr.utilFormTlv();
byte[] industryInfo = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.setParam(1261, industryInfo);
fptr.openReceipt();
Для открытия чека требуется вызвать метод openReceipt() с указанием типа чека (параметр LIBFPTR_PARAM_RECEIPT_TYPE).
Тип чека (LIBFPTR_PARAM_RECEIPT_TYPE) может принимать следующие значения:
- LIBFPTR_RT_SELL - чек прихода (продажи);
- LIBFPTR_RT_SELL_RETURN - чек возврата прихода (продажи);
- LIBFPTR_RT_SELL_CORRECTION - чек коррекции прихода;
- LIBFPTR_RT_SELL_RETURN_CORRECTION - чек коррекции возврата прихода;
- LIBFPTR_RT_BUY - чек расхода (покупки);
- LIBFPTR_RT_BUY_RETURN - чек возврата расхода (покупки);
- LIBFPTR_RT_BUY_CORRECTION - чек коррекции расхода;
- LIBFPTR_RT_BUY_RETURN_CORRECTION - чек коррекции возврата расхода.
Чтобы чек не печатался (электронный чек), нужно установить параметру LIBFPTR_PARAM_RECEIPT_ELECTRONICALLY значение true.
Также в данном методе можно передать следующие реквизиты (для всех чеков, кроме чеков коррекции):
Параметр | Описание | Тип |
---|---|---|
1008 | Электронный адрес / телефон получателя | string |
1117 | Электронный адрес отправителя чека | string |
1055 | Применяемая система налогообложения (СНО) | int |
1187 | Место расчета | string |
1060 | Адрес сайта ФНС | string |
1084 | Дополнительный реквизит пользователя | bytearray |
1192 | Дополнительный реквизит чека (БСО) | string |
1256 | Сведения о покупателе (клиенте) | bytearray |
1261 | Отраслевой реквизит чека | bytearray |
1270 | Операционный реквизит чека | bytearray |
Реквизит 1256 составной и состоит из следующих реквизитов:
Реквизит | Описание | Тип |
---|---|---|
1227 | Покупатель (клиент) | string |
1228 | ИНН покупателя (клиента) | string |
1243 | Дата рождения покупателя (клиента) | string |
1244 | Гражданство | string |
1245 | Код вида документа, удостоверяющего личность | string |
1246 | Данные документа, удостоверяющего личность | string |
1254 | Адрес покупателя (клиента) | string |
Реквизит 1261 составной и состоит из следующих реквизитов:
Реквизит | Описание | Тип |
---|---|---|
1262 | Идентификатор ФОИВ | string |
1263 | Дата документа основания | datetime |
1264 | Номер документа основания | string |
1265 | Значение отраслевого реквизита | string |
Реквизит 1270 составной и состоит из следующих реквизитов:
Реквизит | Описание | Тип |
---|---|---|
1271 | Идентификатор операции | int |
1272 | Данные операции | string |
1273 | Дата и время операции | datetime |
Реквизит 1084 составной и состоит из следующих реквизитов:
Реквизит | Описание | Тип |
---|---|---|
1085 | Наименование дополнительного реквизита пользователя | string |
1086 | Значение дополнительного реквизита пользователя | string |
Реквизит 1055 может принимать следующие значения:
- LIBFPTR_TT_OSN - общая;
- LIBFPTR_TT_USN_INCOME - упрощенная доход;
- LIBFPTR_TT_USN_INCOME_OUTCOME - упрощенная доход минус расход;
- LIBFPTR_TT_ESN - единый сельскохозяйственный доход;
- LIBFPTR_TT_PATENT - патентная система налогообложения.
Для чеков коррекций допустимы следующие реквизиты:
Реквизит | Описание | Тип |
---|---|---|
1055 | Применяемая система налогообложения | int |
1173 | Тип коррекции | int |
1174 | Основание для коррекции | bytearray |
Реквизит 1174 составной и состоит из следующих реквизитов:
Реквизит | Описание | Тип |
---|---|---|
1178 | Дата совершения корректируемого расчета | datetime |
1179 | Номер предписания налогового органа | string |
Результатом команды будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SHIFT_AUTO_OPENED | true, если при выполнении операции была автоматически открыта смена в ККТ | bool |
Отменить чек
Отмена чека
libfptr_cancel_receipt(fptr);
fptr.cancelReceipt();
fptr.cancelReceipt();
fptr.cancelReceipt();
Для отмены чека требуется вызвать метод cancelReceipt().
Зарегистрировать позицию
Регистрация позиции без указания суммы налога
libfptr_set_param_str(fptr, LIBFPTR_PARAM_COMMODITY_NAME, L"Товар");
libfptr_set_param_double(fptr, LIBFPTR_PARAM_PRICE, 100);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_QUANTITY, 5.15);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT0);
libfptr_registration(fptr);
fptr.setParam(LIBFPTR_PARAM_COMMODITY_NAME, L"Товар");
fptr.setParam(LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT0);
fptr.registration();
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Товар");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT0);
fptr.registration();
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Товар");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT0);
fptr.registration();
Регистрация позиции с указанием суммы налога
libfptr_set_param_str(fptr, LIBFPTR_PARAM_COMMODITY_NAME, L"Товар");
libfptr_set_param_double(fptr, LIBFPTR_PARAM_PRICE, 100);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_QUANTITY, 5.15);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_TAX_SUM, 51.5);
libfptr_registration(fptr);
fptr.setParam(LIBFPTR_PARAM_COMMODITY_NAME, L"Товар");
fptr.setParam(LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
fptr.setParam(LIBFPTR_PARAM_TAX_SUM, 51.5);
fptr.registration();
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Товар");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_SUM, 51.5);
fptr.registration();
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Товар");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_SUM, 51.5);
fptr.registration();
Регистрация позиции без расчета суммы налога
libfptr_set_param_str(fptr, LIBFPTR_PARAM_COMMODITY_NAME, L"Товар");
libfptr_set_param_double(fptr, LIBFPTR_PARAM_PRICE, 100);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_QUANTITY, 5.15);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_USE_ONLY_TAX_TYPE, true);
libfptr_registration(fptr);
// ...
libfptr_set_param_int(fptr, LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_TAX_SUM, 78.56);
libfptr_receipt_tax(fptr);
fptr.setParam(LIBFPTR_PARAM_COMMODITY_NAME, L"Товар");
fptr.setParam(LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT0);
fptr.setParam(LIBFPTR_PARAM_USE_ONLY_TAX_TYPE, true);
fptr.registration();
// ...
fptr.setParam(LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
fptr.setParam(LIBFPTR_PARAM_TAX_SUM, 78.56);
fptr.receiptTax();
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Товар");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT0);
fptr.setParam(IFptr.LIBFPTR_PARAM_USE_ONLY_TAX_TYPE, true);
fptr.registration();
// ...
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_SUM, 78.56);
fptr.receiptTax();
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Товар");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT0);
fptr.setParam(IFptr.LIBFPTR_PARAM_USE_ONLY_TAX_TYPE, true);
fptr.registration();
// ...
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_SUM, 78.56);
fptr.receiptTax();
Регистрация позиции с кодом маркировки
libfptr_set_param_str(fptr, LIBFPTR_PARAM_COMMODITY_NAME, L"Товар");
libfptr_set_param_double(fptr, LIBFPTR_PARAM_PRICE, 100);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_QUANTITY, 5.15);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_TAX_SUM, 51.5);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MARKING_CODE_TYPE, LIBFPTR_MCT_EGAIS_20);
uchar mark[] = {<массив байт от сканера>};
libfptr_set_param_bytearray(fptr, LIBFPTR_PARAM_MARKING_CODE, &mark[0], sizeof(mark));
libfptr_registration(fptr);
fptr.setParam(LIBFPTR_PARAM_COMMODITY_NAME, L"Товар");
fptr.setParam(LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
fptr.setParam(LIBFPTR_PARAM_TAX_SUM, 51.5);
fptr.setParam(LIBFPTR_PARAM_MARKING_CODE_TYPE, LIBFPTR_MCT_EGAIS_20);
fptr.setParam(LIBFPTR_PARAM_MARKING_CODE, {<массив байт от сканера>});
fptr.registration();
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Товар");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_SUM, 51.5);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_TYPE, IFptr.LIBFPTR_MCT_EGAIS_20);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE, new byte[]{<массив байт от сканера>});
fptr.registration();
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Товар");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_SUM, 51.5);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_TYPE, IFptr.LIBFPTR_MCT_EGAIS_20);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE, new byte[]{<массив байт от сканера>});
fptr.registration();
Регистрация позиции с кодом товара (1162)
libfptr_set_param_str(fptr, LIBFPTR_PARAM_COMMODITY_NAME, L"Товар");
libfptr_set_param_double(fptr, LIBFPTR_PARAM_PRICE, 100);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_QUANTITY, 5.15);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_TAX_SUM, 51.5);
uchar code[] = {<массив байт реквизита 1162>};
libfptr_set_param_bytearray(fptr, 1162, &code[0], sizeof(code));
libfptr_registration(fptr);
fptr.setParam(LIBFPTR_PARAM_COMMODITY_NAME, L"Товар");
fptr.setParam(LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
fptr.setParam(LIBFPTR_PARAM_TAX_SUM, 51.5);
fptr.setParam(1162, {<массив байт реквизита 1162>});
fptr.registration();
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Товар");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_SUM, 51.5);
fptr.setParam(1162, new byte[]{<массив байт реквизита 1162>});
fptr.registration();
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Товар");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_SUM, 51.5);
fptr.setParam(1162, new byte[]{<массив байт реквизита 1162>});
fptr.registration();
Регистрация позиции с агентом и поставщиком
libfptr_set_param_str(fptr, 1005, L"Улица Свободы, д.1");
libfptr_set_param_str(fptr, 1016, L"123456789047");
libfptr_set_param_str(fptr, 1026, L"ООО Оператор");
libfptr_set_param_str(fptr, 1075, L"+79161234567");
libfptr_set_param_str(fptr, 1075, L"+79169876543");
libfptr_util_form_tlv(fptr);
std::vector<uchar> agentInfo(128);
int size = libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_TAG_VALUE,
&agentInfo[0], agentInfo.size());
if (size > agentInfo.size())
{
agentInfo.resize(size);
libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_TAG_VALUE,
&agentInfo[0], agentInfo.size());
}
agentInfo.resize(size);
libfptr_set_param_str(fptr, 1171, L"+79113456789");
libfptr_set_param_str(fptr, 1225, L"ООО Поставщик");
libfptr_util_form_tlv(fptr);
std::vector<uchar> suplierInfo;
int size = libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_TAG_VALUE,
&suplierInfo[0], suplierInfo.size());
if (size > suplierInfo.size())
{
suplierInfo.resize(size);
libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_TAG_VALUE,
&suplierInfo[0], suplierInfo.size());
}
suplierInfo.resize(size);
libfptr_set_param_str(fptr, LIBFPTR_PARAM_COMMODITY_NAME, L"Товар");
libfptr_set_param_double(fptr, LIBFPTR_PARAM_PRICE, 100);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_QUANTITY, 5.15);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
libfptr_set_param_int(fptr, 1222, LIBFPTR_AT_ANOTHER);
libfptr_set_param_bytearray(fptr, 1223, &agentInfo[0]. agentInfo.size());
libfptr_set_param_str(fptr, 1226, L"123456789047");
libfptr_set_param_bytearray(fptr, 1224, &suplierInfo[0]. suplierInfo.size());
libfptr_registration(fptr);
fptr.setParam(1005, L"Улица Свободы, д.1");
fptr.setParam(1016, L"123456789047");
fptr.setParam(1026, L"ООО Оператор");
fptr.setParam(1075, L"+79161234567");
fptr.setParam(1075, L"+79169876543");
fptr.utilFormTlv();
std::vector<uchar> agentInfo = fptr.getParamByteArray(LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(1171, L"+79113456789");
fptr.setParam(1225, L"ООО Поставщик");
fptr.utilFormTlv();
std::vector<uchar> suplierInfo = fptr.getParamByteArray(LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(LIBFPTR_PARAM_COMMODITY_NAME, L"Товар");
fptr.setParam(LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
fptr.setParam(1222, LIBFPTR_AT_ANOTHER);
fptr.setParam(1223, agentInfo);
fptr.setParam(1226, L"123456789047");
fptr.setParam(1224, suplierInfo);
fptr.registration();
fptr.setParam(1005, "Улица Свободы, д.1");
fptr.setParam(1016, "123456789047");
fptr.setParam(1026, "ООО Оператор");
fptr.setParam(1075, "+79161234567");
fptr.setParam(1075, "+79169876543");
fptr.utilFormTlv();
byte[] agentInfo = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(1171, "+79113456789");
fptr.setParam(1225, "ООО Поставщик");
fptr.utilFormTlv();
byte[] suplierInfo = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Товар");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(1222, IFptr.LIBFPTR_AT_ANOTHER);
fptr.setParam(1223, agentInfo);
fptr.setParam(1226, "123456789047");
fptr.setParam(1224, suplierInfo);
fptr.registration();
fptr.setParam(1005, "Улица Свободы, д.1");
fptr.setParam(1016, "123456789047");
fptr.setParam(1026, "ООО Оператор");
fptr.setParam(1075, "+79161234567");
fptr.setParam(1075, "+79169876543");
fptr.utilFormTlv();
byte[] agentInfo = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(1171, "+79113456789");
fptr.setParam(1225, "ООО Поставщик");
fptr.utilFormTlv();
byte[] suplierInfo = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Товар");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 100);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 5.15);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(1222, IFptr.LIBFPTR_AT_ANOTHER);
fptr.setParam(1223, agentInfo);
fptr.setParam(1226, "123456789047");
fptr.setParam(1224, suplierInfo);
fptr.registration();
Регистрация позиции с отраслевым реквизитом предмета расчета (тег 1260, ФФД 1.2)
const wchar_t mark[] = L"014494550435306821QXYXSALGLMYQQ\u001D91EE06\u001D92YWCXbmK6SN8vvwoxZFk7WAY8WoJNMGGr6Cgtiuja04c=";
uint status = 2;
libfptr_set_param_str(fptr, 1262, L"020");
libfptr_set_param_str(fptr, 1263, L"14.12.2018");
libfptr_set_param_str(fptr, 1264, L"1556");
libfptr_set_param_str(fptr, 1265, L"tm=mdlp&sid=00000000105200");
libfptr_util_form_tlv(fptr);
std::vector<uchar> industryInfo(128);
int size = libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_TAG_VALUE,
&industryInfo[0], industryInfo.size());
if (size > industryInfo.size())
{
industryInfo.resize(size);
libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_TAG_VALUE,
&industryInfo[0], industryInfo.size());
}
industryInfo.resize(size);
uint validationResult = libfptr_get_param_int(fptr, LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
libfptr_set_param_str(fptr, LIBFPTR_PARAM_COMMODITY_NAME, L"Афобазол");
libfptr_set_param_double(fptr, LIBFPTR_PARAM_PRICE, 450);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_QUANTITY, 1.000);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MEASUREMENT_UNIT, LIBFPTR_IU_PIECE);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
libfptr_set_param_int(fptr, 1212, 33);
libfptr_set_param_int(fptr, 1214, 4);
libfptr_set_param_bytearray(fptr, 1260, &industryInfo[0]. industryInfo.size());
libfptr_set_param_bytearray(fptr, LIBFPTR_PARAM_MARKING_CODE, mark);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MARKING_CODE_STATUS, status);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MARKING_CODE_TYPE, LIBFPTR_MCT12_AUTO);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
libfptr_registration(fptr);
std::wstring mark = L"014494550435306821QXYXSALGLMYQQ\u001D91EE06\u001D92YWCXbmK6SN8vvwoxZFk7WAY8WoJNMGGr6Cgtiuja04c=";
uint status = 2;
fptr.setParam(1262, L"020");
fptr.setParam(1263, L"14.12.2018");
fptr.setParam(1264, L"1556");
fptr.setParam(1265, L"tm=mdlp&sid=00000000105200");
fptr.utilFormTlv();
std::vector<uchar> industryInfo = fptr.getParamByteArray(LIBFPTR_PARAM_TAG_VALUE);
uint validationResult = fptr.getParamInt(LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, L"Афобазол");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 450);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 1.000);
fptr.setParam(IFptr.LIBFPTR_PARAM_MEASUREMENT_UNIT, IFptr.LIBFPTR_IU_PIECE);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(1212, 33);
fptr.setParam(1214, 4);
fptr.setParam(1260, industryInfo);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE, mark);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_STATUS, status);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_TYPE, IFptr.LIBFPTR_MCT12_AUTO);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
fptr.registration();
String mark = "014494550435306821QXYXSALGLMYQQ\u001D91EE06\u001D92YWCXbmK6SN8vvwoxZFk7WAY8WoJNMGGr6Cgtiuja04c=";
long status = 2;
fptr.setParam(1262, "020");
fptr.setParam(1263, "14.12.2018");
fptr.setParam(1264, "1556");
fptr.setParam(1265, "tm=mdlp&sid=00000000105200");
fptr.utilFormTlv();
byte[] industryInfo = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_TAG_VALUE);
long validationResult = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Афобазол");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 450);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 1.000);
fptr.setParam(IFptr.LIBFPTR_PARAM_MEASUREMENT_UNIT, IFptr.LIBFPTR_IU_PIECE);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(1212, 33);
fptr.setParam(1214, 4);
fptr.setParam(1260, industryInfo);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE, mark);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_STATUS, status);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_TYPE, IFptr.LIBFPTR_MCT12_AUTO);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
fptr.registration();
String mark = "014494550435306821QXYXSALGLMYQQ\u001D91EE06\u001D92YWCXbmK6SN8vvwoxZFk7WAY8WoJNMGGr6Cgtiuja04c=";
long status = 2;
fptr.setParam(1262, "020");
fptr.setParam(1263, "14.12.2018");
fptr.setParam(1264, "1556");
fptr.setParam(1265, "tm=mdlp&sid=00000000105200");
fptr.utilFormTlv();
byte[] industryInfo = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_TAG_VALUE);
long validationResult = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Афобазол");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 450);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 1.000);
fptr.setParam(IFptr.LIBFPTR_PARAM_MEASUREMENT_UNIT, IFptr.LIBFPTR_IU_PIECE);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(1212, 33);
fptr.setParam(1214, 4);
fptr.setParam(1260, industryInfo);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE, mark);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_STATUS, status);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_TYPE, IFptr.LIBFPTR_MCT12_AUTO);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
fptr.registration();
Регистрация позиции с кодами товаров без указания типа (тег 1163, ФФД 1.2)
...
libfptr_set_param_str(fptr, LIBFPTR_PARAM_PRODUCT_CODE, L"61940017"); //EAN-8
libfptr_set_param_str(fptr, LIBFPTR_PARAM_PRODUCT_CODE, L"6199000000012"); //EAN-13
libfptr_set_param_str(fptr, LIBFPTR_PARAM_PRODUCT_CODE, L"14841234567890"); //ITF-14
libfptr_registration(fptr);
...
fptr.setParam(LIBFPTR_PARAM_PRODUCT_CODE, L"61940017"); //EAN-8
fptr.setParam(LIBFPTR_PARAM_PRODUCT_CODE, L"6199000000012"); //EAN-13
fptr.setParam(LIBFPTR_PARAM_PRODUCT_CODE, L"14841234567890"); //ITF-14
fptr.registration();
...
fptr.setParam(IFptr.LIBFPTR_PARAM_PRODUCT_CODE, "61940017"); //EAN-8
fptr.setParam(IFptr.LIBFPTR_PARAM_PRODUCT_CODE, "6199000000012"); //EAN-13
fptr.setParam(IFptr.LIBFPTR_PARAM_PRODUCT_CODE, "14841234567890"); //ITF-14
fptr.registration();
...
fptr.setParam(IFptr.LIBFPTR_PARAM_PRODUCT_CODE, "61940017"); //EAN-8
fptr.setParam(IFptr.LIBFPTR_PARAM_PRODUCT_CODE, "6199000000012"); //EAN-13
fptr.setParam(IFptr.LIBFPTR_PARAM_PRODUCT_CODE, "14841234567890"); //ITF-14
fptr.registration();
Регистрация позиции с кодами товаров с указанием типа (тег 1163, ФФД 1.2)
...
libfptr_set_param_str(fptr, 1301, L"61940017"); //EAN-8
libfptr_set_param_str(fptr, 1302, L"6199000000012"); //EAN-13
libfptr_set_param_str(fptr, 1303, L"14841234567890"); //ITF-14
libfptr_registration(fptr);
...
fptr.setParam(1301, L"61940017"); //EAN-8
fptr.setParam(1302, L"6199000000012"); //EAN-13
fptr.setParam(1303, L"14841234567890"); //ITF-14
fptr.registration();
...
fptr.setParam(1301, "61940017"); //EAN-8
fptr.setParam(1302, "6199000000012"); //EAN-13
fptr.setParam(1303, "14841234567890"); //ITF-14
fptr.registration();
...
fptr.setParam(1301, "61940017"); //EAN-8
fptr.setParam(1302, "6199000000012"); //EAN-13
fptr.setParam(1303, "14841234567890"); //ITF-14
fptr.registration();
Для регистрации позиции требуется вызвать метод registration().
Обязательными входными параметрами для метода являются:
- LIBFPTR_PARAM_COMMODITY_NAME - название товара
- LIBFPTR_PARAM_PRICE - цена за единицу
- LIBFPTR_PARAM_QUANTITY - количество единиц товара
При передаче только этих параметров будет произведена регистрация товара с расчетом полной суммы позиции и суммы налога на стороне ККТ.
Ниже представлен список дополнительных параметров позиции (могут не поддерживаться в ККТ - в этом случае будет выдана ошибка):
- LIBFPTR_PARAM_TAX_TYPE - номер налоговой ставки, по умолчанию передаётся LIBFPTR_TAX_NO:
- LIBFPTR_TAX_DEPARTMENT - тип, привязанный к секции товара;
- LIBFPTR_TAX_VAT10 - НДС 10%;
- LIBFPTR_TAX_VAT110 - НДС рассчитанный 10/110;
- LIBFPTR_TAX_VAT0 - НДС 0%;
- LIBFPTR_TAX_NO - не облагается;
- LIBFPTR_TAX_VAT20 - НДС 20%;
- LIBFPTR_TAX_VAT120 - НДС рассчитанный 20/120.
- LIBFPTR_PARAM_POSITION_SUM - полная сумма позиции. Может отличаться от произведения цены на количество. В этом случае ККТ разобьет позицию на две, распределив получившуюся разницу (скидку или надбавку) между позициями;
- LIBFPTR_PARAM_DEPARTMENT - номер отдела;
- LIBFPTR_PARAM_TAX_SUM - сумма налога. При передаче значения 0 рассчитывается автоматически;
- LIBFPTR_PARAM_USE_ONLY_TAX_TYPE - регистрировать в ФН только ставку налога. В этом случае требуется до закрытия чека зарегистрировать сумму налога по данной ставке с помощью метода receiptTax();
- LIBFPTR_PARAM_TAX_MODE - способ начисления налога. Параметр принимает следующие значения:
- LIBFPTR_TM_POSITION - на позицию целиком;
- LIBFPTR_TM_UNIT - на единицу товара.
- LIBFPTR_PARAM_INFO_DISCOUNT_SUM - информация о скидке/надбавке. Параметр не влияет на итоговую сумму позиции, просто будет напечатана информационная строка о сумме скидки/надбавки;
- LIBFPTR_PARAM_COMMODITY_PIECE - флаг штучного товара. В количестве не будут напечатаны нули в дробной части;
- LIBFPTR_PARAM_CHECK_SUM - флаг проверки наличности в ДЯ при регистрации позиции. По умолчанию false;
- LIBFPTR_PARAM_PRODUCT_CODE - код товара, содержит данные штрихкода, включается в реквизит 1163 (на стороне ККТ). В этом параметре можно передать данные от сканера. Данный параметр можно подать несколько раз (в зависимости от количества кодов товара).
Также в данном методе можно передать следующие реквизиты ФН:
Реквизит | Описание | Тип |
---|---|---|
1191 | Дополнительный реквизит предмета расчета | string |
1197 | Единицы измерения предмета расчета | string |
2108 | Мера количества предмета расчета | int |
1212 | Признак предмета расчета | int |
1214 | Признак способа расчета | int |
1222 | Признак агента по предмету расчета | int |
1223 | Данные агента | bytearray |
1224 | Данные поставщика | bytearray |
1226 | ИНН поставщика | string |
1229 | Акциз | double |
1230 | Код страны происхождения товара | string |
1231 | Номер таможенной декларации | string |
1260 | Отраслевой реквизит предмета расчета | bytearray |
Реквизит 1260 составной и состоит из следующих реквизитов:
Реквизит | Описание | Тип |
---|---|---|
1262 | Идентификатор ФОИВ | string |
1263 | Дата документа основания | datetime |
1264 | Номер документа основания | string |
1265 | Значение отраслевого реквизита | string |
Реквизит 1222 может принимать следующие значения:
- LIBFPTR_AT_BANK_PAYING_AGENT - банковский платежный агент;
- LIBFPTR_AT_BANK_PAYING_SUBAGENT - банковский платежный субагент;
- LIBFPTR_AT_PAYING_AGENT - платежный агент;
- LIBFPTR_AT_PAYING_SUBAGENT - платежный субагент;
- LIBFPTR_AT_ATTORNEY - поверенный;
- LIBFPTR_AT_COMMISSION_AGENT - комиссионер;
- LIBFPTR_AT_ANOTHER - другой тип агента.
Реквизит 1223 составной и состоит из следующих реквизитов:
Реквизит | Описание | Тип |
---|---|---|
1005 | Адрес оператора перевода | string |
1016 | ИНН оператора перевода | string |
1026 | Наименование оператора перевода | string |
1044 | Операция банковского платежного агента | string |
1073 | Телефон платежного агента (может повторяться несколько раз) | string |
1074 | Телефон оператора по приему платежей (может повторяться несколько раз) | string |
1075 | Телефон оператора перевода (может повторяться несколько раз) | string |
Реквизит 1224 составной и состоит из следующих реквизитов:
Реквизит | Описание | Тип |
---|---|---|
1171 | Телефон поставщика (может повторяться несколько раз) | string |
1225 | Наименование поставщика | string |
В позицию также можно передать коды товара (реквизит 1163), при этом сам реквизит 1163 формировать не требуется, коды товара подаются одним из следующих способов:
- с указанием типов КТ (пользователь сам формирует реквизиты с конкретным типом кодов товара - реквизиты 13XX);
- без указания типов КТ (пользователь задаёт массив кодов товара, ККТ сама разбирает их тип и формирует реквизит 1163 - параметр LIBFPTR_PARAM_PRODUCT_CODE, может быть подан несколько раз);
Комбинировать данные способы запрещено! То есть необходимо подать либо все коды товара с заданным типом, либо с автоопределением.
Используемые коды товара описаны ниже:
Реквизит | Описание | Тип |
---|---|---|
1300 | Нераспознанный код товара | string |
1301 | КТ EAN-8 | string |
1302 | КТ EAN-13 | string |
1303 | КТ ITF-14 | string |
1304 | КТ GS1.0 | string |
1305 | КТ GS1.M | string |
1306 | КТ КМК (короткий маркировочный код) | string |
1307 | КТ МИ (меховые изделия) | string |
1308 | КТ ЕГАИС-2.0 | string |
1309 | КТ ЕГАИС-3.0 | string |
1320 | КТ Ф.1 | string |
1321 | КТ Ф.2 | string |
1322 | КТ Ф.3 | string |
1323 | КТ Ф.4 | string |
1324 | КТ Ф.5 | string |
1325 | КТ Ф.6 | string |
Зарегистрировать оплату
Оплата чека
libfptr_set_param_int(fptr, LIBFPTR_PARAM_PAYMENT_TYPE, LIBFPTR_PT_CASH);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_PAYMENT_SUM, 100.00);
libfptr_payment(fptr);
fptr.setParam(LIBFPTR_PARAM_PAYMENT_TYPE, LIBFPTR_PT_CASH);
fptr.setParam(LIBFPTR_PARAM_PAYMENT_SUM, 100.00);
fptr.payment();
fptr.setParam(IFptr.LIBFPTR_PARAM_PAYMENT_TYPE, IFptr.LIBFPTR_PT_CASH);
fptr.setParam(IFptr.LIBFPTR_PARAM_PAYMENT_SUM, 100.00);
fptr.payment();
fptr.setParam(IFptr.LIBFPTR_PARAM_PAYMENT_TYPE, IFptr.LIBFPTR_PT_CASH);
fptr.setParam(IFptr.LIBFPTR_PARAM_PAYMENT_SUM, 100.00);
fptr.payment();
Для регистрации оплаты чека требуется вызвать метод payment(), передав способ расчета в параметре LIBFPTR_PARAM_PAYMENT_TYPE и сумму расчета в параметре LIBFPTR_PARAM_PAYMENT_SUM.
Способ расчета (LIBFPTR_PARAM_PAYMENT_TYPE) может принимать следующие значения:
- LIBFPTR_PT_CASH - наличными;
- LIBFPTR_PT_ELECTRONICALLY - безналичными;
- LIBFPTR_PT_PREPAID - предварительная оплата (аванс);
- LIBFPTR_PT_CREDIT - последующая оплата (кредит);
- LIBFPTR_PT_OTHER - иная форма оплаты (встречное предоставление);
- LIBFPTR_PT_6 - способ расчета №6;
- LIBFPTR_PT_7 - способ расчета №7;
- LIBFPTR_PT_8 - способ расчета №8;
- LIBFPTR_PT_9 - способ расчета №9;
- LIBFPTR_PT_10 - способ расчета №10.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_REMAINDER | Неоплаченный остаток чека | double |
LIBFPTR_PARAM_CHANGE | Сдача по чеку | double |
Зарегистрировать налог на чек
Регистрация налога на чек
libfptr_set_param_int(fptr, LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_TAX_SUM, 100.00);
libfptr_receipt_tax(fptr);
fptr.setParam(LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
fptr.setParam(LIBFPTR_PARAM_TAX_SUM, 100.00);
fptr.receiptTax();
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_SUM, 100.00);
fptr.receiptTax();
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_SUM, 100.00);
fptr.receiptTax();
Для регистрации налога на чек требуется вызвать метод receiptTax(), передав тип налога в параметре LIBFPTR_PARAM_TAX_TYPE и сумму налога в параметре LIBFPTR_PARAM_TAX_SUM.
Тип налога (LIBFPTR_PARAM_TAX_TYPE) может принимать следующие значения:
- LIBFPTR_TAX_VAT10 - НДС 10%;
- LIBFPTR_TAX_VAT110 - НДС расчитанный 10/110;
- LIBFPTR_TAX_VAT0 - НДС 0%;
- LIBFPTR_TAX_NO - не облагается;
- LIBFPTR_TAX_VAT20 - НДС 20%;
- LIBFPTR_TAX_VAT120 - НДС расчитанный 20/120.
Закрыть чек
Закрытие частично оплаченного или неоплаченного чека
libfptr_set_param_int(fptr, LIBFPTR_PARAM_PAYMENT_TYPE, LIBFPTR_PT_ELECTRONICALLY);
libfptr_close_receipt(fptr);
fptr.setParam(LIBFPTR_PARAM_PAYMENT_TYPE, LIBFPTR_PT_ELECTRONICALLY);
fptr.closeReceipt();
fptr.setParam(IFptr.LIBFPTR_PARAM_PAYMENT_TYPE, IFptr.LIBFPTR_PT_ELECTRONICALLY);
fptr.closeReceipt();
fptr.setParam(IFptr.LIBFPTR_PARAM_PAYMENT_TYPE, IFptr.LIBFPTR_PT_ELECTRONICALLY);
fptr.closeReceipt();
Закрытие полностью оплаченного чека
libfptr_close_receipt(fptr);
fptr.closeReceipt();
fptr.closeReceipt();
fptr.closeReceipt();
Для закрытия чека требуется вызвать метод closeReceipt().
Если чек оплачен не полностью или не оплачен совсем (не зарегистрирована ни одна оплата), то чек будет автоматически оплачен / доплачен заданным в параметре LIBFPTR_PARAM_PAYMENT_TYPE типом оплаты и закрыт. Если в этом случае способ расчета не передан, будет использован наличный способ расчета (LIBFPTR_PT_CASH). Если чек уже полностью оплачен, то значение параметра LIBFPTR_PARAM_PAYMENT_TYPE ни на что не влияет.
Проверить закрытие документа
Проверка закрытия документа (на примере закрытия фискального чека)
// Вспомогательная функция для чтения текста ошибки
std::wstring getErrorDescription(libfptr_handle fptr)
{
std::vector<wchar_t> str(32);
int size = libfptr_error_description(fptr, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_error_description(fptr, &str[0], str.size());
}
return std::wstring(&str[0]);
}
libfptr_close_receipt(fptr);
while (libfptr_check_document_closed(fptr) < 0) {
// Не удалось проверить состояние документа. Вывести пользователю текст ошибки, попросить устранить неполадку и повторить запрос
std::wcout << getErrorDescription(fptr) << std::endl;
continue;
}
if (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_DOCUMENT_CLOSED) == 0) {
// Документ не закрылся. Требуется его отменить (если это чек) и сформировать заново
libfptr_cancel_receipt(fptr);
return;
}
if (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_DOCUMENT_PRINTED) == 0) {
// Можно сразу вызвать метод допечатывания документа, он завершится с ошибкой, если это невозможно
while (libfptr_continue_print(fptr) < 0) {
// Если не удалось допечатать документ - показать пользователю ошибку и попробовать еще раз.
std::wcout << L"Не удалось напечатать документ (Ошибка \"" << getErrorDescription(fptr) << L"\"). Устраните неполадку и повторите." << std::endl;
continue;
}
}
fptr.closeReceipt();
while (fptr.checkDocumentClosed() < 0)
{
// Не удалось проверить состояние документа. Вывести пользователю текст ошибки, попросить устранить неполадку и повторить запрос
std::wcout << fptr.errorDescription(fptr) << std::endl;
continue;
}
if (!fptr.getParamBool(LIBFPTR_PARAM_DOCUMENT_CLOSED))
{
// Документ не закрылся. Требуется его отменить (если это чек) и сформировать заново
fptr.cancelReceipt();
return;
}
if (!fptr.getParamBool(LIBFPTR_PARAM_DOCUMENT_PRINTED))
{
// Можно сразу вызвать метод допечатывания документа, он завершится с ошибкой, если это невозможно
while (fptr.continuePrint() < 0)
{
// Если не удалось допечатать документ - показать пользователю ошибку и попробовать еще раз.
std::wcout << L"Не удалось напечатать документ (Ошибка \"" << fptr.errorDescription() << L"\"). Устраните неполадку и повторите." << std::endl;
continue;
}
}
fptr.closeReceipt();
while (fptr.checkDocumentClosed() < 0) {
// Не удалось проверить состояние документа. Вывести пользователю текст ошибки, попросить устранить неполадку и повторить запрос
System.out.println(fptr.errorDescription());
continue;
}
if (!fptr.getParamBool(IFptr.LIBFPTR_PARAM_DOCUMENT_CLOSED)) {
// Документ не закрылся. Требуется его отменить (если это чек) и сформировать заново
fptr.cancelReceipt();
return;
}
if (!fptr.getParamBool(IFptr.LIBFPTR_PARAM_DOCUMENT_PRINTED)) {
// Можно сразу вызвать метод допечатывания документа, он завершится с ошибкой, если это невозможно
while (fptr.continuePrint() < 0) {
// Если не удалось допечатать документ - показать пользователю ошибку и попробовать еще раз.
System.out.println(String.format("Не удалось напечатать документ (Ошибка \"%s\"). Устраните неполадку и повторите.", fptr.errorDescription()));
continue;
}
}
fptr.closeReceipt();
while (fptr.checkDocumentClosed() < 0) {
// Не удалось проверить состояние документа. Вывести пользователю текст ошибки, попросить устранить неполадку и повторить запрос
Log.d(TAG, fptr.errorDescription());
continue;
}
if (!fptr.getParamBool(IFptr.LIBFPTR_PARAM_DOCUMENT_CLOSED)) {
// Документ не закрылся. Требуется его отменить (если это чек) и сформировать заново
fptr.cancelReceipt();
return;
}
if (!fptr.getParamBool(IFptr.LIBFPTR_PARAM_DOCUMENT_PRINTED)) {
// Можно сразу вызвать метод допечатывания документа, он завершится с ошибкой, если это невозможно
while (fptr.continuePrint() < 0) {
// Если не удалось допечатать документ - показать пользователю ошибку и попробовать еще раз.
Log.d(TAG, String.format("Не удалось напечатать документ (Ошибка \"%s\"). Устраните неполадку и повторите.", fptr.errorDescription()));
continue;
}
}
В ряде ситуаций (окончание бумаги, потеря связи с ККТ в момент регистрации документа) состояние документа остается неизвестным. Он может закрыться в ФН (что является необратимой операцией), но не напечататься на чековой ленте. Данный метод сверяет счетчики ККТ с сохраненными до закрытия документа копиями и вычисляет, закрылся ли он, а также проверяет состояние печати документа.
Метод применим для следующих типов документов:
- чеков;
- отчетов закрытия и открытия смены;
- отчетов регистрации, перерегистрации ККТ, закрытия ФН;
- отчета о состоянии расчетов.
Если какой-то из документов формируется автоматически (например, открытие смены при формировании первого чека в смене), то метод checkDocumentClosed() его учитывать не будет.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DOCUMENT_CLOSED | Документ закрылся | bool |
LIBFPTR_PARAM_DOCUMENT_PRINTED | Документ допечатался | bool |
Работа с марками в ФФД 1.2
Дополнительные настройки
В драйвер добавлена дополнительная настройка LIBFPTR_SETTING_VALIDATE_MARK_WITH_FNM_ONLY, позволяющая проводить проверку КМ средствами драйвера.
Проверка КМ
const wchar_t mark[] = L"014494550435306821QXYXSALGLMYQQ\u001D91EE06\u001D92YWCXbmK6SN8vvwoxZFk7WAY8WoJNMGGr6Cgtiuja04c=";
uint status = 2;
// Запускаем проверку КМ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MARKING_CODE_TYPE, LIBFPTR_MCT12_AUTO);
libfptr_set_param_str(fptr, LIBFPTR_PARAM_MARKING_CODE, mark);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MARKING_CODE_STATUS, status);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_QUANTITY, 1.000);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MEASUREMENT_UNIT, LIBFPTR_IU_PIECE);
libfptr_set_param_bool(fptr, LIBFPTR_PARAM_MARKING_WAIT_FOR_VALIDATION_RESULT, true);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
libfptr_set_param_str(fptr, LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY, L"1/2");
libfptr_begin_marking_code_validation(fptr);
// Дожидаемся окончания проверки и запоминаем результат
while (true) {
libfptr_get_marking_code_validation_status(fptr);
if (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY))
break;
}
uint validationResult = libfptr_get_param_int(fptr, LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
// Подтверждаем реализацию товара с указанным КМ
libfptr_accept_marking_code(fptr);
// ... Проверяем остальные КМ
// Формируем чек
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
libfptr_open_receipt(fptr);
libfptr_set_param_str(fptr, LIBFPTR_PARAM_COMMODITY_NAME, L"Молоко");
libfptr_set_param_int(fptr, LIBFPTR_PARAM_PRICE, 80);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_QUANTITY, 1.000);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MEASUREMENT_UNIT, LIBFPTR_IU_PIECE);
libfptr_set_param_str(fptr, LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY, L"1/2");
libfptr_set_param_int(fptr, LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
libfptr_set_param_int(fptr, 1212, 1);
libfptr_set_param_int(fptr, 1214, 7);
libfptr_set_param_str(fptr, LIBFPTR_PARAM_MARKING_CODE, mark);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MARKING_CODE_STATUS, status);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
libfptr_registration(fptr);
// ... Регистрируем остальные позиции
libfptr_set_param_int(fptr, LIBFPTR_PARAM_SUM, 120);
libfptr_receipt_total(fptr);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_PAYMENT_TYPE, LIBFPTR_PT_CASH);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_PAYMENT_SUM, 1000);
libfptr_payment(fptr);
// Перед закрытием проверяем, что все КМ отправились (на случай, если были проверки КМ без ожидания результата
while (true) {
libfptr_check_marking_code_validations_ready(fptr);
if (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY))
break;
}
libfptr_close_receipt(fptr);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MARKING_CODE_TYPE, LIBFPTR_MCT12_AUTO);
libfptr_set_param_str(fptr, LIBFPTR_PARAM_MARKING_CODE, L"014494550435306821QXYXSALGLMYQQ\u001D91EE06\u001D92YWCXbmK6SN8vvwoxZFk7WAY8WoJNMGGr6Cgtiuja04c=");
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MARKING_CODE_STATUS, 2);
libfptr_set_param_double(fptr, LIBFPTR_PARAM_QUANTITY, 1.000);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MEASUREMENT_UNIT, fptr.LIBFPTR_IU_PIECE);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
libfptr_set_param_str(fptr, LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY, L"1/2");
libfptr_begin_marking_code_validation(fptr);
std::wstring mark = L"014494550435306821QXYXSALGLMYQQ\u001D91EE06\u001D92YWCXbmK6SN8vvwoxZFk7WAY8WoJNMGGr6Cgtiuja04c=";
uint status = 2;
// Запускаем проверку КМ
fptr.setParam(LIBFPTR_PARAM_MARKING_CODE_TYPE, LIBFPTR_MCT12_AUTO);
fptr.setParam(LIBFPTR_PARAM_MARKING_CODE, mark);
fptr.setParam(LIBFPTR_PARAM_MARKING_CODE_STATUS, status);
fptr.setParam(LIBFPTR_PARAM_QUANTITY, 1.000);
fptr.setParam(LIBFPTR_PARAM_MEASUREMENT_UNIT, LIBFPTR_IU_PIECE);
fptr.setParam(LIBFPTR_PARAM_MARKING_WAIT_FOR_VALIDATION_RESULT, true);
fptr.setParam(LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
fptr.setParam(LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY, L"1/2");
fptr.beginMarkingCodeValidation();
// Дожидаемся окончания проверки и запоминаем результат
while (true) {
fptr.getMarkingCodeValidationStatus();
if (fptr.getParamBool(LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY))
break;
}
uint validationResult = fptr.getParamInt(LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
// Подтверждаем реализацию товара с указанным КМ
fptr.acceptMarkingCode();
// ... Проверяем остальные КМ
// Формируем чек
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
fptr.openReceipt();
fptr.setParam(LIBFPTR_PARAM_COMMODITY_NAME, L"Молоко");
fptr.setParam(LIBFPTR_PARAM_PRICE, 80);
fptr.setParam(LIBFPTR_PARAM_QUANTITY, 1.000);
fptr.setParam(LIBFPTR_PARAM_MEASUREMENT_UNIT, LIBFPTR_IU_PIECE);
fptr.setParam(LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY, L"1/2");
fptr.setParam(LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT10);
fptr.setParam(1212, 33);
fptr.setParam(1214, 4);
fptr.setParam(LIBFPTR_PARAM_MARKING_CODE, mark);
fptr.setParam(LIBFPTR_PARAM_MARKING_CODE_STATUS, status);
fptr.setParam(LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult);
fptr.setParam(LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
fptr.registration();
// ... Регистрируем остальные позиции
fptr.setParam(LIBFPTR_PARAM_PAYMENT_TYPE, LIBFPTR_PT_CASH);
fptr.setParam(LIBFPTR_PARAM_PAYMENT_SUM, 1000);
fptr.payment();
// Перед закрытием проверяем, что все КМ отправились (на случай, если были проверки КМ без ожидания результата
while (true) {
fptr.checkMarkingCodeValidationsReady();
if (fptr.getParamBool(LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY))
break;
}
fptr.closeReceipt();
fptr.setParam(LIBFPTR_PARAM_MARKING_CODE_TYPE, LIBFPTR_MCT12_AUTO);
fptr.setParam(LIBFPTR_PARAM_MARKING_CODE, L"014494550435306821QXYXSALGLMYQQ\u001D91EE06\u001D92YWCXbmK6SN8vvwoxZFk7WAY8WoJNMGGr6Cgtiuja04c=");
fptr.setParam(LIBFPTR_PARAM_MARKING_CODE_STATUS, 2);
fptr.setParam(LIBFPTR_PARAM_QUANTITY, 1.000);
fptr.setParam(LIBFPTR_PARAM_MEASUREMENT_UNIT, LIBFPTR_IU_PIECE);
fptr.setParam(LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
fptr.setParam(LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY, L"1/2");
fptr.beginMarkingCodeValidation();
String mark = "014494550435306821QXYXSALGLMYQQ\u001D91EE06\u001D92YWCXbmK6SN8vvwoxZFk7WAY8WoJNMGGr6Cgtiuja04c=";
long status = 2;
// Запускаем проверку КМ
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_TYPE, IFptr.LIBFPTR_MCT12_AUTO);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE, mark);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_STATUS, status);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 1.000);
fptr.setParam(IFptr.LIBFPTR_PARAM_MEASUREMENT_UNIT, IFptr.LIBFPTR_IU_PIECE);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY, "1/2");
fptr.beginMarkingCodeValidation();
// Дожидаемся окончания проверки и запоминаем результат
while (true) {
fptr.getMarkingCodeValidationStatus();
if (fptr.getParamBool(IFptr.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY))
break;
}
long validationResult = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
// Подтверждаем реализацию товара с указанным КМ
fptr.acceptMarkingCode();
// ... Проверяем остальные КМ
// Формируем чек
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.openReceipt();
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, "Молоко");
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 80);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 1.000);
fptr.setParam(IFptr.LIBFPTR_PARAM_MEASUREMENT_UNIT, IFptr.LIBFPTR_IU_PIECE);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY, "1/2");
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT10);
fptr.setParam(1212, 33);
fptr.setParam(1214, 4);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE, mark);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_STATUS, status);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
fptr.registration();
// ... Регистрируем остальные позиции
fptr.setParam(IFptr.LIBFPTR_PARAM_SUM, 120);
fptr.receiptTotal();
fptr.setParam(IFptr.LIBFPTR_PARAM_PAYMENT_TYPE, IFptr.LIBFPTR_PT_CASH);
fptr.setParam(IFptr.LIBFPTR_PARAM_PAYMENT_SUM, 1000);
fptr.payment();
// Перед закрытием проверяем, что все КМ отправились (на случай, если были проверки КМ без ожидания результата
while (true) {
fptr.checkMarkingCodeValidationsReady();
if (fptr.getParamBool(IFptr.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY))
break;
}
fptr.closeReceipt();
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_TYPE, IFptr.LIBFPTR_MCT12_AUTO);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE, L"014494550435306821QXYXSALGLMYQQ\u001D91EE06\u001D92YWCXbmK6SN8vvwoxZFk7WAY8WoJNMGGr6Cgtiuja04c=");
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_CODE_STATUS, 2);
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 1.000);
fptr.setParam(IFptr.LIBFPTR_PARAM_MEASUREMENT_UNIT, IFptr.LIBFPTR_IU_PIECE);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
fptr.setParam(IFptr.LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY, L"1/2");
fptr.beginMarkingCodeValidation();
Общий алгоритм
Проверка КМ состоит из нескольких операций, которые должны быть последовательно выполнены для каждого кода маркировки:
- начать проверку КМ (beginMarkingCodeValidation()), драйвер запускает процедуру отправки данных КМ на сервер для онлайн-проверки. Следующий КМ можно проверить только после окончания предыдущей проверки. Метод является блокирующим, необходимо дождаться его выполнения в течение установленного таймаута;
- дождаться ответа на проверку (getMarkingCodeValidationStatus()). Метод нужно вызывать до тех пор, пока выходной параметр LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY не станет равным true, метод вернёт результат онлайн проверки;
- подтвердить реализацию КМ (acceptMarkingCode()) или отказаться (declineMarkingCode()). Это обязательная операция в обоих режимах проверки.
Онлайн проверку можно прервать методом cancelMarkingCodeValidation().
Запуск проверки КМ
Входные параметры для метода beginMarkingCodeValidation():
Параметр | Описание | Тип | Обязательность |
---|---|---|---|
LIBFPTR_PARAM_MARKING_CODE_TYPE | Тип КМ (тег 2100) | int | |
LIBFPTR_PARAM_MARKING_CODE | КМ (тег 2000) | bytearray | + |
LIBFPTR_PARAM_MARKING_CODE_STATUS | Планируемый статус КМ (тег 2003) | int | + |
LIBFPTR_PARAM_QUANTITY | Количество товара (тег 1023) | double | |
LIBFPTR_PARAM_MEASUREMENT_UNIT | Мера количества товара (тег 2108) | int | |
LIBFPTR_PARAM_MARKING_PROCESSING_MODE | Режим обработки кода товара (тег 2102) | int | + |
LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY | Дробное количество товара (тег 1291) | string |
Значения параметра LIBFPTR_PARAM_MARKING_CODE_TYPE соответствуют значениям реквизита 2100 и могут принимать следующие значения:
- LIBFPTR_MCT12_AUTO - определить автоматически;
- LIBFPTR_MCT12_UNKNOWN - неопознанный КМ, тип кода маркировки не идентифицирован (код маркировки отсутствует, не может быть прочитан или может быть прочитан, но не может быть распознан);
- LIBFPTR_MCT12_SHORT - короткий КМ;
- LIBFPTR_MCT12_88_CHECK - КМ со значением кода проверки длиной 88 символов, подлежащим проверке в ФН;
- LIBFPTR_MCT12_44_NO_CHECK - КМ со значением кода проверки длиной 44 символа, не подлежащим проверке в ФН;
- LIBFPTR_MCT12_44_CHECK - КМ со значением кода проверки длиной 44 символа, подлежащим проверке в ФН;
- LIBFPTR_MCT12_4_NO_CHECK - КМ со значением кода проверки длиной 4 символа, не подлежащим проверке в ФН.
Значения параметра LIBFPTR_PARAM_MARKING_CODE_STATUS соответствуют значениям реквизита 2003 и могут принимать следующие значения:
- LIBFPTR_MES_PIECE_SOLD - штучный товар, реализован;
- LIBFPTR_MES_DRY_FOR_SALE - мерный товар, в стадии реализации;
- LIBFPTR_MES_PIECE_RETURN - штучный товар, возвращен;
- LIBFPTR_MES_DRY_RETURN - часть товара, возвращена;
- LIBFPTR_MES_UNCHANGED - статус товара не изменился.
Значения параметра LIBFPTR_PARAM_QUANTITY соответствуют значениям реквизита 1023.
Значения параметра LIBFPTR_PARAM_MEASUREMENT_UNIT соответствуют значениям реквизита 2108 и могут принимать следующие значения:
- LIBFPTR_IU_PIECE - штуки, единицы;
- LIBFPTR_IU_GRAM - грамм;
- LIBFPTR_IU_KILOGRAM - килограмм;
- LIBFPTR_IU_TON - тонна;
- LIBFPTR_IU_CENTIMETER - сантиметр;
- LIBFPTR_IU_DECIMETER - дециметр;
- LIBFPTR_IU_METER - метр;
- LIBFPTR_IU_SQUARE_CENTIMETER - квадратный сантиметр;
- LIBFPTR_IU_SQUARE_DECIMETER - квадратный дециметр;
- LIBFPTR_IU_SQUARE_METER - квадратный метр;
- LIBFPTR_IU_MILLILITER - миллилитр;
- LIBFPTR_IU_LITER - литр;
- LIBFPTR_IU_CUBIC_METER - кубический метр;
- LIBFPTR_IU_KILOWATT_HOUR - киловатт час;
- LIBFPTR_IU_GKAL - гигакалория;
- LIBFPTR_IU_DAY - сутки (день);
- LIBFPTR_IU_HOUR - час;
- LIBFPTR_IU_MINUTE - минута;
- LIBFPTR_IU_SECOND - секунда;
- LIBFPTR_IU_KILOBYTE - килобайт;
- LIBFPTR_IU_MEGABYTE - мегабайт;
- LIBFPTR_IU_GIGABYTE - гигабайт;
- LIBFPTR_IU_TERABYTE - терабайт;
- LIBFPTR_IU_OTHER - иные единицы измерения.
Значения параметра LIBFPTR_PARAM_MARKING_PROCESSING_MODE соответствуют значениям реквизита 2102.
Значения параметра LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY представляют собой строку, в которой записана дробь в формате "Ц...Ц/Ц...Ц", т.е. два числа, разделённых символом "/" - числитель и знаменатель. Числитель и знаменатель должны быть отличны от нуля, а также дробь должна быть правильная, т.е. числитель строго меньше знаменателя. Данный реквизит соответствует значениям реквизита 1292, реквизит 1291 формируется автоматически на основании значения этого реквизита.
Результатом метода будут параметры, описывающие результат локальной проверки:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_MARKING_CODE_VALIDATION_RESULT | Результат локальной проверки (тег 2004) | int |
LIBFPTR_PARAM_MARKING_CODE_OFFLINE_VALIDATION_ERROR | Ошибка локальной проверки | int |
Значения параметра LIBFPTR_PARAM_MARKING_CODE_OFFLINE_VALIDATION_ERROR могут принимать следующие значения:
- LIBFPTR_CER_CHECKED - КМ проверен в ФН;
- LIBFPTR_CER_TYPE_INCORRECT - КМ данного типа не подлежит проверке в ФН;
- LIBFPTR_CER_NO_KEYS - ФН не содержит ключ проверки кода проверки этого КМ;
- LIBFPTR_CER_NO_GS1 - проверка невозможна, так как отсутствуют идентификаторы применения GS1 91 и/или 92 или их формат неверный;
- LIBFPTR_CER_OTHER - проверка КМ в ФН невозможна по иной причине.
Ожидание окончания проверки КМ
libfptr_get_marking_code_validation_status(fptr);
bool ready = libfptr_get_param_bool(fptr, LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY);
if (ready) {
std::vector<wchar_t> str(1024);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR_DESCRIPTION, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR_DESCRIPTION, &str[0], str.size());
}
std::wstring errorDescription = std::wstring(&str[0]);
uint result = libfptr_get_param_int(fptr, LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
bool isRequestSent = libfptr_get_param_bool(fptr, LIBFPTR_PARAM_IS_REQUEST_SENT);
uint error = libfptr_get_param_int(fptr, LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR);
uint info = libfptr_get_param_int(fptr, 2109);
uint processingResult = libfptr_get_param_int(fptr, 2005);
uint processingCode = libfptr_get_param_int(fptr, 2105);
...
}
fptr.getMarkingCodeValidationStatus();
bool ready = fptr.getParamBool(LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY);
if (ready) {
uint result = fptr.getParamInt(LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
bool isRequestSent = fptr.getParamBool(LIBFPTR_PARAM_IS_REQUEST_SENT);
uint error = fptr.getParamInt(LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR);
std::wstring errorDescription = fptr.getParamString(LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR_DESCRIPTION);
uint info = fptr.getParamInt(2109);
uint processingResult = fptr.getParamInt(2005);
uint processingCode = fptr.getParamInt(2105);
...
}
fptr.getMarkingCodeValidationStatus();
boolean ready = fptr.getParamBool(IFptr.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY);
if (ready) {
long result = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
boolean isRequestSent = fptr.getParamBool(IFptr.LIBFPTR_PARAM_IS_REQUEST_SENT);
long error = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR);
String errorDescription = fptr.getParamString(IFptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR_DESCRIPTION);
long info = fptr.getParamInt(2109);
long processingResult = fptr.getParamInt(2005);
long processingCode = fptr.getParamInt(2105);
...
}
Метод getMarkingCodeValidationStatus() нужно вызывать до тех пор, пока параметр LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY не станет равен true.
Входные параметры для метода getMarkingCodeValidationStatus() отсутствуют.
Выходные параметры:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY | Проверка завершена | bool |
LIBFPTR_PARAM_IS_REQUEST_SENT | КМ был отправлен на сервер | bool |
LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT | Результат проверки сведений о товаре (тег 2106) | int |
LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR | Ошибка онлайн проверки | int |
LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR_DESCRIPTION | Описание ошибки онлайн проверки | string |
LIBFPTR_PARAM_TLV_LIST | Список полученных TLV-реквизитов | string |
2109 | Сведения о статусе товара (тег 2109) | int |
2005 | Результаты обработки запроса (тег 2005) | int |
2105 | Код обработки запроса (тег 2105) | int |
2100 | Тип кода маркировки (тег 2100) | int |
2101 | Идентификатор товара (тег 2101) | string |
2102 | Режим обработки кода маркировки (тег 2102) | int |
В зависимости от данных, которые вернёт сервер ИСМ, некоторые выходные параметры могут отсутствовать (реквизиты с числовыми параметрами 2109, 2005, 2105, 2100, 2101 и 2102). Для определения списка полученных реквизитов необходимо использовать свойство LIBFPTR_PARAM_TLV_LIST, которое содержит список из чисел (номер тега), разделённых символом ";". Например, "2109;2005;2105;2100".
Параметры LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR и LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR_DESCRIPTION соответствуют коду ошибки драйвера и его описанию в соответствии с документацией. Если вернулась ошибка, отличная от 0, то актуальны только следующие параметры:
- LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY - проверка завершена;
- LIBFPTR_PARAM_IS_REQUEST_SENT - КМ был отправлен на сервер.
Подтверждение и отказ от реализации товара
libfptr_accept_marking_code(fptr);
uint result = libfptr_get_param_int(fptr, LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
fptr.acceptMarkingCode();
uint result = fptr.getParamInt(LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
fptr.acceptMarkingCode();
long result = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
Для подтверждения реализации нужно вызвать метод acceptMarkingCode().
Выходные параметры:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT | Результат проверки сведений о товаре (тег 2106) | int |
libfptr_decline_marking_code(fptr);
fptr.declineMarkingCode();
fptr.declineMarkingCode();
Для отказа от реализации нужно вызвать метод declineMarkingCode().
Выходных параметров нет.
Прерывание проверки КМ
libfptr_cancel_marking_code_validation(fptr);
fptr.cancelMarkingCodeValidation();
fptr.cancelMarkingCodeValidation();
Проверку КМ можно прервать с помощью метода cancelMarkingCodeValidation().
Очистка таблицы проверенных КМ
libfptr_clear_marking_code_validation_result(fptr);
fptr.clearMarkingCodeValidationResult();
fptr.clearMarkingCodeValidationResult();
Для очистки таблицы проверенных КМ в ФН требуется вызвать метод clearMarkingCodeValidationResult().
Передать данные уведомления
libfptr_set_param_str(fptr, 1262, L"016");
libfptr_set_param_str(fptr, 1263, L"24.09.2020");
libfptr_set_param_str(fptr, 1264, L"8252");
libfptr_set_param_str(fptr, 1265, L"значение");
libfptr_util_form_tlv(fptr);
std::vector<uchar> industryInfo(128);
int size = libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_TAG_VALUE, &industryInfo[0], industryInfo.size());
if (size > industryInfo.size())
{
industryInfo.resize(size);
libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_TAG_VALUE, &industryInfo[0], industryInfo.size());
}
industryInfo.resize(size);
libfptr_set_param_str(fptr, 1228, L"123456789047");
libfptr_set_param_bytearray(fptr, 1261, &industryInfo[0], industryInfo.size());
libfptr_write_sales_notice(fptr);
fptr.setParam(1262, L"016");
fptr.setParam(1263, L"24.09.2020");
fptr.setParam(1264, L"8252");
fptr.setParam(1265, L"значение");
fptr.utilFormTlv();
std::vector<uchar> industryInfo = fptr.getParamByteArray(LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(1228, L"123456789047");
fptr.setParam(1261, industryInfo);
fptr.writeSalesNotice();
fptr.setParam(1262, "016");
fptr.setParam(1263, "24.09.2020");
fptr.setParam(1264, "8252");
fptr.setParam(1265, "значение");
fptr.utilFormTlv();
byte[] industryInfo = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(1228, "123456789047");
fptr.setParam(1261, industryInfo);
fptr.writeSalesNotice();
В уведомление о реализации товара с КМ также можно передать данные о реализации маркированного товара с помощью метода writeSalesNotice(), который принимает параметры:
- 1228 - ИНН клиента;
- 1261 - отраслевой реквизит чека (можно несколько).
Регистрация чека
После проверки всех КМ можно начать регистрировать позиции чека. В нужных позициях нужно повторно передать код маркировки, привязанный к товару. Для этого используются параметры:
- LIBFPTR_PARAM_MARKING_CODE - код маркировки (тег 2000);
- LIBFPTR_PARAM_MARKING_CODE_STATUS - новый статус товара (тег 2110). Параметр должен принимать тоже значение, что и параметр LIBFPTR_PARAM_MARKING_CODE_STATUS при проверке КМ;
- LIBFPTR_PARAM_MARKING_PROCESSING_MODE - режим обработки КМ (тег 2102);
- LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT - результат проверки КМ (тег 2106) (из результата метода acceptMarkingCode()).
Также можно передать данные о реализации маркированного товара в уведомление с помощью метода writeSalesNotice() после регистрации всех позиций чека (если среди них есть позиции с КМ). Подробнее в соответствующем разделе Передать данные уведомления.
Перед самым закрытием чека можно дождаться, пока драйвер не отправит все КМ, проверка которых была запущена без ожидания результата. Это можно сделать с помощью метода checkMarkingCodeValidationsReady(), возвращающего признак завершения фоновых проверок LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY. Если этого не сделать, драйвер всё равно дождётся окончания проверок в блокирующем режиме.
Обновление ключей проверки ФН-М
libfptr_update_fnm_keys(fptr);
fptr.updateFnmKeys();
fptr.updateFnmKeys();
Для обновления ключей проверки ФН-М требуется вызвать метод updateFnmKeys().
Входные и выходные параметры отсутствуют.
Проверка сервера ИСМ
// Начать проверку связи с сервером ИСМ
libfptr_ping_marking_server(fptr);
// Ожидание результатов проверки связи с сервером ИСМ
while (true) {
libfptr_get_marking_server_status(fptr);
if (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_CHECK_MARKING_SERVER_READY))
break;
}
uint errorCode = libfptr_get_param_int(fptr, LIBFPTR_PARAM_MARKING_SERVER_ERROR_CODE);
std::vector<wchar_t> str(1024);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_MARKING_SERVER_ERROR_DESCRIPTION, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_MARKING_SERVER_ERROR_DESCRIPTION, &str[0], str.size());
}
std::wstring errorDescription = std::wstring(&str[0]);
uint responseTime = libfptr_get_param_int(fptr, LIBFPTR_PARAM_MARKING_SERVER_RESPONSE_TIME);
// Начать проверку связи с сервером ИСМ
fptr.pingMarkingServer();
// Ожидание результатов проверки связи с сервером ИСМ
while (true) {
fptr.getMarkingServerStatus();
if (fptr.getParamBool(LIBFPTR_PARAM_CHECK_MARKING_SERVER_READY))
break;
}
uint errorCode = fptr.getParamInt(LIBFPTR_PARAM_MARKING_SERVER_ERROR_CODE);
std::wstring errorDescription = fptr.getParamString(LIBFPTR_PARAM_MARKING_SERVER_ERROR_DESCRIPTION);
uint responseTime = fptr.getParamInt(LIBFPTR_PARAM_MARKING_SERVER_RESPONSE_TIME);
// Начать проверку связи с сервером ИСМ
fptr.pingMarkingServer();
// Ожидание результатов проверки связи с сервером ИСМ
while (true) {
fptr.getMarkingServerStatus();
if (fptr.getParamBool(IFptr.LIBFPTR_PARAM_CHECK_MARKING_SERVER_READY))
break;
}
long errorCode = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MARKING_SERVER_ERROR_CODE);
String errorDescription = fptr.getParamString(IFptr.LIBFPTR_PARAM_MARKING_SERVER_ERROR_DESCRIPTION);
long responseTime = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MARKING_SERVER_RESPONSE_TIME);
Проверка сервера ИСМ состоит из следующих этапов:
- начать проверку сервера ИСМ с помощью метода pingMarkingServer();
- дождаться ответа на проверку (getMarkingServerStatus()). Метод нужно вызывать до тех пор, пока выходной параметр LIBFPTR_PARAM_CHECK_MARKING_SERVER_READY не станет равным true.
Для метода pingMarkingServer() входные и выходные параметры отсутствуют.
Для метода getMarkingServerStatus() входные параметры отсутствуют. Результатом метода будут параметры, описывающие результат проверки:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_CHECK_MARKING_SERVER_READY | Проверка завершена | bool |
LIBFPTR_PARAM_MARKING_SERVER_ERROR_CODE | Ошибка проверки | int |
LIBFPTR_PARAM_MARKING_SERVER_ERROR_DESCRIPTION | Описание ошибки | string |
LIBFPTR_PARAM_MARKING_SERVER_RESPONSE_TIME | Время ожидания ответа от сервера, мс | int |
Значения параметров LIBFPTR_PARAM_MARKING_SERVER_ERROR_CODE и LIBFPTR_PARAM_MARKING_SERVER_ERROR_DESCRIPTION соответствуют коду и описанию ошибки драйвера, см. приложение Список кодов ошибок.
Внесения и выплаты
Внесение
Внесение
libfptr_set_param_double(fptr, LIBFPTR_PARAM_SUM, 100.00);
libfptr_cash_income(fptr);
fptr.setParam(LIBFPTR_PARAM_SUM, 100.00);
fptr.cashIncome();
fptr.setParam(IFptr.LIBFPTR_PARAM_SUM, 100.00);
fptr.cashIncome();
Для регистрации внесения требуется вызвать метод cashIncome() и указать сумму внесения в параметре LIBFPTR_PARAM_SUM. Чтобы документ не печатался, нужно установить параметру LIBFPTR_PARAM_DOCUMENT_ELECTRONICALLY значение true.
Результатом команды будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SHIFT_AUTO_OPENED | true, если при выполнении операции была автоматически открыта смена в ККТ | bool |
Выплата
Выплата
libfptr_set_param_double(fptr, LIBFPTR_PARAM_SUM, 100.00);
libfptr_cash_outcome(fptr);
fptr.setParam(LIBFPTR_PARAM_SUM, 100.00);
fptr.cashOutcome();
fptr.setParam(IFptr.LIBFPTR_PARAM_SUM, 100.00);
fptr.cashOutcome();
Для регистрации выплаты требуется вызвать метод cashOutcome() и указать сумму выплаты в параметре LIBFPTR_PARAM_SUM. Чтобы документ не печатался, нужно установить параметру LIBFPTR_PARAM_DOCUMENT_ELECTRONICALLY значение true.
Результатом команды будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SHIFT_AUTO_OPENED | true, если при выполнении операции была автоматически открыта смена в ККТ | bool |
Печать отчетов
Для печати отчета необходим заполнить тип отчета (параметр LIBFPTR_PARAM_REPORT_TYPE) и дополнительные параметры отчета (если они требуются) и вызвать метод report().
X-отчет
X-отчет
libfptr_set_param_int(fptr, LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_X);
libfptr_report(fptr);
fptr.setParam(LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_X);
fptr.report();
fptr.setParam(IFptr.LIBFPTR_PARAM_REPORT_TYPE, IFptr.LIBFPTR_RT_X);
fptr.report();
Для печати X-отчета требуется вызвать метод report() с типом отчета LIBFPTR_PARAM_REPORT_TYPE равным LIBFPTR_RT_X.
Копия последнего документа
Копия последнего документа
libfptr_set_param_int(fptr, LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_LAST_DOCUMENT);
libfptr_report(fptr);
fptr.setParam(LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_LAST_DOCUMENT);
fptr.report();
fptr.setParam(IFptr.LIBFPTR_PARAM_REPORT_TYPE, IFptr.LIBFPTR_RT_LAST_DOCUMENT);
fptr.report();
Для печати копии последнего документа требуется вызвать метод report() с типом отчета LIBFPTR_PARAM_REPORT_TYPE равным LIBFPTR_RT_LAST_DOCUMENT.
Отчет о состоянии расчетов
Отчет о состоянии расчетов
libfptr_set_param_int(fptr, LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_OFD_EXCHANGE_STATUS);
libfptr_report(fptr);
fptr.setParam(LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_OFD_EXCHANGE_STATUS);
fptr.report();
fptr.setParam(IFptr.LIBFPTR_PARAM_REPORT_TYPE, IFptr.LIBFPTR_RT_OFD_EXCHANGE_STATUS);
fptr.report();
Для печати отчета о состоянии расчетов требуется вызвать метод report() с типом отчета LIBFPTR_PARAM_REPORT_TYPE равным LIBFPTR_RT_OFD_EXCHANGE_STATUS.
Печать информации о ККТ
Печать информации о ККТ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_KKT_INFO);
libfptr_report(fptr);
fptr.setParam(LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_KKT_INFO);
fptr.report();
fptr.setParam(IFptr.LIBFPTR_PARAM_REPORT_TYPE, IFptr.LIBFPTR_RT_KKT_INFO);
fptr.report();
Для печати информации о ККТ требуется вызвать метод report() с типом отчета LIBFPTR_PARAM_REPORT_TYPE равным LIBFPTR_RT_KKT_INFO.
Тест связи с ОФД
Тест связи с ОФД
libfptr_set_param_int(fptr, LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_OFD_TEST);
libfptr_report(fptr);
fptr.setParam(LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_OFD_TEST);
fptr.report();
fptr.setParam(IFptr.LIBFPTR_PARAM_REPORT_TYPE, IFptr.LIBFPTR_RT_OFD_TEST);
fptr.report();
Для печати диагностики соединения с ОФД требуется вызвать метод report() с типом отчета LIBFPTR_PARAM_REPORT_TYPE равным LIBFPTR_RT_OFD_TEST.
Печать документа из ФН
Печать документа из ФН
libfptr_set_param_int(fptr, LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_FN_DOC_BY_NUMBER);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DOCUMENT_NUMBER, 12);
libfptr_report(fptr);
fptr.setParam(LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_FN_DOC_BY_NUMBER);
fptr.setParam(LIBFPTR_PARAM_DOCUMENT_NUMBER, 12);
fptr.report();
fptr.setParam(IFptr.LIBFPTR_PARAM_REPORT_TYPE, IFptr.LIBFPTR_RT_FN_DOC_BY_NUMBER);
fptr.setParam(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER, 12);
fptr.report();
Для печати документа из архива фискального накопителя требуется вызвать метод report() с типом отчета LIBFPTR_PARAM_REPORT_TYPE равным LIBFPTR_RT_FN_DOC_BY_NUMBER.
Для указания номер документа используется параметр LIBFPTR_PARAM_DOCUMENT_NUMBER.
Печать итогов регистрации / перерегистрации
Печать итогов регистрации / перерегистрации
libfptr_set_param_int(fptr, LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_FN_REGISTRATIONS);
libfptr_report(fptr);
fptr.setParam(LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_FN_REGISTRATIONS);
fptr.report();
fptr.setParam(IFptr.LIBFPTR_PARAM_REPORT_TYPE, IFptr.LIBFPTR_RT_FN_REGISTRATIONS);
fptr.report();
Для печати итогов регистрации/перерегистрации требуется вызвать метод report() с типом отчета LIBFPTR_PARAM_REPORT_TYPE равным LIBFPTR_RT_FN_REGISTRATIONS.
Печать информации о подписках на ККТ
Печать информации о подписках на ККТ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_LICENSE_INFO);
libfptr_report(fptr);
fptr.setParam(LIBFPTR_PARAM_REPORT_TYPE, LIBFPTR_RT_LICENSE_INFO);
fptr.report();
fptr.setParam(IFptr.LIBFPTR_PARAM_REPORT_TYPE, IFptr.LIBFPTR_RT_LICENSE_INFO);
fptr.report();
Для печати информации о подписках на ККТ требуется вызвать метод report() с типом отчета LIBFPTR_PARAM_REPORT_TYPE равным LIBFPTR_RT_LICENSE_INFO.
Запрос информации из ФН
Значение реквизита регистрации
Запрос значения реквизита регистрации
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_TAG_VALUE);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_TAG_NUMBER, 1018);
libfptr_fn_query_data(fptr);
std::vector<wchar_t> str(32);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_TAG_VALUE, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_TAG_VALUE, &str[0], str.size());
}
std::wstring companyVATIN = std::wstring(&str[0]);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_TAG_VALUE);
fptr.setParam(LIBFPTR_PARAM_TAG_NUMBER, 1018);
fptr.fnQueryData();
std::wstring companyVATIN = fptr.getParamString(LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_TAG_VALUE);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAG_NUMBER, 1018);
fptr.fnQueryData();
String companyVATIN = fptr.getParamString(IFptr.LIBFPTR_PARAM_TAG_VALUE);
Для запроса одного из реквизитов регистрации требуется вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_TAG_VALUE и указать номер реквизита LIBFPTR_PARAM_TAG_NUMBER.
После выполнения метода значение реквизита можно прочитать из параметра LIBFPTR_PARAM_TAG_VALUE. Тип параметра зависит от номера реквизита.
Список доступных к запросу реквизитов представлен в описании запроса Регистрационные данные.
В отличие от запроса LIBFPTR_FNDT_REGISTRATION_TLV данные считываются преимущественно из кеша параметров ККТ.
Чтение реквизита регистрации по номеру отчета
Чтение реквизита регистрации
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_REGISTRATION_TLV);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_REGISTRATION_NUMBER, 1);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_TAG_NUMBER, 1018);
libfptr_fn_query_data(fptr);
uint tagNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_TAG_NUMBER);
uint tagType = libfptr_get_param_int(fptr, LIBFPTR_PARAM_TAG_TYPE);
std::vector<wchar_t> str(32);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_TAG_VALUE, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_TAG_VALUE, &str[0], str.size());
}
std::wstring companyVATIN = std::wstring(&str[0]);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_REGISTRATION_TLV);
fptr.setParam(LIBFPTR_PARAM_REGISTRATION_NUMBER, 1);
fptr.setParam(LIBFPTR_PARAM_TAG_NUMBER, 1018);
fptr.fnQueryData();
std::wstring tagName = fptr.getParamString(LIBFPTR_PARAM_TAG_NAME);
uint tagType = fptr.getParamInt(LIBFPTR_PARAM_TAG_TYPE);
std::wstring companyVATIN = fptr.getParamString(LIBFPTR_PARAM_TAG_VALUE);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_REGISTRATION_TLV);
fptr.setParam(IFptr.LIBFPTR_PARAM_REGISTRATION_NUMBER, 1);
fptr.setParam(IFptr.LIBFPTR_PARAM_TAG_NUMBER, 1018);
fptr.fnQueryData();
String tagName = fptr.getParamString(IFptr.LIBFPTR_PARAM_TAG_NAME);
long tagType = fptr.getParamInt(IFptr.LIBFPTR_PARAM_TAG_TYPE);
String companyVATIN = fptr.getParamString(IFptr.LIBFPTR_PARAM_TAG_VALUE);
Для запроса одного из реквизитов регистрации требуется вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_REGISTRATION_TLV и указать номер реквизита LIBFPTR_PARAM_TAG_NUMBER и порядковый номер регистрации LIBFPTR_PARAM_REGISTRATION_NUMBER.
После выполнения метода доступны следующие выходные параметры:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_TAG_VALUE | Значение реквизита | Зависит от номера реквизита |
LIBFPTR_PARAM_TAG_TYPE | Тип реквизита | int |
LIBFPTR_PARAM_TAG_NAME | Название реквизита | string |
LIBFPTR_PARAM_TAG_IS_COMPLEX | true, если реквизит составной | bool |
LIBFPTR_PARAM_TAG_IS_REPEATABLE | true, если реквизит может повторяться | bool |
Реквизит можно сразу считать в удобном для обработки виде. Для этого нужно ориентироваться на значение параметра LIBFPTR_PARAM_TAG_TYPE, и, в зависимости от него, использовать методы для чтения разных типов параметров - getParamInt(), getParamBool(), getParamDouble() и т.п.
В отличие от запроса LIBFPTR_FNDT_TAG_VALUE данные считываются напрямую из ФН. Закешированные значения из ККТ не учитываются.
Регистрационные данные
Запрос реквизитов регистрации ККТ
// Вспомогательная функция для чтения строковых параметров
std::wstring readStringAttribute(libfptr_handle fptr, int paramNumber) {
std::vector<wchar_t> str(32);
int size = libfptr_get_param_str(fptr, paramNumber, &str[0], str.size());
if (size > str.size()) {
str.resize(size);
libfptr_get_param_str(fptr, paramNumber, &str[0], str.size());
}
return std::wstring(&str[0]);
}
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_REG_INFO);
libfptr_fn_query_data(fptr);
int taxationTypes = libfptr_get_param_int(fptr, 1062);
int ffdVersion = libfptr_get_param_int(fptr, 1209);
bool autoModeSign = (libfptr_get_param_bool(fptr, 1001) != 0);
bool offlineModeSign = (libfptr_get_param_bool(fptr, 1002) != 0);
bool encryptionSign = (libfptr_get_param_bool(fptr, 1056) != 0);
bool internetSign = (libfptr_get_param_bool(fptr, 1108) != 0);
bool serviceSign = (libfptr_get_param_bool(fptr, 1109) != 0);
bool bsoSign = (libfptr_get_param_bool(fptr, 1110) != 0);
bool lotterySign = (libfptr_get_param_bool(fptr, 1126) != 0);
bool gamblingSign = (libfptr_get_param_bool(fptr, 1193) != 0);
bool exciseSign = (libfptr_get_param_bool(fptr, 1207) != 0);
bool machineInstallationSign = (libfptr_get_param_bool(fptr, 1221) != 0);
std::wstring fnsUrl = readStringAttribute(fptr, 1060);
std::wstring organizationAddress = readStringAttribute(fptr, 1009);
std::wstring organizationVATIN = readStringAttribute(fptr, 1018);
std::wstring organizationName = readStringAttribute(fptr, 1048);
std::wstring organizationEmail = readStringAttribute(fptr, 1117);
std::wstring paymentsAddress = readStringAttribute(fptr, 1187);
std::wstring registrationNumber = readStringAttribute(fptr, 1037);
std::wstring machineNumber = readStringAttribute(fptr, 1036);
std::wstring ofdVATIN = readStringAttribute(fptr, 1017);
std::wstring ofdName = readStringAttribute(fptr, 1046);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_REG_INFO);
fptr.fnQueryData();
uint taxationTypes = fptr.getParamInt(1062);
uint ffdVersion = fptr.getParamInt(1209);
bool autoModeSign = fptr.getParamBool(1001);
bool offlineModeSign = fptr.getParamBool(1002);
bool encryptionSign = fptr.getParamBool(1056);
bool internetSign = fptr.getParamBool(1108);
bool serviceSign = fptr.getParamBool(1109);
bool bsoSign = fptr.getParamBool(1110);
bool lotterySign = fptr.getParamBool(1126);
bool gamblingSign = fptr.getParamBool(1193);
bool exciseSign = fptr.getParamBool(1207);
bool machineInstallationSign = fptr.getParamBool(1221);
std::wstring fnsUrl = fptr.getParamString(1060);
std::wstring organizationAddress = fptr.getParamString(1009);
std::wstring organizationVATIN = fptr.getParamString(1018);
std::wstring organizationName = fptr.getParamString(1048);
std::wstring organizationEmail = fptr.getParamString(1117);
std::wstring paymentsAddress = fptr.getParamString(1187);
std::wstring registrationNumber = fptr.getParamString(1037);
std::wstring machineNumber = fptr.getParamString(1036);
std::wstring ofdVATIN = fptr.getParamString(1017);
std::wstring ofdName = fptr.getParamString(1046);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_REG_INFO);
fptr.fnQueryData();
long taxationTypes = fptr.getParamInt(1062);
long agentSign = fptr.getParamInt(1057);
long ffdVersion = fptr.getParamInt(1209);
boolean autoModeSign = fptr.getParamBool(1001);
boolean offlineModeSign = fptr.getParamBool(1002);
boolean encryptionSign = fptr.getParamBool(1056);
boolean internetSign = fptr.getParamBool(1108);
boolean serviceSign = fptr.getParamBool(1109);
boolean bsoSign = fptr.getParamBool(1110);
boolean lotterySign = fptr.getParamBool(1126);
boolean gamblingSign = fptr.getParamBool(1193);
boolean exciseSign = fptr.getParamBool(1207);
boolean machineInstallationSign = fptr.getParamBool(1221);
String fnsUrl = fptr.getParamString(1060);
String organizationAddress = fptr.getParamString(1009);
String organizationVATIN = fptr.getParamString(1018);
String organizationName = fptr.getParamString(1048);
String organizationEmail = fptr.getParamString(1117);
String paymentsAddress = fptr.getParamString(1187);
String registrationNumber = fptr.getParamString(1037);
String machineNumber = fptr.getParamString(1036);
String ofdVATIN = fptr.getParamString(1017);
String ofdName = fptr.getParamString(1046);
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
1060 | Адрес сайта ФНС | string |
1009 | Адрес расчетов | string |
1018 | ИНН организации | string |
1048 | Название организации | string |
1062 | Системы налогообложения | int |
1117 | E-mail организации | string |
1187 | Адрес места расчетов | string |
1037 | Регистрационный номер устройства | string |
1209 | Версия ФФД | int |
1001 | Признак автоматического режима | bool |
1036 | Номер автомата | string |
1002 | Признак автономного режима | bool |
1056 | Признак шифрования | bool |
1108 | Признак ККТ для расчетов в сети Интернет | bool |
1109 | Признак расчетов за услуги | bool |
1110 | Признак АС БСО | bool |
1126 | Признак проведения лотерей | bool |
1193 | Признак проведения азартных игр | bool |
1207 | Признак подакцизного товара | bool |
1221 | Признак установки принтера в автомате | bool |
1017 | ИНН ОФД | string |
1046 | Название ОФД | string |
LIBFPTR_PARAM_TRADE_MARKED_PRODUCTS | Признак торговли маркированными товарами | bool |
LIBFPTR_PARAM_INSURANCE_ACTIVITY | Признак осуществления страховой деятельности | bool |
LIBFPTR_PARAM_PAWN_SHOP_ACTIVITY | Признак осуществления ломбардной деятельности | bool |
Значение реквизита 1062 (системы налогообложения) - битовое поле, значениями которого являются одно или несколько из следующих значений:
- LIBFPTR_TT_OSN - общая;
- LIBFPTR_TT_USN_INCOME - упрощенная доход;
- LIBFPTR_TT_USN_INCOME_OUTCOME - упрощенная доход минус расход;
- LIBFPTR_TT_ESN - единый сельскохозяйственный доход;
- LIBFPTR_TT_PATENT - патентная система налогообложения.
Реквизит 1209 (версия ФФД) может принимать следующие значения:
- LIBFPTR_FFD_UNKNOWN - неизвестная;
- LIBFPTR_FFD_1_2 - ФФД 1.2.
Статус информационного обмена с ОФД
Запрос статуса информационного обмена с ОФД
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_OFD_EXCHANGE_STATUS);
libfptr_fn_query_data(fptr);
int exchangeStatus = libfptr_get_param_int(fptr, LIBFPTR_PARAM_OFD_EXCHANGE_STATUS);
int unsentCount = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENTS_COUNT);
int firstUnsentNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENT_NUMBER);
int ofdMessageRead = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_OFD_MESSAGE_READ) != 0);
int year, month, day, hour, minute, second;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_OFD_EXCHANGE_STATUS);
fptr.fnQueryData();
uint exchangeStatus = fptr.getParamInt(LIBFPTR_PARAM_OFD_EXCHANGE_STATUS);
uint unsentCount = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENTS_COUNT);
uint firstUnsentNumber = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENT_NUMBER);
std::wstring ofdMessageRead = fptr.getParamBool(LIBFPTR_PARAM_OFD_MESSAGE_READ);
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_OFD_EXCHANGE_STATUS);
fptr.fnQueryData();
long exchangeStatus = fptr.getParamInt(IFptr.LIBFPTR_PARAM_OFD_EXCHANGE_STATUS);
long unsentCount = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT);
long firstUnsentNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER);
boolean ofdMessageRead = fptr.getParamBool(IFptr.LIBFPTR_PARAM_OFD_MESSAGE_READ);
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
Для запроса cтатуса информационного обмена с ОФД необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_OFD_EXCHANGE_STATUS.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_OFD_EXCHANGE_STATUS | Статус информационного обмена с ОФД | int |
LIBFPTR_PARAM_DOCUMENTS_COUNT | Количество неотправленных документов | int |
LIBFPTR_PARAM_DOCUMENT_NUMBER | Номер первого неотправленного документа | int |
LIBFPTR_PARAM_DATE_TIME | Дата и время первого неотправленного документа | datetime |
LIBFPTR_PARAM_OFD_MESSAGE_READ | Флаг наличия сообщения для ОФД | bool |
Значение LIBFPTR_PARAM_OFD_EXCHANGE_STATUS представляет собой битовое поле:
- бит 0 - транспортное соединение установлено;
- бит 1 – есть сообщение для передачи в ОФД;
- бит 2 – ожидание ответного сообщения (квитанции) от ОФД;
- бит 3 – есть команда от ОФД;
- бит 4 – изменились настройки соединения с ОФД;
- бит 5 – ожидание ответа на команду от ОФД.
Информация о ФН
Запрос информации и статуса ФН
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO);
libfptr_fn_query_data(fptr);
std::vector<wchar_t> str(1024);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_SERIAL_NUMBER, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_SERIAL_NUMBER, &str[0], str.size());
}
std::wstring fnSerial = std::wstring(&str[0]);
size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_FN_VERSION, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_FN_VERSION, &str[0], str.size());
}
std::wstring fnVersion = std::wstring(&str[0]);
size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_FN_EXECUTION, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_FN_EXECUTION, &str[0], str.size());
}
std::wstring fnExecution = std::wstring(&str[0]);
int fnType = libfptr_get_param_int(fptr, LIBFPTR_PARAM_FN_TYPE);
int fnState = libfptr_get_param_int(fptr, LIBFPTR_PARAM_FN_STATE);
int fnFlags = libfptr_get_param_int(fptr, LIBFPTR_PARAM_FN_FLAGS);
bool fnNeedReplacement = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_FN_NEED_REPLACEMENT) != 0);
bool fnExhausted = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_FN_RESOURCE_EXHAUSTED) != 0);
bool fnMemoryOverflow = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_FN_MEMORY_OVERFLOW) != 0);
bool fnOfdTimeout = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_FN_OFD_TIMEOUT) != 0);
bool fnCriticalError = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_FN_CRITICAL_ERROR) != 0);
bool fnContainsServerUri = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_FN_CONTAINS_KEYS_UPDATER_SERVER_URI) != 0);
if (fnContainsServerUri)
{
size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_FN_KEYS_UPDATER_SERVER_URI, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_FN_KEYS_UPDATER_SERVER_URI, &str[0], str.size());
}
std::wstring fnKeysUpdaterServerUri = std::wstring(&str[0]);
}
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO);
fptr.fnQueryData();
std::wstring fnSerial = fptr.getParamString(LIBFPTR_PARAM_SERIAL_NUMBER);
std::wstring fnVersion = fptr.getParamString(LIBFPTR_PARAM_FN_VERSION);
std::wstring fnExecution = fptr.getParamString(LIBFPTR_PARAM_FN_EXECUTION);
uint fnType = fptr.getParamInt(LIBFPTR_PARAM_FN_TYPE);
uint fnState = fptr.getParamInt(LIBFPTR_PARAM_FN_STATE);
uint fnFlags = fptr.getParamInt(LIBFPTR_PARAM_FN_FLAGS);
bool fnNeedReplacement = fptr.getParamBool(LIBFPTR_PARAM_FN_NEED_REPLACEMENT);
bool fnExhausted = fptr.getParamBool(LIBFPTR_PARAM_FN_RESOURCE_EXHAUSTED);
bool fnMemoryOverflow = fptr.getParamBool(LIBFPTR_PARAM_FN_MEMORY_OVERFLOW);
bool fnOfdTimeout = fptr.getParamBool(LIBFPTR_PARAM_FN_OFD_TIMEOUT);
bool fnCriticalError = fptr.getParamBool(LIBFPTR_PARAM_FN_CRITICAL_ERROR);
bool fnContainsServerUri = fptr.getParamBool(LIBFPTR_PARAM_FN_CONTAINS_KEYS_UPDATER_SERVER_URI);
if (fnContainsServerUri)
std::wstring fnKeysUpdaterServerUri = fptr.getParamString(LIBFPTR_PARAM_FN_KEYS_UPDATER_SERVER_URI);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_FN_INFO);
fptr.fnQueryData();
String fnSerial = fptr.getParamString(IFptr.LIBFPTR_PARAM_SERIAL_NUMBER);
String fnVersion = fptr.getParamString(IFptr.LIBFPTR_PARAM_FN_VERSION);
String fnExecution = fptr.getParamString(IFptr.LIBFPTR_PARAM_FN_EXECUTION);
long fnType = fptr.getParamInt(IFptr.LIBFPTR_PARAM_FN_TYPE);
long fnState = fptr.getParamInt(IFptr.LIBFPTR_PARAM_FN_STATE);
long fnFlags = fptr.getParamInt(IFptr.LIBFPTR_PARAM_FN_FLAGS);
boolean fnNeedReplacement = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FN_NEED_REPLACEMENT);
boolean fnExhausted = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FN_RESOURCE_EXHAUSTED);
boolean fnMemoryOverflow = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FN_MEMORY_OVERFLOW);
boolean fnOfdTimeout = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FN_OFD_TIMEOUT);
boolean fnCriticalError = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FN_CRITICAL_ERROR);
boolean fnContainsServerUri = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FN_CONTAINS_KEYS_UPDATER_SERVER_URI);
if (fnContainsServerUri)
{
String fnKeysUpdaterServerUri = fptr.getParamString(IFptr.LIBFPTR_PARAM_FN_KEYS_UPDATER_SERVER_URI);
}
Для запроса информации и статуса ФН необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_FN_INFO.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SERIAL_NUMBER | Серийный номер ФН | string |
LIBFPTR_PARAM_FN_VERSION | Версия ФН | string |
LIBFPTR_PARAM_FN_EXECUTION | Исполнение ФН (только для ФН-М) | string |
LIBFPTR_PARAM_FN_TYPE | Тип ФН | int |
LIBFPTR_PARAM_FN_STATE | Состояние ФН | int |
LIBFPTR_PARAM_FN_FLAGS | Нерасшифрованный байт флагов ФН | int |
LIBFPTR_PARAM_FN_NEED_REPLACEMENT | Требуется срочная замена ФН | bool |
LIBFPTR_PARAM_FN_RESOURCE_EXHAUSTED | Исчерпан ресурс ФН | bool |
LIBFPTR_PARAM_FN_MEMORY_OVERFLOW | Память ФН переполнена | bool |
LIBFPTR_PARAM_FN_OFD_TIMEOUT | Превышено время ожидания ответа от ОФД | bool |
LIBFPTR_PARAM_FN_CRITICAL_ERROR | Критическая ошибка ФН | bool |
LIBFPTR_PARAM_FN_CONTAINS_KEYS_UPDATER_SERVER_URI | ФН содержит URI сервера ОКП | bool |
Тип ФН (LIBFPTR_PARAM_FN_TYPE) может принимать следующие значения:
- LIBFPTR_FNT_UNKNOWN - неизвестная (не удалось получить);
- LIBFPTR_FNT_DEBUG - отладочная версия;
- LIBFPTR_FNT_RELEASE - боевая версия.
Состояние ФН (LIBFPTR_PARAM_FN_STATE) может принимать следующие значения:
- LIBFPTR_FNS_INITIAL - настройка ФН;
- LIBFPTR_FNS_CONFIGURED - готовность к активации;
- LIBFPTR_FNS_FISCAL_MODE - фискальный режим;
- LIBFPTR_FNS_POSTFISCAL_MODE - постфискальный режим;
- LIBFPTR_FNS_ACCESS_ARCHIVE - доступ к архиву.
Информация о последней регистрации / перерегистрации
Запрос информации о последней регистрации / перерегистрации
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_LAST_REGISTRATION);
libfptr_fn_query_data(fptr);
int documentNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENT_NUMBER);
int registrationsCount = libfptr_get_param_int(fptr, LIBFPTR_PARAM_REGISTRATIONS_COUNT);
int year, month, day, hour, minute, second;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_LAST_REGISTRATION);
fptr.fnQueryData();
uint documentNumber = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENT_NUMBER);
uint registrationsCount = fptr.getParamInt(LIBFPTR_PARAM_REGISTRATIONS_COUNT);
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_LAST_REGISTRATION);
fptr.fnQueryData();
long documentNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER);
long registrationsCount = fptr.getParamInt(IFptr.LIBFPTR_PARAM_REGISTRATIONS_COUNT);
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
Для запроса информации о последней регистрации / перерегистрации необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_LAST_REGISTRATION.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DOCUMENT_NUMBER | Номер документа | int |
LIBFPTR_PARAM_REGISTRATIONS_COUNT | Номер регистрации / перерегистрации | int |
LIBFPTR_PARAM_DATE_TIME | Дата и время документа | datetime |
Информация о последнем документе
Запрос информации о последнем фискальном документе
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_LAST_DOCUMENT);
libfptr_fn_query_data(fptr);
int documentNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENT_NUMBER);
std::vector<wchar_t> str(1024);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_FISCAL_SIGN, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_FISCAL_SIGN, &str[0], str.size());
}
std::wstring fiscalSign = std::wstring(&str[0]);
int year, month, day, hour, minute, second;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_LAST_DOCUMENT);
fptr.fnQueryData();
uint documentNumber = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENT_NUMBER);
std::wstring fiscalSign = fptr.getParamString(LIBFPTR_PARAM_FISCAL_SIGN);
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_LAST_DOCUMENT);
fptr.fnQueryData();
long documentNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER);
String fiscalSign = fptr.getParamString(IFptr.LIBFPTR_PARAM_FISCAL_SIGN);
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
Для запроса информации о последнем чеке в ФН необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_LAST_DOCUMENT.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DOCUMENT_NUMBER | Номер документа | int |
LIBFPTR_PARAM_FISCAL_SIGN | Фискальный признак документа | string |
LIBFPTR_PARAM_DATE_TIME | Дата и время документа | datetime |
Информация о смене
Запрос информации о текущей смене в ФН
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_SHIFT);
libfptr_fn_query_data(fptr);
int receiptNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPT_NUMBER);
int shiftNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_SHIFT_NUMBER);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_SHIFT);
fptr.fnQueryData();
uint receiptNumber = fptr.getParamInt(LIBFPTR_PARAM_RECEIPT_NUMBER);
uint shiftNumber = fptr.getParamInt(LIBFPTR_PARAM_SHIFT_NUMBER)
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_SHIFT);
fptr.fnQueryData();
long receiptNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_NUMBER);
long shiftNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SHIFT_NUMBER);
Для запроса информации о смене в ФН необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_SHIFT.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_RECEIPT_NUMBER | Количество чеков за смену | int |
LIBFPTR_PARAM_SHIFT_NUMBER | Номер смены | int |
Количество ФД за смену
Запрос количества ФД за смену
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_DOCUMENTS_COUNT_IN_SHIFT);
libfptr_fn_query_data(fptr);
int documentsCount = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_DOCUMENTS_COUNT_IN_SHIFT);
fptr.fnQueryData();
uint documentsCount = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENTS_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_DOCUMENTS_COUNT_IN_SHIFT);
fptr.fnQueryData();
long documentsCount = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT);
Для запроса количества фискальных документов за смену необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_DOCUMENTS_COUNT_IN_SHIFT.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DOCUMENTS_COUNT | Количество ФД за смену | int |
Версии ФФД
Запрос версий ФФД
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FFD_VERSIONS);
libfptr_fn_query_data(fptr);
int deviceFfdVersion = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DEVICE_FFD_VERSION);
int fnFfdVersion = libfptr_get_param_int(fptr, LIBFPTR_PARAM_FN_FFD_VERSION);
int maxFnFfdVersion = libfptr_get_param_int(fptr, LIBFPTR_PARAM_FN_MAX_FFD_VERSION);
int ffdVersion = libfptr_get_param_int(fptr, LIBFPTR_PARAM_FFD_VERSION);
int maxFfdVersion = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DEVICE_MAX_FFD_VERSION);
int minFfdVersion = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DEVICE_MIN_FFD_VERSION);
int versionKKT = libfptr_get_param_int(fptr, LIBFPTR_PARAM_VERSION);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FFD_VERSIONS);
fptr.fnQueryData();
uint deviceFfdVersion = fptr.getParamInt(LIBFPTR_PARAM_DEVICE_FFD_VERSION);
uint fnFfdVersion = fptr.getParamInt(LIBFPTR_PARAM_FN_FFD_VERSION);
uint maxFnFfdVersion = fptr.getParamInt(LIBFPTR_PARAM_FN_MAX_FFD_VERSION);
uint ffdVersion = fptr.getParamInt(LIBFPTR_PARAM_FFD_VERSION);
uint maxFfdVersion = fptr.getParamInt(LIBFPTR_PARAM_DEVICE_MAX_FFD_VERSION);
uint minFfdVersion = fptr.getParamInt(LIBFPTR_PARAM_DEVICE_MIN_FFD_VERSION);
uint versionKKT = fptr.getParamInt(LIBFPTR_PARAM_VERSION);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_FFD_VERSIONS);
fptr.fnQueryData();
long deviceFfdVersion = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DEVICE_FFD_VERSION);
long fnFfdVersion = fptr.getParamInt(IFptr.LIBFPTR_PARAM_FN_FFD_VERSION);
long maxFnFfdVersion = fptr.getParamInt(IFptr.LIBFPTR_PARAM_FN_MAX_FFD_VERSION);
long ffdVersion = fptr.getParamInt(IFptr.LIBFPTR_PARAM_FFD_VERSION);
long maxFfdVersion = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DEVICE_MAX_FFD_VERSION);
long minFfdVersion = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DEVICE_MIN_FFD_VERSION);
long versionKKT = fptr.getParamInt(IFptr.LIBFPTR_PARAM_VERSION);
Для запроса информации о версиях ФФД необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_FFD_VERSIONS.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DEVICE_FFD_VERSION | Версия ФФД ККТ | int |
LIBFPTR_PARAM_FN_FFD_VERSION | Версия ФФД ФН | int |
LIBFPTR_PARAM_FN_MAX_FFD_VERSION | Максимальная версия ФФД ФН | int |
LIBFPTR_PARAM_FFD_VERSION | Версия ФФД | int |
LIBFPTR_PARAM_DEVICE_MAX_FFD_VERSION | Максимальная версия ФФД ККТ | int |
LIBFPTR_PARAM_DEVICE_MIN_FFD_VERSION | Минимальная версия ФФД ККТ | int |
LIBFPTR_PARAM_VERSION | Версия модели ККТ | int |
Указанные выше версии ФФД принимают следующие значения:
- LIBFPTR_FFD_UNKNOWN - неизвестная;
- LIBFPTR_FFD_1_0_5 - ФФД 1.05;
- LIBFPTR_FFD_1_1 - ФФД 1.1;
- LIBFPTR_FFD_1_2 - ФФД 1.2.
Срок действия ФН
Запрос срока действия ФН
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_VALIDITY);
libfptr_fn_query_data(fptr);
int registrationsRemain = libfptr_get_param_int(fptr, LIBFPTR_PARAM_REGISTRATIONS_REMAIN);
int registrationsCount = libfptr_get_param_int(fptr, LIBFPTR_PARAM_REGISTRATIONS_COUNT);
int year, month, day, hour, minute, second;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_VALIDITY);
fptr.fnQueryData();
uint registrationsRemain = fptr.getParamInt(LIBFPTR_PARAM_REGISTRATIONS_REMAIN);
uint registrationsCount = fptr.getParamInt(LIBFPTR_PARAM_REGISTRATIONS_COUNT);
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_VALIDITY);
fptr.fnQueryData();
long registrationsRemain = fptr.getParamInt(IFptr.LIBFPTR_PARAM_REGISTRATIONS_REMAIN);
long registrationsCount = fptr.getParamInt(IFptr.LIBFPTR_PARAM_REGISTRATIONS_COUNT);
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
Для запроса срока действия ФН необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_VALIDITY.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DATE_TIME | Срок действия ФН | datetime |
LIBFPTR_PARAM_REGISTRATIONS_COUNT | Сделано перерегистраций | int |
LIBFPTR_PARAM_REGISTRATIONS_REMAIN | Осталось перерегистраций | int |
Ошибки обмена с ОФД
Запрос ошибок обмена с ОФД
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_ERRORS);
libfptr_fn_query_data(fptr);
std::vector<wchar_t> str(1024);
int size = 0;
int networkError = libfptr_get_param_int(fptr, LIBFPTR_PARAM_NETWORK_ERROR);
size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_NETWORK_ERROR_TEXT, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_NETWORK_ERROR_TEXT, &str[0], str.size());
}
std::wstring networkErrorText = std::wstring(&str[0]);
int ofdError = libfptr_get_param_int(fptr, LIBFPTR_PARAM_OFD_ERROR);
size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_OFD_ERROR_TEXT, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_OFD_ERROR_TEXT, &str[0], str.size());
}
std::wstring ofdErrorText = std::wstring(&str[0]);
int fnError = libfptr_get_param_int(fptr, LIBFPTR_PARAM_FN_ERROR);
size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_FN_ERROR_TEXT, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_FN_ERROR_TEXT, &str[0], str.size());
}
std::wstring fnErrorText = std::wstring(&str[0]);
int documentNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENT_NUMBER);
int commandCode = libfptr_get_param_int(fptr, LIBFPTR_PARAM_COMMAND_CODE);
int year, month, day, hour, minute, second;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_ERRORS);
fptr.fnQueryData();
uint networkError = fptr.getParamInt(LIBFPTR_PARAM_NETWORK_ERROR);
std::wstring networkErrorText = fptr.getParamString(LIBFPTR_PARAM_NETWORK_ERROR_TEXT);
uint ofdError = fptr.getParamInt(LIBFPTR_PARAM_OFD_ERROR);
std::wstring nofdErrorText = fptr.getParamString(LIBFPTR_PARAM_OFD_ERROR_TEXT);
uint fnError = fptr.getParamInt(LIBFPTR_PARAM_FN_ERROR);
std::wstring nfnErrorText = fptr.getParamString(LIBFPTR_PARAM_FN_ERROR_TEXT);
uint documentNumber = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENT_NUMBER);
uint commandCode = fptr.getParamInt(LIBFPTR_PARAM_COMMAND_CODE);
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_ERRORS);
fptr.fnQueryData();
long networkError = fptr.getParamInt(IFptr.LIBFPTR_PARAM_NETWORK_ERROR);
String networkErrorText = fptr.getParamString(IFptr.LIBFPTR_PARAM_NETWORK_ERROR_TEXT);
long ofdError = fptr.getParamInt(IFptr.LIBFPTR_PARAM_OFD_ERROR);
String ofdErrorText = fptr.getParamString(IFptr.LIBFPTR_PARAM_OFD_ERROR_TEXT);
long fnError = fptr.getParamInt(IFptr.LIBFPTR_PARAM_FN_ERROR);
String fnErrorText = fptr.getParamString(IFptr.LIBFPTR_PARAM_FN_ERROR_TEXT);
long documentNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER);
long commandCode = fptr.getParamInt(IFptr.LIBFPTR_PARAM_COMMAND_CODE);
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
Для запроса ошибок обмена с ОФД необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_ERRORS.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DATE_TIME | Дата и время последнего успешного соединения с ОФД | datetime |
LIBFPTR_PARAM_NETWORK_ERROR | Код ошибки сети | int |
LIBFPTR_PARAM_NETWORK_ERROR_TEXT | Текст ошибки сети | string |
LIBFPTR_PARAM_OFD_ERROR | Код ошибки ОФД | int |
LIBFPTR_PARAM_OFD_ERROR_TEXT | Текст ошибки ОФД | string |
LIBFPTR_PARAM_FN_ERROR | Код ошибки ФН | int |
LIBFPTR_PARAM_FN_ERROR_TEXT | Текст ошибки ФН | string |
LIBFPTR_PARAM_DOCUMENT_NUMBER | Номер ФД, на котором произошла ошибка | int |
LIBFPTR_PARAM_COMMAND_CODE | Команда ФН, на которой произошла ошибка | int |
Квитанция ОФД
Запрос квитанции ОФД
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_TICKET_BY_DOC_NUMBER);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DOCUMENT_NUMBER, 12);
libfptr_fn_query_data(fptr);
int documentNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENT_NUMBER);
int year, month, day, hour, minute, second;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
std::vector<uchar> ofdFiscalSign(128);
int size = libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_OFD_FISCAL_SIGN,
&ofdFiscalSign[0], ofdFiscalSign.size());
if (size > ofdFiscalSign.size())
{
ofdFiscalSign.resize(size);
libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_OFD_FISCAL_SIGN,
&ofdFiscalSign[0], ofdFiscalSign.size());
}
ofdFiscalSign.resize(size);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_TICKET_BY_DOC_NUMBER);
fptr.setParam(LIBFPTR_PARAM_DOCUMENT_NUMBER, 12);
fptr.fnQueryData();
uint documentNumber = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENT_NUMBER);
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
std::vector<uchar> ofdFiscalSign = fptr.getParamByteArray(LIBFPTR_PARAM_OFD_FISCAL_SIGN);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_TICKET_BY_DOC_NUMBER);
fptr.setParam(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER, 12);
fptr.fnQueryData();
long documentNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER);
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
byte[] ofdFiscalSign = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_OFD_FISCAL_SIGN);
Для запроса квитанции ОФД необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_TICKET_BY_DOC_NUMBER и указать номер документа в параметре LIBFPTR_PARAM_DOCUMENT_NUMBER.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DATE_TIME | Дата и время из квитанции ОФД (UTC) | datetime |
LIBFPTR_PARAM_DOCUMENT_NUMBER | Номер ФД из квитанции | int |
LIBFPTR_PARAM_OFD_FISCAL_SIGN | Фискальный признак ОФД | bytearray |
Информация о документе
Запрос информации о документе
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_DOCUMENT_BY_NUMBER);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_DOCUMENT_NUMBER, 24);
libfptr_fn_query_data(fptr);
int documentType = libfptr_get_param_int(fptr, LIBFPTR_PARAM_FN_DOCUMENT_TYPE);
int documentNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENT_NUMBER);
bool hasOfdTicket = (libfptr_get_param_bool(fptr, LIBFPTR_PARAM_HAS_OFD_TICKET) != 0);
int year, month, day, hour, minute, second;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
std::vector<wchar_t> str(1024);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_FISCAL_SIGN, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_FISCAL_SIGN, &str[0], str.size());
}
std::wstring fiscalSign = std::wstring(&str[0]);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_DOCUMENT_BY_NUMBER);
fptr.setParam(LIBFPTR_PARAM_DOCUMENT_NUMBER, 24);
fptr.fnQueryData();
uint documentType = fptr.getParamInt(LIBFPTR_PARAM_FN_DOCUMENT_TYPE);
uint documentNumber = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENT_NUMBER);
bool hasOfdTicket = fptr.getParamBool(LIBFPTR_PARAM_HAS_OFD_TICKET);
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
std::wstring fiscalSign = fptr.getParamString(LIBFPTR_PARAM_FISCAL_SIGN);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_DOCUMENT_BY_NUMBER);
fptr.setParam(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER, 24);
fptr.fnQueryData();
long documentType = fptr.getParamInt(IFptr.LIBFPTR_PARAM_FN_DOCUMENT_TYPE);
long documentNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER);
boolean hasOfdTicket = fptr.getParamBool(IFptr.LIBFPTR_PARAM_HAS_OFD_TICKET);
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
String fiscalSign = fptr.getParamString(IFptr.LIBFPTR_PARAM_FISCAL_SIGN);
Для запроса информации о фискальном документе необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_DOCUMENT_BY_NUMBER и указать номер документа в параметре LIBFPTR_PARAM_DOCUMENT_NUMBER.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_FN_DOCUMENT_TYPE | Тип документа | int |
LIBFPTR_PARAM_DATE_TIME | Дата и время документа | datetime |
LIBFPTR_PARAM_DOCUMENT_NUMBER | Номер ФД | int |
LIBFPTR_PARAM_HAS_OFD_TICKET | Флаг наличия подтверждения ОФД | bool |
LIBFPTR_PARAM_FISCAL_SIGN | Фискальный признак | string |
Параметр LIBFPTR_PARAM_FN_DOCUMENT_TYPE может принимать следующие значения:
- LIBFPTR_FN_DOC_REGISTRATION - Отчет о регистрации;
- LIBFPTR_FN_DOC_OPEN_SHIFT - Отчет об открытии смены;
- LIBFPTR_FN_DOC_RECEIPT - Кассовый чек;
- LIBFPTR_FN_DOC_BSO - Бланк строгой отчетности;
- LIBFPTR_FN_DOC_CLOSE_SHIFT - Отчет о закрытии смены;
- LIBFPTR_FN_DOC_CLOSE_FN - Отчет о закрытии фискального накопителя;
- LIBFPTR_FN_DOC_OPERATOR_CONFIRMATION - Подтверждение оператора;
- LIBFPTR_FN_DOC_REREGISTRATION - Отчет об изменении параметров регистрации;
- LIBFPTR_FN_DOC_EXCHANGE_STATUS - Отчет о текущем состоянии расчетов;
- LIBFPTR_FN_DOC_CORRECTION - Кассовый чек коррекции;
- LIBFPTR_FN_DOC_BSO_CORRECTION - Бланк строгой отчетности коррекции.
Дополнительные выходные параметры зависят от значения LIBFPTR_PARAM_FN_DOCUMENT_TYPE.
Выходные параметры для отчета регистрации:
Параметр | Описание | Тип |
---|---|---|
1018 | ИНН организации | string |
1037 | Регистрационный номер устройства | string |
1062 | Системы налогообложения | int |
1001 | Признак автоматического режима | bool |
1002 | Признак автономного режима | bool |
1056 | Признак шифрования | bool |
1108 | Признак ККТ для расчетов в сети Интернет | bool |
1109 | Признак расчетов за услуги | bool |
1110 | Признак АС БСО | bool |
1290 | Признаки условий применения ККТ | int |
1017 | ИНН ОФД | string |
Выходные параметры для отчета перерегистрации:
Параметр | Описание | Тип |
---|---|---|
1018 | ИНН организации | string |
1037 | Регистрационный номер устройства | string |
1062 | Системы налогообложения | int |
1001 | Признак автоматического режима | bool |
1002 | Признак автономного режма | bool |
1056 | Признак шифрования | bool |
1108 | Признак ККТ для расчетов в сети Интернет | bool |
1109 | Признак расчетов за услуги | bool |
1110 | Признак АС БСО | bool |
1290 | Признаки условий применения ККТ | int |
1017 | ИНН ОФД | string |
1205 | Коды причин перерегистрации | int |
Выходные параметры для отчета о закрытии ФН:
Параметр | Описание | Тип |
---|---|---|
1018 | ИНН организации | string |
1037 | Регистрационный номер устройства | string |
Выходные параметры для отчетов об открытии / закрытии смены:
Параметр | Описание | Тип |
---|---|---|
1038 или LIBFPTR_PARAM_SHIFT_NUMBER | Номер смены | int |
Выходные параметры для чеков и БСО:
Параметр | Описание | Тип |
---|---|---|
1054 | Признак расчета | int |
1020 | Сумма расчета | double |
LIBFPTR_PARAM_HAS_ADDITIONAL_DATA | Есть дополнительные данные по чеку.Все реквизиты ниже доступны только в случае, если этот параметр равен true | bool |
1031 | Сумма по чеку (БСО) наличными | double |
1081 | Сумма по чеку (БСО) безналичными | double |
1215 | Сумма по чеку (БСО) предоплатой | double |
1216 | Сумма по чеку (БСО) постоплатой | double |
1217 | Сумма по чеку (БСО) встречным предоставлением | double |
1102 | Сумма НДС чека по ставке 20% | double |
1103 | Сумма НДС чека по ставке 10% | double |
1104 | Сумма расчёта по чеку с НДС по ставке 0% | double |
1105 | Сумма расчёта по чека без НДС | double |
1106 | Сумма НДС чека по расч. ставке 20/120 | double |
1107 | Сумма НДС чека по расч. ставке 10/110 | double |
1192 | Дополнительный реквизит чека (БСО) | string |
LIBFPTR_PARAM_FISCAL_SIGN_ARCHIVE | Фискальный признак сообщения для архива (ФПА) | bytearray |
Выходные параметры для отчета о состоянии расчетов:
Параметр | Описание | Тип |
---|---|---|
1097 | Количество непереданных ФД | int |
1098 | Дата первого из непереданных ФД | datetime |
Значение реквизита 1062 (системы налогообложения) - битовое поле, значениями которого являются одно или несколько из следующих значений:
- LIBFPTR_TT_OSN - общая;
- LIBFPTR_TT_USN_INCOME - упрощенная доход;
- LIBFPTR_TT_USN_INCOME_OUTCOME - упрощенная доход минус расход;
- LIBFPTR_TT_ESN - единый сельскохозяйственный доход;
- LIBFPTR_TT_PATENT - патентная система налогообложения.
Возможные значения реквизитов 1101 и 1205 приведены в разделе Перерегистрация ККТ.
Возможные значения для реквизита 1054 (признак расчета):
- 1 - приход;
- 2 - возврат прихода;
- 3 - расход;
- 4 - возврат расхода.
Детализация ошибки ФН
Запрос детализации ошибки ФН
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_ERROR_DETAIL);
libfptr_fn_query_data(fptr);
std::vector<uchar> details(128);
int size = libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_FN_ERROR_DATA,
&details[0], details.size());
if (size > details.size())
{
details.resize(size);
libfptr_get_param_bytearray(fptr, LIBFPTR_PARAM_FN_ERROR_DATA,
&details[0], details.size());
}
details.resize(size);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_ERROR_DETAIL);
fptr.fnQueryData();
std::vector<uchar> details = fptr.getParamByteArray(LIBFPTR_PARAM_FN_ERROR_DATA);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_ERROR_DETAIL);
fptr.fnQueryData();
byte[] details = fptr.getParamByteArray(IFptr.LIBFPTR_PARAM_FN_ERROR_DATA);
Для запроса детализации ошибки ФН необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_ERROR_DETAIL.
Детализация ошибки будет доступна в выходном параметре LIBFPTR_PARAM_FN_ERROR_DATA.
Ресурс памяти ФН
Запрос ресурса памяти ФН
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FREE_MEMORY);
libfptr_fn_query_data(fptr);
uint documentsCount = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENTS_COUNT);
uint freeMemory = libfptr_get_param_int(fptr, LIBFPTR_PARAM_FREE_MEMORY);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FREE_MEMORY);
fptr.fnQueryData();
uint documentsCount = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENTS_COUNT);
uint freeMemory = fptr.getParamInt(LIBFPTR_PARAM_FREE_MEMORY);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_FREE_MEMORY);
fptr.fnQueryData();
long documentsCount = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT);
long freeMemory = fptr.getParamInt(IFptr.LIBFPTR_PARAM_FREE_MEMORY);
Для запроса ресурса свободной памяти ФН необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_FREE_MEMORY.
Детализация ошибки будет доступна в выходном параметре LIBFPTR_PARAM_FN_ERROR_DATA.
Выходные параметры:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DOCUMENTS_COUNT | Ресурс данных 5-летнего хранения. Приблизительное количество документов, которое можно создать в ФН | int |
LIBFPTR_PARAM_FREE_MEMORY | Ресурс данных 30-дневного хранения. Размер свободной области (в килобайтах) для записи документов. После 30 дней работы значение может колебаться возле постоянного уровня | int |
Ошибки обмена с ИСМ
Запрос ошибок обмена с ИСМ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_ISM_ERRORS);
libfptr_fn_query_data(fptr);
std::vector<wchar_t> str(1024);
int size = 0;
int networkError = libfptr_get_param_int(fptr, LIBFPTR_PARAM_NETWORK_ERROR);
size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_NETWORK_ERROR_TEXT, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_NETWORK_ERROR_TEXT, &str[0], str.size());
}
std::wstring networkErrorText = std::wstring(&str[0]);
int ismError = libfptr_get_param_int(fptr, LIBFPTR_PARAM_ISM_ERROR);
size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_ISM_ERROR_TEXT, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_ISM_ERROR_TEXT, &str[0], str.size());
}
std::wstring ismErrorText = std::wstring(&str[0]);
int fnError = libfptr_get_param_int(fptr, LIBFPTR_PARAM_FN_ERROR);
size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_FN_ERROR_TEXT, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_FN_ERROR_TEXT, &str[0], str.size());
}
std::wstring fnErrorText = std::wstring(&str[0]);
int documentNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENT_NUMBER);
int commandCode = libfptr_get_param_int(fptr, LIBFPTR_PARAM_COMMAND_CODE);
int year, month, day, hour, minute, second;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_ISM_ERRORS);
fptr.fnQueryData();
uint networkError = fptr.getParamInt(LIBFPTR_PARAM_NETWORK_ERROR);
std::wstring networkErrorText = fptr.getParamString(LIBFPTR_PARAM_NETWORK_ERROR_TEXT);
uint ismError = fptr.getParamInt(LIBFPTR_PARAM_ISM_ERROR);
std::wstring nismErrorText = fptr.getParamString(LIBFPTR_PARAM_ISM_ERROR_TEXT);
uint fnError = fptr.getParamInt(LIBFPTR_PARAM_FN_ERROR);
std::wstring nfnErrorText = fptr.getParamString(LIBFPTR_PARAM_FN_ERROR_TEXT);
uint documentNumber = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENT_NUMBER);
uint commandCode = fptr.getParamInt(LIBFPTR_PARAM_COMMAND_CODE);
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_ISM_ERRORS);
fptr.fnQueryData();
long networkError = fptr.getParamInt(IFptr.LIBFPTR_PARAM_NETWORK_ERROR);
String networkErrorText = fptr.getParamString(IFptr.LIBFPTR_PARAM_NETWORK_ERROR_TEXT);
long ismError = fptr.getParamInt(IFptr.LIBFPTR_PARAM_ISM_ERROR);
String ismErrorText = fptr.getParamString(IFptr.LIBFPTR_PARAM_ISM_ERROR_TEXT);
long fnError = fptr.getParamInt(IFptr.LIBFPTR_PARAM_FN_ERROR);
String fnErrorText = fptr.getParamString(IFptr.LIBFPTR_PARAM_FN_ERROR_TEXT);
long documentNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER);
long commandCode = fptr.getParamInt(IFptr.LIBFPTR_PARAM_COMMAND_CODE);
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
Для запроса ошибок обмена с ИСМ необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_ISM_ERRORS.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DATE_TIME | Дата и время последнего успешного соединения с ИСМ | datetime |
LIBFPTR_PARAM_NETWORK_ERROR | Код ошибки сети | int |
LIBFPTR_PARAM_NETWORK_ERROR_TEXT | Текст ошибки сети | string |
LIBFPTR_PARAM_ISM_ERROR | Код ошибки ИСМ | int |
LIBFPTR_PARAM_ISM_ERROR_TEXT | Текст ошибки ИСМ | string |
LIBFPTR_PARAM_FN_ERROR | Код ошибки ФН | int |
LIBFPTR_PARAM_FN_ERROR_TEXT | Текст ошибки ФН | string |
LIBFPTR_PARAM_DOCUMENT_NUMBER | Номер ФД, на котором произошла ошибка | int |
LIBFPTR_PARAM_COMMAND_CODE | Команда ФН, на которой произошла ошибка | int |
Статус информационного обмена с ИСМ
Запрос статуса информационного обмена с ИСМ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_ISM_EXCHANGE_STATUS);
libfptr_fn_query_data(fptr);
int unsentCount = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENTS_COUNT);
int firstUnsentNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_DOCUMENT_NUMBER);
int year, month, day, hour, minute, second;
libfptr_get_param_datetime(fptr, LIBFPTR_PARAM_DATE_TIME, &year, &month, &day, &hour, &minute, &second);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_ISM_EXCHANGE_STATUS);
fptr.fnQueryData();
uint unsentCount = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENTS_COUNT);
uint firstUnsentNumber = fptr.getParamInt(LIBFPTR_PARAM_DOCUMENT_NUMBER);
std::tm dateTime = fptr.getParamDateTime(LIBFPTR_PARAM_DATE_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_ISM_EXCHANGE_STATUS);
fptr.fnQueryData();
long unsentCount = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT);
long firstUnsentNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER);
Date dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME);
Для запроса cтатуса информационного обмена с ИСМ необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_ISM_EXCHANGE_STATUS.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_DOCUMENTS_COUNT | Количество непереданных уведомлений | int |
LIBFPTR_PARAM_DOCUMENT_NUMBER | Номер первого непереданного уведомления | int |
LIBFPTR_PARAM_DATE_TIME | Дата и время первого непереданного уведомления | datetime |
Состояние работы с КМ
Запрос состояния работы с КМ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_MARKING_MODE_STATUS);
libfptr_fn_query_data(fptr);
int markingModeCheckingStatus = libfptr_get_param_int(fptr, LIBFPTR_PARAM_MARKING_MODE_CHECKING_STATUS);
int markCheckingCount = libfptr_get_param_int(fptr, LIBFPTR_PARAM_MARK_CHECKING_COUNT);
int markSoldCount = libfptr_get_param_int(fptr, LIBFPTR_PARAM_MARK_SOLD_COUNT);
bool noticeIsBegin = libfptr_get_param_bool(fptr, LIBFPTR_PARAM_NOTICE_IS_BEGIN);
int noticeFreeMemory = libfptr_get_param_int(fptr, LIBFPTR_PARAM_NOTICE_FREE_MEMORY);
int noticeCount = libfptr_get_param_int(fptr, LIBFPTR_PARAM_NOTICE_COUNT);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_MARKING_MODE_STATUS);
fptr.fnQueryData();
uint markingModeCheckingStatus = fptr.getParamInt(LIBFPTR_PARAM_MARKING_MODE_CHECKING_STATUS);
uint markCheckingCount = fptr.getParamInt(LIBFPTR_PARAM_MARK_CHECKING_COUNT);
uint markSoldCount = fptr.getParamInt(LIBFPTR_PARAM_MARK_SOLD_COUNT);
bool noticeIsBegin = fptr.getParamBool(LIBFPTR_PARAM_NOTICE_IS_BEGIN);
uint noticeFreeMemory = fptr.getParamInt(LIBFPTR_PARAM_NOTICE_FREE_MEMORY);
uint noticeCount = fptr.getParamInt(LIBFPTR_PARAM_NOTICE_COUNT);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_MARKING_MODE_STATUS);
fptr.fnQueryData();
long markingModeCheckingStatus = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MARKING_MODE_CHECKING_STATUS);
long markCheckingCount = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MARK_CHECKING_COUNT);
long markSoldCount = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MARK_SOLD_COUNT);
boolean noticeIsBegin = fptr.getParamBool(IFptr.LIBFPTR_PARAM_NOTICE_IS_BEGIN);
long noticeFreeMemory = fptr.getParamInt(IFptr.LIBFPTR_PARAM_NOTICE_FREE_MEMORY);
long noticeCount = fptr.getParamInt(IFptr.LIBFPTR_PARAM_NOTICE_COUNT);
Для запроса состояния работы с КМ необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_MARKING_MODE_STATUS.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_MARKING_MODE_CHECKING_STATUS | Состояние проверки КМ в ФН | int |
LIBFPTR_PARAM_MARK_CHECKING_COUNT | Количество проверенных КМ в таблице проверенных КМ | int |
LIBFPTR_PARAM_MARK_SOLD_COUNT | Количество реализованных КМ | int |
LIBFPTR_PARAM_NOTICE_IS_BEGIN | Формирование уведомления | bool |
LIBFPTR_PARAM_NOTICE_FREE_MEMORY | Ресурс области уведомлений | int |
LIBFPTR_PARAM_NOTICE_COUNT | Количество неотправленных уведомлений | int |
LIBFPTR_PARAM_MARK_CHECKING_STATUS_IN_CASH | Статус проверки КМ в ККТ | int |
LIBFPTR_PARAM_MARK_CHECKING_TYPE_IN_CASH | Тип проверки КМ в ККТ | int |
LIBFPTR_PARAM_MARK_CHECKING_STAGE_IN_CASH | Этап проверки КМ в ККТ | int |
Состояние проверки КМ в ФН (LIBFPTR_PARAM_MARKING_MODE_CHECKING_STATUS) может принимать следующие значения:
- LIBFPTR_MCS_BLOCK - работа с КМ временно заблокирована (переполнение области уведомлений);
- LIBFPTR_MCS_NO_MARK_FOR_CHECK - нет КМ на проверке;
- LIBFPTR_MCS_MARK_RECEIVE_B1 - передан КМ в команде B1h;
- LIBFPTR_MCS_MARK_STATE_QUERY_B5 - сформирован запрос о статусе КМ в команде B5h;
- LIBFPTR_MCS_MARK_STATE_ANSWER_B6 - получен ответ на запрос о статусе КМ в команде B6h.
Количество проверок КМ (LIBFPTR_PARAM_MARK_CHECKING_COUNT) показывает количество сохраненных результатов проверки КМ.
Количество реализованных КМ (LIBFPTR_PARAM_MARK_SOLD_COUNT) показывает количество КМ включенных в уведомление о реализации
Формирование уведомления (LIBFPTR_PARAM_NOTICE_IS_BEGIN) в случае значения true означает, что формирование уведомления начато, иначе - уведомление не формируется.
Ресурс области уведомлений (LIBFPTR_PARAM_NOTICE_FREE_MEMORY) может принимать следующие значения:
- LIBFPTR_NFM_LESS_50_PERCENT - область заполнена менее чем на 50%;
- LIBFPTR_NFM_FROM_50_TO_80_PERCENT - область заполнена от 50 до 80%;
- LIBFPTR_NFM_FROM_80_TO_90_PERCENT - область заполнена от 80 до 90%;
- LIBFPTR_NFM_MORE_90_PERCENT - область заполнена более чем на 90%;
- LIBFPTR_NFM_OUT_OF_MEMORY - область полностью заполнена.
Количество неотправленных уведомлений (LIBFPTR_PARAM_NOTICE_COUNT) показывает количество неподтверждённых или невыгруженных уведомлений о реализации маркированного товара.
Статус проверки КМ в ККТ (LIBFPTR_PARAM_MARK_CHECKING_STATUS_IN_CASH) может принимать следующие значения:
- LIBFPTR_MCS_NOT_EXECUTED - не выполняется;
- LIBFPTR_MCS_EXECUTED - выполняется;
- LIBFPTR_MCS_IS_OVER - проверка завершена;
- LIBFPTR_MCS_RESULT_IS_RECIEVED - результат получен.
Тип проверки КМ в ККТ (LIBFPTR_PARAM_MARK_CHECKING_TYPE_IN_CASH) может принимать следующие значения:
- LIBFPTR_MCT_AUTONOMOUS - автономный режим;
- LIBFPTR_MCT_WAIT_FOR_RESULT - ожидать ответ;
- LIBFPTR_MCT_RESULT_NOT_WAIT - ответ не ожидается;
- LIBFPTR_MCT_QUERY_NOT_SEND - запрос не отправлялся.
Этап проверки КМ в ККТ (LIBFPTR_PARAM_MARK_CHECKING_STAGE_IN_CASH) может принимать следующие значения:
- LIBFPTR_MCST_WAITING_FOR_TASK - ожидание задания;
- LIBFPTR_MCST_OPENING_CONNECTION - открытие соединения;
- LIBFPTR_MCST_SENDING - отправка;
- LIBFPTR_MCST_WAITING_FOR_RESULT - ожидание ответа;
- LIBFPTR_MCST_GETTING_RESULT - получение ответа;
- LIBFPTR_MCST_DECODE_RESULT - декодирование ответа;
- LIBFPTR_MCST_TASK_IS_OVER - задание завершено;
- LIBFPTR_MCST_WAITING_FOR_REPEAT - ожидание повтора.
Время выполнения проверки КМ
Запрос времени выполнения проверки КМ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_CHECK_MARK_TIME);
libfptr_fn_query_data(fptr);
int fnCheckMarkTime = libfptr_get_param_int(fptr, LIBFPTR_PARAM_FN_CHECK_MARK_TIME);
int sendingMarkTime = libfptr_get_param_int(fptr, LIBFPTR_PARAM_SENDING_MARK_TIME);
int markingServerExchangeTime = libfptr_get_param_int(fptr, LIBFPTR_PARAM_MARKING_SERVER_EXCHANGE_TIME);
int fullSendingMarkTime = libfptr_get_param_int(fptr, LIBFPTR_PARAM_FULL_SENDING_MARK_TIME);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_CHECK_MARK_TIME);
fptr.fnQueryData();
uint fnCheckMarkTime = fptr.getParamInt(LIBFPTR_PARAM_FN_CHECK_MARK_TIME);
uint sendingMarkTime = fptr.getParamInt(LIBFPTR_PARAM_SENDING_MARK_TIME);
uint markingServerExchangeTime = fptr.getParamInt(LIBFPTR_PARAM_MARKING_SERVER_EXCHANGE_TIME);
uint fullSendingMarkTime = fptr.getParamInt(LIBFPTR_PARAM_FULL_SENDING_MARK_TIME);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_CHECK_MARK_TIME);
fptr.fnQueryData();
long fnCheckMarkTime = fptr.getParamInt(IFptr.LIBFPTR_PARAM_FN_CHECK_MARK_TIME);
long sendingMarkTime = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SENDING_MARK_TIME);
long markingServerExchangeTime = fptr.getParamInt(IFptr.LIBFPTR_PARAM_MARKING_SERVER_EXCHANGE_TIME);
long fullSendingMarkTime = fptr.getParamInt(IFptr.LIBFPTR_PARAM_FULL_SENDING_MARK_TIME);
Для запроса состояния работы с КМ необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_CHECK_MARK_TIME.
Результатом этого запроса будет следующая информация:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_FN_CHECK_MARK_TIME | Время проверки в ФН, мс | int |
LIBFPTR_PARAM_SENDING_MARK_TIME | Время отправки, мс | int |
LIBFPTR_PARAM_MARKING_SERVER_EXCHANGE_TIME | Время обмена с сервером, мс | int |
LIBFPTR_PARAM_FULL_SENDING_MARK_TIME | Полное время проверки, мс | int |
Параметр LIBFPTR_PARAM_FN_CHECK_MARK_TIME показывает время проверки ФН в мс. Если проверка в ФН еще не была проведена, то равно 0. Включает в себя время на проверку в КМ и получение пакета для обмена с сервером.
Параметр LIBFPTR_PARAM_SENDING_MARK_TIME показывает время открытия соединения и отправки данных в последней попытке в мс. Если ответ не был получен, то равно 0. Если ККТ работает в автономном режиме, то всегда равно 0.
Параметр LIBFPTR_PARAM_MARKING_SERVER_EXCHANGE_TIME показывает время открытия соединения, отправки данных и получения ответа от сервера в последней попытке. Если ответ не был получен, то равно 0. Если ККТ работает в автономном режиме, то всегда равно 0.
Параметр LIBFPTR_PARAM_FULL_SENDING_MARK_TIME показывает полное время проверки, включая повторы. Также к полному времени проверки добавляется время команды ФН на повторное получение пакета для обмена.
Счетчики ФН
В ФН 1.2 доступны следующие счетчики:
- Счетчики итогов операций (сменные и необнуляемые);
- Счетчики итогов операций по заданному типу расчетов (сменные и необнуляемые);
- Счетчики количеств операций (сменные и необнуляемые);
- Счетчики итогов непереданных документов.
Счетчики итогов операций
Чтение счетчиков итогов операций ФН по типу расчета
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_TOTALS);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_COUNTERS_TYPE, LIBFPTR_FNCT_SHIFT);
libfptr_fn_query_data(fptr);
uint receipts = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPTS_COUNT);
uint corrections = libfptr_get_param_int(fptr, LIBFPTR_PARAM_CORRECTIONS_COUNT);
double receiptsSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_RECEIPTS_SUM);
double correctionsSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_CORRECTIONS_SUM);
double cashSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_PAYMENTS_SUM_CASH);
double noncashSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_PAYMENTS_SUM_ELECTRONICALLY);
double prepaidSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_PAYMENTS_SUM_PREPAID);
double creditSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_PAYMENTS_SUM_CREDIT);
double barterSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_PAYMENTS_SUM_OTHER);
double vat20Sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_TAXES_SUM_VAT20);
double vat10Sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_TAXES_SUM_VAT10);
double vat120Sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_TAXES_SUM_VAT120);
double vat110Sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_TAXES_SUM_VAT110);
double vat0Sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_TAXES_SUM_VAT0);
double vatNoSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_TAXES_SUM_NO);
fptr.setParam(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_TOTALS);
fptr.setParam(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL);
fptr.setParam(LIBFPTR_PARAM_FN_COUNTERS_TYPE, LIBFPTR_FNCT_SHIFT);
fptr.fnQueryData();
uint receipts = fptr.getParamInt(LIBFPTR_PARAM_RECEIPTS_COUNT);
uint corrections = fptr.getParamInt(LIBFPTR_PARAM_CORRECTIONS_COUNT);
double receiptsSum = fptr.getParamDouble(LIBFPTR_PARAM_RECEIPTS_SUM);
double correctionsSum = fptr.getParamDouble(LIBFPTR_PARAM_CORRECTIONS_SUM);
double cashSum = fptr.getParamDouble(LIBFPTR_PARAM_PAYMENTS_SUM_CASH);
double noncashSum = fptr.getParamDouble(LIBFPTR_PARAM_PAYMENTS_SUM_ELECTRONICALLY);
double prepaidSum = fptr.getParamDouble(LIBFPTR_PARAM_PAYMENTS_SUM_PREPAID);
double creditSum = fptr.getParamDouble(LIBFPTR_PARAM_PAYMENTS_SUM_CREDIT);
double barterSum = fptr.getParamDouble(LIBFPTR_PARAM_PAYMENTS_SUM_OTHER);
double vat20Sum = fptr.getParamDouble(LIBFPTR_PARAM_TAXES_SUM_VAT20);
double vat10Sum = fptr.getParamDouble(LIBFPTR_PARAM_TAXES_SUM_VAT10);
double vat120Sum = fptr.getParamDouble(LIBFPTR_PARAM_TAXES_SUM_VAT120);
double vat110Sum = fptr.getParamDouble(LIBFPTR_PARAM_TAXES_SUM_VAT110);
double vat0Sum = fptr.getParamDouble(LIBFPTR_PARAM_TAXES_SUM_VAT0);
double vatNoSum = fptr.getParamDouble(LIBFPTR_PARAM_TAXES_SUM_NO);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_TOTALS);
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_COUNTERS_TYPE, IFptr.LIBFPTR_FNCT_SHIFT);
fptr.fnQueryData();
long receipts = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPTS_COUNT);
long corrections = fptr.getParamInt(IFptr.LIBFPTR_PARAM_CORRECTIONS_COUNT);
double receiptsSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_RECEIPTS_SUM);
double correctionsSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_CORRECTIONS_SUM);
double cashSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_PAYMENTS_SUM_CASH);
double noncashSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_PAYMENTS_SUM_ELECTRONICALLY);
double prepaidSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_PAYMENTS_SUM_PREPAID);
double creditSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_PAYMENTS_SUM_CREDIT);
double barterSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_PAYMENTS_SUM_OTHER);
double vat20Sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_TAXES_SUM_VAT20);
double vat10Sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_TAXES_SUM_VAT10);
double vat120Sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_TAXES_SUM_VAT120);
double vat110Sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_TAXES_SUM_VAT110);
double vat0Sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_TAXES_SUM_VAT0);
double vatNoSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_TAXES_SUM_NO);
Для запроса счетчиков итогов операций ФН по заданному типу расчетов необходимо вызвать метод fnQueryData() с типом запроса LIBFPTR_PARAM_FN_DATA_TYPE равным LIBFPTR_FNDT_TOTALS и передать тип расчета в параметре LIBFPTR_PARAM_RECEIPT_TYPE и тип счетчиков ФН в параметре LIBFPTR_PARAM_FN_COUNTERS_TYPE.
Выходные параметры:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_RECEIPTS_COUNT | Общее количество чеков (включая коррекции) | int |
LIBFPTR_PARAM_CORRECTIONS_COUNT | Количество коррекций | int |
LIBFPTR_PARAM_RECEIPTS_SUM | Итоговая сумма чеков (включая коррекции) | double |
LIBFPTR_PARAM_CORRECTIONS_SUM | Сумма коррекций | double |
LIBFPTR_PARAM_PAYMENTS_SUM_CASH | Сумма наличных оплат | double |
LIBFPTR_PARAM_PAYMENTS_SUM_ELECTRONICALLY | Сумма безналичных оплат | double |
LIBFPTR_PARAM_PAYMENTS_SUM_PREPAID | Сумма оплат авансом | double |
LIBFPTR_PARAM_PAYMENTS_SUM_CREDIT | Сумма оплат кредитом | double |
LIBFPTR_PARAM_PAYMENTS_SUM_OTHER | Сумма оплат встречным предоставлением | double |
LIBFPTR_PARAM_TAXES_SUM_VAT20 | Сумма НДС 20% | double |
LIBFPTR_PARAM_TAXES_SUM_VAT10 | Сумма НДС 10% | double |
LIBFPTR_PARAM_TAXES_SUM_VAT120 | Сумма НДС 20/120 | double |
LIBFPTR_PARAM_TAXES_SUM_VAT110 | Сумма НДС 10/110 | double |
LIBFPTR_PARAM_TAXES_SUM_VAT0 | Сумма НДС 0% | double |
LIBFPTR_PARAM_TAXES_SUM_NO | Сумма без НДС | double |
Чтение счетчиков итогов операций ФН
// Вспомогательная функция для чтения строковых параметров
std::wstring readStringAttribute(libfptr_handle fptr, int paramNumber) {
std::vector<wchar_t> str(32);
int size = libfptr_get_param_str(fptr, paramNumber, &str[0], str.size());
if (size > str.size()) {
str.resize(size);
libfptr_get_param_str(fptr, paramNumber, &str[0], str.size());
}
return std::wstring(&str[0]);
}
// Вспомогательная функция чтения следующей записи
int readNextRecord(libfptr_handle fptr, const std::wstring &recordsID) {
libfptr_set_param_str(fptr, LIBFPTR_PARAM_RECORDS_ID, recordsID.c_str());
return libfptr_read_next_record(fptr);
}
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECORDS_TYPE, LIBFPTR_RT_FN_SUM_COUNTERS);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_COUNTERS_TYPE, LIBFPTR_FNCT_SHIFT);
libfptr_begin_read_records(handle);
std::wstring recordsID = readStringAttribute(fptr, LIBFPTR_PARAM_RECORDS_ID);
uint shiftNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_SHIFT_NUMBER);
uint receiptsAll = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPTS_COUNT);
uint correctionsAll = libfptr_get_param_int(fptr, LIBFPTR_PARAM_CORRECTIONS_COUNT);
while (readNextRecord(fptr, recordsID) == LIBFPTR_OK)
{
uint receiptType = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE);
uint receipts = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPTS_COUNT);
uint corrections = libfptr_get_param_int(fptr, LIBFPTR_PARAM_CORRECTIONS_COUNT);
double receiptsSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_RECEIPTS_SUM);
double correctionsSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_CORRECTIONS_SUM);
double cashSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_PAYMENTS_SUM_CASH);
double noncashSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_PAYMENTS_SUM_ELECTRONICALLY);
double prepaidSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_PAYMENTS_SUM_PREPAID);
double creditSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_PAYMENTS_SUM_CREDIT);
double barterSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_PAYMENTS_SUM_OTHER);
double vat20Sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_TAXES_SUM_VAT20);
double vat10Sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_TAXES_SUM_VAT10);
double vat120Sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_TAXES_SUM_VAT120);
double vat110Sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_TAXES_SUM_VAT110);
double vat0Sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_TAXES_SUM_VAT0);
double vatNoSum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_TAXES_SUM_NO);
}
libfptr_set_param_str(fptr, LIBFPTR_PARAM_RECORDS_ID, recordsID.c_str());
libfptr_end_read_records(fptr);
// Вспомогательная функция чтения следующей записи
int readNextRecord(IFptr &fptr, const std::wstring &recordsID)
{
fptr.setParam(LIBFPTR_PARAM_RECORDS_ID, recordsID);
return fptr.readNextRecord();
}
fptr.setParam(LIBFPTR_PARAM_RECORDS_TYPE, LIBFPTR_RT_FN_SUM_COUNTERS);
fptr.setParam(LIBFPTR_PARAM_FN_COUNTERS_TYPE, LIBFPTR_FNCT_SHIFT);
fptr.beginReadRecords();
std::wstring recordsID = fptr.getParamString(LIBFPTR_PARAM_RECORDS_ID);
uint shiftNumber = fptr.getParamInt(LIBFPTR_PARAM_SHIFT_NUMBER);
uint receiptsAll = fptr.getParamInt(LIBFPTR_PARAM_RECEIPTS_COUNT);
uint correctionsAll = fptr.getParamInt(LIBFPTR_PARAM_CORRECTIONS_COUNT);
while (readNextRecord(fptr, recordsID) == LIBFPTR_OK)
{
uint receiptType = fptr.getParamInt(LIBFPTR_PARAM_RECEIPT_TYPE);
uint receipts = fptr.getParamInt(LIBFPTR_PARAM_RECEIPTS_COUNT);
uint corrections = fptr.getParamInt(LIBFPTR_PARAM_CORRECTIONS_COUNT);
double receiptsSum = fptr.getParamDouble(LIBFPTR_PARAM_RECEIPTS_SUM);
double correctionsSum = fptr.getParamDouble(LIBFPTR_PARAM_CORRECTIONS_SUM);
double cashSum = fptr.getParamDouble(LIBFPTR_PARAM_PAYMENTS_SUM_CASH);
double noncashSum = fptr.getParamDouble(LIBFPTR_PARAM_PAYMENTS_SUM_ELECTRONICALLY);
double prepaidSum = fptr.getParamDouble(LIBFPTR_PARAM_PAYMENTS_SUM_PREPAID);
double creditSum = fptr.getParamDouble(LIBFPTR_PARAM_PAYMENTS_SUM_CREDIT);
double barterSum = fptr.getParamDouble(LIBFPTR_PARAM_PAYMENTS_SUM_OTHER);
double vat20Sum = fptr.getParamDouble(LIBFPTR_PARAM_TAXES_SUM_VAT20);
double vat10Sum = fptr.getParamDouble(LIBFPTR_PARAM_TAXES_SUM_VAT10);
double vat120Sum = fptr.getParamDouble(LIBFPTR_PARAM_TAXES_SUM_VAT120);
double vat110Sum = fptr.getParamDouble(LIBFPTR_PARAM_TAXES_SUM_VAT110);
double vat0Sum = fptr.getParamDouble(LIBFPTR_PARAM_TAXES_SUM_VAT0);
double vatNoSum = fptr.getParamDouble(LIBFPTR_PARAM_TAXES_SUM_NO);
}
fptr.setParam(LIBFPTR_PARAM_RECORDS_ID, recordsID);
fptr.endReadRecords();
// Вспомогательная функция чтения следующей записи
int readNextRecord(IFptr fptr, String recordsID) {
fptr.setParam(IFptr.LIBFPTR_PARAM_RECORDS_ID, recordsID);
return fptr.readNextRecord();
}
fptr.setParam(IFptr.LIBFPTR_PARAM_RECORDS_TYPE, IFptr.LIBFPTR_RT_FN_SUM_COUNTERS);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_COUNTERS_TYPE, IFptr.LIBFPTR_FNCT_SHIFT);
fptr.beginReadRecords();
String recordsID = fptr.getParamString(IFptr.LIBFPTR_PARAM_RECORDS_ID);
long shiftNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SHIFT_NUMBER);
long receiptsAll = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPTS_COUNT);
long correctionsAll = fptr.getParamInt(IFptr.LIBFPTR_PARAM_CORRECTIONS_COUNT);
while (readNextRecord(fptr, recordsID) == IFptr.LIBFPTR_OK) {
long receiptType = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE);
long receipts = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPTS_COUNT);
long corrections = fptr.getParamInt(IFptr.LIBFPTR_PARAM_CORRECTIONS_COUNT);
double receiptsSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_RECEIPTS_SUM);
double correctionsSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_CORRECTIONS_SUM);
double cashSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_PAYMENTS_SUM_CASH);
double noncashSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_PAYMENTS_SUM_ELECTRONICALLY);
double prepaidSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_PAYMENTS_SUM_PREPAID);
double creditSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_PAYMENTS_SUM_CREDIT);
double barterSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_PAYMENTS_SUM_OTHER);
double vat20Sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_TAXES_SUM_VAT20);
double vat10Sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_TAXES_SUM_VAT10);
double vat120Sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_TAXES_SUM_VAT120);
double vat110Sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_TAXES_SUM_VAT110);
double vat0Sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_TAXES_SUM_VAT0);
double vatNoSum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_TAXES_SUM_NO);
}
fptr.setParam(IFptr.LIBFPTR_PARAM_RECORDS_ID, recordsID);
fptr.endReadRecords();
Также можно запросить счетчики итогов сразу по всем типам расчетов. Для этого нужно вызвать метод beginReadRecords() с типом данных LIBFPTR_PARAM_RECORDS_TYPE равным LIBFPTR_RT_FN_SUM_COUNTERS. В параметре LIBFPTR_PARAM_FN_COUNTERS_TYPE нужно указать тип счетчиков.
Выходным параметрами будут следующие значения:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SHIFT_NUMBER | Номер смены | int |
LIBFPTR_PARAM_RECEIPTS_COUNT | Общее количество чеков (включая коррекции) | int |
LIBFPTR_PARAM_CORRECTIONS_COUNT | Количество коррекций | int |
Каждый успешный вызов метода readNextRecord() заполняет следующие параметры:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_RECEIPT_TYPE | Тип расчета | int |
LIBFPTR_PARAM_RECEIPTS_COUNT | Общее количество чеков (включая коррекции) | int |
LIBFPTR_PARAM_CORRECTIONS_COUNT | Количество коррекций | int |
LIBFPTR_PARAM_RECEIPTS_SUM | Итоговая сумма чеков (включая коррекции) | double |
LIBFPTR_PARAM_CORRECTIONS_SUM | Сумма коррекций | double |
LIBFPTR_PARAM_PAYMENTS_SUM_CASH | Сумма наличных оплат | double |
LIBFPTR_PARAM_PAYMENTS_SUM_ELECTRONICALLY | Сумма безналичных оплат | double |
LIBFPTR_PARAM_PAYMENTS_SUM_PREPAID | Сумма оплат авансом | double |
LIBFPTR_PARAM_PAYMENTS_SUM_CREDIT | Сумма оплат кредитом | double |
LIBFPTR_PARAM_PAYMENTS_SUM_OTHER | Сумма оплат встречным предоставлением | double |
LIBFPTR_PARAM_TAXES_SUM_VAT20 | Сумма НДС 20% | double |
LIBFPTR_PARAM_TAXES_SUM_VAT10 | Сумма НДС 10% | double |
LIBFPTR_PARAM_TAXES_SUM_VAT120 | Сумма НДС 20/120 | double |
LIBFPTR_PARAM_TAXES_SUM_VAT110 | Сумма НДС 10/110 | double |
LIBFPTR_PARAM_TAXES_SUM_VAT0 | Сумма НДС 0% | double |
LIBFPTR_PARAM_TAXES_SUM_NO | Сумма без НДС | double |
Тип расчета (LIBFPTR_PARAM_RECEIPT_TYPE) может принимать следующие значения:
- LIBFPTR_RT_SELL - чек прихода (продажи);
- LIBFPTR_RT_SELL_RETURN - чек возврата прихода (продажи);
- LIBFPTR_RT_BUY - чек расхода (покупки);
- LIBFPTR_RT_BUY_RETURN - чек возврата расхода (покупки).
Тип счетчиков ФН (LIBFPTR_PARAM_FN_COUNTERS_TYPE) может принимать следующие значения:
- LIBFPTR_FNCT_SHIFT - сменные счетчики;
- LIBFPTR_FNCT_NON_NULLABLE - необнуляемые счетчики.
Счетчики количеств операций
Чтение счетчиков количеств операций ФН
// Вспомогательная функция для чтения строковых параметров
std::wstring readStringAttribute(libfptr_handle fptr, int paramNumber) {
std::vector<wchar_t> str(32);
int size = libfptr_get_param_str(fptr, paramNumber, &str[0], str.size());
if (size > str.size()) {
str.resize(size);
libfptr_get_param_str(fptr, paramNumber, &str[0], str.size());
}
return std::wstring(&str[0]);
}
// Вспомогательная функция чтения следующей записи
int readNextRecord(libfptr_handle fptr, const std::wstring &recordsID) {
libfptr_set_param_str(fptr, LIBFPTR_PARAM_RECORDS_ID, recordsID.c_str());
return libfptr_read_next_record(fptr);
}
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECORDS_TYPE, LIBFPTR_RT_FN_QUANTITY_COUNTERS);
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_COUNTERS_TYPE, LIBFPTR_FNCT_SHIFT);
libfptr_begin_read_records(handle);
std::wstring recordsID = readStringAttribute(fptr, LIBFPTR_PARAM_RECORDS_ID);
uint shiftNumber = libfptr_get_param_int(fptr, LIBFPTR_PARAM_SHIFT_NUMBER);
uint countAll = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPTS_COUNT);
while (readNextRecord(fptr, recordsID) == LIBFPTR_OK)
{
uint receiptType = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE);
uint count = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPTS_COUNT);
uint corrections = libfptr_get_param_int(fptr, LIBFPTR_PARAM_CORRECTIONS_COUNT);
}
libfptr_set_param_str(fptr, LIBFPTR_PARAM_RECORDS_ID, recordsID.c_str());
libfptr_end_read_records(fptr);
// Вспомогательная функция чтения следующей записи
int readNextRecord(IFptr &fptr, const std::wstring &recordsID)
{
fptr.setParam(LIBFPTR_PARAM_RECORDS_ID, recordsID);
return fptr.readNextRecord();
}
fptr.setParam(LIBFPTR_PARAM_RECORDS_TYPE, LIBFPTR_RT_FN_QUANTITY_COUNTERS);
fptr.setParam(LIBFPTR_PARAM_FN_COUNTERS_TYPE, LIBFPTR_FNCT_SHIFT);
fptr.beginReadRecords();
std::wstring recordsID = fptr.getParamString(LIBFPTR_PARAM_RECORDS_ID);
uint shiftNumber = fptr.getParamInt(LIBFPTR_PARAM_SHIFT_NUMBER);
uint countAll = fptr.getParamInt(LIBFPTR_PARAM_RECEIPTS_COUNT);
while (readNextRecord(fptr, recordsID) == LIBFPTR_OK)
{
uint receiptType = fptr.getParamInt(LIBFPTR_PARAM_RECEIPT_TYPE);
uint count = fptr.getParamInt(LIBFPTR_PARAM_RECEIPTS_COUNT);
uint corrections = fptr.getParamInt(LIBFPTR_PARAM_CORRECTIONS_COUNT);
}
fptr.setParam(LIBFPTR_PARAM_RECORDS_ID, recordsID);
fptr.endReadRecords();
// Вспомогательная функция чтения следующей записи
int readNextRecord(IFptr fptr, String recordsID) {
fptr.setParam(IFptr.LIBFPTR_PARAM_RECORDS_ID, recordsID);
return fptr.readNextRecord();
}
fptr.setParam(IFptr.LIBFPTR_PARAM_RECORDS_TYPE, IFptr.LIBFPTR_RT_FN_QUANTITY_COUNTERS);
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_COUNTERS_TYPE, IFptr.LIBFPTR_FNCT_SHIFT);
fptr.beginReadRecords();
String recordsID = fptr.getParamString(IFptr.LIBFPTR_PARAM_RECORDS_ID);
long shiftNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SHIFT_NUMBER);
long countAll = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPTS_COUNT);
while (readNextRecord(fptr, recordsID) == IFptr.LIBFPTR_OK) {
long receiptType = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE);
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPTS_COUNT);
long corrections = fptr.getParamInt(IFptr.LIBFPTR_PARAM_CORRECTIONS_COUNT);
}
fptr.setParam(IFptr.LIBFPTR_PARAM_RECORDS_ID, recordsID);
fptr.endReadRecords();
Для чтения счетчиков количеств операций ФН необходимо вызвать метод beginReadRecords() с типом данных LIBFPTR_PARAM_RECORDS_TYPE равным LIBFPTR_RT_FN_QUANTITY_COUNTERS. В параметре LIBFPTR_PARAM_FN_COUNTERS_TYPE нужно указать тип счетчиков.
Выходным параметрами будут следующие значения:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_SHIFT_NUMBER | Номер смены | int |
LIBFPTR_PARAM_RECEIPTS_COUNT | Общее количество чеков (включая коррекции) | int |
Каждый успешный вызов метода readNextRecord() заполняет следующие параметры:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_RECEIPT_TYPE | Тип расчета | int |
LIBFPTR_PARAM_RECEIPTS_COUNT | Общее количество чеков (включая коррекции) | int |
LIBFPTR_PARAM_CORRECTIONS_COUNT | Количество коррекций | int |
Тип расчета (LIBFPTR_PARAM_RECEIPT_TYPE) может принимать следующие значения:
- LIBFPTR_RT_SELL - чек прихода (продажи);
- LIBFPTR_RT_SELL_RETURN - чек возврата прихода (продажи);
- LIBFPTR_RT_BUY - чек расхода (покупки);
- LIBFPTR_RT_BUY_RETURN - чек возврата расхода (покупки).
Тип счетчиков ФН (LIBFPTR_PARAM_FN_COUNTERS_TYPE) может принимать следующие значения:
- LIBFPTR_FNCT_SHIFT - сменные счетчики;
- LIBFPTR_FNCT_NON_NULLABLE - необнуляемые счетчики.
Счетчики итогов непереданных документов
Чтение счетчиков итогов непереданных документов ФН
// Вспомогательная функция для чтения строковых параметров
std::wstring readStringAttribute(libfptr_handle fptr, int paramNumber) {
std::vector<wchar_t> str(32);
int size = libfptr_get_param_str(fptr, paramNumber, &str[0], str.size());
if (size > str.size()) {
str.resize(size);
libfptr_get_param_str(fptr, paramNumber, &str[0], str.size());
}
return std::wstring(&str[0]);
}
// Вспомогательная функция чтения следующей записи
int readNextRecord(libfptr_handle fptr, const std::wstring &recordsID) {
libfptr_set_param_str(fptr, LIBFPTR_PARAM_RECORDS_ID, recordsID.c_str());
return libfptr_read_next_record(fptr);
}
libfptr_set_param_int(fptr, LIBFPTR_PARAM_RECORDS_TYPE, LIBFPTR_RT_FN_UNSENT_DOCS_COUNTERS);
libfptr_begin_read_records(handle);
std::wstring recordsID = readStringAttribute(fptr, LIBFPTR_PARAM_RECORDS_ID);
uint countAll = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPTS_COUNT);
while (readNextRecord(fptr, recordsID) == LIBFPTR_OK)
{
uint receiptType = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPT_TYPE);
uint count = libfptr_get_param_int(fptr, LIBFPTR_PARAM_RECEIPTS_COUNT);
double sum = libfptr_get_param_double(fptr, LIBFPTR_PARAM_RECEIPTS_SUM);
}
libfptr_set_param_str(fptr, LIBFPTR_PARAM_RECORDS_ID, recordsID.c_str());
libfptr_end_read_records(fptr);
// Вспомогательная функция чтения следующей записи
int readNextRecord(IFptr &fptr, const std::wstring &recordsID)
{
fptr.setParam(LIBFPTR_PARAM_RECORDS_ID, recordsID);
return fptr.readNextRecord();
}
fptr.setParam(LIBFPTR_PARAM_RECORDS_TYPE, LIBFPTR_RT_FN_UNSENT_DOCS_COUNTERS);
fptr.beginReadRecords();
std::wstring recordsID = fptr.getParamString(LIBFPTR_PARAM_RECORDS_ID);
uint countAll = fptr.getParamInt(LIBFPTR_PARAM_RECEIPTS_COUNT);
while (readNextRecord(fptr, recordsID) == LIBFPTR_OK)
{
uint receiptType = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE);
uint count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPTS_COUNT);
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_RECEIPTS_SUM);
}
fptr.setParam(LIBFPTR_PARAM_RECORDS_ID, recordsID);
fptr.endReadRecords();
// Вспомогательная функция чтения следующей записи
int readNextRecord(IFptr fptr, String recordsID) {
fptr.setParam(IFptr.LIBFPTR_PARAM_RECORDS_ID, recordsID);
return fptr.readNextRecord();
}
fptr.setParam(IFptr.LIBFPTR_PARAM_RECORDS_TYPE, IFptr.LIBFPTR_RT_FN_UNSENT_DOCS_COUNTERS);
fptr.beginReadRecords();
String recordsID = fptr.getParamString(IFptr.LIBFPTR_PARAM_RECORDS_ID);
long countAll = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPTS_COUNT);
while (readNextRecord(fptr, recordsID) == IFptr.LIBFPTR_OK) {
long receiptType = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE);
long count = fptr.getParamInt(IFptr.LIBFPTR_PARAM_RECEIPTS_COUNT);
double sum = fptr.getParamDouble(IFptr.LIBFPTR_PARAM_RECEIPTS_SUM);
}
fptr.setParam(IFptr.LIBFPTR_PARAM_RECORDS_ID, recordsID);
fptr.endReadRecords();
Для чтения счетчиков количеств операций ФН необходимо вызвать метод beginReadRecords() с типом данных LIBFPTR_PARAM_RECORDS_TYPE равным LIBFPTR_RT_FN_UNSENT_DOCS_COUNTERS.
Выходным параметрами будут следующие значения:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_RECEIPTS_COUNT | Общее количество чеков (включая коррекции) | int |
Каждый успешный вызов метода readNextRecord() заполняет следующие параметры:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_RECEIPT_TYPE | Тип расчета | int |
LIBFPTR_PARAM_RECEIPTS_COUNT | Общее количество чеков (включая коррекции) | int |
LIBFPTR_PARAM_RECEIPTS_SUM | Итоговая сумма чеков (включая коррекции) | double |
Тип расчета (LIBFPTR_PARAM_RECEIPT_TYPE) может принимать следующие значения:
- LIBFPTR_RT_SELL - чек прихода (продажи);
- LIBFPTR_RT_SELL_RETURN - чек возврата прихода (продажи);
- LIBFPTR_RT_BUY - чек расхода (покупки);
- LIBFPTR_RT_BUY_RETURN - чек возврата расхода (покупки).
Регистрация ККТ
Регистрация ККТ
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_OPERATION_TYPE, LIBFPTR_FNOP_REGISTRATION);
libfptr_set_param_str(fptr, 1060, L"www.nalog.ru");
libfptr_set_param_str(fptr, 1009, L"Улица свободы, 42");
libfptr_set_param_str(fptr, 1018, L"135792468001");
libfptr_set_param_str(fptr, 1048, L"Иванов Иван Иванович");
libfptr_set_param_int(fptr, 1062, LIBFPTR_TT_OSN | LIBFPTR_TT_PATENT);
libfptr_set_param_str(fptr, 1117, L"my-company@mail.ru");
libfptr_set_param_str(fptr, 1187, L"Улица свободы, 45");
libfptr_set_param_str(fptr, 1037, L"12345678900987654321");
libfptr_set_param_int(fptr, 1209, LIBFPTR_FFD_1_0_5);
libfptr_set_param_bool(fptr, 1001, false);
libfptr_set_param_str(fptr, 1036, L"513");
libfptr_set_param_bool(fptr, 1002, false);
libfptr_set_param_bool(fptr, 1056, false);
libfptr_set_param_bool(fptr, 1108, false);
libfptr_set_param_bool(fptr, 1109, false);
libfptr_set_param_bool(fptr, 1110, false);
libfptr_set_param_bool(fptr, 1126, false);
libfptr_set_param_bool(fptr, 1193, true);
libfptr_set_param_bool(fptr, 1207, false);
libfptr_set_param_bool(fptr, 1221, false);
libfptr_set_param_str(fptr, 1017, L"9715260691");
libfptr_set_param_str(fptr, 1046, L"ООО \"Эвотор ОФД\"");
libfptr_fn_operation(fptr);
fptr.setParam(LIBFPTR_PARAM_FN_OPERATION_TYPE, LIBFPTR_FNOP_REGISTRATION);
fptr.setParam(1060, L"www.nalog.ru");
fptr.setParam(1009, L"Улица свободы, 42");
fptr.setParam(1018, L"135792468001");
fptr.setParam(1048, L"Иванов Иван Иванович");
fptr.setParam(1062, LIBFPTR_TT_OSN | LIBFPTR_TT_PATENT);
fptr.setParam(1117, L"my-company@mail.ru");
fptr.setParam(1187, L"Улица свободы, 45");
fptr.setParam(1037, L"12345678900987654321");
fptr.setParam(1209, LIBFPTR_FFD_1_0_5);
fptr.setParam(1001, false);
fptr.setParam(1036, L"513");
fptr.setParam(1002, false);
fptr.setParam(1056, false);
fptr.setParam(1108, false);
fptr.setParam(1109, false);
fptr.setParam(1110, false);
fptr.setParam(1126, false);
fptr.setParam(1193, true);
fptr.setParam(1207, false);
fptr.setParam(1221, false);
fptr.setParam(1017, L"12345678910");
fptr.setParam(1046, L"ООО \"ОФД\"");
fptr.fnOperation();
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_OPERATION_TYPE, IFptr.LIBFPTR_FNOP_REGISTRATION);
fptr.setParam(1060, "www.nalog.gov.ru");
fptr.setParam(1009, "Улица свободы, 42");
fptr.setParam(1018, "135792468001");
fptr.setParam(1048, "Иванов Иван Иванович");
fptr.setParam(1062, IFptr.LIBFPTR_TT_OSN | IFptr.LIBFPTR_TT_PATENT);
fptr.setParam(1117, "my-company@mail.ru");
fptr.setParam(1187, "Улица свободы, 45");
fptr.setParam(1037, "12345678900987654321");
fptr.setParam(1209, IFptr.LIBFPTR_FFD_1_0_5);
fptr.setParam(1001, false);
fptr.setParam(1036, "513");
fptr.setParam(1002, false);
fptr.setParam(1056, false);
fptr.setParam(1108, false);
fptr.setParam(1109, false);
fptr.setParam(1110, false);
fptr.setParam(1126, false);
fptr.setParam(1193, true);
fptr.setParam(1207, false);
fptr.setParam(1221, false);
fptr.setParam(1017, "9715260691");
fptr.setParam(1046, "ООО \"Эвотор ОФД\"");
fptr.fnOperation()
Для регистрации ККТ необходимо вызвать метод fnOperation() с типом операции LIBFPTR_PARAM_FN_OPERATION_TYPE равным LIBFPTR_FNOP_REGISTRATION. Также необходимо указать параметры регистрации:
Параметр | Описание | Тип |
---|---|---|
1060 | Адрес сайта ФНС | string |
1009 | Адрес расчетов | string |
1018 | ИНН организации | string |
1048 | Название организации | string |
1062 | Системы налогообложения | int |
1117 | E-mail организации | string |
1187 | Адрес места расчетов | string |
1037 | Регистрационный номер устройства | string |
1209 | Версия ФФД | int |
1001 | Признак автоматического режима | bool |
1036 | Номер автомата | string |
1002 | Признак автономного режима | bool |
1056 | Признак шифрования | bool |
1108 | Признак ККТ для расчетов в сети Интернет | bool |
1109 | Признак расчетов за услуги | bool |
1110 | Признак АС БСО | bool |
1126 | Признак проведения лотерей | bool |
1193 | Признак проведения азартных игр | bool |
1207 | Признак подакцизного товара | bool |
1221 | Признак установки в автомате | bool |
LIBFPTR_PARAM_PAWN_SHOP_ACTIVITY | Признак осуществления ломбардной деятельности | bool |
LIBFPTR_PARAM_INSURANCE_ACTIVITY | Признак осуществления страховой деятельности | bool |
LIBFPTR_PARAM_TRADE_MARKED_PRODUCTS | Признак торговли маркированными товарами | bool |
1017 | ИНН ОФД | string |
1046 | Название ОФД | string |
Значение реквизита 1062 (системы налогообложения) - битовое поле, значениями которого являются одно или несколько из следующих значений:
- LIBFPTR_TT_OSN - общая;
- LIBFPTR_TT_USN_INCOME - упрощенная доход;
- LIBFPTR_TT_USN_INCOME_OUTCOME - упрощенная доход минус расход;
- LIBFPTR_TT_ESN - единый сельскохозяйственный доход;
- LIBFPTR_TT_PATENT - патентная система налогообложения.
Реквизит 1209 (версия ФФД) может принимать следующие значения:
- LIBFPTR_FFD_UNKNOWN - неизвестная;
- LIBFPTR_FFD_1_2 - ФФД 1.2.
Перерегистрация ККТ
Для перерегистрации ККТ необходимо вызвать метод fnOperation() с типом операции LIBFPTR_PARAM_FN_OPERATION_TYPE равным LIBFPTR_FNOP_CHANGE_PARAMETERS. Список параметров перерегистрации приведен в разделе Регистрация ККТ.
Требуется указать причины перерегистрации в реквизите 1205 (битовое поле), который может принимать следующие значения:
- 0x00000001 - замена фискального накопителя;
- 0x00000002 - замена оператора фискальных данных;
- 0x00000004 - изменение наименования пользователя ККТ;
- 0x00000008 - изменение адреса и (или) места установки (применения) ККТ;
- 0x00000010 - перевод ККТ из автономного режима в режим передачи данных;
- 0x00000020 - перевод ККТ из режима передачи данных в автономный режим;
- 0x00000040 - изменение версии модели ККТ;
- 0x00000080 - изменение перечня систем налогообложения, применяемых при осуществлении расчетов;
- 0x00000100 - изменение номера автоматического устройства для расчетов, в составе которого применяется ККТ;
- 0x00000200 - перевод ККТ из автоматического режима в неавтоматический режим (осуществление расчетов кассиром);
- 0x00000400 - перевод ККТ из неавтоматического режима (осуществление расчетов кассиром) в автоматический режим;
- 0x00000800 - перевод ККТ из режима, не позволяющего формировать БСО, в режим, позволяющий формировать БСО;
- 0x00001000 - перевод ККТ из режима, позволяющего формировать БСО, в режим, не позволяющий формировать БСО;
- 0x00002000 - перевод ККТ из режима расчетов в сети Интернет (позволяющего не печатать кассовый чек и БСО) в режим, позволяющий печатать кассовый чек и БСО;
- 0x00004000 - перевод ККТ из режима, позволяющего печатать кассовый чек и БСО, в режим расчетов в сети Интернет (позволяющего не печатать кассовый чек и БСО);
- 0x00008000 - перевод ККТ из режима, позволяющего оказывать услуги платежного агента (субагента) или банковского платежного агента, в режим, не позволяющий оказывать услуги платежного агента (субагента) или банковского платежного агента;
- 0x00010000 - перевод ККТ из режима, не позволяющего оказывать услуги платежного агента (субагента) или банковского платежного агента в режим, позволяющий оказывать услуги платежного агента (субагента) или банковского платежного агента;
- 0x00020000 - перевод ККТ из режима, позволяющего применять ККТ при приеме ставок и выплате денежных средств виде выигрыша при осуществлении деятельности по проведению азартных игр, в режим, не позволяющий применять ККТ при приеме ставок и выплате денежных средств в виде выигрыша при осуществлении деятельности по проведению азартных игр;
- 0x00040000 - перевод ККТ из режима, не позволяющего применять ККТ при приеме ставок и выплате денежных средств в виде выигрыша при осуществлении деятельности по проведению азартных игр, в режим, позволяющий применять ККТ при приеме ставок и выплате денежных средств в виде выигрыша при осуществлении деятельности по проведению азартных игр;
- 0x00080000 - перевод ККТ из режима, позволяющего применять ККТ при приеме денежных средств при реализации лотерейных билетов, электронных лотерейных билетов, приеме лотерейных ставок и выплате денежных средств в виде выигрыша при осуществлении деятельности по проведению лотерей, в режим, не позволяющий применять ККТ при приеме денежных средств при реализации лотерейных билетов, электронных лотерейных билетов, приеме лотерейных ставок и выплате денежных средств в виде выигрыша при осуществлении деятельности по проведению лотерей;
- 0x00100000 - перевод ККТ из режима, не позволяющего применять ККТ при приеме денежных средств при реализации лотерейных билетов, электронных лотерейных билетов, приеме лотерейных ставок и выплате денежных средств в виде выигрыша при осуществлении деятельности по проведению лотерей, в режим, позволяющий применять ККТ при приеме денежных средств при реализации лотерейных билетов, электронных лотерейных билетов, приеме лотерейных ставок и выплате денежных средств в виде выигрыша при осуществлении деятельности по проведению лотерей;
- 0x00200000 - изменение версии ФФД;
- 0x80000000 - иные причины.
На некоторых ККТ возможно отключить печать отчета о перерегистрации ККТ с помощью установки параметра LIBFPTR_PARAM_REPORT_ELECTRONICALLY в true. Если ККТ не поддерживает такой функционал, параметр будет проигнорирован и отчет будет напечатан.
Замена ФН
Для регистрации замены ФН необходимо вызвать метод fnOperation() с типом операции LIBFPTR_PARAM_FN_OPERATION_TYPE равным LIBFPTR_FNOP_CHANGE_FN. Список параметров перерегистрации приведен в разделе Регистрация ККТ.
В случае работы по ФФД ≥ 1.1 требуется указать причины перерегистрации в реквизите 1205 (битовое поле). Список возможных значений приведен в разделе Перерегистрация ККТ.
На некоторых ККТ возможно отключить печать отчета о регистрации замены ФН с помощью установки параметра LIBFPTR_PARAM_REPORT_ELECTRONICALLY в true. Если ККТ не поддерживает такой функционал, параметр будет проигнорирован и отчет будет напечатан.
Закрытие ФН
Закрытие ФН
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_OPERATION_TYPE, LIBFPTR_FNOP_CLOSE_ARCHIVE);
libfptr_fn_operation(fptr);
fptr.setParam(LIBFPTR_PARAM_FN_OPERATION_TYPE, LIBFPTR_FNOP_CLOSE_ARCHIVE);
fptr.fnOperation();
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_OPERATION_TYPE, IFptr.LIBFPTR_FNOP_CLOSE_ARCHIVE);
fptr.fnOperation();
Для закрытия ФН необходимо вызвать метод fnOperation() с типом операции LIBFPTR_PARAM_FN_OPERATION_TYPE равным LIBFPTR_FNOP_CLOSE_ARCHIVE.
Нефискальная печать
Печать клише
Печать клише
libfptr_print_cliche(fptr);
fptr.printCliche();
fptr.printCliche();
Для печати запрограммированного в ККТ клише необходимо вызвать метод printCliche().
Клише автоматически печатается при закрытии всех документов (и фискальных, и нефискальных).
Печать текста
Печать строки
libfptr_set_param_str(fptr, LIBFPTR_PARAM_TEXT, L"Строка");
libfptr_print_text(fptr);
fptr.setParam(LIBFPTR_PARAM_TEXT, L"Строка");
fptr.printText();
fptr.setParam(IFptr.LIBFPTR_PARAM_TEXT, "Строка");
fptr.printText();
Печать строки с выравниванием по центру
libfptr_set_param_str(fptr, LIBFPTR_PARAM_TEXT, L"Строка");
libfptr_set_param_int(fptr, LIBFPTR_PARAM_ALIGNMENT, LIBFPTR_ALIGNMENT_CENTER);
libfptr_print_text(fptr);
fptr.setParam(LIBFPTR_PARAM_TEXT, L"Строка");
fptr.setParam(LIBFPTR_PARAM_ALIGNMENT, LIBFPTR_ALIGNMENT_CENTER);
fptr.printText();
fptr.setParam(IFptr.LIBFPTR_PARAM_TEXT, "Строка");
fptr.setParam(IFptr.LIBFPTR_PARAM_ALIGNMENT, IFptr.LIBFPTR_ALIGNMENT_CENTER);
fptr.printText();
Для печати строки необходимо вызвать метод printText() и задать следующие параметры:
Параметр | Описание | Тип | Значение по умолчанию |
---|---|---|---|
LIBFPTR_PARAM_TEXT | Строка для печати | string | Пустая строка |
LIBFPTR_PARAM_ALIGNMENT | Выравнивание | int | LIBFPTR_ALIGNMENT_LEFT |
LIBFPTR_PARAM_FONT | Номер шрифта | int | Стандартный для ККТ шрифт |
LIBFPTR_PARAM_FONT_DOUBLE_WIDTH | Двойная ширина | bool | false |
LIBFPTR_PARAM_FONT_DOUBLE_HEIGHT | Двойная высота | bool | false |
LIBFPTR_PARAM_LINESPACING | Межстрочный интервал | int | Стандартный для ККТ интервал |
Выравнивание LIBFPTR_PARAM_ALIGNMENT может принимать следующие значения:
- LIBFPTR_ALIGNMENT_LEFT - по левому краю;
- LIBFPTR_ALIGNMENT_CENTER - по центру;
- LIBFPTR_ALIGNMENT_RIGHT - по правому краю.
Печать штрихкода
Печать штрихкода
libfptr_set_param_str(fptr, LIBFPTR_PARAM_BARCODE, L"123456789012");
libfptr_set_param_int(fptr, LIBFPTR_PARAM_BARCODE_TYPE, LIBFPTR_BT_EAN_13);
libfptr_print_barcode(fptr);
fptr.setParam(LIBFPTR_PARAM_BARCODE, L"123456789012");
fptr.setParam(LIBFPTR_PARAM_BARCODE_TYPE, LIBFPTR_BT_EAN_13);
fptr.printBarcode();
fptr.setParam(IFptr.LIBFPTR_PARAM_BARCODE, "123456789012");
fptr.setParam(IFptr.LIBFPTR_PARAM_BARCODE_TYPE, IFptr.LIBFPTR_BT_EAN_13);
fptr.printBarcode();
Для печати штрихкода необходимо вызвать метод printBarcode() и задать следующие обязательные параметры:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_BARCODE | Данные штрихкода | string |
LIBFPTR_PARAM_BARCODE_TYPE | Тип штрихкода | int |
Тип штрихкода LIBFPTR_PARAM_BARCODE_TYPE может принимать следующие значения:
Одномерные штрихкоды:
- LIBFPTR_BT_EAN_13 - EAN-13.
Двумерные штрихкоды:
- LIBFPTR_BT_QR - QR-код.
Также можно изменить параметры печати штрихкода с помощью следующих параметров:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_ALIGNMENT | Выравнивание штрихкода | int |
LIBFPTR_PARAM_SCALE | Коэффициент увеличения штрихкода | int |
LIBFPTR_PARAM_LEFT_MARGIN | Дополнительный отступ слева | int |
Выравнивание LIBFPTR_PARAM_ALIGNMENT может принимать следующие значения:
- LIBFPTR_ALIGNMENT_LEFT - по левому краю;
- LIBFPTR_ALIGNMENT_CENTER - по центру;
- LIBFPTR_ALIGNMENT_RIGHT - по правому краю.
Для одномерных штрихкодов дополнительно можно задать следующие параметры:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_BARCODE_PRINT_TEXT | Флаг печати данных ШК | bool |
Для QR-кода дополнительно можно задать следующие параметры:
Параметр | Описание | Тип |
---|---|---|
LIBFPTR_PARAM_BARCODE_CORRECTION | Коррекция QR-кода | int |
LIBFPTR_PARAM_BARCODE_VERSION | Версия QR-кода | int |
Коррекция штрихкода LIBFPTR_PARAM_BARCODE_CORRECTION может принимать следующие значения:
- LIBFPTR_BC_DEFAULT - по умолчанию;
- LIBFPTR_BC_0 - L(7%);
- LIBFPTR_BC_1 - M(15%);
- LIBFPTR_BC_2 - Q(25%);
- LIBFPTR_BC_3 - H(30%).
Печать картинки
Печать картинки
libfptr_set_param_str(fptr, LIBFPTR_PARAM_FILENAME, L"C:\\picture.png");
libfptr_print_picture(fptr);
fptr.setParam(LIBFPTR_PARAM_FILENAME