Introdução
No Odoo, os modelos determinam a forma como a informação é organizada e armazenada na base de dados. Tudo o que é gestão empresarial — encomendas, faturas, movimentos contabilísticos — é representado por um modelo que define os campos e as relações entre registos.
Perceber os modelos do Odoo é fundamental tanto para programadores como para consultores funcionais. São a espinha dorsal da arquitectura de dados: definem campos, ligações entre tabelas e a lógica de negócio que corre por trás das operações.
Neste texto vamos focar-nos num dos modelos mais críticos da Contabilidade do Odoo: account.move.line. Se precisa de relatórios personalizados, sincronizar com sistemas externos ou ajustar processos de conciliação, vai encontrar-se a trabalhar com este modelo.
O que é o modelo account.move.line
O modelo account.move.line descreve cada linha de um lançamento contabilístico. Cada linha corresponde a um débito ou crédito numa escritura; no lançamento completo, os totais de débito e crédito têm de coincidir para que a escrita seja correcta.
Este modelo integra o módulo de Contabilidade e funciona como filho de account.move — que representa o movimento no seu conjunto (faturas, recibos, extratos bancários, lançamentos manuais). Um lançamento pode ter várias linhas associadas.
O account.move.line é definido no módulo base de contabilidade e é frequentemente estendido por outros módulos através de herança de modelos. O módulo de Vendas acrescenta campos de fatura, Compras adiciona campos de fornecedor e a contabilização analítica introduz distribuição analítica, tudo sem duplicar a estrutura principal.
Campos principais do modelo
A seguir estão os campos mais relevantes do account.move.line. Conhecê-los permite manipular lançamentos, conciliações e relatórios com confiança.
1. name
Tipo: Char. Etiqueta ou descrição da linha, visível em vistas e relatórios. Em linhas originadas por faturas, costuma vir do nome do produto ou de uma descrição personalizada.
2. move_id
Tipo: Many2one (account.move). Liga a linha ao lançamento pai. Cada linha pertence exactamente a um movimento — é a relação essencial para agrupar as linhas em lançamentos.
3. account_id
Tipo: Many2one (account.account). Conta utilizada na linha. Obrigatória. Deve apontar para uma conta operacional (não de visualização ou encerrada) e é usada nos relatórios do plano de contas.
4. debit
Tipo: Float. Valor a débito. Padrão 0.0. Numa linha apenas debit ou credit está preenchido. Débitos aumentam contas do activo e despesas.
5. credit
Tipo: Float. Valor a crédito. Padrão 0.0. Créditos aumentam passivos, capital e proveitos. O total de débitos tem de igualar o total de créditos no movimento.
6. balance
Tipo: Float. Campo calculado: debit menos credit. Mostra o efeito líquido da linha — positivo para débitos, negativo para créditos — e é utilizado em relatórios e conciliações.
7. partner_id
Tipo: Many2one (res.partner). Cliente, fornecedor ou outra entidade associada à linha. Fundamental para contas a receber/pagar, relatórios de ageing e processos de conciliação.
8. date
Tipo: Date. Data efectiva da linha. Normalmente herda a data do movimento pai e serve para fecho de período e relatórios temporais.
9. date_maturity
Tipo: Date. Data de vencimento do pagamento. Relevante para contas a receber e a pagar, usada em ageing e agendamento de pagamentos.
10. currency_id
Tipo: Many2one (res.currency). Moeda da linha. Pode ser diferente da moeda da empresa quando se regista um lançamento em moeda estrangeira.
11. amount_currency
Tipo: Float. Valor na moeda da linha. Usado em operações multi-moeda juntamente com currency_id para cálculos e reconciliações.
12. quantity
Tipo: Float. Quantidade opcional. Utilizada em linhas ligadas a produtos (faturas, faturas de compra) para relatórios por unidades e cálculo de preço unitário.
13. product_id
Tipo: Many2one (product.product). Produto associado à linha. Preenchido quando a origem é uma venda, compra ou linha de fatura.
14. product_uom_id
Tipo: Many2one (uom.uom). Unidade de medida da quantidade, usada para apresentar e converter quantidades de forma correta.
15. price_unit
Tipo: Float. Preço unitário. Utilizado com quantity para calcular o valor das linhas em faturas e facturas de compra.
16. tax_ids
Tipo: Many2many (account.tax). Impostos aplicados à linha. Ao validar, o Odoo pode criar linhas adicionais para os montantes de imposto.
17. tax_line_id
Tipo: Many2one (account.tax). Em linhas de imposto, refere o imposto gerador. Permite distinguir linhas de imposto das linhas contabilísticas normais.
18. analytic_account_id
Tipo: Many2one (account.analytic.account). Conta analítica para controlo de custos e proveitos. Usada quando a contabilidade analítica está activa.
19. analytic_distribution
Tipo: Json ou Text. Armazena a distribuição analítica por várias contas. Em versões recentes substitui a apenas indicar uma conta analítica quando se usam planos de distribuição.
20. ref
Tipo: Char. Referência externa ou nota, geralmente herdada do movimento pai. Visível em relatórios e útil para casar movimentos.
21. narration
Tipo: Text. Nota interna ligada ao movimento. Normalmente não aparece em documentos enviados ao cliente, mas ajuda na auditoria interna.
22. journal_id
Tipo: Many2one (account.journal). Diário do movimento. Utilizado para filtrar relatórios e análises por diário.
23. company_id
Tipo: Many2one (res.company). Empresa a que a linha pertence. Em ambientes multi-empresa define a visibilidade e influencia consolidação.
24. reconciled
Tipo: Boolean. Indica se a linha está totalmente conciliada. Útil para mostrar só os itens pendentes nas vistas de conciliação.
25. full_reconcile_id
Tipo: Many2one (account.full.reconcile). Agrupa todas as linhas conciliadas entre si, permitindo rastrear conjuntos de conciliação completos.
26. payment_id
Tipo: Many2one (account.payment). Para linhas de pagamento, liga ao registo de pagamento correspondente. Usado ao reconciliar faturas com pagamentos.
27. statement_id
Tipo: Many2one (account.bank.statement). Para linhas que vêm de extratos bancários, liga ao extrato. Essencial na conciliação bancária.
28. statement_line_id
Tipo: Many2one (account.bank.statement.line). Liga à linha específica do extrato bancário quando se faz o pareamento de movimentos com transacções bancárias.
29. display_type
Tipo: Selection. Pode ser 'line_section' ou 'line_note' para cabeçalhos e notas no lançamento. Essas linhas são apenas de exibição, sem débito nem crédito.
30. create_date
Tipo: Datetime. Data e hora de criação do registo. Gerido automaticamente pelo Odoo e útil para auditoria.
31. write_date
Tipo: Datetime. Data e hora da última modificação. Também gerido automaticamente e ajuda a seguir alterações ao longo do tempo.
Como este modelo entra nos processos da empresa
1. Faturação a clientes
Ao validar uma fatura, o Odoo gera linhas em account.move.line: linhas de receita vão para contas de proveitos, linhas a receber para a conta do cliente e são criadas linhas de imposto conforme necessário. O campo partner_id liga a linha ao cliente para ageing e conciliação.
2. Faturas de fornecedores
As faturas de compra geram linhas para despesas, IVA dedutível e contas a pagar. A estrutura é equivalente à das faturas de cliente, mas com tipos de conta invertidos conforme a natureza da operação.
3. Conciliação bancária
Linhas de extrato bancário são associadas a linhas de movimentos através de statement_line_id; quando concilia, o Odoo agrupa as linhas com full_reconcile_id e marca-as como reconciliadas (reconciled = True).
4. Lançamentos manuais
Os utilizadores podem registar lançamentos manuais com várias linhas: cada uma tem uma conta, débito ou crédito e, opcionalmente, partner. Antes de validar, o Odoo exige que os totais de débito e crédito coincidam.
5. Relatórios analíticos e de custos
Com contabilização analítica activa, as linhas transportam analytic_account_id ou analytic_distribution, permitindo relatórios por projecto, departamento ou outras dimensões para analisar custos e receitas.
Como os desenvolvedores estendem este modelo
Os programadores estendem account.move.line com padrões estabelecidos — a herança de modelos é o método principal para acrescentar campos ou lógica sem tocar no núcleo.
Herança de modelo
Defina _inherit = 'account.move.line' no seu módulo para prolongar o modelo. Pode adicionar campos, sobrescrever métodos ou impor restrições. Trabalhar por herança mantém as alterações isoladas e facilita actualizações.
Adicionar campos
Declare novos campos no modelo herdado com o tipo adequado: Char, Many2one, Boolean, Integer, Text, Selection, etc. Pense em campos dependentes da empresa para ambientes multi-company e tenha atenção às dependências em campos calculados.
Extensões em Python
Sobrescreva métodos como create, write ou unlink para injectar lógica. Use sempre super() para manter o comportamento padrão. Evite comprometer a regra de débito=crédito e lembre-se das chamadas de API expostas para integrações externas.
Odoo Studio
O Odoo Studio permite adicionar campos sem escrever código — útil para ajustes rápidos como etiquetas ou campos auxiliares. Para lógica complexa, regras de conciliação ou integrações, os módulos personalizados são mais robustos e fáceis de manter.
Boas práticas
- Nunca crie ou altere linhas de movimento directamente sem passar pelo movimento pai. Use a API do movimento (por exemplo, line_ids) para que o Odoo aplique verificações, regras e mantenha a consistência dos dados.
- Ao construir relatórios, filtre por move_id.state = 'posted' para excluir rascunhos e movimentos cancelados.
- Atribua account_id com o tipo correcto (recebível, pagável, etc.) para assegurar que ageing e conciliações funcionam como esperado.
- Em integrações via API, crie primeiro o movimento e só depois adicione as linhas, garantindo desde logo que débitos e créditos ficam equilibrados antes de validar.
- Para campos personalizados, utilize prefixos como
x_ou o prefixo do seu módulo para evitar colisões com futuras versões do Odoo.
Erros comuns
- Definir simultaneamente debit e credit numa mesma linha. Cada linha deve ter apenas um dos campos preenchido.
- Criar movimentos desequilibrados. Ototal de débitos tem de ser igual ao total de créditos — o Odoo valida isto ao postar o movimento.
- Editar directamente linhas já postadas em vez de usar reversões ou lançamentos de ajustamento. Movimentos contabilísticos validados devem ser corrigidos com lançamentos novos.
- Esquecer de preencher partner_id em linhas de recebíveis/pagáveis. Isso impede relatórios de ageing correctos e dificulta a conciliação.
- Sobrescrever métodos centrais sem chamar
super(). Isso pode quebrar conciliações, bloqueios ou funcionalidades de módulos dependentes.
Conclusão
O account.move.line é o coração da contabilidade no Odoo: regista cada débito e crédito de faturas, recibos e lançamentos. Dominar os seus campos e saber como os módulos o estendem facilita configuração, personalização e integrações seguras.
Se for consultor funcional a mapear processos ou programador a desenvolver relatórios e integrações, compreender bem o account.move.line reduz erros e acelera implementações.
Precisa de ajuda na sua implementação Odoo?
A Dasolo apoia empresas a implementar, personalizar e optimizar Odoo, com especial foco em integrações via API e desenvolvimento. A nossa equipa conhece a fundo a arquitectura de dados do Odoo e modelos como o account.move.line.
Se precisa de apoio na sua implementação Odoo, desenvolvimento de módulos ou integrações, podemos ajudar. Agende uma demonstração para conversarmos sobre o seu projecto.