Inleiding
Een van de minder besproken functies in het Odoo-datamodel is het bedrijfafhankelijke veld. Het is een kleine eigenschap die een groot verschil maakt zodra je begint te werken met multi-company configuraties.
In de meeste Odoo-setup's houdt een veld op een record een enkele waarde vast die elke gebruiker in de database kan zien. Maar wat gebeurt er als twee bedrijven dezelfde productcatalogus delen, en elk bedrijf zijn eigen interne referentiecode nodig heeft? Of wanneer verschillende bedrijven verschillende standaardrekeningen nodig hebben voor hetzelfde product?
Dat is precies het probleem dat de company_dependent eigenschap oplost. Of je nu Odoo-ontwikkeling doet, Odoo-aanpassingen maakt, of gewoon het Odoo-framework verkent, het begrijpen van dit veldtype zal je een echt voordeel geven in multi-company projecten.
Wat is een bedrijfafhankelijke veld in Odoo
Een bedrijfafhankelijke veld is een veld dat een aparte waarde per bedrijf opslaat, op hetzelfde record. Wanneer een gebruiker die tot Bedrijf A behoort het veld leest, ziet hij de waarde van zijn bedrijf. Wanneer een gebruiker van Bedrijf B hetzelfde record leest, ziet hij een andere waarde.
Van buitenaf lijkt het op een normaal veld en gedraagt het zich ook zo. Gebruikers interageren er op dezelfde manier mee in de Odoo-interface. De magie gebeurt achter de schermen in de Odoo ORM.
Hoe het verschijnt in de interface
In de Odoo UI ziet een bedrijfafhankelijk veld eruit als een regulier veld. Er is geen zichtbare indicator die een gebruiker vertelt dat de waarde die ze zien bedrijfsspecifiek is. Dit is opzettelijk: het gedrag is transparant voor eindgebruikers.
Vanuit een ontwikkelaarsperspectief is dit een van de Odoo-veldtypen die kan worden toegepast op veel basistypen: Char, Boolean, Integer, Float, Many2one, en anderen. De company_dependent=True eigenschap is wat dit gedrag activeert in de Odoo ORM.
In Odoo Studio zijn sommige bedrijfafhankelijke velden al zichtbaar op standaardmodellen (zoals productgerelateerde velden voor rekeningen). Aangepaste bedrijfafhankelijke velden kunnen ook worden gemaakt, hoewel de ondersteuning van Studio voor deze specifieke eigenschap in sommige Odoo-versies beperkt is.
Hoe het veld werkt
Onder de motorkap werken bedrijfafhankelijke velden heel anders dan reguliere velden. Het begrijpen van het mechanisme helpt om verrassingen te voorkomen bij het bouwen of debuggen van Odoo-aanpassingen.
Opslag in ir.property
In Odoo 16 en eerder worden de waarden van bedrijfafhankelijke velden niet opgeslagen in de eigen database-tabel van het model. In plaats daarvan worden ze opgeslagen in een aparte systeemtabel genaamd ir.property.
Elke invoer in ir.property koppelt:
- Een specifiek record (bijv. product met ID 42)
- Een specifiek veld (bijv.
property_account_income_id) - Een specifieke onderneming
- De werkelijke waarde voor die combinatie
Dit is waarom de waarden transparant lijken voor gebruikers: de ORM haalt automatisch op en schrijft naar ir.property op basis van de huidige bedrijfscontext.
Wijzigingen in Odoo 17+
Met Odoo 17 is het opslagmechanisme herzien. Bedrijfsspecifieke velden worden nu rechtstreeks in de tabel van het model opgeslagen met behulp van een jsonb kolom, waarbij bedrijfswaarden worden opgeslagen als een JSON-woordenboek. Dit verbetert de prestaties aanzienlijk en vereenvoudigt de queries.
De interface en de API voor ontwikkelaars blijven hetzelfde, maar queries op bedrijfsspecifieke velden zijn nu veel sneller op grote schaal.
Standaardwaarden
Bedrijfsspecifieke velden ondersteunen bedrijfsspecifieke standaardwaarden. Wanneer er geen waarde expliciet is ingesteld voor een gegeven bedrijf, valt het veld terug op de standaard die op het veld zelf is gedefinieerd. Deze standaard kan ook per bedrijf worden ingesteld via het ir.property model (Odoo 16 en eerder) of rechtstreeks op het model (Odoo 17+).
Interactie met de ORM
In de Odoo ORM-context respecteert de toegang tot een bedrijfsspecifiek veld altijd het huidige bedrijf in de omgeving (self.env.company). Dit betekent:
- Het lezen van het veld retourneert de waarde voor het actieve bedrijf
- Het schrijven naar het veld werkt alleen de waarde bij voor het actieve bedrijf
- Het wisselen van de bedrijfscontext (
record.with_company(company)) stelt je in staat om waarden voor een specifiek bedrijf te lezen of te schrijven.
Zakelijke gebruikscases
Het bedrijfsafhankelijke veld is niet zomaar een technische curiositeit. Het lost echte, dagelijkse problemen op in multi-company Odoo-omgevingen. Hier zijn vijf veelvoorkomende scenario's waarin het zijn plaats echt verdient.
1. Boekhouding: Per-Bedrijf Inkomsten- en Uitgavenrekeningen
Dit is het meest voorkomende voorbeeld in Odoo uit de doos. De velden property_account_income_id en property_account_expense_id op producten zijn bedrijfsafhankelijk.
In de praktijk: Bedrijf A verkoopt hetzelfde product als Bedrijf B, maar elk bedrijf heeft een andere rekeningenstelsel. In plaats van het productrecord te dupliceren, configureert elk bedrijf gewoon zijn eigen boekhoudlijnen. Het product is gedeeld; de boekhoudlogica niet.
2. Verkoop en CRM: Per-Bedrijf Prijslijsten
In een groep die meerdere verkoopentiteiten runt, kan elk bedrijf verschillende prijsstrategieën hanteren. Met een bedrijfsafhankelijke prijslijstveld kan een gedeeld klantrecord verschillende standaard prijslijsten bevatten, afhankelijk van welk bedrijf de verkoop verwerkt.
Dit houdt de CRM-gegevens gecentraliseerd terwijl elk bedrijf zijn eigen commerciële regels kan toepassen.
3. Voorraad: Per-Bedrijf Voorraadwaarderingsmethode
Sommige groepen opereren magazijnen over meerdere rechtspersonen met verschillende lokale regelgeving. Een product kan FIFO-kostprijs vereisen in het ene land en gemiddelde kosten in een ander. Het gebruik van bedrijfsafhankelijke velden op het product of de categorie voorkomt dat de hele productcatalogus gedupliceerd wordt.
4. Productie: Per-Bedrijf Standaard Leverancier
Wanneer een gedeeld product van verschillende leveranciers wordt gekocht, afhankelijk van het bedrijf, kan een bedrijfsafhankelijke many2one-veld dat naar res.partner verwijst, de voorkeurleverancier per entiteit bevatten. Elk bedrijf ziet zijn eigen voorkeurleverancier zonder enige conflicten.
5. Aangepaste Velden voor Regelgevende Gegevens
Groepen die in meerdere landen opereren, moeten vaak land-specifieke nalevingsreferenties opslaan op gedeelde records. Een product kan bijvoorbeeld een andere HS-code of belastingclassificatie per jurisdictie nodig hebben. Een bedrijf afhankelijk Char veld is een schone, laagdrempelige manier om dit te beheren zonder modelvarianten te creëren.
Een veld maken of aanpassen
Er zijn twee hoofdmethoden om bedrijf afhankelijke velden in Odoo te creëren: met Odoo Studio of door Python-code direct te schrijven.
Odoo Studio gebruiken
Odoo Studio stelt je in staat om velden te creëren zonder enige code. Studio biedt echter niet in alle versies een speciale schakelaar voor company_dependent. In Odoo 16 en 17 is de optie beschikbaar voor sommige veldtypes bij het creëren van nieuwe velden op standaardmodellen.
Als je volledige controle over deze eigenschap nodig hebt, is technische ontwikkeling de betrouwbaardere benadering. Studio is een goed startpunt voor eenvoudigere gevallen, maar het heeft beperkingen als het gaat om geavanceerde Odoo-aanpassingsscenario's.
Technische Benadering: Python Velden
In een aangepaste Odoo-module is het declareren van een bedrijf afhankelijk veld eenvoudig. Dit is het standaardpatroon dat wordt gebruikt in de ontwikkeling van Odoo Python-velden:
from odoo import fields, models
class ProductTemplate(models.Model):
_inherit = 'product.template'
x_internal_ref = fields.Char(
string='Interne Referentie (per bedrijf)',
company_dependent=True,
)
x_preferred_carrier_id = fields.Many2one(
comodel_name='res.partner',
string='Voorkeursvervoerder',
company_dependent=True,
)
Het toevoegen van company_dependent=True aan elke veldverklaring is alles wat nodig is. De ORM regelt de rest automatisch.
Standaardwaarden Per Bedrijf Instellen
In Odoo 16 en eerder kun je een bedrijfsniveau standaard instellen via het ir.property model. Dit is nuttig wanneer je een redelijke standaard wilt voor alle records in een bedrijf, zonder het record voor record in te stellen:
self.env['ir.property']._set_default(
'x_internal_ref',
'product.template',
'DEFAULT-VALUE',
company_id=self.env.company.id,
)
In Odoo 17+ wordt de standaardwaarde rechtstreeks op het modelrecord opgeslagen en is deze ook toegankelijk via de velddefinitie.
Odoo Studio Velden en Beperkingen
Houd er rekening mee dat de x_ prefix vereist is voor aangepaste velden wanneer u met Odoo Studio-velden werkt. Het bedrijfafhankelijke gedrag is mogelijk niet zichtbaar in de Studio UI, maar kan nog steeds worden geconfigureerd vanuit het technische menu onder Instellingen als de ontwikkelaarsmodus actief is.
Beste praktijken
Werken met bedrijfafhankelijke velden is eenvoudig zodra je de patronen kent. Hier zijn de praktijken die je tijd zullen besparen en hoofdpijn zullen voorkomen.
1. Gebruik het alleen wanneer waarden echt verschillen per bedrijf
Bedrijfafhankelijke velden voegen complexiteit toe. Als de waarde hetzelfde is voor alle bedrijven, gebruik dan een regulier veld. Reserveer company_dependent=True voor velden waar verschillende bedrijven echt verschillende waarden nodig hebben op gedeelde records.
2. Test altijd in een multi-bedrijfcontext
Bij het bouwen of testen van functies die bedrijfafhankelijke velden bevatten, test altijd met minstens twee actieve bedrijven. Het is gemakkelijk om problemen te missen in een eenbedrijfsetup die onmiddellijk in productie naar voren komen.
3. Gebruik with_company() voor cross-bedrijfsoperaties
Als je code bedrijfafhankelijke veldwaarden moet lezen of schrijven voor een bedrijf anders dan het huidige, gebruik dan record.with_company(target_company). Vermijd het handmatig wisselen van het bedrijfsomgeving zonder het te herstellen.
4. Wees voorzichtig met exporteren en importeren
Bij het exporteren van records die bedrijfsspecifieke velden bevatten, weerspiegelen de geëxporteerde waarden het bedrijf van de gebruiker die de export uitvoert. Het importeren van hetzelfde bestand onder een andere bedrijfscontext zal de waarden voor dat bedrijf instellen. Dit is vaak het juiste gedrag, maar wees hier expliciet over in migratie- en gegevensimportwerkstromen.
5. Documenteer Welke Velden Bedrijfsspecifiek Zijn
Eindgebruikers weten zelden welke velden bedrijfsspecifiek zijn. Een korte opmerking in uw interne Odoo-documentatie of onboardingmateriaal helpt enorm. Het voorkomt verwarring wanneer een gebruiker van bedrijf wisselt en verschillende waarden op hetzelfde record ziet.
6. Geef de Voorkeur aan Many2one Boven Char voor Gestructureerde Gegevens
Wanneer de waarde per bedrijf een verwijzing naar een ander record is (rekening, prijslijst, partner), gebruik dan een Many2one bedrijfsspecifiek veld in plaats van een naam als tekst op te slaan. Dit houdt het datamodel schoon en maakt rapportage betrouwbaarder.
Veelvoorkomende valkuilen
Zelfs ervaren Odoo-ontwikkelaars lopen tegen problemen aan met bedrijfsspecifieke velden. Weten waar je op moet letten voorkomt verspilde debugtijd.
Valstrik 1: Vergeten van de Bedrijfscontext in Geautomatiseerde Acties
Geplande acties en serveracties worden vaak uitgevoerd in een context waarin het bedrijf het eerste bedrijf in de database is, niet noodzakelijkerwijs het bedrijf dat je verwacht. Als je geautomatiseerde actie een bedrijfsspecifiek veld leest of schrijft, verifieer dan expliciet de bedrijfscontext. Gebruik with_company() voor de zekerheid.
Valstrik 2: Aannemen dat het Veld Gedraagt als een Berekenend Veld
Bedrijfsspecifieke velden zijn geen berekenende velden. Ze hebben geen compute-methode. De variatie per bedrijf komt uit opslag, niet uit berekening. Proberen om compute= naast company_dependent=True toe te voegen zal niet werken zoals verwacht en kan fouten in het Odoo-framework veroorzaken.
Valstrik 3: Zoeken Over Bedrijven Heen
Standaard ORM-zoekopdrachten op bedrijfsspecifieke velden geven alleen resultaten terug die overeenkomen met de huidige bedrijfscontext. Als je over alle bedrijven heen wilt zoeken, moet je ir.property rechtstreeks opvragen (Odoo 16 en eerder) of de jsonb-kolom zorgvuldig behandelen (Odoo 17+). Dit is een veelvoorkomende bron van verwarring in rapportage- en gegevensextractiewerk.
Valstrik 4: Geen standaardinstellingen voor alle bedrijven instellen
Wanneer je een bedrijfafhankelijke veld in een live systeem introduceert, zullen bestaande records False of None retourneren voor elk bedrijf dat niet expliciet een waarde heeft ingesteld. Als je bedrijfslogica een standaardwaarde verwacht, stel deze dan proactief in voor alle relevante bedrijven met behulp van een datamigratiescript.
Valstrik 5: Het verwarren met toegangsrechten
Bedrijfafhankelijke velden bepalen welke waarde wordt weergegeven, niet of de gebruiker het veld überhaupt kan zien. Als je een veld volledig wilt verbergen voor bepaalde bedrijven of gebruikers, is dat een taak voor recordregels of toegangsrechten op veldniveau, niet voor company_dependent.
Conclusie
Het bedrijfafhankelijke veld is een van die functies in Odoo die onzichtbaar lijkt totdat je het nodig hebt, en dan onmisbaar wordt. Het is het juiste hulpmiddel voor elke situatie waarin hetzelfde record verschillende waarden moet dragen over bedrijven: boekhoudconfiguraties, prijsregels, regelgevende referenties of enige bedrijfsspecifieke eigenschap die varieert per rechtspersoon.
Begrijpen hoe het werkt op het ORM-niveau, welke versie van Odoo het opslagmodel heeft veranderd, en welke valstrikken je moet vermijden, zal je aanzienlijke tijd besparen bij multi-company projecten. Of je het nu tegenkomt in een standaard Odoo ontwikkelaarsgids of het ontdekt tijdens het debuggen van een live systeem, kennis van dit veldtype is een teken van echte Odoo-expertise.
Als je bouwt op het Odoo-framework en per-bedrijfsgegevens op een nette manier moet afhandelen, is company_dependent=True het antwoord waar je naar op zoek was.
Hulp nodig bij uw Odoo-implementatie?
Bij Dasolo helpen we bedrijven met de implementatie, aanpassing en optimalisatie van Odoo op alle schalen en configuraties, inclusief complexe multi-company setups. Of je nu een op maat gemaakt datamodel, een aangepaste veldstrategie of een volledige Odoo-uitrol nodig hebt, ons team heeft de technische en functionele diepgang om het goed te doen.
Als je vragen hebt over bedrijfafhankelijke velden of een ander aspect van je Odoo-implementatie, helpen we je graag. Neem contact met ons op en laten we praten over wat je aan het bouwen bent.