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.







6 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

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

      Eliminar
  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

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

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

    ResponderEliminar
    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

      Eliminar