~inddiana/diana-addons/supply_control_update-gudanthony7

« back to all changes in this revision

Viewing changes to supply_control/utilidades/impresion/original/fiscales.py

  • Committer: Aryrosa Fuentes
  • Date: 2017-08-02 14:24:08 UTC
  • mfrom: (58.1.8 diana_adoons_branch)
  • mto: This revision was merged to the branch mainline in revision 59.
  • Revision ID: afuentes@industriasdiana.gob.ve-20170802142408-tabv0anafn81lv57
modificaciones sobre control_de_asignaciones

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: iso-8859-1 -*-
 
2
 
 
3
 #* OEOG Clase que permite enviar comandos a impresoras fiscales
 
4
 #*
 
5
 #*
 
6
 #* @version   Beta 1
 
7
 #* @author    Andres Hocevar
 
8
 #*
 
9
 #* @since     Agosto 10 del 2010
 
10
 #**/
 
11
 #/***************************************************************************
 
12
 #*
 
13
 #* Este programa es software libre: usted puede redistribuirlo y / o modificar
 
14
 #* bajo los t�rminos de la GNU General Public License publicada por
 
15
 #* la Free Software Foundation, bien de la versi�n 3 de la Licencia, o
 
16
 #* (A su elecci�n) cualquier versi�n posterior.
 
17
 #*
 
18
 #* Este programa se distribuye con la esperanza de que sea �til,
 
19
 #* pero SIN NINGUNA GARANT�A, incluso sin la garant�a impl�cita de
 
20
 #* COMERCIALIZACI�N o IDONEIDAD PARA UN PROP�SITO PARTICULAR. Ver la
 
21
 #* Licencia P�blica General GNU para m�s detalles.
 
22
 #*
 
23
 #* Deber�a haber recibido una copia de la GNU General Public License
 
24
 #* junto con este programa. Si no, v�ase <http://www.gnu.org/licenses/>.
 
25
 #*
 
26
 #***************************************************************************/
 
27
import serial
 
28
import operator
 
29
import sys
 
30
import time
 
31
import glob
 
32
 
 
33
class factfis:
 
34
  bandera=False
 
35
  mdepura=False
 
36
  puerto =None
 
37
  status =''
 
38
  error  =''
 
39
  envio  =''
 
40
  status =''
 
41
  error  =''
 
42
  ser = ''
 
43
  def __init__(self,p='auto'):
 
44
    if p=='auto':
 
45
      posibles=['COM0','COM1','COM2','COM3','COM4','COM5','COM6','COM7']+\
 
46
      glob.glob('/dev/ttyS*') + glob.glob('/dev/ttyUSB*')
 
47
      for self.puerto in posibles:
 
48
        if self.OpenFpctrl():
 
49
          if self.ManipulaCTS_RTS():
 
50
            self._write(chr(0x05))
 
51
            time.sleep(0.2)
 
52
            t=self.ser.inWaiting()
 
53
            if t>0:
 
54
              self.ser.setRTS(False)
 
55
              break
 
56
          else:
 
57
            self.CloseFpctrl()
 
58
    else:
 
59
      self.puerto = p
 
60
      self.OpenFpctrl()
 
61
 
 
62
  def OpenFpctrl(self):
 
63
    if not self.bandera:
 
64
      try:
 
65
        self.ser = serial.Serial(
 
66
        port=self.puerto,
 
67
        baudrate=9600,
 
68
        bytesize=serial.EIGHTBITS,
 
69
        parity  =serial.PARITY_EVEN,
 
70
        stopbits=serial.STOPBITS_ONE,
 
71
        timeout =15,
 
72
        writeTimeout=5,
 
73
        xonxoff=0,
 
74
        rtscts=0) 
 
75
        self.bandera=True
 
76
        return True
 
77
      except serial.SerialException:
 
78
        self.bandera=False
 
79
        self.envio = "Impresora no conectada o error accediendo al puerto"
 
80
        return False
 
81
 
 
82
  def CloseFpctrl(self):
 
83
    if self.bandera:
 
84
      self.ser.close()
 
85
      self.bandera=False
 
86
 
 
87
  def ManipulaCTS_RTS(self):
 
88
    try:
 
89
      self.ser.setRTS(True)
 
90
      lpri=1
 
91
      while not self.ser.getCTS():
 
92
        time.sleep(lpri/10)
 
93
        lpri=lpri+1
 
94
        if lpri>20:
 
95
          self.ser.setRTS(False)
 
96
          return False
 
97
      return True
 
98
    except serial.SerialException:
 
99
      return False
 
100
 
 
101
  def SimpleCmd(self,cmd):
 
102
    try:
 
103
      self.ser.flushInput()
 
104
      self.ser.flushOutput()
 
105
      if self.ManipulaCTS_RTS():
 
106
        msj=self.qenviar(cmd)
 
107
        self._write(msj)
 
108
        rt=self._read(1)
 
109
        if rt==chr(0x06):
 
110
          self.envio = "Status: 00  Error: 00"
 
111
          rt=True
 
112
        else:
 
113
          self.envio = "Status: 00  Error: 89"
 
114
          rt=False
 
115
      else:
 
116
        self.DarStatus_Error(0, 128);
 
117
        self.envio = "Error... CTS in False"
 
118
        rt=False
 
119
      self.ser.setRTS(False)
 
120
    except serial.SerialException:
 
121
      rt=False
 
122
    return rt
 
123
 
 
124
  def QueryCmd(self,cmd):
 
125
    try:
 
126
      self.ser.flushInput()
 
127
      self.ser.flushOutput()
 
128
      if self.ManipulaCTS_RTS():
 
129
        msj=self.qenviar(cmd)
 
130
        self._write(msj)
 
131
        rt=True
 
132
      else:
 
133
        self.DarStatus_Error(0, 128);
 
134
        self.envio = "Error... CTS in False"
 
135
        rt=False
 
136
      self.ser.setRTS(False)
 
137
    except serial.SerialException:
 
138
      rt=False
 
139
    return rt
 
140
 
 
141
  def FecthRow(self):
 
142
    while True:
 
143
      time.sleep(0.7)
 
144
      bytes = self.ser.inWaiting()
 
145
      if bytes>3:
 
146
        msj=self._read(bytes)
 
147
        linea=msj[1:-1]
 
148
        lrc=chr(self.lrc(linea))
 
149
        if lrc==msj[-1]:
 
150
          self.ser.flushInput()
 
151
          self.ser.flushOutput()
 
152
          self._write(chr(0x06))
 
153
          return msj
 
154
        else:
 
155
          self._write(chr(0x15))
 
156
      else:
 
157
        break
 
158
    return None
 
159
 
 
160
 
 
161
  def ReadFpStatus(self):
 
162
    if self.ManipulaCTS_RTS():
 
163
      msj=chr(0x05)
 
164
      self._write(msj)
 
165
      time.sleep(0.05)
 
166
      #bytes = self.ser.inWaiting()
 
167
      r=self._read(5)
 
168
      if len(r)==5:
 
169
        if ord(r[1])^ord(r[2])^0x03 == ord(r[4]):
 
170
          return self.DarStatus_Error(ord(r[1]), ord(r[2]))
 
171
        else:
 
172
          return self.DarStatus_Error(0, 144)
 
173
      else:
 
174
        self.estado = "Impresora ocupada";
 
175
        return self.DarStatus_Error(0, 114)
 
176
    else:
 
177
      return self.DarStatus_Error(0, 128);
 
178
      self.estado = "Error... CTS in False";
 
179
 
 
180
  def _write(self,msj):
 
181
#    if self.mdepura:
 
182
#      print '<<< '+self.depura(msj)
 
183
    self.ser.write(msj)
 
184
 
 
185
  def _read(self,bytes):
 
186
    msj = self.ser.read(bytes)
 
187
#    if self.mdepura:
 
188
#      print '>>> '+self.depura(msj)
 
189
    return msj
 
190
 
 
191
  def qenviar(self,linea):
 
192
    lrc = self.lrc(linea+chr(0x03))
 
193
    previo=chr(0x02)+linea+chr(0x03)+chr(lrc)
 
194
    return previo
 
195
 
 
196
  def lrc(self,linea):
 
197
    return reduce(operator.xor, map(ord, linea))
 
198
 
 
199
  def depura(self,linea):
 
200
    if linea!=None:
 
201
      if len(linea)==0:
 
202
        return 'null'
 
203
      if len(linea)>3:
 
204
        lrc=linea[-1]
 
205
        linea=linea[0:-1]
 
206
        adic=' LRC('+str(ord(lrc))+')'
 
207
      else:
 
208
        adic=''
 
209
      linea=linea.replace(chr(0x02),'STX',1)
 
210
      linea=linea.replace(chr(0x05),'ENQ',1)
 
211
      linea=linea.replace(chr(0x03),'ETX',1)
 
212
      linea=linea.replace(chr(0x04),'EOT',1)
 
213
      linea=linea.replace(chr(0x06),'ACK',1)
 
214
      linea=linea.replace(chr(0x15),'NAK',1)
 
215
      linea=linea.replace(chr(0x17),'ETB',1)
 
216
 
 
217
    return linea+adic
 
218
 
 
219
  def estado1(self):
 
220
    if self.QueryCmd('S1'):
 
221
      msj=1
 
222
      while True:
 
223
        msj=self.FecthRow()
 
224
        if msj==None:
 
225
          break
 
226
        msj=msj[1:-2]
 
227
        m=msj.split(chr(10))
 
228
        if len(m)>=9:
 
229
          return m
 
230
    return None
 
231
 
 
232
  def DarStatus_Error(self,st,er):
 
233
    st_aux = st;
 
234
    st = st & ~0x04
 
235
 
 
236
    if   (st & 0x6A) == 0x6A: #En modo fiscal, carga completa de la memoria fiscal y emisi�n de documentos no fiscales
 
237
      self.status='En modo fiscal, carga completa de la memoria fiscal y emisi�n de documentos no fiscales'
 
238
      status = "12"
 
239
    elif (st & 0x69) == 0x69: #En modo fiscal, carga completa de la memoria fiscal y emisi�n de documentos  fiscales
 
240
      self.status='En modo fiscal, carga completa de la memoria fiscal y emisi�n de documentos  fiscales'
 
241
      status = "11"
 
242
    elif (st & 0x68) == 0x68: #En modo fiscal, carga completa de la memoria fiscal y en espera
 
243
      self.status='En modo fiscal, carga completa de la memoria fiscal y en espera'
 
244
      status = "10"
 
245
    elif (st & 0x72) == 0x72: #En modo fiscal, cercana carga completa de la memoria fiscal y en emisi�n de documentos no fiscales
 
246
      self.status='En modo fiscal, cercana carga completa de la memoria fiscal y en emisi�n de documentos no fiscales'
 
247
      status = "9 "
 
248
    elif (st & 0x71) == 0x71: #En modo fiscal, cercana carga completa de la memoria fiscal y en emisi�n de documentos no fiscales
 
249
      self.status='En modo fiscal, cercana carga completa de la memoria fiscal y en emisi�n de documentos no fiscales'
 
250
      status = "8 "
 
251
    elif (st & 0x70) == 0x70: #En modo fiscal, cercana carga completa de la memoria fiscal y en espera
 
252
      self.status='En modo fiscal, cercana carga completa de la memoria fiscal y en espera'
 
253
      status = "7 "
 
254
    elif (st & 0x62) == 0x62: #En modo fiscal y en emisi�n de documentos no fiscales
 
255
      self.status='En modo fiscal y en emisi�n de documentos no fiscales'
 
256
      status = "6 "
 
257
    elif (st & 0x61) == 0x61: #En modo fiscal y en emisi�n de documentos fiscales
 
258
      self.status='En modo fiscal y en emisi�n de documentos fiscales'
 
259
      status = "5 "
 
260
    elif (st & 0x60) == 0x60: #En modo fiscal y en espera
 
261
      self.status='En modo fiscal y en espera'
 
262
      status = "4 "
 
263
    elif (st & 0x42) == 0x42: #En modo prueba y en emisi�n de documentos no fiscales
 
264
      self.status='En modo prueba y en emisi�n de documentos no fiscales'
 
265
      status = "3 "
 
266
    elif (st & 0x41) == 0x41: #En modo prueba y en emisi�n de documentos fiscales
 
267
      self.status='En modo prueba y en emisi�n de documentos fiscales'
 
268
      status = "2 "
 
269
    elif (st & 0x40) == 0x40: #En modo prueba y en espera
 
270
      self.status='En modo prueba y en espera'
 
271
      status = "1 "
 
272
    elif (st & 0x00) == 0x00: #Status Desconocido
 
273
      self.status='Status Desconocido'
 
274
      status = "0 "
 
275
 
 
276
    if   (er & 0x6C) == 0x6C: #Memoria Fiscal llena
 
277
      self.error = 'Memoria Fiscal llena'
 
278
      error = "108"
 
279
    elif (er & 0x64) == 0x64: #Error en memoria fiscal
 
280
      self.error = 'Error en memoria fiscal'
 
281
      error = "100"
 
282
    elif (er & 0x60) == 0x60: #Error Fiscal
 
283
      self.error = 'Error Fiscal'
 
284
      error = "96 "
 
285
    elif (er & 0x5C) == 0x5C: #Comando Invalido
 
286
      self.error = 'Comando Invalido'
 
287
      error = "92 "
 
288
    elif (er & 0x58) == 0x58: # No hay asignadas  directivas
 
289
      self.error = 'No hay asignadas  directivas'
 
290
      error = "88 "
 
291
    elif (er & 0x54) == 0x54: #Tasa Invalida
 
292
      self.error = 'Tasa Invalida'
 
293
      error = "84 "
 
294
    elif (er & 0x50) == 0x50: #Comando Invalido/Valor Invalido
 
295
      self.error = 'Comando Invalido/Valor Invalido'
 
296
      error = "80 "
 
297
    elif (er & 0x43) == 0x43: #Fin en la entrega de papel y error mec�nico
 
298
      self.error = 'Fin en la entrega de papel y error mec�nico'
 
299
      error = "3  "
 
300
    elif (er & 0x42) == 0x42: #Error de indole mecanico en la entrega de papel
 
301
      self.error = 'Error de indole mecanico en la entrega de papel'
 
302
      error = "2  "
 
303
    elif (er & 0x41) == 0x41: #Fin en la entrega de papel
 
304
      self.error = 'Fin en la entrega de papel'
 
305
      error = "1  "
 
306
    elif (er & 0x40) == 0x40: #Sin error
 
307
      self.error = 'Sin error'
 
308
      error = "0  "
 
309
 
 
310
    if (st_aux & 0x04) == 0x04: #Buffer Completo
 
311
      self.error = ''
 
312
      error = "112 "
 
313
    elif er == 128:     # Error en la comunicacion
 
314
      self.error = 'CTS en falso'
 
315
      error = "128 ";
 
316
    elif er == 137:     # No hay respuesta
 
317
      self.error = 'No hay respuesta'
 
318
      error = "137 ";
 
319
    elif er == 144:     # Error LRC
 
320
      self.error = 'Error LRC'
 
321
      error = "144 ";
 
322
    elif er == 114:
 
323
      self.error = 'Impresora no responde o ocupada'
 
324
      error = "114 ";
 
325
 
 
326
 
 
327
    return status+"   "+error
 
328
 
 
329
  def reiniciar(self):
 
330
    if self.bandera:
 
331
      self.ser.close()
 
332
      time.sleep(1)
 
333
      self.ser.open()
 
334
 
 
335
  def __del__(self):
 
336
    if self.bandera:
 
337
      self.ser.close()
 
338