-
Notifications
You must be signed in to change notification settings - Fork 17
Home
Можно работать через 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();
printer.printXReport()
.
Как открыть/закрыть смену, напечатать чек прихода/расхода и их возвратов, напечатать чек коррекции и сформировать отчет о текущем состоянии расчетов
Вот пример кода демонстрирующий формирование вышеперечисленных документов в соответствии с ФФД 1.05.
FSStatusInfo fsStatus = printer.fsReadStatus();
if(fsStatus.getDocType().getValue() != FSDocType.FS_DOCTYPE_NONE)
printer.fsCancelDocument(); // отменяем
Для печати дубликата чека есть несколько способов:
- Печать дубликата последнего только чека
void printDuplicateReceipt()
- Использовать СКЛ.
Для ее включения в 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)
- Чтение из ФН документов в виде 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);
Драйвер логирует свои действия опираясь на 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();