Arme usando pyFiscalPrinter un server en Flask que recibe comandos mediante javascript desde un browser (todo en la misma PC física).
Lo que está en el browser es una aplicación Rails, pero no viene al caso.
En la misma PC tengo instaladas una Hasar 320F y una Hasar 262F (es tickeadora térmica), ambas por USB con adaptador para puerto serie.
Funciona todo: en función al tipo de compra imprime: o bien factura (A o B) o bien ticket.
Mientras desarrollé, todas las pruebas me funcionaron bien, pero luego cuando el comercio empezó a usar "en serio" algunos tickets salen cancelados.La que falla es la impresora térmica Hasar modelo 262F, que más allá de la cantidad de columnas, es compatible con el modelo 615. En general imprime bien, pero algunos tickets se cancelan a la mitad. Luego si se imprime el mismo ticket, lo hace correctamente (no es error de datos). ¿Puede tener que ver la velocidad en la que envío los comandos de 'addItem'? lo hago mediante for sin ninguna espera.
El código es este:
printer.openTicket()
for item in document['items']: name = str(item['name']) quantity = item['quantity'] amount = float(item['amount']) vat = float(item['vat']) printer.addItem(name, quantity, amount, vat, discount=0, discountDescription="")
¿Alguno tuvo esta experiencia?
Me cuesta determinar el error porque solo pasa muy de vez cuando.
Desde ya, muchas gracias. Gracias
def printDocument(port, driver, model, document):
res = {'ok': False, 'response': {}}
res['response']['ticket_list_id'] = document['id']
try:
printer = getPrinter(port, driver, model)
if document['receipt_type'] in ['InvoiceB', 'InvoiceA']:
if document['receipt_type'] == 'InvoiceB':
doc_type = "B"
else:
doc_type = "A"
docType = printer.DOC_TYPE_CUIT
ivaType_customer = document['customer']['condition']
if ivaType_customer == 'IvaResponsableInscripto':
ivaType = printer.IVA_TYPE_RESPONSABLE_INSCRIPTO
elif ivaType_customer == 'IvaResponsableNoInscripto':
ivaType = printer.IVA_TYPE_RESPONSABLE_NO_INSCRIPTO
elif ivaType_customer == 'NoResponsable':
ivaType = printer.IVA_TYPE_NO_RESPONSABLE
elif ivaType_customer == 'IvaExento':
ivaType = printer.IVA_TYPE_EXENTO
elif ivaType_customer == 'ResponsableMonotributo':
ivaType = printer.IVA_TYPE_RESPONSABLE_MONOTRIBUTO
elif ivaType_customer == 'AConsumidorFinal':
ivaType = printer.IVA_TYPE_CONSUMIDOR_FINAL
docType = printer.DOC_TYPE_SIN_CALIFICADOR
else:
ivaType = printer.IVA_TYPE_NO_CATEGORIZADO
document_number = printer.getLastNumber(str(doc_type)) + 1
name = document['customer']['name']
address = document['customer']['address']
number = document['customer']['number']
printer.openBillTicket(str(doc_type), str(name), str(address), str(number), str(docType), str(ivaType), document['texts'])
elif document['receipt_type'] == 'Ticket':
doc_type = 'T'
#En la tickeadora no anda el setHeader
#printer.setHeader(document['texts'])
printer.openTicket()
else:
raise Exception('Tipo de factura invalido')
for item in document['items']:
name = str(item['name'])
quantity = item['quantity']
amount = float(item['amount'])
vat = float(item['vat'])
printer.addItem(name, quantity, amount, vat, discount=0, discountDescription="")
for payment in document['payments']:
for desc, value in payment.iteritems():
printer.addPayment(str(desc), float(value))
for discount in document['global_discounts']:
for desc, value in discount.iteritems():
printer.addAdditional(str(desc), value, 0, True)
res_subtotal = printer.getSubtotal()
subtotal = {}
subtotal['lines'] = res_subtotal[2]
subtotal['total'] = float(res_subtotal[3])
subtotal['vat'] = float(res_subtotal[4])
subtotal['canceled'] = 0
subtotal['invoice_letter'] = doc_type
document_number = printer.closeDocument()
subtotal['document_number'] = document_number
res['ok'] = True
res['response']['subtotal'] = subtotal
res['ok'] = True
except Exception as ex:
#ante cualquier error se cancela la factura
printer.cancelAnyDocument()
res['ok'] = False
res['error'] = str(ex)
res['response']['id'] = document['id']
res['response']['document_number'] = document_number
return resArme usando pyFiscalPrinter un server en Flask que recibe comandos mediante javascript desde un browser (todo en la misma PC física).Lo que está en el browser es una aplicación Rails, pero no viene al caso.En la misma PC tengo instaladas una Hasar 320F y una Hasar 262F (es tickeadora térmica), ambas por USB con adaptador para puerto serie.Funciona todo: en función al tipo de compra imprime: o bien factura (A o B) o bien ticket.Mientras desarrollé, todas las pruebas me funcionaron bien, pero luego cuando el comercio empezó a usar "en serio" algunos tickets salen cancelados.La que falla es la impresora térmica Hasar modelo 262F, que más allá de la cantidad de columnas, es compatible con el modelo 615. En general imprime bien, pero algunos tickets se cancelan a la mitad. Luego si se imprime el mismo ticket, lo hace correctamente (no es error de datos). ¿Puede tener que ver la velocidad en la que envío los comandos de 'addItem'? lo hago mediante for sin ninguna espera.
--
Daniel Malisani
Lo
que convendría hacer es lockear el acceso a la impresora, de forma tal que
las comunicaciones sean secuenciales, enviar un comando recién cuando el
anterior se dejó de ejecutar.
En el caso del socketserver que está actualmente eso se resuelve haciendo
que el server atienda de a una conexión a la vez. Tendrías que ver cómo
implementar algo similar en tu server flask.
Incluso tal vez no te alcance con lock por comando y tengas que implementar
algo por operación, ya que si un cliente está a mitad de una factura,
enviando items y otro quiere iniciar una nueva se va a armar quilombo. Te
dejo a vos la creatividad de implementar eso en un protocolo sin conexión
como http. Después compartí el resultado!!
Enviado
con Aquamail para Android
http://www.aqua-mail.com
El 22 de julio de 2014 16:34:10 Juan La Battaglia <jua...@gmail.com> escribio:
--
---
Has recibido este mensaje porque estás suscrito al grupo "PyFiscalPrinter" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a pyfiscalprint...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
-- Guillermo M. Narvaja Lambda Sistemas S.R.L. www.fierro-soft.com.ar - radiocut.fm Tel: (5411) 3220-1520 (rotativas) y 4857-6662 Cel: (5411) 15-6783-4435 Email: guillerm...@fierro-soft.com.ar MSN: guillerm...@hotmail.com Skype: guillermonarvaja Lavalleja 519 1er Piso - Ciudad de Buenos Aires - Argentina |
import threading
def unlock_by_time(printer):
try:
print 'unlock_by_time'
printer.getLastNumber("B") #es solo para preguntarle algo
print 'unlock_by_time OK'
except Exception as e:
print 'Exception en unlock_by_time'
print 'Exception: ' + str(e)
def unlock_by_time_wrapper(printer, function_name):
t = threading.Timer(3, unlock_by_time, [printer]) #ejecuta si pasan mas de 3 segundos
t.start() #empieza a contar
printer 'Start thread for unlock_by_time for: ' + function_name
yield
t.cancel() #si llega hasta acá no se ejecuta el thread
print 'Cancel thread for unlock_by_time for: ' + function_name
def imprimir_ticket():
[...]
print 'send addItem'
for x in unlock_by_time_wrapper(printer, 'addItem'): #ejecución de bloque
printer.addItem(name, quantity, amount, vat, discount=0, discountDescription="")
print 'send addItem OK'
[...]