Introducción
En Odoo, los modelos son la plantilla que dicta cómo se organiza y guarda la información en la base de datos. Todo dato de negocio —pedidos, facturas, asientos contables— se materializa dentro de un modelo concreto.
Comprender los modelos de Odoo es imprescindible tanto para desarrolladores como para consultores funcionales. Son la columna vertebral de la arquitectura de datos: determinan campos, relaciones y buena parte de la lógica que gobierna la aplicación.
Este texto profundiza en uno de los modelos más críticos de la contabilidad en Odoo: account.move.line. Si vas a crear informes, conectar sistemas externos o ajustar procesos de conciliación, acabarás trabajando con este modelo.
¿Qué es el modelo account.move.line?
El modelo account.move.line representa cada una de las líneas que componen un asiento contable. Cada registro corresponde a un débito o un crédito; al publicar un asiento, sus líneas deben cuadrar —los débitos totales igualan a los créditos totales—.
Este modelo forma parte del módulo de Contabilidad y actúa como hijo del modelo account.move, que representa el asiento completo (facturas, abonos, extractos bancarios y asientos manuales). Todo asiento tiene una o varias líneas asociadas.
account.move.line se define en el módulo de contabilidad y otros módulos lo amplían mediante herencia de modelos. Ventas añade detalles de línea de factura; Compras incorpora datos de factura proveedor; Analítica añade distribución analítica. Cada módulo añade su lógica sin duplicar la estructura núcleo.
Campos clave del modelo
A continuación encontrarás los campos más relevantes de account.move.line. Conocerlos te permitirá manejar asientos y datos contables con seguridad y precisión.
1. name
Tipo: Char. Descripción o etiqueta de la línea. Es obligatorio y suele aparecer en vistas e informes. En líneas de factura normalmente recoge el nombre del producto o una descripción personalizada.
2. move_id
Tipo: Many2one (account.move). Enlace con el asiento padre. Cada línea pertenece a un único move; esta relación es la clave para agrupar las líneas en un asiento.
3. account_id
Tipo: Many2one (account.account). Cuenta contable a la que se imputa la línea. Obligatorio: no puede ser una cuenta tipo vista ni una cuenta cerrada. Se emplea para agrupación y reporting en el plan contable.
4. debit
Tipo: Float. Importe en debe. Valor por defecto 0.0. En una línea solo se define débito o crédito, no ambos. Los débitos aumentan activos y gastos.
5. credit
Tipo: Float. Importe en haber. Valor por defecto 0.0. Los créditos aumentan pasivos, patrimonio e ingresos. En un asiento, la suma de débitos debe igualar la suma de créditos.
6. balance
Tipo: Float. Campo calculado: debit menos credit. Muestra el efecto neto de la línea —positivo para débitos, negativo para créditos— y se usa en informes y conciliaciones.
7. partner_id
Tipo: Many2one (res.partner). Cliente, proveedor u otra contraparte asociada a la línea. Fundamental para cuentas a cobrar/pagar, antigüedad de saldos y conciliaciones.
8. date
Tipo: Date. Fecha efectiva de la línea. Normalmente se hereda del asiento padre. Se utiliza para cierres de periodo, reporting y cálculos de antigüedad.
9. date_maturity
Tipo: Date. Fecha de vencimiento del pago. Relevante para cuentas por cobrar y por pagar; influye en informes de vencimientos y planificación de pagos.
10. currency_id
Tipo: Many2one (res.currency). Moneda de la línea. Puede diferir de la moneda de la compañía cuando hay operaciones en divisas.
11. amount_currency
Tipo: Float. Importe en la moneda de la línea. Junto con currency_id permite llevar contabilidad multimoneda y mostrar valores en moneda extranjera.
12. quantity
Tipo: Float. Cantidad opcional. Útil en líneas relacionadas con productos (facturas, albaranes) para informes basados en cantidades y cálculo de precio unitario.
13. product_id
Tipo: Many2one (product.product). Producto asociado a la línea, cuando procede de un pedido o una factura. Facilita trazabilidad y reporting por producto.
14. product_uom_id
Tipo: Many2one (uom.uom). Unidad de medida de la cantidad. Se usa junto a product_id para mostrar y convertir cantidades correctamente.
15. price_unit
Tipo: Float. Precio unitario. Se combina con la cantidad para calcular importes en facturas y gastos.
16. tax_ids
Tipo: Many2many (account.tax). Impuestos aplicables a la línea. Al contabilizar, Odoo genera líneas adicionales para las bases e impuestos según la configuración fiscal.
17. tax_line_id
Tipo: Many2one (account.tax). En líneas de impuesto, referencia al impuesto que generó esa línea. Permite distinguir líneas fiscales de líneas contables normales.
18. analytic_account_id
Tipo: Many2one (account.analytic.account). Cuenta analítica para repartir costes e ingresos. Se utiliza cuando la contabilidad analítica está activada.
19. analytic_distribution
Tipo: Json o Text. Distribución analítica entre varias cuentas. En versiones recientes sustituye o complementa a analytic_account_id cuando se usan planes de distribución.
20. ref
Tipo: Char. Referencia externa o memo, a menudo heredada del asiento padre. Aparece en informes y se usa para emparejamientos en conciliación.
21. narration
Tipo: Text. Nota interna ligada al asiento. No suele imprimirse en documentos para clientes por defecto; sirve para aclaraciones internas.
22. journal_id
Tipo: Many2one (account.journal). Diario asociado al asiento. Útil para filtros y análisis por diario contable.
23. company_id
Tipo: Many2one (res.company). Compañía propietaria de la línea. En entornos multiempresa condiciona visibilidad y consolida datos correctamente.
24. reconciled
Tipo: Boolean. Indica si la línea está completamente conciliada. Se usa para filtrar partidas pendientes en vistas de conciliación.
25. full_reconcile_id
Tipo: Many2one (account.full.reconcile). Agrupa todas las líneas reconciliadas entre sí. Facilita el seguimiento de grupos de conciliación.
26. payment_id
Tipo: Many2one (account.payment). En líneas derivadas de pagos, enlaza con el registro de pago correspondiente. Se usa al conciliar facturas con cobros/pagos.
27. statement_id
Tipo: Many2one (account.bank.statement). En líneas relacionadas con extractos bancarios, referencia al extracto padre. Importante en la conciliación bancaria.
28. statement_line_id
Tipo: Many2one (account.bank.statement.line). Enlace con la línea concreta del extracto bancario cuando se empata el movimiento y la transacción bancaria.
29. display_type
Tipo: Selection. Permite marcar la línea como encabezado o nota visual ('line_section' o 'line_note'). Estas líneas son informativas y no contienen importes en debe/haber.
30. create_date
Tipo: Datetime. Fecha y hora de creación del registro. Odoo la gestiona automáticamente; es útil para auditorías.
31. write_date
Tipo: Datetime. Fecha y hora de la última modificación. También gestionada por Odoo; sirve para rastrear cambios a lo largo del tiempo.
Cómo se utiliza este modelo en los procesos de negocio
1. Facturación a clientes
Al validar una factura, Odoo genera líneas en account.move.line: las de ingresos a cuentas de venta y las de cartera a la cuenta por cobrar del cliente; además crea líneas específicas para los impuestos. partner_id conecta la línea con el cliente para anticipo en antigüedad y conciliación.
2. Facturas de proveedor
Las facturas proveedor crean líneas de gasto, IVA soportado y cuentas a pagar. La estructura es simétrica a la de las facturas de cliente, cambiando los tipos de cuenta implicados.
3. Conciliación bancaria
Las líneas del extracto bancario se emparejan con las líneas del asiento mediante statement_line_id. Al conciliar, Odoo agrupa las líneas con full_reconcile_id y marca reconciled como True.
4. Asientos manuales
Los usuarios pueden registrar asientos manuales con varias líneas; cada una lleva cuenta, debe o haber y opcionalmente partner. Odoo impide la publicación si los débitos y créditos no cuadran.
5. Informes analíticos y de costes
Si la contabilidad analítica está activada, las líneas incorporan analytic_account_id o analytic_distribution. Los informes pueden agruparse por cuenta analítica para mostrar costes e ingresos por proyecto, departamento u otra dimensión.
Cómo amplían los desarrolladores este modelo
Los desarrolladores amplían account.move.line con varios patrones; la herencia de modelos de Odoo es el mecanismo habitual.
Herencia de modelo
Utiliza _inherit = 'account.move.line' para ampliar el modelo: añadir campos, sobreescribir métodos o introducir restricciones. Mantener la extensión en un módulo separado facilita las actualizaciones y el mantenimiento.
Añadir campos
Declara nuevos campos en el modelo heredado usando el tipo adecuado: Char, Many2one, Boolean, Integer, Text, Selection, etc. Ten en cuenta la opción company_dependent en entornos multiempresa y define correctamente dependencias en campos calculados.
Extensiones en Python
Sobrescribe métodos como create, write o unlink para incorporar lógica adicional. Llama siempre a super() para preservar el comportamiento base. Evita violar la regla de que débitos igualen a créditos; la API de Odoo expone estos puntos para integraciones externas.
Odoo Studio
Odoo Studio permite añadir campos a account.move.line sin programar, ideal para ajustes rápidos como etiquetas o datos adicionales. Para reglas complejas de negocio o conciliaciones, conviene implementar un módulo personalizado por mantenibilidad.
Buenas prácticas
- Nunca crees ni modifiques líneas de asiento saltándote el asiento padre: usa la API del move (por ejemplo line_ids) para que Odoo aplique validaciones y mantenga la coherencia de los datos.
- Al diseñar informes, filtra por move_id.state = 'posted' para excluir asientos en borrador o cancelados.
- Asegúrate de usar account_id con el tipo correcto (receivable, payable, etc.) para que la antigüedad y los procesos de conciliación funcionen como se espera.
- Al integrar por API, crea primero el move y después añade las líneas. Verifica que débitos y créditos cuadren antes de publicar el asiento.
- Para campos personalizados, utiliza prefijos como
x_o el prefijo del módulo para evitar colisiones con futuras versiones de Odoo.
Errores habituales
- Establecer a la vez débito y crédito en la misma línea. Cada línea debe contener o débito o crédito, nunca ambos.
- Crear asientos desbalanceados. La suma de débitos debe igualar la de créditos; Odoo lo valida al publicar.
- Modificar líneas ya publicadas sin usar el flujo adecuado de ajustes o asientos de regularización. Las correcciones deben registrarse mediante nuevos asientos, no editando directamente los publicados.
- Olvidar asignar partner_id en líneas por cobrar o por pagar. Esto impide generar antigüedad correcta y dificulta la conciliación.
- Sobrescribir métodos centrales sin llamar a super(). Esto puede romper conciliaciones, bloqueos o comportamientos esperados en otros módulos.
Conclusión
El modelo account.move.line es el núcleo de la contabilidad en Odoo: registra cada débito y crédito de facturas, asientos y extractos. Conocer sus campos y cómo se extiende te permitirá configurar, personalizar e integrar Odoo con mayor seguridad.
Tanto si eres consultor mapeando procesos contables como desarrollador creando informes o conectores, dominar account.move.line te ahorrará tiempo y reducirá errores.
¿Necesitas ayuda con tu implantación de Odoo?
Dasolo acompaña a empresas en la implantación, personalización y optimización de Odoo. Somos especialistas en integraciones API y en desarrollo sobre la arquitectura de datos de Odoo, con experiencia práctica en modelos como account.move.line.
Si necesitas soporte para tu implantación de Odoo, desarrollo de módulos a medida o integraciones, podemos ayudarte. Solicita una demo para comentar tu proyecto.