Introdução
Uma das funcionalidades menos comentadas no modelo de dados do Odoo é o campo dependente da empresa. É um pequeno atributo que faz uma grande diferença assim que você começa a trabalhar com configurações de múltiplas empresas.
Na maioria das configurações do Odoo, um campo em um registro contém um único valor que todos os usuários do banco de dados podem ver. Mas o que acontece quando duas empresas compartilham o mesmo catálogo de produtos e cada empresa precisa do seu próprio código de referência interno? Ou quando diferentes empresas precisam de diferentes contas padrão para o mesmo produto?
Esse é exatamente o problema que o atributo company_dependent resolve. Seja você um desenvolvedor Odoo, um personalizador Odoo, ou apenas explorando o framework Odoo, entender este tipo de campo lhe dará uma verdadeira vantagem em projetos de múltiplas empresas.
O que é um Campo Dependente da Empresa no Odoo
Um campo dependente da empresa é um campo que armazena um valor separado por empresa, no mesmo registro. Quando um utilizador pertencente à Empresa A lê o campo, vê o valor da sua empresa. Quando um utilizador da Empresa B lê o mesmo registro, vê um valor diferente.
Do exterior, parece e comporta-se como um campo normal. Os utilizadores interagem com ele da mesma forma na interface do Odoo. A mágica acontece nos bastidores no ORM do Odoo.
Como Aparece na Interface
Na interface do Odoo, um campo dependente da empresa parece idêntico a um campo regular. Não há um indicador visível que diga a um utilizador que o valor que vê é específico da empresa. Isso é intencional: o comportamento é transparente para os utilizadores finais.
Do ponto de vista de um desenvolvedor, este é um dos tipos de campo do Odoo que pode ser aplicado a muitos tipos base: Char, Boolean, Integer, Float, Many2one, e outros. O atributo company_dependent=True é o que ativa esse comportamento no ORM do Odoo.
No Odoo Studio, alguns campos dependentes da empresa já estão expostos em modelos padrão (como campos relacionados a produtos para contas). Campos dependentes da empresa personalizados também podem ser criados, embora o suporte do Studio para este atributo específico seja limitado em algumas versões do Odoo.
Como o Campo Funciona
Nos bastidores, os campos dependentes da empresa funcionam de forma muito diferente dos campos regulares. Compreender o mecanismo ajuda a evitar surpresas ao construir ou depurar personalizações do Odoo.
Armazenamento em ir.property
No Odoo 16 e versões anteriores, os valores dos campos dependentes da empresa não são armazenados na tabela de banco de dados do próprio modelo. Em vez disso, são armazenados em uma tabela de sistema separada chamada ir.property.
Cada entrada em ir.property liga:
- Um registro específico (por exemplo, produto com ID 42)
- Um campo específico (por exemplo,
property_account_income_id) - Uma empresa específica
- O valor real para essa combinação
É por isso que os valores parecem transparentes para os usuários: o ORM recupera e grava em ir.property automaticamente com base no contexto da empresa atual.
Mudanças no Odoo 17+
A partir do Odoo 17, o mecanismo de armazenamento foi reestruturado. Campos dependentes da empresa agora são armazenados diretamente na tabela do modelo usando uma coluna jsonb, com valores da empresa armazenados como um dicionário JSON. Isso melhora significativamente o desempenho e simplifica as consultas.
A interface e a API voltada para desenvolvedores permanecem as mesmas, mas as consultas em campos dependentes da empresa agora são muito mais rápidas em grande escala.
Valores Padrão
Campos dependentes da empresa suportam valores padrão específicos da empresa. Quando nenhum valor foi explicitamente definido para uma determinada empresa, o campo recai sobre o padrão definido no próprio campo. Esse padrão também pode ser definido por empresa através do modelo ir.property (Odoo 16 e anteriores) ou diretamente no modelo (Odoo 17+).
Interação com o ORM
No contexto do orm do odoo, acessar um campo dependente da empresa sempre respeita a empresa atual no ambiente (self.env.company). Isso significa:
- Ler o campo retorna o valor para a empresa ativa
- Escrever no campo atualiza apenas o valor para a empresa ativa
- A mudança de contexto da empresa (
record.with_company(company)) permite ler ou escrever valores para uma empresa específica
Casos de Uso Empresarial
O campo dependente da empresa não é apenas uma curiosidade técnica. Ele resolve problemas reais do dia a dia em configurações multi-empresa do Odoo. Aqui estão cinco cenários comuns onde ele realmente ganha seu lugar.
1. Contabilidade: Contas de Receita e Despesa por Empresa
Este é o exemplo mais comum no Odoo pronto para uso. Os campos property_account_income_id e property_account_expense_id nos produtos são dependentes da empresa.
Na prática: A Empresa A vende o mesmo produto que a Empresa B, mas cada empresa tem um plano de contas diferente. Em vez de duplicar o registro do produto, cada empresa apenas configura suas próprias linhas contábeis. O produto é compartilhado; a lógica contábil não é.
2. Vendas e CRM: Listas de Preços por Empresa
Em um grupo que opera várias entidades de vendas, cada empresa pode usar diferentes estratégias de preços. Com um campo de lista de preços dependente da empresa, um registro de cliente compartilhado pode ter diferentes listas de preços padrão dependendo de qual empresa está processando a venda.
Isso mantém os dados do CRM centralizados enquanto permite que cada empresa aplique suas próprias regras comerciais.
3. Inventário: Método de Avaliação de Estoque por Empresa
Alguns grupos operam armazéns em várias entidades legais com diferentes regulamentos locais. Um produto pode exigir custo FIFO em um país e custo médio em outro. Usar campos dependentes da empresa no produto ou categoria evita a duplicação de todo o catálogo de produtos.
4. Fabricação: Fornecedor Padrão por Empresa
Quando um produto compartilhado é adquirido de diferentes fornecedores dependendo da empresa, um campo many2one dependente da empresa apontando para res.partner pode manter o fornecedor preferido por entidade. Cada empresa vê seu próprio fornecedor preferido sem qualquer conflito.
5. Campos Personalizados para Dados Regulatórios
Grupos que operam em vários países frequentemente precisam armazenar referências de conformidade específicas de cada país em registros compartilhados. Por exemplo, um produto pode precisar de um código HS ou classificação fiscal diferente por jurisdição. Um campo dependente da empresa é uma maneira limpa e de baixo custo para lidar com isso sem criar variantes de modelo.
Criando ou Personalizando o Campo
Existem duas maneiras principais de criar campos dependentes da empresa no Odoo: usando o Odoo Studio ou escrevendo código Python diretamente.
Usando Odoo Studio
O Odoo Studio permite que você crie campos sem nenhum código. No entanto, o Studio não expõe um alternador dedicado para company_dependent em todas as versões. No Odoo 16 e 17, a opção está disponível em alguns tipos de campo ao criar novos campos em modelos padrão.
Se você precisar de controle total sobre esse atributo, o desenvolvimento técnico é a abordagem mais confiável. O Studio é um bom ponto de partida para casos mais simples, mas tem limites quando se trata de cenários avançados de personalização do Odoo.
Abordagem Técnica: Campos Python
Em um módulo Odoo personalizado, declarar um campo dependente da empresa é simples. Este é o padrão padrão usado no desenvolvimento de campos Python do Odoo:
from odoo import fields, models
class ProductTemplate(models.Model):
_inherit = 'product.template'
x_internal_ref = fields.Char(
string='Referência Interna (por empresa)',
company_dependent=True,
)
x_preferred_carrier_id = fields.Many2one(
comodel_name='res.partner',
string='Transportadora Preferida',
company_dependent=True,
)
Adicionar company_dependent=True a qualquer declaração de campo é tudo o que é necessário. O ORM cuida do resto automaticamente.
Definindo Valores Padrão por Empresa
No Odoo 16 e versões anteriores, você pode definir um padrão em nível de empresa através do modelo ir.property. Isso é útil quando você deseja um padrão sensato para todos os registros em uma empresa, sem defini-lo registro por registro:
self.env['ir.property']._set_default(
'x_internal_ref',
'product.template',
'DEFAULT-VALUE',
company_id=self.env.company.id,
)
No Odoo 17+, o valor padrão é armazenado diretamente no registro do modelo e também é acessível através da definição do campo.
Campos e Limitações do Odoo Studio
Ao trabalhar com campos do Odoo Studio, tenha em mente que o prefixo x_ é obrigatório para campos personalizados. O comportamento dependente da empresa pode não ser visível na interface do Studio, mas ainda pode ser configurado a partir do menu técnico em Configurações se o modo de desenvolvedor estiver ativo.
Melhores Práticas
Trabalhar com campos dependentes da empresa é simples uma vez que você conhece os padrões. Aqui estão as práticas que economizarão seu tempo e evitarão dores de cabeça.
1. Use Apenas Quando os Valores Realmente Diferirem por Empresa
Campos dependentes da empresa adicionam complexidade. Se o valor for o mesmo em todas as empresas, use um campo regular. Reserve company_dependent=True para campos onde empresas diferentes realmente precisam de valores diferentes em registros compartilhados.
2. Sempre Teste em Contexto de Múltiplas Empresas
Ao construir ou testar recursos que envolvem campos dependentes da empresa, sempre teste com pelo menos duas empresas ativas. É fácil perder problemas em uma configuração de empresa única que surgirão imediatamente em produção.
3. Use with_company() para Operações Entre Empresas
Se o seu código precisar ler ou escrever valores de campos dependentes da empresa para uma empresa diferente da atual, use record.with_company(target_company). Evite mudar manualmente a empresa do ambiente sem restaurá-la.
4. Tenha Cuidado com Exportações e Importações
Ao exportar registos que contêm campos dependentes da empresa, os valores exportados refletem a empresa do utilizador que está a realizar a exportação. Importar o mesmo ficheiro sob um contexto de empresa diferente definirá os valores para essa empresa. Este é frequentemente o comportamento correto, mas seja explícito sobre isso em fluxos de migração e importação de dados.
5. Documente Quais Campos São Dependentes da Empresa
Os utilizadores finais raramente sabem quais campos são dependentes da empresa. Uma breve nota na sua documentação interna do Odoo ou nos materiais de integração faz uma grande diferença. Isso evita confusões quando um utilizador muda de empresa e vê valores diferentes no mesmo registo.
6. Prefira Many2one em vez de Char para Dados Estruturados
Quando o valor por empresa é uma referência a outro registo (conta, lista de preços, parceiro), utilize um campo dependente da empresa Many2one em vez de armazenar um nome como texto. Isso mantém o modelo de dados limpo e torna os relatórios mais fiáveis.
Erros Comuns
Mesmo desenvolvedores experientes do Odoo enfrentam problemas com campos dependentes da empresa. Saber o que observar evitará tempo perdido em depuração.
Armadilha 1: Esquecer o Contexto da Empresa em Ações Automatizadas
Ações agendadas e ações do servidor muitas vezes são executadas em um contexto onde a empresa é a primeira empresa no banco de dados, não necessariamente a que você espera. Se a sua ação automatizada lê ou escreve um campo dependente da empresa, verifique o contexto da empresa explicitamente. Use with_company() para garantir.
Armada 2: Assumir que o Campo Comporta-se Como um Campo Computado
Campos dependentes da empresa não são campos computados. Eles não têm um método compute. A variação por empresa vem do armazenamento, não do cálculo. Tentar adicionar compute= juntamente com company_dependent=True não funcionará como esperado e pode causar erros no framework do Odoo.
Armada 3: Pesquisar Através das Empresas
Pesquisas ORM padrão em campos dependentes da empresa apenas retornam resultados que correspondem ao contexto da empresa atual. Se precisar pesquisar em todas as empresas, você precisa consultar ir.property diretamente (Odoo 16 e anteriores) ou lidar com a coluna jsonb com cuidado (Odoo 17+). Esta é uma fonte comum de confusão em relatórios e trabalhos de extração de dados.
Armadilha 4: Não Definir Padrões para Todas as Empresas
Quando você introduz um campo dependente da empresa em um sistema ao vivo, os registros existentes retornarão False ou None para qualquer empresa que não tenha definido explicitamente um valor. Se a sua lógica de negócios espera um padrão, defina-o proativamente para todas as empresas relevantes usando um script de migração de dados.
Armadilha 5: Confundir com Direitos de Acesso
Campos dependentes da empresa controlam qual valor é mostrado, não se o usuário pode ver o campo ou não. Se você precisa ocultar um campo completamente de certas empresas ou usuários, isso é um trabalho para regras de registro ou direitos de acesso a nível de campo, não para company_dependent.
Conclusão
O campo dependente da empresa é uma daquelas funcionalidades no Odoo que parece invisível até que você precise dela, e então se torna indispensável. É a ferramenta certa para qualquer situação em que o mesmo registro precise carregar valores diferentes entre empresas: configurações contábeis, regras de preços, referências regulatórias ou qualquer atributo específico de negócios que varia por entidade legal.
Entender como funciona a nível de ORM, qual versão do Odoo mudou o modelo de armazenamento e quais armadilhas evitar economizará um tempo significativo em projetos multi-empresa. Quer você encontre isso em um guia de desenvolvedor padrão do Odoo ou descubra enquanto depura um sistema ao vivo, conhecer esse tipo de campo é um sinal de verdadeira expertise em Odoo.
Se você está construindo sobre a estrutura do Odoo e precisa lidar com dados por empresa de forma limpa, company_dependent=True é a resposta que você estava procurando.
Precisa de Ajuda com a Sua Implementação do Odoo?
Na Dasolo, ajudamos empresas a implementar, personalizar e otimizar o Odoo em todas as escalas e configurações, incluindo configurações complexas de múltiplas empresas. Se você precisa de um modelo de dados sob medida, uma estratégia de campo personalizada ou uma implementação completa do Odoo, nossa equipe tem a profundidade técnica e funcional para acertar.
Se você tiver perguntas sobre campos dependentes da empresa ou qualquer outro aspecto da sua implementação do Odoo, estamos felizes em ajudar. Entre em contato conosco e vamos conversar sobre o que você está construindo.