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.

Asesoria Especializada

Consultoria desde $15 USD por Hora.

jueves, 30 de noviembre de 2017

Localización Mexicana para Odoo 10

Adaptaciones Contables para México


Hola a todos, este pequeño Post es para anunciar la Localización Mexicana para la version 10 de Odoo, una cosa importante que quiero resaltar es que esta localizacion es compatible con la version Comunitaria y la Version Enterprise de Odoo, algunas de sus funcionalidades mas importantes son:
  • 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 ....


Cualquier información: german.ponce@outlook.com


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


Cualquier información: german.ponce@outlook.com


viernes, 2 de diciembre de 2016

Retornar un reporte mediante una función Python en Odoo

Retornar un reporte mediante un botón en Odoo


    
La ejecución y el manejo de los reportes mediante funciones en odoo, se hace de la siguiente manera:

# -*- coding: utf-8 -*-
def print_report(self):
    return self.env['report'].get_action(self, 'modulo.nombre_tecnico_reporte')

La parte importante en este boton es invocar el reporte correcto, primero el nombre del modulo seguido de un punto y por ultimo el nombre tecnico del reporte.

Otra parte importante es que self contiene los ids de los registros que tenemos que imprimir, entonces si queremos imprimir varios registros al mismo tiempo bastaría con tener una instancia de ellos.



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.

lunes, 28 de noviembre de 2016

Seleccionar Vista a mostrar en Campos Relacion (Many2One)

Mostrar una Vista especifica en campos relacionales Many2One



     Odoo siempre sorprende en lo flexible y poderoso que puede llegar a ser al momento de desarrollar aplicaciones, en este post mostrare como poder seleccionar una vista especifica para los campos many2one, esto ayuda para tener una segmentación sobre lo que queremos que el usuario vea en la sección principal (menús) y la información que queremos que vea en los campos relación.

<field name="my_field_id" context="{'form_view_ref':'my_module.my_xml_view_id'}"/>

La parte importante es identificar que solo debemos modificar el apartado my_module por el nombre de nuestro modulo que contiene la vista a seleccionar y seguido de un punto y el ID de la vista, esto seria suficiente para poder mostrarle al usuario una vista distinta en los campos many2one.


miércoles, 19 de octubre de 2016

Override de Funciones Javascript en Odoo

Método para Sobrescribir Funciones Javascript en Odoo



Trabajando en algunas modificaciones de apuntes contables me di cuenta que tenemos un filtro "escondido" en las fuentes de javascript la cual limitaba los registros para no mostrar partidas cuyo crédito y débito es 0.0, de alguna forma esto es correcto, pero para algunas personas es importante tener el desglose total de las partidas sin importar los montos, bueno para ello tenia que adentrarme en el archivo llamado account_move_line_quickadd.js y el método search_by_journal_period, para sobrescribir debemos hacer lo siguiente:

  1. Nuestro archivo __openerp__.py debe importar los archivos con codigo Javascript.
        'js': ['static/src/js/move_line_search_view.js'],
    
  2. El archivo  move_line_search_view.js contendra el reemplazo de la funcion, para ello la estructura es la siguiente:
    openerp.journal_entries_report_filter = function (instance) {
        instance.web.account.QuickAddListView.include({
    
            search_by_journal_period: function() {
                /*console.log("HOLA SUPER METODO")*/
                var self = this;
                var domain = [];
                if (self.current_journal !== null) domain.push(
                    ["journal_id", "=", self.current_journal]);
                if (self.current_period !== null) domain.push(
                    ["period_id", "=", self.current_period]);
                self.last_context["journal_id"] = 
                    self.current_journal === null ? false : 
                    self.current_journal;
                if (self.current_period === null) delete 
                    self.last_context["period_id"];
                else self.last_context["period_id"] =  
                    self.current_period;
                self.last_context["journal_type"] = 
                    self.current_journal_type;
                self.last_context["currency"] = 
                    self.current_journal_currency;
                self.last_context["analytic_journal_id"] = 
                    self.current_journal_analytic;
                return self.old_search(
                    new instance.web.CompoundDomain(
                                        self.last_domain, 
                        domain), self.last_context, 
                                    self.last_group_by);
            },
        });
    };
    

    journal_entries_report_filter es el modulo que estoy creando con los nuevos métodos javascript, openerp.journal_entries_report_filter = function (instance) fragmento de código  que crea una instancia de los archivos fuente javascript para instanciar el modulo account y sus recursos, en la siguiente linea apreciamos la referencia (instancia) del modulo account instance.web.account.QuickAddListView.include por ultimo el método search_by_journal_period es el método que estoy reemplazando o sobrescribiendo.
Nota: no se olviden de tener como dependencia
Espero que les ayude en algún momento.