В прикрепленном файле пример работы Казначей ФА с использованием готовых библиотек Python, входящих в ДТО 9.11.
Базовые функции, которые понадобились при работе
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
import dto9fptr
import os
import time
DTO_LIB_NAME = "/opt/ATOL/drivers9/bin/libfptr.so"
class Atol:
def __init__(self):
# Create ATOL KKM
self.dto = dto9fptr.Fptr(DTO_LIB_NAME, -1)
self.dto.put_DeviceSingleSetting('Model', 76)
self.dto.put_DeviceSingleSetting('Protocol', 2)
# Port USB ATOL
self.dto.put_DeviceSingleSetting('Port', "USB")
self.dto.put_DeviceSingleSetting('Vid', 0x2912)
self.dto.put_DeviceSingleSetting('Pid', 0x0005)
self.dto.put_DeviceSingleSetting('SearchDir', os.path.dirname(DTO_LIB_NAME))
self.dto.ApplySingleSettings()
self.dto.put_DeviceEnabled(True)
def openCheck(self, checktype):
self.dto.put_Mode(1)
if self.dto.SetMode()[0] < 0:
logging.error('(ATOL)Open check. Can not set registration mode %s',
self.dto.SetMode()[0])
logging.info('(ATOL)Cancel check')
self.dto.CancelCheck()
time.sleep(2)
self.dto.SetMode()
self.dto.put_CheckType(checktype)
# Switch off test mode
self.dto.put_TestMode(0)
# PrintCheck - Check creation mode
# 0 - Electronic form
# 1 - Print check
self.dto.put_PrintCheck(1)
self.dto.OpenCheck()
def closeCheck(self, typeclose):
self.dto.put_TypeClose(typeclose)
self.dto.CloseCheck()
def printText(self, text, alignment, wrap):
self.dto.put_Caption(text)
self.dto.put_TextWrap(wrap)
self.dto.put_Alignment(alignment)
self.dto.PrintString()
def reportZ(self):
"""Close shift"""
logging.info('(ATOL)ReportZ creating...')
# ModeReportClear = 3
# ReportZ = 1
self.dto.put_Mode(3)
self.dto.SetMode()
self.dto.put_ReportType(1)
self.dto.Report()
def printFiscalCheck(self, checktype, summ, post, wash_dict):
# Open check
# self.openCheck(checktype)
# print("Mode Registration")
self.dto.put_Mode(1)
set_result = self.dto.SetMode()[0]
print(set_result)
if set_result < 0:
if set_result == -3822:
logging.error('(ATOL)Shift overdue 24 hours. Closing shift...')
self.reportZ()
set_result = self.dto.SetMode()
self.dto.put_Mode(1)
set_result = self.dto.SetMode()
# Cancel check if it was opened in occasion
# print("Cancel Check")
self.dto.CancelCheck()
# print("Open Check")
self.dto.put_CheckType(1)
self.dto.put_TestMode(0)
self.dto.put_PrintCheck(1)
self.dto.OpenCheck()
# Имя кассира
self.dto.put_FiscalPropertyNumber(1021)
self.dto.put_FiscalPropertyPrint(1)
self.dto.put_FiscalPropertyType(5)
self.dto.put_FiscalPropertyValue(u'Старший кассир')
self.dto.WriteFiscalProperty()
# Применяемая система налогооблажения в чеке:
# ОСН - 1
# УСН доход - 2
# УСН доход-расход - 4
# ЕНВД - 8
# ЕСН - 16
# ПСН - 32
self.dto.put_FiscalPropertyNumber(1055)
self.dto.put_FiscalPropertyValue(8)
self.dto.put_FiscalPropertyType(1)
self.dto.WriteFiscalProperty()
# TaxTypeNumber - Номер налога:
# 0 - Налог из секции
# 1 - НДС 0%
# 2 - НДС 10%
# 3 - НДС 18%
# 4 - НДС не облагается
# 5 - НДС с расчётной ставкой 10%
# 6 - НДС с расчётной ставкой 18%
self.dto.put_TaxNumber(4)
# print("Registration")
if post == 99:
self.dto.put_Name(u'Пополнение карты')
else:
self.dto.put_Name(u'Мойка автомобиля на посту ' + str(post))
self.dto.put_Price(summ)
self.dto.put_Quantity(1.000)
self.dto.put_PositionSum(summ)
self.dto.put_Summ(0.00000)
self.dto.put_Department(0)
self.dto.Registration()
# print("Payment")
self.dto.put_TypeClose(0)
self.dto.put_Summ(summ)
self.dto.Payment()
print("Close Check")
self.dto.CloseCheck()
def beep(self):
self.dto.Beep()
p.s. Если нужно будет помочь, обращайтесь
Во спасибо тебе добрый человек... а то у меня по усб напрямую не пошло без searchDir
Базовые функции, которые понадобились при работе
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
import dto9fptr
import os
import time
....
Здравствуйте! А есть ли такой пример для 10 версии драйвера? А то данный пример не совместим с 10 версией.
И еще пара вопросов:
1) Какой workflow для терминала пополнения мобильного телефона? У нас нет кассира, как в данном примере.
2) Есть ли какой-нибудь тестовый режим, для тестирования без фискального накопителя?
Здравствуйте! А есть ли такой пример для 10 версии драйвера? А то данный пример не совместим с 10 версией.
Примеры для работы, а так же описание методов используемых в работе 10го Драйвера находятся в папке "DOCS".
1) Какой workflow для терминала пополнения мобильного телефона? У нас нет кассира, как в данном примере.
Открыть чек, регистрация позиции, закрыть чек. Работа кассира не предусмотрена для данной модели ККТ.
2) Есть ли какой-нибудь тестовый режим, для тестирования без фискального накопителя?
Нет, такого режима не предусмотрено, для тестирования отдельно приобретается МГМ (массогабаритный макет ФН), который полностью имитирует работу ФН.
Здравствуйте! А есть ли такой пример для 10 версии драйвера? А то данный пример не совместим с 10 версией.
И еще пара вопросов:
1) Какой workflow для терминала пополнения мобильного телефона? У нас нет кассира, как в данном примере.
2) Есть ли какой-нибудь тестовый режим, для тестирования без фискального накопителя?
Данный пример нельзя использовать в 10й версии драйвера - в основном поменялись регистры имен методов и немного логика работы и 1к1 драйвера не совместимы. Его пришлось с оглядкой на образец переписать под задачу.
ККТ осуществляет операции от имени ответственного лица - можно писать Администратор, старший кассир, иное - по штатному расписанию и форме собственности, инн сотрудника (по api) указывать не обязательно.
Минимальный workflow - коннект, логин, внесение в чек продажной позиции, закрытие чека - печать, закрытие соединения.
+закрытие смены - по расписанию в устройстве либо вручную.
тестировать без фискальника как написали - нельзя, с фискальником можно делать проводки и тут же, не закрывая смену - чеки возврата, как терпимая замена тесту с МГМ.
Коллеги, добрый день.
Пытаемся корректно печатать нефискальные чеки. Процедуры выглядят следующим образом:
def printNonFiscalCheckMultiline(self, lines):
self.printStart()
# Body
for i in range(len(lines)):
self.printLine(lines, Atol.TextWrapWord, Atol.AlignmentLeft)
self.printLine(' ', Atol.TextWrapNone, Atol.AlignmentCenter)
self.printEnd()
def printEnd(self):
# Footer
self.dto.PrintFooter()
self.dto.FullCut()
def printStart(self):
self.dto.put_Mode(Atol.MOD_REP_NO_DUMPING)
self.dto.SetMode()
При этом сначала печатается фискальный чек, затем выводятся данные на нефискальный чек.
Перед фискальным чеком при этом выскакивает пустой чек. Подскажите, возможно некорректно осуществляется перевод в режим, или вообще не нужно делать переход в режим печати без гашения? или после печати возвращать в режим регистрации.
Спасибо!
(https://i.ibb.co/Ldmgym2/Selection-008.png) (https://ibb.co/Ldmgym2)