Cargando el padrón de percepciones/retenciones en Odoo, usando el comando copy

Gustavo Orrillo
- 28/08/2022 - 2 min. de lectura

Cargar los padrones de  retenciones/percepciones en Odoo es algo a lo que le dedicamos bastante tiempo. Por varios motivos, el principal creo yo que es el tiempo que nos lleva cargar dicho padrón. Para darles un ejemplo, cargar el padrón de ARBA de percepciones lleva por lo menos una hora, y no es una tarea que podamos dejar a los usuarios finales (por razones obvias).

 A lo largo del tiempo le dedicamos espacio en nuestro blog debido a que es un problema interesante y porque nos gusta compartir lo que vamos aprendiendo. Lo hicimos indicando como se carga el padrón de AFIP, en el que hablamos como se usa el método load. Ahora vamos a hablar de como se utiliza el comando COPY de PostgreSQL para cargar el padrón (hice pruebas de carga del padrón de ARBA con el método load y tardó practicamente una hora)

El comando COPY es un comando de PostgreSQL que nos permite hacer bulk loading de archivos en la base de datos. El bulk loading es el método favorito para importar cantidades masivas de datos en una tabla de una base de datos. En nuestro caso, queremos probar cuanto tiempo se tarda en cargar un archivo simulado de cuatro millones de registros. 

Primero vamos a crear un archivo CSV con cuatro millones de registros. Para ello vamos a usar un script de Python para simular los cuatro millones de registros, con su respectivo CUIT (simulado también) y un número random que haga de porcentaje de percepción:

#!/usr/bin/python3
import csv
from random import random
f = open('padron.csv','w')
csv_writer = csv.writer(f,delimiter=';')
for i in range(4000000):
    print(i,(i/4000000)*100)
    data = ['2022-08-28','30'+str(i).zfill(8) + '7',round(random(),2)]
    csv_writer.writerow(data)
f.close()

Paso seguido, mediante psql creamos la tabla de padron

create table padron (
    fecha date, 
    cuit varchar(15),
    percent float);

Seguidamente, pasamos a cargar el archivo de padrón en la tabla creada anteriormente mediante el comando COPY

copy padron(fecha,cuit,percent) from '/home/gustavo/work/temp/padron/padron.csv' with delimiter ';';

En el cual indicamos que vamos a cargar las columnas fecha, cuit y percent de la tabla padrón a partir del archivo indicado en el parámetro from. También indicamos el delimitador.


Como verán, se tardó no más de 15 segundos para cargar cuatro millones de registros. Muy impresionante.

Esta herramienta debe integrarse mediante un módulo que cargue en una tabla que no esté mapeada por el ORM (no queremos lidiar con el overhead que este agrega a los millones de registros que necesitamos registrar) los datos del padrón por medio de la sentencia COPY. Ya es mucho más manejable que hacerlo mediante el ORM o mediante la sentencia INSERT de PostgreSQL. Y manejable desde el mismo Odoo por medio de la función execute que brinda el framework. Por último, las percepciones de los clientes o retenciones de los proveedores podrán cargarse en el modelo res.partner mediante la sentencia SELECT de SQL, la cual podrá ejecutarse mediante la función execute. 

Acerca de:

Gustavo Orrillo

Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.