Introduzione
Una funzione poco visibile ma potente nel modello dati di Odoo è il campo dipendente dalla società. Non è qualcosa che salta all'occhio nella configurazione quotidiana, ma diventa fondamentale quando gestisci più entità legali nella stessa installazione.
Nel funzionamento standard di Odoo, un campo di un record contiene un unico valore condiviso da tutti gli utenti. Il problema sorge quando più società usano lo stesso prodotto ma devono mantenere referenze interne diverse, o quando le stesse anagrafiche necessitano di conti predefiniti differenti a seconda dell'entità che effettua l'operazione.
Proprio a questo serve l'attributo company_dependent. Che tu stia sviluppando, personalizzando o studiando il framework Odoo, sapere come e quando usarlo ti dà un vantaggio concreto nei progetti multi-company.
Cos'è un campo dipendente dalla società in Odoo
Un campo dipendente dalla società è progettato per conservare un valore separato per ogni società, pur rimanendo sullo stesso record. Un utente di Società A vedrà il valore impostato per A; un utente di Società B vedrà invece il valore relativo a B.
In superficie l'interazione è identica a quella di un campo normale: l'utente compila o legge lo stesso campo nella UI. La differenza è gestita internamente dall'ORM di Odoo.
Come si presenta nell'interfaccia
Nell'interfaccia Odoo il campo dipendente dalla società non ha segni distintivi visibili: appare esattamente come un campo standard. Questa scelta mantiene l'esperienza utente semplice e senza frizioni.
Dal punto di vista dello sviluppatore, l'attributo può essere applicato a molti tipi di campo: Char, Boolean, Integer, Float, Many2one e altri. È la flag company_dependent=True che abilita il comportamento speciale nell'ORM.
In Odoo Studio alcune proprietà company-dependent sui modelli standard sono già esposte (per esempio campi legati ai conti su prodotti). È possibile creare campi personalizzati con questa caratteristica, ma il supporto di Studio può variare tra le versioni: per controlli avanzati spesso è preferibile lo sviluppo tecnico.
Come funziona il campo
Dietro le quinte, il funzionamento dei campi company-dependent è diverso da quello dei campi tradizionali. Capirne il meccanismo evita sorprese durante debug, migrazioni e personalizzazioni.
Archiviazione su ir.property
Nelle versioni fino a Odoo 16 i valori dei campi dipendenti dalla società non sono salvati nella tabella del modello, ma in una tabella di sistema separata chiamata ir.property.
Ogni record nella tabella ir.property collega:
- Un record specifico (es. prodotto con ID 42)
- Un campo specifico (es.
property_account_income_id) - Una società specifica
- Il valore effettivo associato a quella combinazione
Per questo l'utente non nota nulla: l'ORM si occupa automaticamente di leggere e scrivere su ir.property in base al contesto della società corrente.
Cambiamenti in Odoo 17+
Con Odoo 17 il meccanismo è stato rivisto: i valori company-dependent vengono ora salvati direttamente nella tabella del modello tramite una colonna jsonb, che memorizza le diverse versioni per società in un dizionario JSON. Il risultato è un notevole miglioramento delle performance e query più semplici.
L'interfaccia e l'API per gli sviluppatori rimangono in gran parte invariate, ma le operazioni su larga scala risultano decisamente più veloci rispetto al passato.
Valori predefiniti
I campi company-dependent supportano default specifici per ciascuna società. Se per una società non è stato impostato un valore, il campo ricade sul default definito nella dichiarazione del campo oppure su un default impostato per società tramite ir.property (fino a Odoo 16) o direttamente sul modello (Odoo 17+).
Interazione con l'ORM
Nel contesto dell'ORM di Odoo, l'accesso a un campo company-dependent rispetta sempre la società attiva in self.env.company. Questo comporta che:
- La lettura restituisce il valore relativo alla società attiva
- La scrittura aggiorna il valore solo per la società corrente
- Cambiare il contesto aziendale con
record.with_company(company)consente di leggere o scrivere il valore per una società specifica
Casi d'uso aziendali
Il campo company-dependent non è una curiosità tecnica: risolve problemi pratici quotidiani in ambienti multi-entity. Ecco cinque scenari in cui dà il suo meglio.
1. Contabilità: conti ricavi e costi per società
Questo è l'esempio più diffuso in Odoo: i campi property_account_income_id e property_account_expense_id sui prodotti sono company-dependent.
Nella pratica: lo stesso prodotto venduto da due società diverse può dover essere contabilizzato su piani dei conti distinti. Invece di duplicare i prodotti, ogni società imposta i propri conti sullo stesso record prodotto.
2. Vendite e CRM: listini prezzi per società
In un gruppo con più entità commerciali, ciascuna società può adottare strategie di prezzo proprie. Un campo listino company-dependent permette a uno stesso cliente di avere listini di default diversi a seconda della società che crea l'offerta.
Questo mantiene centrale l'anagrafica cliente, lasciando libertà commerciale a ogni entità.
3. Magazzino: metodo di valutazione scorte per società
Gruppi con magazzini in più giurisdizioni possono necessitare metodi di valutazione differenti (FIFO, prezzo medio, ecc.). Applicando la scelta di valutazione come campo company-dependent su prodotto o categoria si evita la duplicazione del catalogo.
4. Produzione: fornitore predefinito per società
Se un prodotto viene rifornito da fornitori diversi a seconda della società, un campo company-dependent di tipo many2one verso res.partner memorizza il fornitore preferito per ciascuna entità senza conflitti.
5. Campi personalizzati per requisiti normativi
Gruppi internazionali spesso devono mantenere riferimenti regolatori diversi per paese (codici HS, classificazioni IVA, ecc.). Un campo Char company-dependent è una soluzione leggera per tracciare queste differenze senza creare varianti del modello.
Creare o personalizzare il campo
Esistono due approcci principali per creare campi company-dependent in Odoo: tramite Odoo Studio o con codice Python in un modulo personalizzato.
Usare Odoo Studio
Odoo Studio permette di aggiungere campi senza programmare, ma non sempre espone una casella di controllo specifica per company_dependent in tutte le versioni. In Odoo 16 e 17 l'opzione è disponibile per alcuni tipi di campo sui modelli standard.
Per controllo completo e scenari avanzati la via tecnica è più affidabile. Studio resta utile per prototipi o casi semplici, ma ha limiti quando servono personalizzazioni profonde.
Approccio tecnico: campi Python
In un modulo personalizzato dichiarare un campo company-dependent è semplice e segue il pattern standard dello sviluppo Odoo in Python:
from odoo import fields, models
class ProductTemplate(models.Model):
_inherit = 'product.template'
x_internal_ref = fields.Char(
string='Riferimento interno (per società)',
company_dependent=True,
)
x_preferred_carrier_id = fields.Many2one(
comodel_name='res.partner',
string='Vettore preferito',
company_dependent=True,
)
Aggiungere company_dependent=True alla definizione del campo è sufficiente: l'ORM provvederà al resto.
Impostare valori predefiniti per società
Fino a Odoo 16 si possono definire default a livello di società tramite il modello ir.property, utile per avere un valore sensato per tutti i record di una società senza doverli aggiornare uno per uno:
self.env['ir.property']._set_default(
'x_internal_ref',
'product.template',
'DEFAULT-VALUE',
company_id=self.env.company.id,
)
In Odoo 17+ il default può essere memorizzato direttamente sul record del modello ed è accessibile anche dalla definizione del campo.
Campi creati con Odoo Studio e limitazioni
Ricorda che i campi personalizzati creati con Studio richiedono il prefisso x_. Il comportamento company-dependent potrebbe non essere esplorabile direttamente dalla UI di Studio, ma è comunque configurabile tramite il menu tecnico se la modalità sviluppatore è attiva.
Buone pratiche
Gestire i campi company-dependent diventa naturale seguendo alcuni schemi consolidati. Queste pratiche ti faranno risparmiare tempo e problemi.
1. Usalo solo quando il valore deve davvero differire per società
I campi company-dependent aggiungono complessità: se il valore è identico per tutte le società, resta su un campo normale. Riserva company_dependent=True ai casi in cui le entità legali richiedano varianti reali.
2. Testa sempre in un contesto multi-company
Durante sviluppo e test, usa almeno due società attive: problemi che restano nascosti in un'installazione mono-company emergono immediatamente in produzione.
3. Usa with_company() per operazioni cross-company
Se il tuo codice deve leggere o scrivere valori per una società diversa da quella corrente, utilizza record.with_company(target_company). Evita di cambiare manualmente self.env.company senza ripristinare il contesto.
4. Attenzione a esportazioni e importazioni
Le esportazioni riflettono i valori della società dell'utente che le esegue; importando lo stesso file sotto un'altra società imposterai i valori per quella società. Questo comportamento è corretto ma va considerato nelle migrazioni e nei workflow di import.
5. Documenta quali campi sono company-dependent
Gli utenti finali spesso non sanno quali campi variano per società. Una breve nota nella documentazione interna o nei materiali di onboarding evita confusione quando si cambia società e il valore visualizzato cambia.
6. Preferisci Many2one a Char per dati strutturati
Se il valore per società è un riferimento a un altro record (conto, listino, partner), usa un campo Many2one company-dependent invece di salvare solo il nome testuale. Mantieni così il modello dati pulito e faciliti le analisi e i report.
Errori comuni
Anche sviluppatori esperti incontrano difficoltà con i campi company-dependent. Conoscere gli errori tipici evita ore di debug inutili.
Errore 1: dimenticare il contesto aziendale nelle azioni automatiche
Action server e azioni programmate spesso girano con il contesto della prima società del database, non necessariamente quella attesa. Se un'azione legge o scrive su un campo company-dependent, verifica esplicitamente la società con with_company().
Errore 2: confondere il campo con un campo computato
I campi company-dependent non sono campi computati: non si basano su un compute. La variazione per società deriva dallo storage, non da un calcolo. Mescolare compute= con company_dependent=True può creare comportamenti non previsti e errori.
Errore 3: cercare su più società senza criterio
Le ricerche ORM su campi company-dependent restituiscono risultati relativi alla società attiva. Per cercare su tutte le società bisogna interrogare direttamente ir.property (Odoo 16 e precedenti) o gestire opportunamente la colonna jsonb (Odoo 17+). Questo causa spesso incomprensioni in report e estrazioni dati.
Errore 4: non impostare default per tutte le società
Se introduci un campo company-dependent su un sistema in esercizio, i record esistenti saranno False o None per le società che non hanno un valore esplicito. Se la logica aziendale si aspetta un default, applicalo subito via script di migrazione.
Errore 5: confonderlo con i permessi di accesso
I campi company-dependent determinano quale valore viene mostrato, non se il campo è visibile. Se devi nascondere un campo a certe società o utenti, usa regole di record o diritti a livello di campo, non company_dependent.
Conclusione
Il campo dipendente dalla società è una di quelle funzionalità Odoo che sembra invisibile fino al momento in cui serve, poi diventa essenziale. È lo strumento giusto quando lo stesso record deve portare valori diversi per società: contabilità, listini, requisiti normativi o qualsiasi attributo aziendale variabile.
Capire il funzionamento a livello di ORM, sapere quale versione di Odoo ha cambiato il modello di storage e conoscere le insidie comuni ti farà risparmiare tempo nei progetti multi-company. Che lo trovi in una guida per sviluppatori o lo scopra mentre risolvi un problema in produzione, padroneggiare questo tipo di campo è segno di competenza su Odoo.
Se lavori sul framework Odoo e ti serve gestire dati per società in modo elegante, company_dependent=True è probabilmente la soluzione che cercavi.
Serve aiuto per la tua implementazione Odoo?
Noi di Dasolo affianchiamo le aziende nell'implementazione, personalizzazione e ottimizzazione di Odoo su progetti di ogni dimensione, inclusi scenari multi-company complessi. Che tu abbia bisogno di un modello dati su misura, di una strategia per i campi o di un rollout completo, il nostro team unisce competenze funzionali e tecniche per ottenere risultati.
Se hai dubbi sui campi company-dependent o su qualsiasi altra parte della tua implementazione Odoo, siamo a disposizione per aiutarti. Contattaci e parliamo del progetto che vuoi realizzare.