Introdução
No Odoo, os modelos definem como os dados são estruturados e armazenados na base de dados. Cada pedaço de dados empresariais com o qual você trabalha, desde pedidos de venda a faturas e contactos, vive num modelo.
Compreender os modelos do Odoo é essencial tanto para desenvolvedores quanto para consultores funcionais. Os modelos são a base da arquitetura de dados do Odoo. Eles definem campos, relacionamentos e lógica de negócios.
Este artigo foca em um dos modelos mais importantes do módulo de Vendas: sale.order.line. Quer você esteja construindo módulos personalizados, integrando sistemas externos ou configurando fluxos de trabalho de preços, você trabalhará com este modelo.
O que é o modelo sale.order.line
O modelo sale.order.line representa itens individuais em uma cotação ou pedido de venda no Odoo. Cada linha normalmente corresponde a um produto, com informações de quantidade, preço e imposto.
Este modelo no Odoo é utilizado pelo módulo de Vendas (sale). Ele herda de analytic.mixin para rastreamento de custos de projeto e integração de folha de ponto. Quando você adiciona um produto a uma cotação, está criando um registro sale.order.line.
O modelo é definido no módulo de venda. Outros módulos o estendem através da herança de modelo do Odoo. Por exemplo, sale_stock adiciona campos relacionados à entrega. sale_margin adiciona cálculos de margem. Cada módulo adiciona o que precisa sem duplicar a estrutura central.
Campos Chave no Modelo
Aqui estão os campos mais importantes do Odoo no modelo sale.order.line. Compreender estes ajudará você a trabalhar de forma eficaz com cotações e pedidos de venda.
1. order_id
Tipo: Many2one (sale.order). Obrigatório. Referência ao pedido de venda pai. Este campo vincula cada linha ao seu pai. As linhas são excluídas quando o pedido é excluído (cascata).
2. sequence
Tipo: Inteiro. Padrão 10. Controla a ordem de exibição das linhas no pedido. Usado para classificar seções, notas e linhas de produtos.
3. company_id
Tipo: Many2one (res.company). Relacionado a partir de order_id. Usado para regras de múltiplas empresas e controle de acesso.
4. currency_id
Tipo: Many2one (res.currency). Relacionado a partir de order_id. Usado para todos os campos monetários na linha. Garante a moeda correta para precificação.
5. order_partner_id
Tipo: Many2one (res.partner). Relacionado a partir de order_id. O cliente. Usado para lista de preços e regras fiscais.
6. salesman_id
Tipo: Many2one (res.users). Relacionado a partir de order_id. O vendedor. Usado para comissão e relatórios.
7. state
Tipo: Seleção. Relacionado a partir de order_id. Status do pedido (rascunho, enviado, venda, concluído, cancelado). Determina quais campos são editáveis.
8. display_type
Tipo: Seleção. Valores: line_section ou line_note. Quando definido, a linha é um cabeçalho de seção ou uma nota, não uma linha de produto. Os campos do produto estão vazios.
9. is_downpayment
Tipo: Booleano. Indica se a linha é um pagamento antecipado. Pagamentos antecipados são faturados separadamente.
10. is_expense
Tipo: Booleano. Verdadeiro quando a linha vem de uma despesa ou fatura de fornecedor. Usado para rastreamento de custos de projeto.
11. product_id
Tipo: Many2one (product.product). O produto que está a ser vendido. O domínio restringe-se a produtos vendáveis. Necessário para linhas de produtos.
12. product_template_id
Tipo: Many2one (product.template). Computado a partir de product_id. Usado pelo configurador de produtos para seleção de variantes.
13. name
Tipo: Texto. A descrição da linha. Computada a partir do produto e atributos personalizados. Inclui detalhes da variante quando aplicável.
14. product_uom_qty
Tipo: Float. Necessário. A quantidade encomendada. Padrão 1.0. Pode ser influenciada pela embalagem.
15. product_uom
Tipo: Many2one (uom.uom). Unidade de medida. Padrão do produto. Usado para quantidade e preços.
16. tax_id
Tipo: Many2many (account.tax). Impostos aplicados à linha. Computado a partir do produto e da posição fiscal.
17. price_unit
Tipo: Float. Obrigatório. Preço unitário por product_uom. Calculado a partir da lista de preços ou do produto. Pode ser substituído manualmente.
18. discount
Tipo: Float. Percentagem de desconto. Aplicada ao price_unit antes do imposto.
19. price_subtotal
Tipo: Monetário. Subtotal antes do imposto. Calculado a partir da quantidade, preço unitário e desconto.
20. price_tax
Tipo: Float. Montante total do imposto. Calculado a partir do price_subtotal e tax_id.
21. price_total
Tipo: Monetário. Total incluindo imposto. O montante principal para faturamento.
22. product_packaging_id
Tipo: Many2one (product.packaging). Embalagem opcional (por exemplo, caixa de 12). Quando definido, a quantidade pode ser determinada pela embalagem.
23. customer_lead
Tipo: Float. Tempo de entrega em dias. Dias entre a confirmação do pedido e o envio. Usado para o cálculo da data de entrega.
24. qty_delivered
Tipo: Float. Quantidade entregue. Atualizada por movimentos de stock ou manualmente. Usado para faturação parcial.
25. qty_invoiced
Tipo: Float. Quantidade já faturada. Calculada a partir das linhas de fatura.
26. qty_to_invoice
Tipo: Float. Quantidade restante a faturar. Calculada a partir de qty_delivered e qty_invoiced.
27. invoice_status
Tipo: Seleção. Valores: upselling, faturado, a faturar, não. Indica o estado de faturação da linha.
28. invoice_lines
Tipo: Many2many (account.move.line). Liga às linhas de fatura criadas a partir desta linha de venda. Usado para rastreabilidade.
29. create_date
Tipo: Data e Hora. Quando o registo foi criado. Gerido automaticamente pelo Odoo.
30. write_date
Tipo: Data e Hora. Quando o registo foi modificado pela última vez. Usado para auditoria.
Como Este Modelo É Usado em Fluxos de Trabalho Empresariais
1. Cotação e Ordem de Venda
Quando um vendedor cria uma cotação, ele adiciona produtos. Cada produto torna-se uma sale.order.line. As linhas mostram quantidade, preço, desconto e total. A ordem é confirmada quando o cliente aceita.
2. Lista de Preços e Descontos
As listas de preços são aplicadas por linha. Os campos price_unit e discount são calculados a partir das regras da lista de preços. Descontos por volume ou preços específicos para clientes são tratados aqui.
3. Entrega e Faturação
Quando o stock é entregue, qty_delivered é atualizado. A faturação pode ser feita por entrega ou de uma só vez. O campo invoice_status orienta o utilizador sobre o que ainda falta faturar.
4. Projeto e Serviços
Para produtos de serviço, as linhas ligam-se a tarefas de projeto e folhas de horas. A herança analytic.mixin permite o rastreamento de custos por projeto.
5. Comércio Eletrônico e Portal
Os visitantes do site adicionam produtos ao carrinho. Cada linha do carrinho torna-se uma sale.order.line quando o pedido é criado. O configurador de produtos utiliza product_template_id e atributos personalizados.
Como os Desenvolvedores Estendem Este Modelo
Os desenvolvedores estendem a sale.order.line usando vários padrões. A herança de modelo do Odoo é o principal mecanismo.
Herança de Modelo
Use _inherit = 'sale.order.line' para estender o modelo. Adicione novos campos, sobrescreva métodos ou adicione restrições. O modelo herdado no Odoo mantém suas alterações em um módulo separado para atualizações fáceis.
Adicionando Campos
Defina novos campos Odoo em seu modelo herdado. Use o tipo de campo correto: Char, Many2one, Boolean, Integer, Text, Selection. Considere campos dependentes da empresa para multi-empresa.
Extensões Python
Sobrescreva _compute_price_unit, _compute_price_subtotal, ou crie/escreva para adicionar lógica. Use super() para chamar o original. Tenha cuidado com campos computados e suas dependências.
Odoo Studio
O Odoo Studio permite que você adicione campos sem código. Bom para personalizações rápidas. Para lógica complexa ou atualizações, módulos personalizados são mais fáceis de manter.
Melhores Práticas
- Use display_type para seções e notas em vez de linhas de produtos falsas. Isso mantém os relatórios limpos.
- Ao construir integrações de API, crie linhas através do order_id. Utilize o campo order_line_ids em sale.order com o formato de comando correto.
- Respeite as restrições SQL. Uma linha de produto deve ter product_id e product_uom. Uma seção ou nota deve ter display_type.
- Para preços personalizados, utilize regras de lista de preços sempre que possível. Substitua métodos de cálculo apenas quando precisar de lógica não suportada por listas de preços.
- Para campos personalizados, use o prefixo
x_ou um prefixo de módulo para evitar conflitos com versões futuras do Odoo.
Erros Comuns
- Criando linhas sem order_id. O campo é obrigatório. Sempre crie linhas no contexto de um pedido.
- Confundindo product_id e product_template_id. Para linhas de produto, defina product_id. Para fluxos de configurador, use product_template_id para selecionar uma variante.
- Modificando price_unit ou desconto após a faturação. Uma vez que qty_invoiced é maior que zero, alterações de preço podem causar inconsistências.
- Substituindo métodos principais sem chamar super(). Isso pode quebrar outros módulos ou futuras atualizações.
- Esquecendo de definir display_type para linhas de seção ou nota. Sem isso, a linha é tratada como uma linha de produto e falhará na validação.
Conclusão
O modelo sale.order.line é central para Odoo Sales. Ele armazena cada linha de produto em cotações e pedidos. Compreender seus campos e como os módulos o estendem ajudará você a configurar, personalizar e integrar o Odoo de forma eficaz.
Seja você um consultor funcional mapeando processos de negócios ou um desenvolvedor construindo módulos personalizados, um sólido entendimento de sale.order.line economizará tempo e evitará erros.
Precisa de Ajuda com a Sua Implementação do Odoo?
A Dasolo ajuda empresas a implementar, personalizar e otimizar o Odoo. Nós nos especializamos em integrações de API e desenvolvimento Odoo. Nossa equipe tem ampla experiência com a arquitetura de dados do Odoo e modelos como sale.order.line.
Se precisar de ajuda com a sua implementação do Odoo, módulos personalizados ou integrações, estamos aqui para ajudar. Agende uma demonstração para discutir o seu projeto.