Примеры работы с использованием готовых библиотек Python

Автор Тех.Поддержка, июн 27, 2017, 21:40

« предыдущая тема - следующая тема »
Вниз

Тех.Поддержка

июн 27, 2017, 21:40 Последнее редактирование: окт 24, 2017, 15:45 от Тех.Поддержка
В прикрепленном файле пример работы Казначей ФА с использованием готовых библиотек Python, входящих в ДТО 9.11.

zhitkov.denis

#1
июл 06, 2017, 22:44 Последнее редактирование: сен 19, 2018, 13:00 от Тех.Поддержка
Базовые функции, которые понадобились при работе

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

zms2003

Во спасибо тебе добрый человек... а то у меня по усб напрямую не пошло без searchDir

jakofe@mailhex.com

Базовые функции, которые понадобились при работе

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
import dto9fptr
import os
import time

....
Здравствуйте! А есть ли такой пример для 10 версии драйвера? А то данный пример не совместим с 10 версией.

И еще пара вопросов:
1) Какой workflow для терминала пополнения мобильного телефона? У нас нет кассира, как в данном примере.
2) Есть ли какой-нибудь тестовый режим, для тестирования без фискального накопителя?

SMVas

Цитировать
Здравствуйте! А есть ли такой пример для 10 версии драйвера? А то данный пример не совместим с 10 версией.
Примеры для работы, а так же описание методов используемых в работе 10го Драйвера находятся в папке "DOCS".
Цитировать
1) Какой workflow для терминала пополнения мобильного телефона? У нас нет кассира, как в данном примере.
Открыть чек, регистрация позиции, закрыть чек. Работа кассира не предусмотрена для данной модели ККТ.
Цитировать
2) Есть ли какой-нибудь тестовый режим, для тестирования без фискального накопителя?
Нет, такого режима не предусмотрено, для тестирования отдельно приобретается МГМ (массогабаритный макет ФН), который полностью имитирует работу ФН.

lefedor

Здравствуйте! А есть ли такой пример для 10 версии драйвера? А то данный пример не совместим с 10 версией.

И еще пара вопросов:
1) Какой workflow для терминала пополнения мобильного телефона? У нас нет кассира, как в данном примере.
2) Есть ли какой-нибудь тестовый режим, для тестирования без фискального накопителя?
Данный пример нельзя использовать в 10й версии драйвера - в основном поменялись регистры имен методов и немного логика работы и 1к1 драйвера не совместимы. Его пришлось с оглядкой на образец переписать под задачу.

ККТ осуществляет операции от имени ответственного лица - можно писать Администратор, старший кассир, иное - по штатному расписанию и форме собственности, инн сотрудника (по api) указывать не обязательно.

Минимальный workflow - коннект, логин, внесение в чек продажной позиции, закрытие чека - печать, закрытие соединения.
+закрытие смены - по расписанию в устройстве либо вручную.

тестировать без фискальника как написали - нельзя, с фискальником можно делать проводки и тут же, не закрывая смену - чеки возврата, как  терпимая замена тесту с МГМ.

zhitkov.denis

Коллеги, добрый день.

Пытаемся корректно печатать нефискальные чеки. Процедуры выглядят следующим образом:

   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()

При этом сначала печатается фискальный чек, затем выводятся данные на нефискальный чек.
Перед фискальным чеком при этом выскакивает пустой чек. Подскажите, возможно некорректно осуществляется перевод в режим, или вообще не нужно делать переход в режим печати без гашения? или после печати возвращать в режим регистрации.

Спасибо!


Вверх