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