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.

Publicidad

martes, 14 de octubre de 2014

Facturación, Ventas y Compras de Manera Simple

Agregar Productos de Manera Simple con Odoo (OpenERP)


    Odoo (OpenERP), es un excelente Programa dentro de sus características principales, podemos destacar la interfaz tan amigable al Usuario, al momento de Capturar, Ventas, Compras y Facturas, ahora les quiero hablar de un modulo que facilita aun más la captura de esta Información, el modulo tiene por nombre Easy Added Products, su función Principal es que se pueda aumentar la Productividad y velocidad utilizando el Sistema, al seleccionar un producto en la parte Superior, se Agrega en automático la Linea con Dicho Producto, esto funciona para Ventas, Compras, Facturas de Cliente y Proveedor. Al ingresar la Linea dependiendo el modelo en donde lo utilicemos, tomara el valor de la Ficha de Dicho Producto, el Precio de Venta, el Precio de Compra y la Unidad de Medida por defecto, como observamos en las siguientes Imágenes:


VENTAS



lunes, 13 de octubre de 2014

Sistema Transporte de Carga (Fletes) con OpenERP (Odoo)

Administración y Control de Viajes para el Sistema de Transporte de Carga, Integrado con OpenERP (Odoo)


    Buenos Días, lectores de mi Blog, gracias por su colaboración en los E-mails, ahora vengo a hablarles un poco de un Modulo que Integra el Control del Tranporte (Fletes, Viajes, Gastos, vales de Combustible), desarrollado por la Empresa Argil Consulting y con un poco de Colaboración de mi parte.
    El sistema tiene por nombre Transport Freight Manager (Administración de Transporte de Carga), el cual fue desarrollado para ser Integrado en OpenERP (Odoo) como un modulo, que permita como su nombre lo dice, administrar las Empresas dedicadas al Transporte de Mercancías, permite dar de Alta Unidades, crear Cartas Porte, Vales de combustible, Manejo de Anticipos, Odometros y hasta poder Programar Mantenimientos de Unidades.

En la siguiente Imagen tenemos la Vista Principal en el Sistema OpenERP 7.0:


martes, 5 de agosto de 2014

Como Consumir el Web Service de Odoo (OpenERP)

Consumiendo el WebServices de Odoo con Python





    Muchos sabemos ó en ocasiones desconocemos como trabaja el Sistema Odoo (OpenERP), para poder comunicar la plataforma creada en Python con nuestros Navegadores convencionales, bien pues esto lo hace graciad a los Web Services y los protocolos XML-RPC y NET-RPC, el protocolo XML-RPC, se encarga de las transacciones Web y toda la parte de los Navegadores, el protocolo NET-RPC, se utilizaba anteriormente en la version 6.1 de OpenERP hacia atras para poder utilizar un Cliente de Escriorio (GTK), que era una alternativa para los Navegadores y tenia una completa integracion con el Sistema, a partir de la version 7.0 de OpenERP se elimina este Cliente y se vuelve completamente Web.

    Ahora como mencione anteriormente, utilizaremos el XML-RPC para poder consumir este Web Services utilizando un programa externo en Python, que permitira crear registros en Clientes/Proveedores (res.partner) de OpenERP.

lunes, 21 de julio de 2014

Curso de Introduccion al Desarrollo OpenERP 7.0 (Odoo)

Creando mi Primer Modulo



Buenas Tardes, en este Post, comparto el Curso Impartido sobre Desarrollo utilizando el Framework OpenObject para desarrollos con OpenERP (Odoo).


jueves, 26 de junio de 2014

Utilizar un Servidor Independiente PostgreSQL para Odoo (OpenERP 8.0)


    En ocasiones una Instalación de Odoo (OpenERP) y un servidor de Base de Datos (PostgreSQL 9.3) en un solo servidor, no son suficientes cuando el numero de Usuarios del Sistema crece demasiado, las consultas suelen ser mas lentas y en ocasiones el servidor puede Crashear por la carga de informacion y los recursos limitados de tener un solo Servidor.

    PostgreSQL es un gestor de base de datos que permite conexiones remotas, esta ventaja la podemos utilizar para tener nuestro propio servidor dedicado, unica y exclusivamente para el manejo de la Informacion, ahora como podemos tener 2 servidores para estos 2 Procesos.

viernes, 6 de junio de 2014

Solucion al Error! "UnknownLocaleError: unknown locale 'en'"?



Muchos durante el Arranque del Servidor Odoo (OpenERP) nos hemos topado con el Error:

"UnknownLocaleError: unknown locale 'en'"


Y esto cocurre por que en ocasiones la libreria Python Babel no encuentra un archivo en.data, la solucion es crear un enlace simbolico ejecutando el siguiente comando:

ln -s /usr/share/python-babel-localedata/localedata/en_150.dat /usr/share/python-babel-localedata/localedata/en.dat


Espero les haya Solucionado el Problema....


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




martes, 8 de abril de 2014

Introduccion en la Declaracion de Campos Odoo (OpenERP)

Los campos Introducción 


    Los objetos pueden contener diferentes tipos de campos. Esos tipos se pueden dividir en tres categorías: los tipos simples, tipos de relación y campos funcionales. Los tipos simples son enteros, reales, booleanos, cadenas, etc ... ; Los tipos de relación se utilizan para representar relaciones entre objetos (one2one, one2many, many2one). Campos funcionales son campos especiales porque no se almacenan en la base de datos pero calculan en tiempo real dado otros campos de la vista.

    Aquí está la cabecera del método de inicialización de cualquier campo de la clase definida en Odoo (OpenERP) (como se puede ver en el server / bin / OSV / fields.py):
def __ init__ (self, char = "Unknow", required = False, readonly = False, domain = None, context = None, priority = 0, change_default = False, size = None, onDelete = "cascade", translate = False, selection = False, ** args):
Hay un conjunto común de parámetros opcionales que están disponibles para la mayoría de los tipos de campos:

change_default: Ya sea o no el usuario puede definir valores por defecto en otros campos en función del valor de este campo. Estos valores por defecto deben ser definidos en la tabla ir.values.
help: Una descripción de cómo se debe utilizar el campo: más y más descriptivo que char . Aparecerá en la información sobre herramientas cuando se pasa el ratón sobre el campo.
ondelete: Cómo manejar las eliminaciones  en un registro relacionado. Por default encontraremos el valor "ondelete".
priority: No se utiliza?
readonly: True si el usuario no puede editar este campo, de lo contrario False .
required: True si el campo debe tener un valor antes de que el objeto puede ser salvado, de lo contrario False .
size: El tamaño del campo en la base de datos: número de caracteres o dígitos. Para los campos de tipo Char.
states: Permite anular otros parámetros para los estados específicos de este objeto. Acepta un diccionario con los nombres de los estados como claves y una lista de nombres / valores tuplas como los valores. Por ejemplo: states = {'done': [('readonly', True)]}
char: El nombre del campo como debe aparecer en una etiqueta o encabezado de la columna. Cadenas que contienen caracteres no ASCII deben utilizar objetos unicode de Python. Por ejemplo: 'test': fields.boolean (u'Testé ')
translate: True si el contenido de este campo debe ser traducido, de lo contrario False .

OpenERP atributos de objetos

Atributos en la Definicion de Modelos en OpenERP


Objetos Introducción 

Para definir un nuevo objeto, se debe definir una nueva clase Python entonces una instancia de ella. Esta clase debe heredar de la clase OSV en el módulo osv.

Definición de objeto 

La primera línea de la definición de objeto siempre será de la forma:
clase  name_of_the_object ( OSV . OSV ): 
        _name  =  'name.of.the.object' 
        _columns  =  {  ...  } 
        ... 
name_of_the_object ()
Un objeto se define declarando algunos campos con nombres predefinidos en la clase. Dos de ellos son necesarios (_name y _columns), el resto son opcionales. Los campos predefinidos son:

Campos predefinidos 

_auto
Determina si una tabla de PostgreSQL correspondiente debe ser generado automáticamente del objeto. Configuración de _auto en False puede ser útil en caso de objetos OpenERP generados a partir de puntos de vista PostgreSQL. Consulte la sección "Informes de Visitas PostgreSQL" para obtener más detalles.
_columns (requerido)
Se definen los campos que utilizaremos en nuestro Modelo de Datos, al final estos campos se traducen a Columnas en tablas de PostgreSQL.
_constraints
Las restricciones sobre el objeto. Validaciones en Python que aplicamos a la Información que introduce el Usuario.
_sql_constraints
La restricción de SQL en el objeto. Validaciones en SQL que aplicamos a la Información que introduce el Usuario a diferencia de las validaciones en Python estas se aplican en la capa de Datos.
_defaults
Los valores por defecto para algunos de los campos del objeto. Estos valores por defecto aparecen al momento de crear un registro en nuestro Modelo de Datos, se permiten funciones para obtener valores por Default, funciones Lambda, etc...
_inherit
El nombre del objeto osv que el objeto actual hereda. Este solo se utiliza cuando heredamos Modelos o Clases en OpenERP.
_inherits
La lista de objetos OSV el objeto hereda. Esta lista deberá figurar en un diccionario python de la forma: {'name_of_the_parent_object': 'name_of_the_field', ...}. 
_log_access
Determina si el acceso de escritura al recurso debe estar conectado. Si es verdad, se crearán cuatro campos en la tabla de SQL: create_uid, create_date, write_uid, write_date. Estos campos representan, respectivamente, el ID del usuario que creó el registro, la fecha de creación del registro, el identificador del usuario que modificó el registro, y la fecha de la última modificación. Estos datos pueden ser obtenidos usando el método perm_read.
_name (requerido)
Nombre del objeto. Valor predeterminado: Ninguno. Este sera el nombre del Modelo para OpenERP y el que utlizaremos para llamar modelos con el metodo pool.get.
_order
Nombre de los campos que se utilizan para ordenar los resultados de la búsqueda y métodos de lectura.
Valor por defecto: 'id'.
Ejemplos:
_order  =  "nombre" 
_order  =  "date_order desc"
_rec_name
Nombre del campo en el que se almacena el nombre de cada recurso. Valor por defecto: "nombre". Nota: por defecto, el método name_get simplemente devuelve el contenido de este campo.
_sequence
Nombre de la secuencia SQL que administra los identificadores para este objeto. Valor predeterminado: Ninguno.
_sql
Código SQL ejecutado durante la creación del objeto (sólo si _auto es verdadero). Esto significa que el código se ejecuta después de crear la tabla.
_table
Nombre de la tabla SQL. Valor por defecto: (.) ​​El valor del campo _name anterior con los puntos reemplazada por guiones bajos (_).

lunes, 7 de abril de 2014

Utilizar Launchpad Como Controlador de Versiones OPENERP

Crear y Asociar una Cuenta Launchpad para Subir Proyectos ...




    Launchpad es el manejador que utlizamos por defecto en proyectos con OpenERP, tambien existen otras opciones como es GIT, entre otros, pero en este tutorial enseñare como crear su propia llave y ligarla con una cuenta en Launchpad.


1) Tener una cuenta de "www.launchpad.net"

    Como primer paso tenemos que registrarnos creando una cuenta en la plataforma Launchpad, es totalmente Gratuito y no Ofrece todos los beneficios para controlar Nuestros Proyectos.

2) Asociar cuenta launchpad con bazar a la pc actual

       Tenemos que abrir una terminal en nuestro Linux y escribir la siguiente Linea.

bzr whoami "NombreIdentificador <nombre@hesatecnica.com>"

       Con esta Linea tenemos que cambiar el Nombre del Identificador por el de nuestra cuenta launchpad por ejemplo con mi ID quedaria bzr whoami "german-ponce <german.ponce@h....>" al final el correo con el que creamos nuestra Cuenta.

martes, 11 de marzo de 2014

Instalacion Odoo (OPENERP) 8.0 Linux, Ubuntu 12.x , Ubuntu 13.10 y Ubuntu Server



Que tal buenas tardes a todos en este tutorial enseñare como instalar Odoo (OpenERP) en Ubuntu 13.04, aplica tambien para 13.10 y otras distribuciones de Linux como Debian, Linux Mint, entre otras.....

Si alguno no sabe que es  Odoo (OpenERP) ó que es un ERP aquí esta el concepto:

"OpenERP es un conjunto de soluciones integradas para gestión empresarial.
OpenERP automatiza y simplifica los procesos de negocio con la cadena de suministro, con la cadena logística, con la gestión de los clientes, con la lógica financiera, con los recursos humanos de la empresa... y  definitiva con todas y cada una de las áreas inherentes a cualquier modelo de negocio. Bajo licencia libre, multiplataforma y con posibilidad de uso bien mediante interfaz web o aplicación de escritorio, la información y la gestión empresarial siempre están accesibles desde cualquier lugar."

miércoles, 5 de febrero de 2014

Crear Reportes Jasper Reports con Conexion a Base de Datos en Odoo (OpenERP 8.0)


Creando Query SQL para Generar un Reporte

Centered Popup
    Para crear Reportes en Jasper Reports y retomando los Post Anteriores, tenemos 2 Opciones una de ellas es haciendo conexion directa a la Base de Datos y la Otra generando un archivo XML, en este post vamos a conocer como generar un reporte utilizando un Query.

01. Lo primero y mas importante es tener instalado el Modulo Jasper Reports en Nuesta Base OPENERP y tambien tener instalado el JDK de Oracle ó en su defecto el OpenJDK.


02. Abrimos el iReport y Creamos una Nueva Conexión:


Jasper Reports y Odoo (OpenERP 8.0) Parte 02

02. INSTALACION DEL MODULO JASPER REPORTS EN  ODOO (OPENERP 8.0)

01. Como primer paso para la instalación del modulo de Jasper Reports tenemos que descargar Jasper Reports de alguno de los siguientes enlaces:

    - bzr branch lp:~german-ponce/+junk/jasper_reports
    - bzr branch lp:openobject-jasper-reports/7.0 jasper_reports

02. Copiar la carpeta jasper_report (que se acabó de descargar) en el directorio addons de openerp:



03. Desde OpenERP tenemos que actualizar la lista de módulos para que detecte el nuevo modulo que acabamos de insertar, para ello tenemos que ir al menú inicio de OpenERP -> Módulos -> Actualizar lista de módulos:


A mi me aparece de esa forma por que ya lo tengo instalado en su caso le darán click al Botón Instalar.

Jasper Reports y Odoo (OpenERP 8.0) Parte 01

01. PREPARACION DEL ENTORNO JASPER REPORTS UBUNTU (LINUX)


DATOS TECNICOS JASPER REPORTS

    Jasper Reports es una herramienta de creación de informes que tiene la habilidad de poder visualizar el resultado de nuestro reporte en nuestro monitor, a la impresora o a ficheros PDF, HTML, XLS, CSV y XML.

    Está escrito completamente en Java y puede ser usado en gran variedad de aplicaciones de Java, incluyendo J2EE o aplicaciones web, para generar contenido dinámico. Su propósito principal es ayudar a crear documentos de tipo páginas (Reportes), preparados para imprimir en una forma simple y flexible.
    Jasper Reports se usa comúnmente con iReport, un front-end gráfico de código abierto para la edición de informes. Se encuentra bajo licencia libre GNU, por lo que es Software libre. Forma parte de la iniciativa apilada open source Lisog.
    En la integración con Jasper Report como una opción para generar reportes en OpenERP que permitiera tener más control sobre el reporte que estaba generando, se opta por crear un modulo que permitiera la integración de OpenERP y Jasper Report, así es como gracias a NaN-Tic se desarrolla un
modulo que permitiera generar reportes a partir de archivos XML (data set) que se generan a partir del modulo mediante OpenERP y en el cual Jasper Report pudiera traducir la información necesaria y obtener la salida de un Reporte en distintos formatos, para el diseño de los reportes se opto por iReport 3.7.6 como la más estable para la creación de nuestros Reportes.

    Básicamente el modulo genera un documento XML (data set) con las rutas de nuestra información, al crear un Reporte con iReport tomamos estas rutas de información y las colocamos en nuestro reporte, al guardar nuestro reporte se guarda con una extension .jrxml, el modulo instalado en OpenERP toma este
archivo generado .jrxml y traduce la información al formato creado y como resultado tenemos un reporte estilizado y funcional.

PREPARACION DE LA INSTALACION JDK EN UBUNTU

Como observamos en la descripción Jasper Reports utiliza la tecnología Java para compilar y correr sus aplicaciones, por lo consiguiente tenemos que instalar el Kit de desarrollo de Java para poder compilar nuestros reportes, en Ubuntu instalamos el kit siguiendo los pasos que a continuación se describen.

01. Iniciamos abriendo una terminal en Ubuntu o pulsamos la combinación:

Alt+Ctrl+T:


02. Tecleamos el siguiente comando para instalar el JDK:

viernes, 31 de enero de 2014

Corregir Error Time Zone en Odoo (OpenERP 8.0)

Corregir el Error de la Zona Horario en Odoo (OpenERP 8.0)


    Se que muchos habrán notado que al crear registros después de las 6:00 PM los campos de Fecha/Fecha y Hora suelen cambiar para el siguiente día, esto es debido a que el ORM de OPEN utiliza el tipo de fecha y hora llamado 'UTC' en base de Datos, para corregir este error tenemos que hacer lo siguiente:

Tenemos que corregir el Archivo fields.py

Este archivo se localiza en la ruta server/openerp/osv/fields.py

Dentro del Archivo buscar 'UTC' y reemplazarlo por 'SCT'


Nota: 

Esto se Repite con todas las coincidencias que encuentre en el editor en ese archivo fields.py

Adicional a esto es muy importante indicar nuestra zona horaria en la variable de este archivo:

utc = pytz.timezone('UTC')

Aqui debemos indicar la zona horaria de nuestra preferencia, por ejemplo:


utc = pytz.timezone('America/Mexico_City')

 Una vez hecho esto guardamos, reiniciamos el server de Odoo (OPENERP 8.0) é intentamos nuevamente crear los Registros y vamos a poder observar que ahora se insertan correctamente los campos de Fecha y Hora.

lunes, 27 de enero de 2014

Crear Demonio de Arranque Odoo (OPENERP 8.0)

Hacer Funcionar Odoo (OPENERP 8.0) como un Servicio del Sistema

    Para que openerp-server pueda funcionar como un servicio de cualquier S.O. en Linux tenemos que entrar en la ruta:

/etc/init.d/

    Dentro de esta ruta debemos crear nuestro demonio le pondremos como nombre openerp-server-70 como referencia que es la versión 7.0 de OPENERP, y así poder tener distintos demonios para versiones diferentes,  para crear el archivo usamos el comando:

sudo nano openerp-server

    Damos Ctrl+O y Enter para guardar el archivo ahora tendremos en la ruta /etc/init.d nuestro demonio openerp-server-70, como la siguiente imagen:


viernes, 24 de enero de 2014

Redes Sociales en nuestros Modelos en OpenERP 7.0 y Odoo (OpenERP 8.0)

Agregar Redes Sociales en OpenERP 7.0 y Odoo (OpenERP 8.0)



    Desde la Versión 7.0 de OpenERP podemos observar en el pie de cualquier formulario la parte de Redes Sociales que de alguna manera de da un Plus a cualquier modelo de datos, para que podamos tener esa aplicación al momento de crear nuestros módulos en OpenERP tendríamos que agregar en nuestras clases el código siguiente:

1.- En la declaracion de nuestra Clase OSV tendriamos que agregar la linea:

    _inherit = ['mail.thread', 'ir.needaction_mixin'] ### Redes Sociales
  

lunes, 20 de enero de 2014

ENTENTIENDO LOS WORLFLOWS EN ODoo (OPENERP)

WORKFLOWS (FLUJOS DE TRABAJO).


    Los flujos de trabajo pueden ser asociados a cualquier objeto en OpenERP, y son enteramente personalizables.

Se utilizan para estructurar, y gestionar los ciclos de vida de objetos, y documentos.
Definiendo transiciones, trigger (eventos), etc. etc. con herramientas gráficas.
Como de costumbre, los flujos de trabajo, sus actividades (acciones o nodos), y sus transiciones (condiciones), se declaran como un fichero XML.

HERENCIA DE VISTAS Odoo (OPENERP)

HERENCIA DE VISTAS.

Igual que podemos heredar objetos, también podemos heredar vistas de la siguiente manera:
<?xml version="1.0" encoding="UTF­8"?>
<openerp>
   <data>
<!­­--

id='res_partner_xxxxx_form_view_inh'
 
Este es el nuevo identificador que identifica a la vista que estamos  definiendo. Tener en cuenta que termina en 'form_view_inh', esto lo hacemos por norma, para identificar que esta vista, es una vista que
hereda De otra.
'name': Mismo nombre que el ID pero separado por '.'
'res.partner': Objeto al que pertenece la vista de la cuál estamos  heredando.
'inherid_id': Aquí le indicamos el ID de la vista que estamos heredando. La '<carpetapadre> es la primera carpeta que se encuentra  en ADDONS, en la cuál se encuentra el fichero xml, en el que está
definida la vista.
-->

<record model="ir.ui.view" id="res_partner_form_view_inh">
      <field name="name">res.partner.form.view.inh</field>
      <field name="model">res.partner</field>
      <field name="type">form</field>
      <field name="inherit_id" ref="carpetapadre.idVistaPadre" />
      <field name="arch" type="xml">
 
         <field name="campoareemplazar" position="after">
 
                  <field name="nuevocampo" />
         </field>
         <notebook position="inside">
               <page string="Literal para la nueva pestaña">
                  <group col="2" colspan="2">
                        <separator string="Literal del separador" colspan="2"/>
                        <field name="nuevocampo2"/>
                        <field name="nuevocampo3" nolabel="1"/>
                  </group>
               </page>
         </notebook>
   </field>
   </record>
   </data>
</openerp>

RELACIONES ENTRE OBJETOS.

MANEJO DE CAMPOS RELACIONALES EN Odoo (OPENERP)


one2many (de uno a muchos).

Una relación de uno a muchos sería por ejemplo la relación entre autores y libros. Un autor puede tener escritos varios libros, y varios libros pueden pertenecer a un autor. La relación sería de 1 a N.

Ejemplo de definición de la clase autor:

class mybookstore_author(osv.osv):
   _name ='mybookstore.author'
   _description ='Autores'
   _columns= {
      'name': fields.char('Name', size=64, required="True"),
      'active': fields.boolean('Active'),
      'book_ids': fields.one2many('mybookstore.book', 'author_id', 'Books'),
   }

mybookstore_author()

Atributos en Formularios de Odoo (OPENERP)

ATRIBUTOS DEL ELEMENTO DE FORMULARIO <FIELD>


attrs (condiciones de solo lectura, invisible, y requerido).

Cuando definimos un atributo 'attr' a un campo <field>, estamos definiendo una condición.

          Las condiciones que podemos definir es que el campo sea solo de lectura, requerido, o invisible.
Supongamos que tenemos definido en nuestro archivo de Phyton una clase con los siguientes campos:

'historial': fields.boolean('Historial', help="Marque casilla si historial"),
'historial_desc': fields.char('Description', size=64),

Y en la vista, esta es la definición de los campos:

<field name="historial"/>
<field name="historial_desc" attrs="{'invisible': [('historial, '=', False)]}"/>

El campo 'historial_desc' será invisible si el campo 'historial' (booleano) es igual a 'False'.

on_change (trigger que ejecuta una función cuando el valor del campo cambia).


    Cuando el valor del 'field' cambia, automáticamente ejecuta la función que definamos en el atributo 'onchange'. La funcion 'onchange' SIEMPRE DEVUELVE EL PARAMETRO 'value'.

Ejemplo:

<field name="historial"/>
<field name="historial_des" on_change="onchange_historial_des(historial_desc)"     attrs="{'invisible': [('historial', '=', False)]}"/>

Cuando el valor del campo 'onchange_historial_desc'. 'historial_desc' cambie, ejecutaremos la función :

def onchange_historial_desc(self, cr, uid, ids, historial_desc, context={}):
    res = {}
    for xxxx in self.browse(cr, uid, ids):
            res = {
                'historial_desc': (xxxx.historial_desc or '') + _('\n') +  (historial_desc or ''),
            }
        return {'value': res}

    En esta primera opción, no estoy haciendo caso al parámetro 'historial_des', ya que en este campo no viene un ID, sino un texto. Por lo tanto, hago referencia al parámetro de entrada 'ids'.

Opción 2 de la función:

def onchange_historial_des(self, cr, uid, ids, historial_id, context={}):
    res = {}
    if historial_id:
       xx_obj = self.pool.get('xxxx')
       xx = xxxx_obj.browse(cr, uid, historial_id)
       res = {
                'historial_des': (xxxx.historial_desc or '') + _('\n') +  (historial_des or ''),
          }
       return {'value': res

Como Funciona la Herencia en Odoo (OpenERP)


HERENCIA DE CLASES Y METODOS Odoo (OPENERP)

_inherit (Herencia de objetos).

    Al hacer referencia a este atributo, hacemos referencia a la HERENCIA. Un hijo hereda
todos los campos, y funciones de su padre.

Ejemplo: 

    Como todos sabemos, existe una clase que se llama “res.partner”. En el siguiente ejemplo vamos a crear una nueva clase que herede de “res.partner”. A esta nueva clase le añadiremos 2 Campos uno para Identificar que elementos de "res.partner" (Clientes/Proveedores) tienen facebook y cual seria el facebook de dichos registros:

 Esta sería la declaración de la nueva clase:

class res_partner(osv.osv):

<!--­­ Aqui indico el atributo 'name' del Objeto Padre ­­-->

_inherit ='res.partner'
     
<!--­­ Nuevo campo que voy a añadir al Objeto res.partner ­­-->
   
_columns= {
    'facebook': fields.boolean('Facebook'),
    'facebook_description': fields.boolean('URL Facebook'),
}
 
res_partner()

 Heredar funciones, y llamar a funciones padre con SUPER.

     A veces nos puede interesar heredar una función de una clase, para poder modificarla. Vamos a poner como ejemplo la función 'onchange_xxxxx' que está definida en la clase 'mi.clase'.

       Esta función se ejecuta cada vez que cambiemos el id de “mi.clase”, así que imaginemos que queremos cambiar el funcionamiento de dicha función. Teniendo en cuenta que en mi.clase existe la función onchange_xxxxx(self, cr, uid, ids, part), vamos a ver el siguiente ejemplo:

class mi_clase(osv.osv):

    <!--­­ HEREDAMOS DE LA CLASE ­­-->

    _inherit = 'mi.clase'

    <!--­­ DECLARAMOS OTRA VEZ LA FUNCIÓN QUE VAMOS A MODIFICAR --­­>
 
    def onchange_xxxxx(self, cr, uid, ids, part):
        value = {}
        miclase_obj = self.pool.get('mi.clase')

  <!­­-- LLAMAMOS A LA FUNCION PADRE ­­-->

  <!­­-- super(mi_clase,self): De esta manera llamamos a la función padre.   Hay que pasarle 2 parámetro: la clase padre, y 'self' ­­ -->

        res = super(mi_clase, self).onchange_xxxxx(cr, uid, ids, part)
        value = res['value']
        if part:
            miclase = miclase_obj.browse(cr, uid, part)

<!--­­  Modificamos 'value', si en value existe 'client_order_ref'  modifica su valor, si no existe, lo crea  dentro de value  -->
            value.update({
               'client_order_ref': miclase.name,
            })
  <!­­ La función 'onchange' siempre devuelve un value ­­>

return {'value': value}
 
sale_order()

lunes, 13 de enero de 2014

Reglas en Odoo (OpenERP) utilizando campos Many2Many y One2Many



Reglas con Campos Many2Many y One2Many


    Durante la creación de Reglas para Grupos en OpenERP en ocasiones tenemos que utilizar  campos many2many ó one2many para comparar que un valor se encuentre dentro de una lista de valores.

    Por ejemplo cuando trabajamos en un entorno Multicompañia en OpenERP en ocasiones tenemos errores durante el manejo de Modelos que tengan Acceso a campos que utilicen la campos con referencia a compañía, por ejemplo si queremos la comprobación de que un elemento se encuentra dentro de una lista ó que un campo compañia se encuentre dentro del campo company_ids que se encuentra en Usuarios y que contiene una lista de compañias a las cuales el usuario puede tener acceso, tendríamos que agregar en la creación de regla el dominio siguiente:

[('company_id','in',[x.id for x in user.company_ids])]

 - company_id: Es el campo que encuentra en el modelo OpenERP al cual quiero ligar con mi regla.

 - in: Es el la palabra reservada para comparar que un elemento se encuentra dentro de una lista.

 - [x.id for x in user.company_ids]: En esta linea  utilizamos un poco de código Python para crear una lista con los valores para la comparación de mi dominio, x.id es el valor obtenido de un ciclo for utilizando una variable x para la iterar dentro de el campo user.company_ids que contiene la relación many2many con el modelo de compañia. Al Final nos quedaría en ejecución algo como lo siguiente [('10','in',[1,5,15,10,25,35,2])], esto da como resultado True o False depensiendo si el valor 10 se encuentra dentro de los valores 1, 5, 15, 10, 25, 35, 2. A este proceso se le conoce en Python como Listas de Comprensión 


jueves, 9 de enero de 2014

Manejo de Campos many2many en Odoo (OPENERP)

Manejo de Campos many2many 



    En OPENERP es muy común que encontrásemos en el código de algunos módulos la utilización de campos relacionales may2many, los cuales contienen la siguiente sintaxis:

(0, 0, { fields }) Crear nuevos registros con la lista de campos.
(1, ID, { fields }) Modificar la lista de campos.
(2, ID) Borrar un id de la relación many2many.
(3, ID) Quitar (desvincular) un id de la relación manay2many.
(4, ID) Vincular un id
(5, ID) Desvincular todas las veces que aparece un id
(6,?, IDS) Establecer una lista de enlaces

    Por ejemplo para enlazar los impuestos de un producto al crear una linea en pedidos de venta o en lineas de factura nuestros valores quedarían de la siguiente manera:

pedido_padre_id = 65
product_obj = self.pool.get('product.product')
product_id = product_obj.search(cr, uid, [('name','=','Soda 2.5 Litros')])
product_browse = product_obj.browse(cr, uid, product_id, context=None)[0]

 linea_venta = {
                'product_id'           :  product_browse.id,
                'product_uom_qty' :  1,
                'product_uom'     : product_browse.uom_id.id,
                'product_uos_qty' : 1,
                'price_unit'          : product_browse.list_price,
                'name'                 : product_browse.name,
                'type'                   : 'make_to_stock',
                'default_code'      : product_browse.default_code,
                'tax_id'                : [(6, 0, [x.id for x in line.product_id.taxes_id])],
                'order_id'             :  pedido_padre_id,
            })

 order_line_id = self.pool.get('sale.order.line').create(cr, uid, linea_venta, context=None)

   Que pasa en este ejemplo estoy creando una linea para el pedido de venta con el ID 65 en la cual estoy pasando la información del producto 'Soda de 2.5 Litros' hacia mi linea, el punto mas importante en este ejemplo ó la que estamos estudiando es  'tax_id' : [(6, 0, [x.id for x in line.product_id.taxes_id])], que estamos haciendo en esta parte del código, estamos enlazando los impuestos del producto anterior en mi linea de pedido, ésto nos evita que nosotros realicemos la creación de cada impuesto al momento de mandar cada linea a un pedido de venta.
    

miércoles, 8 de enero de 2014

Métodos ORM Básicos para Programar Modulos en Odoo (OpenERP)

Métodos ORM básicos (Crear, Buscar, Leer, Actualizar y Borrar)

Método create

Sintaxis

create (cr, uid, values, context=None)

Crea un nuevo registro con los valores especificados. Parámetros específicos:

values: Diccionario con los valores de los campos para el nuevo registro.

Devuelve el id del registro creado. Puede generar los siguientes errores:

AccessError: Si el usuario no tiene permisos de escritura en el objeto solicitado, o si el usuario intenta
ignorar las reglas de acceso para crear el objeto solicitado.

ValidateError: Si el usuario intenta introducir un valor inválido para un campo que no está en la
selección.

UserError: Si se crease un bucle en una estructura de objetos jerárquica como resultado de la operación (como establecer un objeto como su propio padre).

Por ejemplo para crear un producto tendriamos que generar el diccionario con los valores necesarios, principalmente los que son requeridos por el Modelo:

product_obj = self.pool.get('product.product')

product_vals = {
                         'name': 'Producto X',
                         'type': 'product' ,
                         'list_price': 45.00,
                         'procure_method': 'make_to_stock',
                         }

product_create_id = product_obj.create(cr, uid, product_vals, context=None)

Parámetros comunes a la mayoría de métodos ORM en Odoo (OPENERP)



La mayoría de métodos ORM tiene una serie de parámetros comunes a todos ellos:

  •cr: Cursor de la base de datos
  •uid: Identificador del usuario actual
  •ids: Lista de enteros con los identificadores de los registros (o lista con un único entero cuando hay       sólo un id)
  •context: Diccionario con los argumentos de contexto, como idioma, zona horaria, ...

    Al definir nuestros modelos como herencia de la clase osv.osv permite que todos los métodos de ORM estén disponibles para la programación de los módulos. Estos métodos pueden ser invocados por los propios objetos, dentro de la clase Python, o desde fuera de la clase, obteniendo en primer lugar una instancia a través del concentrador (pooler) del sistema de ORM.

Contexto de los métodos ORM


    En OpenObject, el contexto tiene datos muy importantes, como el idioma en que se debe escribir un documento, si el campo de una función necesita actualizarse o no, ...

    Cuando se efectúa una llamada a un método ORM, es probable que el objeto ya tenga un contexto y el OpenObject lo proporcione como un parámetro en casi todos los métodos. Si el objeto tiene un contexto, es muy importante que siempre se pase el mismo a todos los métodos a los que se llame.

    Esta regla también es aplicable a los métodos ORM que escriba un programador. El programador debe esperar recibir un contexto como parámetro en todos los métodos que desee llamar, y siempre debe pasar el contexto a todos los métodos a los que llame.


lunes, 6 de enero de 2014

INSTALACION DE OPENERP 7.0 EN UBUNTU, UBUNTU SERVER, 12.X y 13.X


OpenERP Logo
Que tal buenas tardes a todos en este tutorial enseñare como instalar OpenERP en Ubuntu 12.04, aplica tambien para 12.10 y otras distribuciones de Linux como Debian, Linux Mint, entre otras.....

Si alguno no sabe que es OpenERP o un ERP aqui esta el concepto:

"OpenERP es un conjunto de soluciones integradas para gestión empresarial.
OpenERP automatiza y simplifica los procesos de negocio con la cadena de suministro, con la cadena logística, con la gestión de los clientes, con la lógica financiera, con los recursos humanos de la empresa... y  definitiva con todas y cada una de las áreas inherentes a cualquier modelo de negocio. Bajo licencia libre, multiplataforma y con posibilidad de uso bien mediante interfaz web o aplicación de escritorio, la información y la gestión empresarial siempre están accesibles desde cualquier lugar."

Realizar Respaldo y Restauración Base de Datos de OpenERP 7.0 desde Terminal o Linea de Comandos Utilizando PostgreSQL 9.1 y 9.2

Que tal muy buenas tardes en este tutorial explicaremos como poder realizar un backup o respaldo y restauracion de nuestra base de datos de openerp con postgresql. Antes que nada utilzaremos el comando pg_dump podemos informanos un poco mas en el siguiente enlace:

  http://www.postgresql.org/docs/9.1/static/app-pgdump.html

 Para realizar un respaldo o también conocido como backup de nuestras base de datos de OpenERP mediante postgrest mediante terminal ejecutaremos el siguiente comando en donde especificaremos la base de datos a restaurar en este caso se nombro TMS, el usuario despues de la letra -U en este caso mi usuario de postgres relacionado con openerp se nombro durante mi instalacion como openerp70, en la letra -h definimos el servidor de nuestra instalacion de openerp en este caso ejecutamos el comando localmente asi que nuestro servidor local por defecto seria localhost, despues insertamos el puerto que utiliza nuestro servicio despues de la leta -p en este caso por defecto utiliza openerp el puerto 5432 y por ultimo especificamos la ruta donde guardara el archivo de restauracion de nuestra base de datos en este caso la ruta de utilizacion fue /opt/openerp y de ahí el nombre con el que se guardara nuestro respaldo en este caso el nombre utilizado es dbbackup tambien podemos añadir que se comprima nuestra base de datos agregandole -Z y un numero de compresion de archivos que va del rango 1 a 9, el numero 9 seria la compresion maxima de un archivo, al fina de la ruta solo se le agrega .gz a tu backup y listo!!!!

 En este caso lo realizare sin la compresion, quedando asi el siguiente comando: pg_dump TMS -Fp -U openerp70 -h localhost -p 5432 > /opt/openerp/dbbackup

  Nota: El comando pg_dump se ejecuta fuera del superusuario de postgres...

Agregar nuevos campos en formularios OpenERP 7 sin necesidad de crear modulos

AGREGAR CAMPOS EN PEDIDO DE VENTA

     OpenERP tiene la facilidad y flexibilidad de poder agregarle nuevos campos a cualquier formulario de cualquier modulo directamente en el servicio sin necesidad de crear un modulo que realice esto, esto es muy eficiente y de mucha ayuda al momento de implementar OpenERP, ya que en ocasiones los campos que contienen los modulo no satisfagan nuestras necesidades, por ejemplo en pedido de venta necesitamos un nuevo campo denominado detalles de la venta este campo contendra hasta 200 caracteres para realizar esto realizaremos lo siguiente:

Entramos a OpenERP mediante nuestro navegador web y nos dirigirnos a la siguiente ruta:

Configuración --> Personalizacion --> Estructura de la Base de Datos --> Modelos



Campos Funcionales con OpenERP

En OpenERP un campo funcional es un campo cuyo valor no sera definido por el usuario sino el resultado de una funcion (estos campos no se guardan en base de datos ). En ocasiones, para aumentar la velocidad de consulta de OpenERP y facilitar las búsquedas, los campos funcionales también pueden ser guardados en la base de datos aunque siempre son calculados/actualizados por una o varias funciones y no por el usuario
.
La estructura de un campo funcional es la Siguiente:
fields.function(fnct, arg=None, fnct_inv=None, fnct_inv_arg=None, type="float, fnct_search=None, obj=None, method=False, store=False, multi=False,...)

Desarrollo de modulos para OpenERP 6.1, 7.0, 8.0

El desarrollo de modulos en OpenERP esta basado en el modelo MVC (Modelo Vista Controlador) y  ORM como su mapeo relacional de objetos, utilizando Python como lenguaje de programacion base y XML para poder generar las vistas de nuestro modulo, PostgreSQL como nuestro gestor de bases de datos, para programar modulos en OpenERP, no se necesita ser un experto en Python, simplemente con entender la base de Python, el manejo de las listas, tuplas y diccionarios y la definicion de funciones.
Para poder desarrollar modulos para OpenERP es necesario conocer un poco sobre el ORM ya que OpenERP tiene sus propias reglas para el desarrollo de sus modulos, una estructura necesaria para que nuestro modulo pueda ser instalado dentro de nuestro OpenERP, para el manejo de nuestras versiones de OpenERP utilizamos Launchpad (https://launchpad.net/) como sitio web y aplicacion web para poder mantener el versionamiento de nuestro modulo o modulos en desarrollo, y asi poder cooperar con la comunidad de software libre.
El siguiente video es desarrollado por el Ing. Israel Cruz Argil donde se trata de mostrar el desarrollo de un modulo OpenERP tocando algunos de los puntos anteriores:

Si necesitan mas informacion sobre etiquetas de XML para las estructuras de vistas para nuestro modulo visiten: http://doc.openerp.com/v6.1/developer/index.html#book-develop-link

Idioma Personalizado para OpenERP

Idioma Personalizado OpenERP
Como ya conocemos OpenERP es un sistema demasiado flexible, nos permite editar vistas, objetos directamente en el sistema, basándonos en esta "propiedad" de OpenERP podemos definir una Traducción Personalizada de nuestro Idioma, ya que en ocasiones la traducción por defecto en OpenERP no es muy clara o algunas palabras están traducidas a un nivel estándar  para solucionar este problema podemos generar una Traducción propia para que posteriormente pudiéramos reutilizarla o en su caso compartirla con la comunidad de OpenERP.

Instalación de Jasper Reports en OpenERP 7.0

El manejo de Reportes con Jasper Reports en OpenERP se dejo a un lado desde la versión 7.0 pero es una excelente opción al momento de crear reportes para cualquier modelo de OpenERP, para ello de ah modificado el Modulo Jasper Reports para hacerlo compatible con la versión 7.0 del ERP. Si no conocen sobre Jasper Reports les recomiendo el siguiente enlace:

Restricciones en OpenERP mediante PostgreSQL

En OpenERP existen 2 Tipos de principales para validar la información que esta introduciendo el usuario contra la contenida en el sistema, ya sea contra la hora del sistema o algún formato necesario para la información, etc., estos tipos de validación serian:
 - Mediante funciones Python: Este tipo de restricción se realiza mediante funciones python.
 - Mediante restricciones de la Base de Datos(SQL Constraint): Este tipo de restricción se define en la clase a la cual se aplicara o la tabla a la cual se estará validando que los datos cumplan con los requisitos que definimos, por ejemplo si queremos que el campo nombre de un producto sea único tendríamos que tener esta restricción en mi clase.
Restricciones con Funciones Python