Importar y sincronizar datos en Odoo
¿Tienes datos en aplicaciones externas que te gustaría importar a Odoo?
¿Te gustaría mantener los datos de Odoo actualizados automáticamente?
En este proyecto detallamos como conseguir sincronizar con Odoo los datos desde una base de datos externa de MSSQL mediante una conexión ODBC.
Para este ejemplo hemos utilizado Odoo v10 en un servidor Ubuntu 16.04
Instalación de módulos
Para el proyecto utilizaremos los siguientes módulos de OCA disponibles para Odoo v10.
Este último módulo para la importación de datos, aún no ha sido migrado por OCA, pero lo podéis encontrar en el siguiente repositorio ya migrado para la v10.
External Database Sources
Nombre Técnico:base_external_dbsource
Dependencias:base
Este módulo permite definir conexiones externas con diferentes bases de datos usando ODBC, Firebird, Oracle o SQLAlchemy.
External Database Source - SQLite
Nombre Técnico:base_external_dbsource_sqlite
Dependencias:base_external_dbsource
Este módulo extiende el modulo ‘base_external_dbsource’, permitiendo conectar con una base de datos SQLite utilizando SQLAlchemy.
Necesitamos instalar en nuestro sistema la librería de Python ‘sqlalchemy’:
# pip install sqlalchemy
External Database Source – MSSQL
Nombre Técnico:base_external_dbsource_mssql
Dependencias:base_extternal_dbsource_sqlite
Este módulo extiende el modulo ‘base_external_dbsource’, permitiendo conectar con bases de datos externas MSSQL usando SQLAlchemy.
Necesitamos instalar las siguientes dependencias en nuestro sistema:
- Librería de Python pymssql
- El controlador FreeTDS (con el paquete tdsodbc)
# pip install pymssql
# apt-get install freetds-dev freetds-bin tdsodbc
External Database Source - ODBC
Nombre Técnico:base_external_dbsource_odbc
Dependencias:base_external_dbsource_sqlite
Este módulo extiende el modulo ‘base_external_dbsource’, permitiendo conectar con bases de datos externas mediante ODBC usando la librería de Python PyODBC.
pyodbc
Es un módulo de código abierto para conectar con bases de datos mediante ODBC. La instalación de este módulo requiere la instalación previa de unos componentes para que la compilación sea correcta.
Puedes consultar más información en https://github.com/mkleehammer/pyodbc
En nuestro Ubuntu 16.04 instalamos estos componentes con los siguientes comandos:
# apt-get install unixodbc-dev
# pip install pyodbc
Microsoft ODBC Driver for SQL Server on Linux and macOS
Como nuestra intención es conectarnos a una base de datos de Microsoft SQL debemos instalar el driver ODBC adecuado para conectar con dicho motor de bases de datos.
Mas información: Installing the Microsoft ODBC Driver for SQL Server on Linux and macOS
Según la documentación de Microsoft debemos cumplir las siguientes dependencias en nuestro servidor Ubuntu 16.04. Si faltara alguna de ellas, o fuera de una versión inferior a la indicada deberemos instalarla o actualizarla en nuestro sistema.
- libc6 (>= 2.21)
- libstdc++6 (>= 4.9)
- libkrb5-3
- libcurl3
- openssl
- debconf (>= 0.5)
- unixodbc (>= 2.3.1-1)
Ahora vamos a instalar el driver ODBC de Microsoft descargandolo de la Web el driver mas reciente a fecha de hoy.
- Url de publicación del driver: https://packages.microsoft.com/ubuntu/16.04/prod/pool/main/m/msodbcsql/
Con los siguientes comandos en la consola descargaremos e instalaremos el driver en nuestro sistema:
# cd /opt
# wget https://packages.microsoft.com/ubuntu/16.04/prod/pool/main/m/msodbcsql/msodbcsql_13.1.9.1-1_amd64.deb
# dpkg -i msodbcsql_13.1.9.1-1_amd64.deb
ODBC ficheros de configuración odbc.ini y odbcinst.ini:
En los archivos '.ini' de configuración de ODBC se crea la configuración del driver de Microsoft. Si no conocemos la ubicación de los archivos de configuración las podemos averiguar con el siguiente comando.
# odbcinst -j unixODBC 2.3.1 DRIVERS............: /etc/odbcinst.ini SYSTEM DATA SOURCES: /etc/odbc.ini FILE DATA SOURCES..: /etc/ODBCDataSources USER DATA SOURCES..: /root/.odbc.ini SQLULEN Size.......: 8 SQLLEN Size........: 8 SQLSETPOSIROW Size.: 8
Editamos el fichero de configuración odbcinst.ini para ver la configuración del driver ODBD Microsoft. El nombre del driver que vemos entre corchetes, es lo que nos interesa para luego realizar la configuración de la conexión.
[ODBC Driver 13 for SQL Server]
Description=Microsoft ODBC Driver 13 for SQL Server
Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.0
UsageCount=1
Como dato de interés, en el fichero odbc.ini podríamos introducir las conexiones DSN que quisiéramos configurar. En las cuales se configuraría el driver a utilizar y el servidor al que queremos acceder. En nuestro caso no las utilizaremos ya que realizaremos la conexión con todos los parámetros necesarios sin utilizar las DSN.
Si has seguido cuidadosamente todos los pasos anteriores y tienes instalados los módulos y sus dependencias ha llegado el momento de reiniciar el sistema para que los cambios tengan efecto.
Configuración de la conexión con MSSQL
Si todo ha salido bien, dentro de Odoo, podemos realizar la configuración de las conexiones desde:
Configuración > Técnico > Estructura de la base de datos > Database Sources (Crear)
Donde nos deben aparecer todos los tipos de conexiones como muestra la imagen.
En este caso vamos a conectar con un servidor de bases de datos Microsoft SQL Server. La cadena de conexión para un servidor Microsoft SQL Server tiene la siguiente estructura.
Driver={ODBC Driver 13 for SQL Server};Server=MiServidor;PORT=NºPuerto;Database=MiBD;Uid=MiUsuario;Charset=utf8;
NOTA: Es importante el ‘;’ del final de la cadena de conexión. Esto es porque el modulo en su programación añadirá la parte con la contraseña ‘Pwd=MiContraseña’ y no funcionara si no está separada por ';' del resto de parametros.
locale
Al realizar el test de la conexión puede que nos dé un error por la configuración locale en nuestro sistema. En las pruebas incluso el servicio de Odoo se caía y teníamos que reiniciarlo. Para solucionarlo debemos instalar el paquete ‘locales’ y configurarlo con los siguientes comandos en la consola.
# apt-get install locales
# dpkg-reconfigure locales // seleccionamos los siguientes paquetes! en_US.UTF-8 es_ES.UTF-8
La configuración se ha guardado en '/etc/default/locale'. Reiniciamos el sistema para que la configuración tenga efecto.
Podemos ver la configuración de nuestro sistema con el comando 'locale':
# locale LANG=es_ES.UTF-8 LANGUAGE= LC_CTYPE="es_ES.UTF-8" LC_NUMERIC="es_ES.UTF-8" LC_TIME="es_ES.UTF-8" LC_COLLATE="es_ES.UTF-8" LC_MONETARY="es_ES.UTF-8" LC_MESSAGES="es_ES.UTF-8" LC_PAPER="es_ES.UTF-8" LC_NAME="es_ES.UTF-8" LC_ADDRESS="es_ES.UTF-8" LC_TELEPHONE="es_ES.UTF-8" LC_MEASUREMENT="es_ES.UTF-8" LC_IDENTIFICATION="es_ES.UTF-8" LC_ALL=
Después de esta configuración ya nos funciona la conexión con la base de datos Microsoft SQL Server.
ODoo importación de datos desde MSSQL
Una vez tenemos la conexión configurada y testeada instalamos el último de los módulos.
Import data from SQL and ODBC data sources.
Nombre Técnico:base_external_import
Dependencias:base, base_external_dbsource
Este módulo permite impotar datos directamante desde otras bases de datos.
Realizamo la configuración de las importaciones desde:
Configuración > Técnico > Estructura de la base de datos > Import from SQL (Crear)
En la imagen vemos nuestra configuración como ejemplo de importación de clientes:
La configuración de la importación es sencilla, lo único que puede tener algo de complejidad es la consulta SQL que debemos desarrollar. Pongo mi ejemplo de consulta, pero aquí cada uno debe tener conocimientos para desarrollar la suya según sus necesidades.
SQL
SELECT Codigo as "ref", is_company, Razon as "name", Nombre as "comercial", 'True' as "customer", Direccio1 as "street", Direccio2 as "street2", Cpostal as "zip", Localida as "city", Provincia as "state_id", Pais as "country_id", Tlfno_1 as "phone", Tlfno_2 as "mobile", DirEmail as "email", DirWeb as "website", NIF as "vat", comment FROM _OdooClientesEmpresas WHERE lastmodified >= CAST(? as datetime)
Consulta SQL: Detalles técnicos
Valores booleanos Verdadero - Falso
En los campos booleanos pasar la cadena (True o False) no se debe pasar el valor numérico (0 o 1).
referencia interna 'ref'
El campo ref es el más importante y obligatorio.
- Se utiliza como ‘referencia interna’ en la ficha del partner.
- Es importante saber que en la importación, este campo también es utilizado para crear el [XML id] del registro, el cual lo referencia internamente con otros modelos de Odoo. Por ejemplo, un cliente con ref ‘001’ se crearía con el XML-id ‘__import__.res_partner_001’ en la tabla de referencias ‘ir_model_data’. De esta forma Odoo lo identifica inequívocamente y no lo duplicaría en futuras actualizaciones de los datos del cliente.