Importando facturas de compra del IVA Compras

5 de agosto de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

En la página de AFIP uno puede descargarse el archivo con el IVA Compras. Este archivo tiene formato CSV y tiene las facturas de proveedores y de gastos registradas electrónicamente para el CUIT de la empresa. Un ejemplo del archivo de algunas columnas del archivo se ve a continuación:


Donde tenemos los datos suficientes para crear la factura de proveedores. Es ideal para registrar gastos, no así facturas de bienes de cambio o de materia prima ya que no contamos con el detalle de las líneas de las mismas.

Para procesar este archivo, desarrollamos un módulo llamado l10n_ar_iva_import, el cual procesa el archivo, crea sus proveedores (si los mismos no están creados) y crea las facturas (si las mismas no están dadas de alta en el sistema).

Después de instalar el módulo, podemos seleccionar el menú de Importar IVA Compras, el cual nos mostrará un formulario para ingresar el archivo y los productos a utilizar para registrar el monto neto, exento y no gravado de la factura. 


Se da de alta el archivo del IVA (debe ser de formato CSV) y paso seguido se clickea en "Procesar". Este botón creará los proveedores que no se encuentren en el sistema (lo hace chequeando el CUIT) y creará las facturas de proveedores y notas de crédito correspondientes.



Este módulo es util para importar facturas de gastos, las que se complementarían con las facturas de bienes de cambio y de materia prima creadas a partir de las órdenes de compra. Esta es una primera versión del módulo, le falta que le agreguemos un botón para confirmar las facturas. Tambien está pendiente de marcar como pagadas las facturas por medio del módulo bill_autopay.

Anexo técnico

Hay al menos un par de aspectos técnicos que me gustaría describir en este artículo. El primero es como leer un archivo CSV a partir de un campo binario. 

csv_data = base64.b64decode(self.iva_file)
data_file = StringIO(csv_data.decode("utf-8"))
data_file.seek(0)
csv_reader = csv.reader(data_file, delimiter=',')
for i,items in enumerate(csv_reader):

Como pueden ver, leemos los contenidos en forma binaria del campo binario donde se encuentra almacenado el archivo. Seguidamente le convertimos a string y lo leemos con el módulo csv. Seguidamente iteramos las líneas leídas.

Otro problema interesante de describir es como crear facturas. No vamos a describir como lo hace el módulo sino vamos a contar como lo hace el módulo point_of_sale (el cual tiene el enfoque que siempre uso para resolver ese problema).

Cuando creamos una factura (o la actualizamos) necesitamos actualizar todos los contenidos de las líneas de las facturas. Para ello invocamos una función que devuelve una lista con los objetos preparados para actualizar el campo invoice_line_ids (algo necesario despues del cambio en la contabilidad de Odoo 13.0)

vals = {
​...
​'invoice_line_ids': self._prepare_invoice_lines()
​...
​}

Como es la estructura del método _prepare_invoice_lines? Arma la lista con los valores de las líneas de la factura. Para ello itera cada una de las líneas a facturar y las agrega a la lista (c

def _prepare_invoice_lines(self):
invoice_lines = []
for line in self.lines:
invoice_lines.append((0, None, self._prepare_invoice_line(line)))
return invoice_lines

La estructura de la línea es brindada por el método _prepare_invoice_line, el cual devuelve el diccionario que actualizará la línea

def _prepare_invoice_line(self, order_line):
name = order_line.product_id.get_product_multiline_description_sale()
return {
'product_id': order_line.product_id.id,
'quantity': order_line.qty if self.amount_total >= 0 else -order_line.qty,
'discount': order_line.discount,
'price_unit': order_line.price_unit,
'name': name,
'tax_ids': [(6, 0, order_line.tax_ids_after_fiscal_position.ids)],
'product_uom_id': order_line.product_uom_id.id,
}

Esa es una de las maneras que se puede programando crear una factura. En este ejemplo lo hicimos con el código del módulo point_of_sale, no lo hicimos con el código del módulo l10n_ar_iva_import ya que este tiene la lógica para crear pagos con impuestos exentos y no gravados también.

Gustavo Orrillo 5 de agosto de 2023
Compartir
Archivar
Identificarse dejar un comentario