Introducción
En Odoo, los modelos definen cómo se estructura y almacena la información en la base de datos. Cada pieza de datos empresariales con la que trabajas, desde pedidos de venta hasta facturas y asientos contables, reside en un modelo.
Entender los modelos de Odoo es esencial tanto para desarrolladores como para consultores funcionales. Los modelos son la base de la arquitectura de datos de Odoo. Definen los campos, relaciones y lógica empresarial de Odoo.
Este artículo se centra en uno de los modelos más importantes en la contabilidad de Odoo: account.move. Ya sea que estés creando informes personalizados, integrando sistemas externos o configurando flujos de trabajo de facturación, trabajarás con este modelo.
¿Qué es el modelo account.move?
El modelo account.move representa las entradas de diario en Odoo. En Odoo 13 y versiones posteriores, unificó lo que solía ser modelos separados: facturas de clientes, facturas de proveedores, notas de crédito y entradas de diario manuales. Hoy en día, todos ellos viven en account.move.
Este modelo en Odoo es utilizado por el módulo de Contabilidad. Es el padre de account.move.line, que contiene las líneas individuales de débito y crédito. Cada factura, factura o entrada de diario es un registro account.move con una o más líneas.
El modelo está definido en el módulo de cuenta. Otros módulos lo extienden a través de la herencia de modelos de Odoo. Ventas añade la creación de facturas a partir de pedidos. Compras añade la creación de facturas. Cada módulo añade lo que necesita sin duplicar la estructura central.
Campos clave en el modelo
Aquí están los campos más importantes de Odoo en el modelo account.move. Entender estos te ayudará a trabajar de manera efectiva con facturas, facturas y entradas de diario.
1. nombre
Tipo: Char. Este campo almacena el número o nombre de la entrada de diario. Generalmente se genera automáticamente a partir de la secuencia del diario. Se muestra en vistas de lista y en documentos impresos.
2. move_type
Tipo: Selección. Determina el tipo de movimiento: entrada (entrada de diario manual), out_invoice (factura de cliente), out_refund (nota de crédito de cliente), in_invoice (factura de proveedor), in_refund (nota de crédito de proveedor). Este campo determina qué vistas y flujos de trabajo se aplican.
3. estado
Tipo: Selección. El estado del flujo de trabajo: borrador, publicado o cancelado. Los movimientos en borrador pueden ser editados. Los movimientos publicados están bloqueados y afectan el libro mayor. Cancelar revierte el efecto.
4. fecha
Tipo: Fecha. La fecha del documento. Se utiliza para informes, antigüedad y cierre de períodos. Para las facturas, esta suele ser la fecha de la factura.
5. journal_id
Tipo: Many2one (account.journal). El diario al que pertenece este movimiento. Los diarios de Ventas, Compras, Bancos y Misceláneos tienen cada uno el suyo. El diario determina la secuencia y las cuentas predeterminadas.
6. company_id
Tipo: Many2one (res.company). En configuraciones de múltiples empresas, esto indica a qué empresa pertenece el movimiento. Afecta la visibilidad de los registros y la consolidación.
7. partner_id
Tipo: Many2one (res.partner). El cliente o proveedor. Requerido para facturas y recibos. Utilizado para informes de antigüedad, conciliación de pagos y encabezados de documentos.
8. currency_id
Tipo: Many2one (res.currency). La moneda del movimiento. Los montos se almacenan en esta moneda. Los movimientos en múltiples monedas utilizan la moneda de la empresa para informes.
9. amount_total
Tipo: Monetario. El monto total del movimiento. Para facturas, este es el monto adeudado. Se calcula a partir de las líneas.
10. amount_residual
Tipo: Monetario. El monto no pagado. Para facturas pagadas, esto es cero. Utilizado para antigüedad y flujos de trabajo de pagos.
11. estado_de_pago
Tipo: Selección. Estado del pago: no_pagado, en_pago, pagado, parcial, revertido, o facturación_legacy. Impulsa recordatorios de pago e informes.
12. line_ids
Tipo: Uno a muchos (account.move.line). Las líneas de asiento contable. Cada línea tiene una cuenta, débito y crédito. La suma de los débitos debe ser igual a la suma de los créditos.
13. invoice_line_ids
Tipo: Uno a muchos (account.move.line). Para facturas y cuentas, estas son las líneas de producto o servicio. Cada línea genera una o más líneas de asiento contable cuando se publica.
14. fecha_factura
Tipo: Fecha. La fecha de la factura. Utilizada para la facturación y los períodos fiscales. Puede diferir de la fecha del movimiento en algunas configuraciones.
15. fecha_vencimiento_factura
Tipo: Fecha. La fecha de vencimiento del pago. Calculada a partir de los términos de pago o establecida manualmente. Utilizada para envejecimiento y cobros.
16. ref
Tipo: Char. Referencia externa o número de factura del proveedor. Útil para emparejar pagos y conciliar con documentos externos.
17. invoice_origin
Tipo: Char. El documento fuente. Para facturas de pedidos de venta, almacena el número del pedido de venta. Permite la trazabilidad del pedido a la factura.
18. create_date
Tipo: Datetime. Almacena la fecha y hora en que se creó el registro. Gestionado automáticamente por Odoo.
19. write_date
Tipo: Datetime. Almacena la fecha y hora de la última modificación. También gestionado automáticamente.
20. narration
Tipo: Text. Notas internas o memorando. Se muestra en los asientos contables impresos. No se muestra a los clientes en las facturas.
21. fiscal_position_id
Tipo: Many2one (account.fiscal.position). La posición fiscal para las reglas de impuestos. Determina qué impuestos se aplican según el socio y el país.
22. invoice_payment_term_id
Tipo: Many2one (account.payment.term). Condiciones de pago (por ejemplo, Net 30). Se utiliza para calcular invoice_date_due y dividir pagos.
23. invoice_user_id
Tipo: Many2one (res.users). El vendedor o usuario responsable de la factura. Se utiliza para comisiones e informes.
24. reversed_entry_id
Tipo: Many2one (account.move). Para entradas revertidas, esto se vincula al movimiento de reversión. Permite un rastro de auditoría de correcciones.
25. to_check
Tipo: Booleano. Indicador para movimientos que necesitan revisión. Se utiliza en la conciliación bancaria y flujos de trabajo de excepciones.
26. active
Tipo: Booleano. Indicador de eliminación suave. Cuando es Falso, el registro se archiva. Los movimientos cancelados se establecen típicamente en active=False.
27. sequence_number
Tipo: Entero. El número de secuencia del diario. Se utiliza para ordenar y mostrar. Gestionado por el mixin de secuencia.
28. amount_untaxed
Tipo: Monetario. El subtotal antes de impuestos. Para facturas, esta es la suma de los montos de las líneas antes de impuestos.
29. amount_tax
Tipo: Monetario. El monto total del impuesto. Calculado a partir de las líneas de la factura y la configuración del impuesto.
30. invoice_source_email
Tipo: Char. Para las facturas de proveedores creadas a partir de correos electrónicos, esto almacena la dirección de correo electrónico de origen. Utilizado para la ingestión automatizada de facturas.
Cómo se utiliza este modelo en los flujos de trabajo empresariales
1. Facturación de Clientes
Cuando se entrega un pedido de venta, Odoo crea un account.move con move_type out_invoice. Los invoice_line_ids provienen de las líneas del pedido. Publicar el movimiento crea las líneas de asiento del diario y actualiza las cuentas por cobrar.
2. Facturas de Proveedores
Los pedidos de compra pueden generar facturas, o las facturas se ingresan manualmente. Cada factura es un account.move con move_type in_invoice. El partner_id es el proveedor. Publicar actualiza las cuentas por pagar.
3. Conciliación de Pagos
Los pagos se emparejan con las facturas utilizando los campos amount_residual y payment_state. El proceso de conciliación vincula los movimientos de pago con los movimientos de factura y elimina el residual.
4. Asientos Manuales
Los contadores crean movimientos con move_type entry para ajustes, acumulaciones o correcciones. Agregan manualmente line_ids con cuentas, débitos y créditos. El movimiento debe equilibrarse antes de publicarse.
5. Notas de Crédito y Reembolsos
Las notas de crédito son movimientos con move_type out_refund o in_refund. Invierten el efecto de la factura o factura original. El reversed_entry_id se vincula de nuevo a la original para auditoría.
Cómo los desarrolladores extienden este modelo
Los desarrolladores extienden account.move utilizando varios patrones. La herencia de modelos de Odoo es el principal mecanismo.
Herencia de Modelos
Utiliza _inherit = 'account.move' para extender el modelo. Agrega nuevos campos de Odoo, sobrescribe métodos o añade restricciones. El modelo heredado en Odoo mantiene tus cambios en un módulo separado para facilitar las actualizaciones.
Añadiendo Campos
Define nuevos campos de Odoo en tu modelo heredado. Utiliza el tipo de campo correcto: Char, Many2one, Boolean, Integer, Text, Selection. Considera campos dependientes de la empresa para multiempresa. Para campos específicos de la factura, utiliza un dominio en move_type.
Extensiones de Python
Sobrescribe create, write, _post o button_draft para añadir lógica. Utiliza super() para llamar al original. Ten cuidado con los campos computados y sus dependencias. Los decoradores del modelo API en Odoo (@api.model, @api.depends) controlan cuándo se ejecutan los métodos.
Odoo Studio
Odoo Studio te permite añadir campos sin código. Es bueno para personalizaciones rápidas como campos de referencia adicionales. Para lógica compleja, validación o acciones automatizadas, los módulos personalizados son más mantenibles.
Nota: account.move es un modelo regular, no un modelo abstracto de Odoo ni un modelo transitorio de Odoo. Los modelos abstractos se utilizan como plantillas y no crean tablas de base de datos. Los modelos transitorios son temporales y se utilizan para asistentes. account.move almacena datos contables permanentes.
Mejores prácticas
- Siempre filtra por move_type al construir informes o integraciones. Diferentes tipos tienen diferentes campos requeridos y comportamientos.
- Utiliza el diario correcto para cada tipo de movimiento. Mezclar diarios puede romper secuencias e informes.
- Al crear movimientos a través de la API, asegúrate de que line_ids estén equilibrados (débito = crédito) antes de publicar. Los movimientos desequilibrados fallarán la validación.
- Para la creación de facturas desde sistemas externos, mapea tus tipos de documento a move_type correctamente. out_invoice para ventas, in_invoice para compras.
- Utiliza el prefijo
x_para campos personalizados para evitar conflictos con futuras versiones de Odoo.
Errores comunes
- Publicar movimientos sin líneas equilibradas. Odoo rechazará la publicación. Siempre verifica que los totales de débito y crédito coincidan.
- Modificar movimientos publicados directamente. Los movimientos publicados están bloqueados. Utiliza una reversión y crea un nuevo movimiento en su lugar.
- Olvidar establecer partner_id en movimientos de clientes o proveedores. Muchos informes y flujos de trabajo dependen de ello.
- Usar el move_type incorrecto. Un out_refund no es lo mismo que un out_invoice negativo. Utiliza el tipo correcto para reembolsos y notas de crédito.
- Sobrescribir métodos centrales sin llamar a super(). Esto puede romper otros módulos o futuras actualizaciones.
Conclusión
El modelo account.move es central para la contabilidad de Odoo. Representa facturas, cuentas por pagar y asientos contables en una estructura unificada. Entender sus campos y cómo los módulos lo extienden te ayudará a configurar, personalizar e integrar Odoo de manera efectiva.
Ya seas un consultor funcional mapeando procesos de negocio o un desarrollador construyendo módulos personalizados, un sólido entendimiento de account.move te ahorrará tiempo y evitará errores.
¿Necesita ayuda con su implementación de Odoo?
Dasolo ayuda a las empresas a implementar, personalizar y optimizar Odoo. Nos especializamos en integraciones de API y desarrollo de Odoo. Nuestro equipo tiene una profunda experiencia con la arquitectura de datos de Odoo y modelos como account.move.
Si necesita ayuda con su implementación de Odoo, módulos personalizados o integraciones, estamos aquí para ayudarle. Reserve una demostración para discutir su proyecto.