Базовые функции, которые понадобились при работе
#!/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(
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. Если нужно будет помочь, обращайтесь