Publicidad

jueves, 10 de abril de 2014

Integracion de Codigos QR con Odoo (OpenERP)

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




Utilizando Python qrcode:



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.







8 comentarios:

  1. 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.

    from 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

    ResponderBorrar
    Respuestas
    1. Hola, podrias hacerlo mediante un asistente o utilzando jasper_reports y es mas sencillo. Saludos

      Borrar
  2. 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.

    from 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

    ResponderBorrar
    Respuestas
    1. Un alternativa podrias utilizar jasper_reports con query directo a la Base de Datos o mediante xpath y es mas sencillo. Saludos.

      Borrar
  3. Hola, 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.

    ResponderBorrar
    Respuestas
    1. Hola 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

      Borrar
    2. no logro implementar el qr en odoo 9 German. No se si podrias dar mas detalles

      Borrar
  4. Algun video donde expliques detalladamente como imprimir el Codigo qr en el ticket o factura de venta?

    ResponderBorrar