Skip to content
Pavel edited this page Apr 11, 2019 · 15 revisions

Добро пожаловать в Shtrih JavaPOS wiki!

Часто задаваемые вопросы

Как создать объект принтера

Можно работать через API предоставляемое JPOS, но драйвер содержит множество DIO-команд специфичных для устройств Штрих-М, поэтому рекомендуется использовать обертку поставляемую с драйвером: printer = new ShtrihFiscalPrinter(new FiscalPrinter());.

Для указания директории в которой будут храниться все файлы драйвера можно использовать метод: SysUtils.setFilesPath(String value);.

Как подключиться к устройству

Конфигурация устройства осуществляется через jpos.xml.
Приложение формирует файл jpos.xml, кладет его в файловую систему по определенному пути, указывает jpos путь к файлу, далее создается объект драйвер и производится подключение. Процедура формирования jpos.xml можно посмотреть в JposConfig.java. Подключение производится согласно стандарту JPOS:

// В open передаем имя устройства указанное в jpos.xml
printer.open("ShtrihFptr");
// 3000 в данном случае таймаут в миллисекундах, он игнорируется,
// таймаут настраивается свойством byteTimeout в jpos.xml
printer.claim(3000);
printer.setDeviceEnabled(true);

Как отключиться от устройства

printer.close();

Как напечатать X-отчет

printer.printXReport().

Как открыть/закрыть смену, напечатать чек прихода/расхода и их возвратов, напечатать чек коррекции и сформировать отчет о текущем состоянии расчетов

Вот пример кода демонстрирующий формирование вышеперечисленных документов в соответствии с ФФД 1.05.

Как отменить начатый чек коррекции/фискализацию/перефискализацию

FSStatusInfo fsStatus = printer.fsReadStatus();
if(fsStatus.getDocType().getValue() != FSDocType.FS_DOCTYPE_NONE)
    printer.fsCancelDocument(); // отменяем

Как напечатать дубликат чека

Для печати дубликата чека есть несколько способов:

  1. Печать дубликата последнего только чека void printDuplicateReceipt()
  2. Использовать СКЛ. Для ее включения в jpos.xml должно стоять <prop name="textReportEnabled" type="String" value="1"/>
/**
 * Печать СКЛ за текущую смену
 */
public void printJournalCurrentDay() 

/**
 * Печать СКЛ за указанную смену
 */
public void printJournalDayNumber(int dayNumber)

/**
 * Печать документа из СКЛ с указанным номером
 */
public void printJournalDocNumber(int docNumber)

/**
 * Печать документа из СКЛ с указанным номером
 */
public void printJournalDocRange(int docNumber1, int docNumber2)
  1. Чтение из ФН документов в виде TLV-структуры DocumentTLV fsReadDocumentTLV(int documentNumber). В этом случае разбор TLV и печать чека полностью ложится на клиента.

Как выполнить запрос на регистрацию и перерегистрацию ККТ?

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

Как произвести внесение/выплату наличных

Внесение

printer.setFiscalReceiptType(FPTR_RT_CASH_IN);
printer.beginFiscalReceipt(false);
printer.printRecCash(sum);
printer.printRecTotal(sum, sum, "0");
printer.endFiscalReceipt(false);

Выплата

printer.setFiscalReceiptType(FPTR_RT_CASH_OUT);
printer.beginFiscalReceipt(false);
printer.printRecCash(sum);
printer.printRecTotal(sum, sum, "0");
printer.endFiscalReceipt(false);

Как настроить логирование на Android

Драйвер логирует свои действия опираясь на slf4j, в виду этого приложение использующее драйвер может настроить вывод логов в необходимое место используя любую совместимую библиотеку для логирования. Пример конфигурации логирования в файл и logcat с использованием logback-android можно найти здесь.

Как узнать время открытия смены

Простого способа сделать это не существует, но используя специальные приемы его можно вычитать из ФН.

// 1. Читаем статус ФН и берем оттуда номер текущего документа
long currentDocumentNumber = printer.fsReadStatus().getDocNumber();

// 2. Читаем статус смены

// нет нормального метода для запроса статуса смены, поэтому так
FSReadDayParameters dayParameters = new FSReadDayParameters();
dayParameters.setSysPassword(printer.getSysPassword());
printer.fsReadDayParameters(dayParameters);

// если смена закрыта завершаем выполнение
if(dayParameters.getDayStatus() == 0) // смена закрыта
    return;

// если смена открыта, то берем оттуда количество документов в смене
long documentsInShift = dayParameters.getReceiptNumber();

// 3. Вычитаем из текущего номера количество документов в смене, получаем номер документа открытия
long shiftOpenDocumentNumber = currentDocumentNumber - documentsInShift;

// 4. Ищем в ФН документ(не читаем ТЛВ, это отдельный метод) по вышеполучнному номеру, в нем есть дата
FSDocumentInfo openShiftDocument = printer.fsFindDocument(shiftOpenDocumentNumber);

if(openShiftDocument.getDocumentType() != FSDocType.FS_DOCTYPE_DAYOPEN)
{
    // Что-то пошло не так и найденные документ не открытие смены, такого быть не должно
    return;
}

FSDateTime shiftOpenDate = openShiftDocument.getDateTime();