Generar Codigos QR para campos Binary en Odoo (OpenERP)
Para la generación de Códigos QR para OpenERP les enseñare a utilizar 2 Librerias:
Utilizando Python qrtools:
Lo primero que de debemos hacer es instalar la libreria qrtools, para instalarlo debemos descargar el paquete del link oficial:
Lo instalamos como cualquier paquete python con el comando :
sudo python setup.py install
Una vez instalado lo importamos en nuestros archivos .py con la linea siguiente:
from qrtools import QR
Ahora debemos agregar un Campo de Tipo binario por ejemplo:
'cfdi_cbb': fields.binary("CFD-I CBB")
Este campo es un código CBB propio de la facturación electrónica, ahora debemos ingresar la cadena para generar ese codigo CBB:
qr_string = "La cadena para mi codigo QR" ## Cadena de Texto qr_code = QR(data=qr_string.encode('utf-8')) ## Encodeamos a utf8 mi Cadena qr_file = open(qr_code.filename, "rb") ## Escribimos la Imagen temp_bytes = qr_file.read() ## Leemos la Imagen qr_bytes = base64.encodestring(temp_bytes) ## Convertimos la Imagen para Escribirla en Base qr_file.close() ## Cerramos la lectura del archivo con la imagen QR
Lo ultimo es escribir la imagen en el modelo account.invoice:
account_obj = self.pool.get('account.invoice') account_obj.write(cr,uid,[ids_del_registro],{'cfdi_cbb':qr_bytes})
Lo primero que debemos hacer es instalar qrcode para ello abrimos una terminal:
sudo apt-get install python-qrcode
Ahora para utilizarlo usamos la linea:
from qrcode import *
Ahora debemos agregar un Campo de Tipo binario por ejemplo:
'cfdi_cbb': fields.binary("CFD-I CBB")
Este campo es un código CBB propio de la facturación electrónica, ahora debemos ingresar la cadena para generar ese codigo CBB:
qr_string = "La cadena para mi codigo QR" ## Cadena de Texto qr = QRCode(version=1, error_correction=ERROR_CORRECT_L) qr.add_data(qrstr) qr.make() ## Generar el codigo QR im = qr.make_image() fname=tempfile.NamedTemporaryFile(suffix='.png',delete=False) im.save(fname.name) f = open(fname.name, "r") data = f.read() f.close()
Lo ultimo es escribir la imagen en el modelo account.invoice:
account_obj = self.pool.get('account.invoice') account_obj.write(cr,uid,[ids_del_registro],{'cfdi_cbb':base64.encodestring(data)}) ## Lo guardamos con enconding base 64.
hola Germán! desde hace tiempo que sigo tus publicaciones, ya que explicas muy bien y se nota que tienes mucho amor y paciencia por este trabajo. Te escribo por lo siguiente. estoy queriendo hacer un informe de ventas por categoría de producto e imprimirlo en un informe qweb.
ResponderBorrarfrom openerp import api, models
class report_cant_categ(models.AbstractModel):
_name = 'report.ventasxcateg.report_cant_categ'
@api.multi
def render_html(self, data=None):
report_obj = self.env['report']
report = report_obj._get_report_from_name('ventasxcateg.report_cant_categ')
docargs = {
'doc_ids': self._ids,
'doc_model': report.model,
'docs': self.env[report.model].browse(self._ids),
'total_productos': self.total_productos,
}
return report_obj.render('ventasxcateg.report_cant_categ', docargs)
def total_productos(self, obj):
res=[]
query = """
SELECT category_id as name, sum(product_uom_qty) as total
FROM sale_order_line
WHERE order_id = %s GROUP BY category_id
"""%(obj.id)
self.cr.execute(query)
data = self.cr.dictfetchall()
for t in data:
req=self.pool.get('product.category').browse(self.cr, self.uid, t['category'])
dict={'name' : req.name, 'total' : t['total']}
res.append(dict)
return res
y el resultado enviarle a mi report.xml mi pregunta es:
si está bien mi procedimiento de lógica
y cómo hago para mostrar a mi informe de esta forma
Categoría Cantidad vendido
Calzados deportivos 5
Zapatos 3
sandalias 3
etc
desde ya gracias por su atención. te deseo éxitos y sigas así ayudando a la gente.
Sebastian
Hola, podrias hacerlo mediante un asistente o utilzando jasper_reports y es mas sencillo. Saludos
Borrarhola Germán! desde hace tiempo que sigo tus publicaciones, ya que explicas muy bien y se nota que tienes mucho amor y paciencia por este trabajo. Te escribo por lo siguiente. estoy queriendo hacer un informe de ventas por categoría de producto e imprimirlo en un informe qweb.
ResponderBorrarfrom openerp import api, models
class report_cant_categ(models.AbstractModel):
_name = 'report.ventasxcateg.report_cant_categ'
@api.multi
def render_html(self, data=None):
report_obj = self.env['report']
report = report_obj._get_report_from_name('ventasxcateg.report_cant_categ')
docargs = {
'doc_ids': self._ids,
'doc_model': report.model,
'docs': self.env[report.model].browse(self._ids),
'total_productos': self.total_productos,
}
return report_obj.render('ventasxcateg.report_cant_categ', docargs)
def total_productos(self, obj):
res=[]
query = """
SELECT category_id as name, sum(product_uom_qty) as total
FROM sale_order_line
WHERE order_id = %s GROUP BY category_id
"""%(obj.id)
self.cr.execute(query)
data = self.cr.dictfetchall()
for t in data:
req=self.pool.get('product.category').browse(self.cr, self.uid, t['category'])
dict={'name' : req.name, 'total' : t['total']}
res.append(dict)
return res
y el resultado enviarle a mi report.xml mi pregunta es:
si está bien mi procedimiento de lógica
y cómo hago para mostrar a mi informe de esta forma
Categoría Cantidad vendido
Calzados deportivos 5
Zapatos 3
sandalias 3
etc
desde ya gracias por su atención. te deseo éxitos y sigas así ayudando a la gente.
Sebastian
Un alternativa podrias utilizar jasper_reports con query directo a la Base de Datos o mediante xpath y es mas sencillo. Saludos.
BorrarHola, me gustaría saber como puedo agregar esa cadena a mi código, por que lo hago pero ma salen errores o simplemente no me deja instalar el modulo, gracias.
ResponderBorrarHola Jhaz, gracias por visitar mi Blog, te comento lo siguiente el problema podria estar en la definicion del campo Binario, por que ahora en la API se definen de una manera y en OpenERP es otra, entonces por allí podria estar el error. Saludos
Borrarno logro implementar el qr en odoo 9 German. No se si podrias dar mas detalles
BorrarAlgun video donde expliques detalladamente como imprimir el Codigo qr en el ticket o factura de venta?
ResponderBorrar