Introdução
No Odoo, um modelo é a definição que dita como a informação é guardada e estruturada na base de dados. Tudo o que trabalha numa empresa — desde faturas e encomendas até artigos de catálogo — é representado por um registo num modelo, que normaliza e valida esses dados.
Perceber como funcionam os modelos é indispensável quer para quem configura processos (consultores funcionais) quer para quem desenvolve. Modelos são o alicerce da arquitetura de dados do Odoo: descrevem campos, relações e lógica. Todos os modelos seguem padrões semelhantes que facilitam manutenção e extensão.
Aqui vamos centrar-nos num dos modelos mais utilizados: product.template. Se trabalha com catálogos, integra sistemas externos ou desenvolve módulos personalizados, este modelo será um ponto central do seu trabalho.
O que é o modelo product.template
O product.template serve para agrupar famílias de artigos que partilham propriedades comuns, enquanto as diferenças (por exemplo tamanho ou cor) ficam nas variantes. Em vez de criar milhares de artigos iguais com pequenas variações, usa-se um template que gera variantes a partir das linhas de atributos.
Este modelo é usado por várias aplicações do Odoo: Vendas, Compras, Inventário, Website e Produção. Criar um artigo no catálogo gera um registo product.template; linhas de encomenda e movimentos de stock referenciam variantes que derivam desse template.
O product.template é definido no módulo de produto e estendido por outros módulos através da herança de modelos do Odoo. Por exemplo, Vendas adiciona preços e regras de faturação, Compras trata regras de fornecedores e Inventário acrescenta rastreio de stock — cada módulo acrescenta apenas o que precisa mantendo a estrutura central intacta.
Distinguir product.template de product.product é fundamental: o template armazena os dados partilhados por todas as variantes; a product.product guarda os dados específicos de cada variante, como código interno (SKU) ou código de barras.
Campos principais do modelo
A seguir estão os campos mais relevantes do product.template. Conhecê-los ajuda a gerir o catálogo, configurar regras comerciais e preparar integrações corretamente.
1. name
Tipo: Char. Nome do produto — a etiqueta que aparece nas listas, no website e nos documentos. É o identificador mais visível do template.
2. create_date
Tipo: Datetime. Data de criação do registo. Gerido automaticamente pelo Odoo, útil para auditorias e relatórios temporais.
3. write_date
Tipo: Datetime. Data da última alteração. Também atualizada pelo sistema, serve para controlar atualizações e sincronizações.
4. active
Tipo: Boolean. Bandeira de arquivamento. Quando falso, o produto fica oculto nas vistas por defeito sem ser eliminado fisicamente.
5. sequence
Tipo: Integer. Ordem de apresentação. Controla a posição em listas e selecções; valores mais baixos aparecem primeiro.
6. type
Tipo: Selection. Tipo de produto: Consumível, Serviço ou Armazenável. Define se o item tem controlo de stock ou é tratado como serviço.
7. categ_id
Tipo: Many2one (product.category). Categoria do produto. Afeta relatórios, rotas por defeito e organização do catálogo; as categorias podem ser hierárquicas.
8. list_price
Tipo: Float. Preço de venda padrão. Serve de base nas propostas; pode ser alterado por regras de preço ou por variantes.
9. standard_price
Tipo: Float. Preço de custo. Usado no cálculo de margens e na valorização de inventário, impactando relatórios de rentabilidade.
10. currency_id
Tipo: Many2one (res.currency). Moeda dos preços (list_price e standard_price). Normalmente herdada da empresa.
11. uom_id
Tipo: Many2one (uom.uom). Unidade de medida para vendas (unidades, kg, l, etc.), que define como se expressam quantidades.
12. uom_po_id
Tipo: Many2one (uom.uom). Unidade de compra. Pode diferir da uom de venda e requer conversões entre unidades.
13. default_code
Tipo: Char. Referência interna ou código. Usada como SKU e para sincronização com sistemas externos; convém mantê-la consistente e única quando possível.
14. barcode
Tipo: Char. Código de barras para leitura. Utilizado em PDV, armazém e inventário; normalmente a nível de variante (product.product) em artigos com atributos.
15. description
Tipo: Char. Descrição interna visível apenas para utilizadores internos — notas de gestão do artigo.
16. description_sale
Tipo: Text. Descrição para vendas. Aparece em cotações e documentos de venda; pode conter formatação HTML para o website ou catálogos.
17. description_purchase
Tipo: Text. Descrição para compras. Exibida em ordens de compra e faturas de fornecedor para clarificar linhas e requisitos.
18. sale_ok
Tipo: Boolean. Permite ou não vender o produto. Se falso, o artigo não aparece nas vistas de venda nem nas cotações.
19. purchase_ok
Tipo: Boolean. Permite ou não comprar o produto. Se falso, o artigo não aparece nas vistas de compras ou em pedidos a fornecedores.
20. weight
Tipo: Float. Peso do artigo. Importante para cálculo de portes e logística; unidade depende das configurações de UoM da empresa.
21. volume
Tipo: Float. Volume do artigo. Usado em planeamento de armazém e cálculo de capacidade logística.
22. product_variant_ids
Tipo: One2many (product.product). Lista de variantes associadas ao template; cada variante herda os atributos comuns do template.
23. product_variant_count
Tipo: Integer. Número de variantes — campo calculado a partir das variantes existentes, útil para filtros e exibição rápida.
24. image_1920
Tipo: Binary. Imagem do produto. O Odoo guarda múltiplos tamanhos; usada em formulários, catálogos e no site.
25. responsible_id
Tipo: Many2one (res.users). Utilizador responsável pelo artigo — para gestão, tarefas e notificações internas.
26. company_id
Tipo: Many2one (res.company). Empresa a que o produto pertence em cenários multi‑empresa.
27. tax_ids
Tipo: Many2many (account.tax). Impostos aplicáveis ao cliente nas vendas; utilizados em cotações e faturas.
28. supplier_tax_id
Tipo: Many2many (account.tax). Impostos aplicáveis nas compras; aplicados em faturas de fornecedores.
29. attribute_line_ids
Tipo: One2many. Linhas de atributos que geram variantes (ex.: Tamanho, Cor). Definem a combinação de variantes possíveis.
30. route_ids
Tipo: Many2many (stock.route). Rotas de stock — determinam como o produto se movimenta (Comprar, Produzir por encomenda, etc.).
31. property_stock_production
Tipo: Many2one (stock.location). Local de produção para artigos fabricados; relevante quando o produto é armazenável e tem rota de fabrico.
32. property_stock_inventory
Tipo: Many2one (stock.location). Local usado em ajustamentos de inventário e contagens físicas.
33. property_valuation
Tipo: Selection. Método de valorização do stock: Automático ou Manual. Influencia o modo como o custo é registado contabilisticamente.
34. property_cost_method
Tipo: Selection. Método de custo: Standard ou FIFO. Determina como o valor do inventário é calculado ao longo do tempo.
35. property_account_income_id
Tipo: Many2one (account.account). Conta de receitas associada às vendas do produto; usada em processos de faturação.
36. property_account_expense_id
Tipo: Many2one (account.account). Conta de custos associada às compras do produto; usada em recebimentos e faturas de fornecedor.
37. invoice_policy
Tipo: Selection. Política de faturação: Por encomenda ou por entrega. Define quando se reconhece a receita nas faturas.
38. expense_policy
Tipo: Selection. Política de custo: Por encomenda ou por entrega. Define quando os custos são reconhecidos contabilmente.
39. service_type
Tipo: Selection. Para serviços: Manual, Timesheet ou Milestones. Controla como o serviço é monitorizado e faturado.
40. optional_product_ids
Tipo: Many2many (product.template). Produtos opcionais para upsell — sugeridos em cotações quando um artigo é adicionado.
Como este modelo entra nos processos de negócio
1. Vendas e propostas
Numa proposta comercial o vendedor escolhe artigos do catálogo; o template fornece a base (descrição, imagens, preço). Se o artigo tiver atributos, escolhem-se variantes específicas no momento da venda.
2. Comércio eletrónico
No site, os clientes navegam por templates e, ao abrir a ficha do produto, escolhem a variante desejada. A informação partilhada — descrições, imagens e preços base — vem do template.
3. Compras e fornecedores
Ordens de compra e faturas de fornecedor ligam-se ao produto. O campo purchase_ok controla visibilidade; impostos de fornecedor e unidade de compra (uom_po_id) definem o comportamento nas encomendas.
4. Inventário e Produção
Movimentos de stock e ordens de fabrico referenciam variantes. O template determina rotas, métodos de valorização e custo; o controlo físico e quantidades são geridos por variante.
5. Faturação
Linhas de fatura referenciam produtos e aplicam regras fiscais e contas definidas no template. A política de faturação do produto decide quando se geram as receitas.
Como os programadores ampliam este modelo
Os desenvolvedores têm várias formas de estender o product.template, sendo a herança de modelos o padrão mais utilizado no Odoo.
Herança de modelo
Para estender, declare _inherit = 'product.template' no seu módulo. Assim adiciona campos, validações e métodos sem alterar o código core. Este padrão mantém as personalizações separadas e facilita atualizações posteriores.
Adicionar campos
No módulo herdado defina os novos campos com o tipo adequado (Char, Many2one, Boolean, Integer, Text, Selection). Considere tornar campos dependentes da empresa em contextos multi‑empresa.
Extensões em Python
Sobrescreva create, write ou unlink para acrescentar lógica de negócio, garantindo que chama super() para manter o comportamento esperado. Tenha especial atenção a campos computados e às suas dependências para evitar inconsistências.
Odoo Studio
O Odoo Studio permite adicionar campos e ajustar vistas sem código — útil para alterações rápidas. Para lógica complexa ou cenários com upgrades frequentes, prefira módulos personalizados.
Boas práticas
- Separe corretamente o que é comum e o que é específico: guarde a informação partilhada no template e coloque dados de variante (SKU, código de barras, stock) em product.product.
- Atribua categ_id correctamente para que rotas e relatórios funcionem automaticamente: categorias influenciam comportamento por defeito.
- Use default_code como chave para mapeamentos com sistemas externos e para integração de inventários; manter consistência facilita sincronizações.
- Ao criar integrações, utilize XML‑RPC ou JSON‑RPC do Odoo. O modelo product.template está exposto na API — mapeie IDs externos com cuidado para evitar conflitos.
- Para campos personalizados, siga a convenção x_ ou prefixe com o nome do seu módulo para reduzir o risco de colisões com futuras versões do Odoo.
Erros comuns
- Criar templates duplicados em vez de usar variantes. Quando as diferenças são apenas atributos (tamanho, cor), utilize attribute_line_ids para gerar variantes em vez de duplicar templates.
- Confundir product.template com product.product. Dados específicos da variante, como barcode e SKU, devem residir em product.product, não no template.
- Esquecer de activar sale_ok ou purchase_ok. Campos desativados tornam o produto invisível nos formulários correspondentes, o que pode bloquear processos de compra ou venda.
- Sobrescrever métodos core sem chamar super(). Isto pode quebrar funcionalidades de outros módulos e dificultar atualizações futuras.
- Adicionar campos obrigatórios sem valor por defeito. Registos antigos podem falhar validações após um upgrade se os novos campos forem requeridos sem default.
Conclusão
O product.template é um dos pilares do Odoo: centraliza definições de produto e os atributos partilhados. Saber como funcionam os seus campos e como os módulos o estendem facilita configurar, personalizar e integrar o Odoo de forma robusta.
Seja para um consultor que organiza catálogos ou para um programador a desenvolver módulos, dominar o product.template evita trabalho redundante e reduz riscos de erro.
Comece com a Dasolo
A Dasolo ajuda empresas a implementar, personalizar e otimizar Odoo. Temos experiência em integrações via API e desenvolvimento de módulos, com conhecimento profundo da arquitectura de dados e modelos como o product.template.
Se precisa de apoio na sua implementação Odoo, construção de módulos personalizados ou integrações, podemos ajudar a definir a melhor solução. Agende uma demonstração para discutir o seu projeto.