Programacion Interactiva

Descubre una Nueva y Poderosa Herramienta.

FrameWork de Nueva Generacion

Acceso a tu Informacion desde cualquier Dispositivo con Navegador.

Enfoque en el Backend

Frontend de forma facil con Odoo y XML.

Creacion de Verticales

Creacion de nuevas Verticales Conquistando nuevos Mercados.

Tu marca aqui mismo

Llega a miles de personas.

Publicidad

Mostrando las entradas con la etiqueta odoo 9. Mostrar todas las entradas
Mostrando las entradas con la etiqueta odoo 9. Mostrar todas las entradas

lunes, 11 de junio de 2018

Agregar Formato a Campos Fecha Reportes Qweb Odoo

Formatear la salida de los Campos Fecha en Reportes Qweb Odoo



     Dentro de Odoo todo es manejado de forma central, la zona horaria, el formato de campos de tipo fecha, etc., esto normalmente ocasiona que se tengan que editar o modificar ciertos reportes para que utilicen nuestras particularidades, tal es el caso de los campos de tipo Fecha/Fecha Hora, en mexico la nomenclatura es dia-mes-aƱo de forma estandar odoo la envia aƱo-mes-dia, para corregir esto en los reportes basta con enviar las opciones para formatear la fecha.

Por ejemplo, yo tengo un reporte con el campo fecha de envio (send_date) la salida estandar de este campo en un reporte Qweb seria:

<span t-field="o.send_date" ></span>

Si agregamos el formato dd/mm/yyyy

<span t-field="o.send_date" t-options='{"format": "dd/MM/yyyy"}'></span>



Formato Fecha Hora:

       <span t-field="o.date_order" t-options='{"format":"dd-MM-yyyy hh:mm:ss"}'/>

lunes, 21 de mayo de 2018

Creación de Campos con Precisión Decimal Dinamica en Odoo

Creación de Campos con Decimales Dinamicos




Un aspecto fundamental en la parte administrativa es la contable donde la presición decimal debe ser muy controlada, tanto en la generación de reportes como en la creación de algunos formularios.

Dentro de las muchas bondades que siempre describo en mis articulos, Odoo cuenta con una presición dinamica, esta precisón puede ser moderada por el usuario final (cliente), esto le ayudara a aumentar o disminuir el numero de decimales en Odoo de acuerdo a sus necesidades y sin tener que programar o editar el codigo fuente.

La precisión decimal la encontramos en el Menu Configuración --> Tenico --> Estructura de la Base de Datos --> Presición Decimal.

El primer paso es crear tu precisión Decimal mediante una vista XML.

<?xml version="1.0" encoding="UTF-8"?>
<odoo>
   <data>
  <!--  Mi presicion decimal-->

  <record model="decimal.precision" id="precision_discounts">
    <field name="name">Discount</field>
    <field name="digits">6</field>
  </record>  

   </data>
</odoo>

Al instalar nuestro modulo o actualizarlo, nos creara el registro correspondiente al XML:


El valor digits es el numero de decimales que tendra el campo que lo utilice como su presición decimal.

El paso final es asignar esta presición en la creación del campo en una clase Odoo.

# -*- coding: utf-8 -*-
from openerp.exceptions import UserError
from openerp import api, fields, models, _, tools
import openerp.addons.decimal_precision as dp

class Accountinvoice(models.Model):
    _inherit = 'account.invoice'
    _name = 'account.invoice'
    
    invoice_discount_amount = fields.Float(digits=dp.get_precision('Discount'), 
                                string='Descuento Total en Monto')


En el ejemplo anterior herede facturas y cree mi campo llamado Descuento Total con 6 Decimales en su parte flotante, el campo se visualiza de la siguiente manera en el Sistema:

Si modificamos la presición decimal a 4.


Veriamos el campo actualizado y los registros anteriores redondeados al nuevo numero de decimales.

Una presición puede ser reutilzada muchas veces no es necesario crear una por cada campo a menos que el proceso lo requiera.

Espero que les ayude esta información y no se olviden dejar sus comentarios.




miƩrcoles, 9 de mayo de 2018

Odoo Complemento Detallista

Complemento Detallista para Odoo

    Actualmente contamos con el complemento de Detallista para Odoo 9, 10 y Odoo 11 tanto Enterprise como versiones Comunitarias, la configuración es muy sencilla y esta relacionada directamente con la información previamente capturada dentro de la Facturación Electronica.

Configuración Producto:


Configuración Cliente:



Captura del Comprobante (Factura):


Resultado XML Timbrado:





PDF Timbrado:


Para Cualquier Información: info@argil.mx o german.ponce@argil.mx

Odoo Complemento Comercio Exterior

Complemento de Comercio Exterior para Odoo



    Actualmente contamos con el complemento de Comercio exterior para Odoo 9, 10 y Odoo 11 tanto Enterprise como versiones Comunitarias, la configuración es muy sencilla y esta relacionada directamente con la información previamente capturada dentro de la Facturación Electronica.

Configuración Producto:


Configuración Cliente:



Captura del Comprobante (Factura):


Resultado XML Timbrado:





PDF Timbrado:


Para Cualquier Información: info@argil.mx o german.ponce@argil.mx

viernes, 23 de junio de 2017

Descarga de Reporte con Nombres DinƔmicos en Odoo 9 y Odoo 10

Generación de Reportes con Nombres DinÔmicos en Odoo



Dentro de las grandes virtudes de Odoo podemos ver una actualización muy util al apartado de Reportes, la cual es la generación del nombre del archivo descargado (Ej. Pedido 01.pdf) de forma dinÔmica tomando información de un campo del formulario donde se imprime el Reporte.

El primero paso es activar el modo desarrollador.

Con este paso, podremos visualizar en Configuración --> Informes --> Formulario --> Campo Printed Report Name

Este campo nos permitirÔ ingresar una serie de evaluaciones del registro del cual se imprime la información para generar el nombre de descarga del Archivo PDF, por ejemplo en el reporte de Facturas podria generar el siguiente nombre:


El resultado sera de 2 maneras, si no existe numero de factura:


Existiendo un numero de folio (factura confirmada):


El Nombre del reporte con concatenaciones puede ser dinƔmico o fijo, reemplazando el valor original del reporte.


Espero les ayude tanto como a mi.


jueves, 20 de abril de 2017

Localización Mexicana para Odoo 8, Odoo 9 y Odoo 10

Adaptaciones Contables para México en cualquier Versión de Odoo


Hola a todos, este pequeño Post es para anunciar la Localización Mexicana para cualquier versión de Odoo (Odoo 8, Odoo 9 y Odoo 10), la cual incluye entre lo mas destacado:
  • Contabilidad Electrónica
    • Catalogo de Cuentas XML
    • Balanza de Comprobación
    • Complementos XML
    • Plan de Cuentas
    • Auxiliares Contables
    • Polizas
  • Facturación Electrónica
  • DIOT
  • Catalogo de Cuentas JerĆ”rquico
  • Reportes IFRS
  • Reclasificacion de Impuestos
  • Periodos Fiscales y AƱos Fiscales
  • Mucho mas ....



Facturacion electronica CFDI 3.3 con complemento de Pagos:

https://poncesoft.blogspot.mx/2017/09/facturacion-electronica-cfdi-33-con.html


Cualquier información: info@argil.mx


viernes, 2 de diciembre de 2016

Invocando Acciones en los Flujos de Odoo

Ejecutar una Transición de Estado con la API Odoo



    Para todos los que venimos de la programación con el Framework de OpenERP hacia la API de Odoo, observamos que todo es mas sencillo, se eliminaron pasos, parĆ”metros, etc., bueno  esto cambio tambiĆ©n en la invocación de flujos (workflow), ahora ejecutar la transición de un estado a otro en las clases que utilizan aĆŗn estos se realiza de la siguiente manera:

# -*- coding: utf-8 -*-

invoice_obj = self.env['account.invoice'].sudo()

invoice_br = invoice_obj.browse([id_factura])

invoice_br.signal_workflow('invoice_open')

La parte clave para ejecutar la transicion es el mĆ©todo signal_workflow propio de las clase principal models.Model de la API.

Anteriormente utilizĆ”bamos la herramienta netsvc de Odoo, la cual fue eliminada a partir de la versión Odoo 8.0


jueves, 1 de diciembre de 2016

Herencia de Clases Web en Odoo

Heredar Clases Web en Odoo (http.Controller)



    Un tema muy importante que ha empezado a tomar importancia en Odoo es el desarrollo y las modificaciones del E-commerce desafortunadamente no tenemos mucha información asĆ­ que estarĆ© subiendo temas y mis propias investigaciones:

Lo primero con lo que quiero empezar es como hacer herencia de una clase web, esto se realiza de una forma muy sencilla:

  1. Debemos importar la clase a la cual vamos a heredar por ejemplo si queremos heredar la clase website_sale lo harĆ­amos de la siguiente manera:

    from openerp.addons.website_sale.controllers.main import website_sale
    

    Observamos que bƔsicamente hacemos un recorrido de toda la ruta de archivos hasta llegar al que contiene la clase a heredar.

  2. Segundo creamos la clase y la heredamos:

  3. class website_sale_extension(website_sale):
    
    
  4. Con esto podremos hacer uso de los metodos propios de website_sale, podremos extenderlos o reemplazarlos.
Un ejemplo seria el siguiente, en donde arregle un Bug que tenia Odoo al momento de procesar un pago:

# -*- coding: utf-8 -*-
from openerp import http
from openerp import SUPERUSER_ID
from openerp.api import Environment
from openerp.addons.web.http import request

import logging
import werkzeug

from openerp import http
from openerp import tools
from openerp.tools.translate import _
from openerp.addons.website.models.website import slug
from openerp.addons.website_sale.controllers.main import website_sale

PPG = 20 # Products Per Page
PPR = 4  # Products Per Row

class website_sale_portal_invoice(website_sale):
    def checkout_form_save(self, checkout):
        cr, uid, context, registry = request.cr, request.uid, request.context, request.registry

        order = request.website.sale_get_order(force_create=1, context=context)

        orm_partner = registry.get('res.partner')
        orm_user = registry.get('res.users')
        order_obj = request.registry.get('sale.order')

        partner_lang = request.lang if request.lang in [lang.code for lang in request.website.language_ids] else None

        billing_info = {'customer': True}
        if partner_lang:
            billing_info['lang'] = partner_lang
        billing_info.update(self.checkout_parse('billing', checkout, True))

        # set partner_id
        partner_id = None
        if request.uid != request.website.user_id.id:
            partner_id = orm_user.browse(cr, SUPERUSER_ID, uid, context=context).partner_id.id
        elif order.partner_id:
            user_ids = request.registry['res.users'].search(cr, SUPERUSER_ID,
                [("partner_id", "=", order.partner_id.id)], context=dict(context or {}, active_test=False))
            if not user_ids or request.website.user_id.id not in user_ids:
                partner_id = order.partner_id.id

        # save partner informations
        if partner_id and request.website.partner_id.id != partner_id:
            orm_partner.write(cr, SUPERUSER_ID, [partner_id], billing_info, context=context)
        else:
            # create partner
            billing_info['team_id'] = request.website.salesteam_id.id
            partner_id = orm_partner.create(cr, SUPERUSER_ID, billing_info, context=context)
        order.write({'partner_id': partner_id})
        ### Correccion ###
        order.onchange_partner_id()
        ### Error ###
        # order_obj.onchange_partner_id(cr, SUPERUSER_ID, [order.id], context=context)
        order.write({'partner_invoice_id': partner_id})

        # create a new shipping partner
        if checkout.get('shipping_id') == -1:
            shipping_info = self._get_shipping_info(checkout)
            if partner_lang:
                shipping_info['lang'] = partner_lang
            shipping_info['parent_id'] = partner_id
            checkout['shipping_id'] = orm_partner.create(cr, SUPERUSER_ID, shipping_info, context)
        if checkout.get('shipping_id'):
            order.write({'partner_shipping_id': checkout['shipping_id']})

        order_info = {
            'message_partner_ids': [(4, partner_id), (3, request.website.partner_id.id)],
        }
        order_obj.write(cr, SUPERUSER_ID, [order.id], order_info, context=context)

Los puntos a resaltar en el código son los comentarios correccion y error con mi solución.

miƩrcoles, 28 de septiembre de 2016

Nuevos atributos para Color en Vistas Avanzadas Odoo

Decoradores para vistas de Lista Odoo 9


    En OpenERP 7 y Odoo 8.0 tenĆ­amos la posibilidad de aƱadir atributos de color (color) y fuente (font) en las vistas de lista, para poder identificarlas de una manera mas sencilla, en Odoo 9.0 encontrĆ© que cambio un poco y ahora utiliza atributos especiales para ello (decoradores), veamos un ejemplo:

Vista con Colores en versiones anteriores a Odoo 9.0

<tree string="Pedidos de Venta" colors="blue:state=='confirmed'" >
    .....
    .....
    .....
</tree>

Atributos para Colores en Odoo 9.0

<tree string="Pedidos de Venta" decoration-info="state=='confirmed'">
    .....
    .....
    .....
</tree>

Otros decoradores son:
  • decoration-bf - Lineas en BOLD 
  • decoration-it - Lineas en ITALICS 
  • decoration-danger - Color LIGHT RED 
  • decoration-info - Color LIGHT BLUE 
  • decoration-muted - Color LIGHT GRAY 
  • decoration-primary - Color LIGHT PURPLE 
  • decoration-success - Color LIGHT GREEN 
  • decoration-warning - Color LIGHT BROWN

martes, 2 de agosto de 2016

Consultar las Tablas Relacionales Many2many en Odoo 9

Como encontrar las tablas resultantes de campos Many2many en Odoo 9



    Dentro de los muchos cambios que estamos observando en la API de odoo y para los que venimos de la programación de módulos en versiones inferiores a odoo (openerp) notamos una dificultad en los campos relacionales, en openerp 7 hacia abajo uno de los atributos que necesitabas para poder declarar un campo de tipo many2many era el nombre de la tabla relacion, por ejemplo la clase purchase.order (compras) y la relacion con account.invoice (facturas), esta relacion de tipo many2many estaba declarada de la siguiente manera:

'invoice_ids': fields.many2many('account.invoice',
               'purchase_invoice_rel', 
               'purchase_id', 'invoice_id', 
               'Invoices', help="Invoices generated for a purchase order"),

A simple vista identificamos la tabla resultante de la relación llamada purchase_invoice_rel.


En la API de odoo ya no es necesario indicar el nombre de la tabla relación, esta se creara de forma interna, aunque si nosotros la indicamos en la declaración del campo odoo respetara ese atributo. El mismo ejemplo anterior con la API de Odoo seria:

invoice_ids = fields.Many2many('account.invoice',
              compute="_compute_invoice", string='Invoices', copy=False)

A simple vista no podemos identificar la tabla resultante de la misma relación, para ello debemos consultar la tabla ir_model_relation  a nivel base de datos y buscarla de forma manual, es una tarea un poco mas compleja,pero al final nos ayudara un poco y nos evitara buscar en todo el codigo del modulo:

select * from ir_model_relation where name like '%order%'


Si queremos ver todas las relaciones creadas en nuestra Base de Datos:

select * from ir_model_relation order by name

Una alternativa es consultando los atributos del campo, en la tabla ir_model_fields:

select * from ir_model_fields where model = 'purchase.order' and name='invoice_ids'

Nota:
         Debemos asegurarnos que el campo que vayamos a consultar el modulo que lo contiene este instalado en la base de datos.

lunes, 4 de enero de 2016

Instalacion de Odoo 9 en Ubuntu

 Instalación Odoo 9 en Linux, Ubuntu 14.x , Ubuntu 15.x y Ubuntu Server


PASOS PARA LA INSTALACIƓN: 
Antes que nada necesitamos instalar las dependencias que utiliza Odoo (una dependencia es una aplicación o una biblioteca requerida por otro programa para poder funcionar correctamente. Por ello se dice que dicho programa depende de tal aplicación o biblioteca).
Antes de instalar las dependencias, necesitamos una actualizacion de los repositorios:
sudo apt-get update && sudo apt-get upgrade
Abrimos una Terminal de Ubuntu o una manera rƔpida es presionando las teclas Alt+Ctrl+T y escribimos lo siguiente:
sudo apt-get install subversion git bzr bzrtools python-pip postgresql python-all-dev python-dev python-setuptools libxml2-dev libxslt1-dev libevent-dev libsasl2-dev libldap2-dev pkg-config libtiff5-dev libjpeg8-dev libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev liblcms2-utils libwebp-dev tcl8.6-dev tk8.6-dev python-tk libyaml-dev fontconfig node-less
Cremos un directorio en la ruta /opt llamada Odoo:
cd /opt
Despues:
sudo mkdir odoo
Cambiamos los permisos de la carpeta odoo al usuario que usara esta ruta (german es el usuario del sistema):
sudo chown german.german * -R odoo
Descargamos Odoo desde el Repositorio Oficial:
sudo git clone https://www.github.com/odoo/odoo --depth 1 --branch 9.0 --single-branch .
Instalamos las dependencias de la aplicación:
sudo pip install -r /opt/odoo/doc/requirements.txt
sudo pip install -r /opt/odoo/requirements.txt

Creamos nuestro Usuario Postgres
Entramos al prompt de postgres:
sudo su postgres
Creamos el Usuario:
createuser -s -P -e odoo
Tecleamos la contraseña (odoo) 2 veces. Ahora para evitar algún error modificamos el template principal de postgres (template1)
psql template1
Y una vez dentro del template:
alter role odoo with password 'odoo';
Para salir del prompt de postgres solo ejecutamos:
psql \q
Creamos nuestro archivo de configuracion de Odoo, para ello vamos al directorio de instalación (/opt/odoo/) y ejecutamos:
python openerp-server -c odoo.conf -s
Lo que estamos haciendo es crear un archivo de configuración para Odoo.
Ahora debemos pausar la ejecución del servidor con la combinación de teclas ctr+c.
Listo, ahora editamos el archivo de configuración llamado odoo.conf, con el editor vi, vim, nano o gedit si estÔn en modo grÔfico y modificamos los valores:
db_host = localhost
db_maxconn = 64
db_name = False
db_password = odoo
db_port = 5432
db_template = template1
db_user = odoo
Guardamos y ahora para ejecutar el servidor odoo, usamos el comando:
python openerp-server -c odoo.conf
En la ruta /opt/odoo
NOTAS: 
En ocasiones el Firewall de Linux, puede bloquear nuestro puerto en donde iniciamos Odoo, entonces debemos ejecutar los siguientes comandos:
sudo ufw allow ssh
sudo ufw allow 8069/tcp
sudo ufw enable