Inleiding
Het Monetair veld is een van de meest nuttige en meest verkeerd gebruikte veldtypes in Odoo. Het lijkt op een getal, slaat op als een float, maar gedraagt zich als geen van beide. Zodra je begrijpt wat het anders maakt, zul je nooit meer een gewone Float gebruiken voor een financiële waarde.
Als je ooit naar een totaalbedrag van een verkooporder, een factuurbedrag of een productprijs in Odoo hebt gekeken, heb je al gebruikgemaakt van een Monetair veld. Ze zijn overal in het Odoo-datamodel, en ze doen stilletjes veel van het zware werk rond valutavormgeving, afronding en precisie.
Deze gids is voor Odoo-ontwikkelaars, consultants en technisch ingestelde zakelijke gebruikers die willen begrijpen hoe het Monetair veld daadwerkelijk werkt. Of je nu een Odoo-veld tutorial volgt, een aangepaste module bouwt, of gewoon probeert te begrijpen waarom je bedragen anders afronden dan verwacht, dit is de referentie die je nodig hebt.
Wat is het Monetair veld in Odoo
Het fields.Monetary type is een van de kern veldtypes in het Odoo-framework. Het is specifiek ontworpen om valuta-gedenomineerde waarden op te slaan: prijzen, bedragen, totalen, budgetten of elk getal dat geld vertegenwoordigt.
Wat het onderscheidt van een reguliere Float is de verplichte relatie met een valuta. Een Monetair veld weet altijd met welke valuta het werkt, en het gebruikt die valuta om te bepalen hoeveel decimalen er moeten worden weergegeven en hoe opgeslagen waarden moeten worden afgerond.
Hoe Het Verschijnt in de Interface
In de Odoo UI wordt een Monetair veld weergegeven met de waarde geformatteerd volgens de bijbehorende valuta. Als de valuta Euro is, zie je iets als € 1.234,50. Als het de Amerikaanse Dollar is, zie je $ 1.234,50. Het aantal decimalen volgt de configuratie van het valutarecord.
Het veld is volledig bewerkbaar in formulierweergaven, wordt netjes weergegeven in lijstweergaven en integreert natuurlijk in draaitabellen en financiële rapporten. Eindgebruikers hoeven helemaal niet na te denken over opmaak. Odoo behandelt het transparant.
Het Onderliggende Gegevenstype
Op het niveau van de database wordt een Monetair veld opgeslagen als een double precision float in PostgreSQL. De valutainformatie wordt niet in dezelfde kolom opgeslagen. Het komt van een gerelateerd res.currency record, gekoppeld via een aparte Many2one-veld op hetzelfde model.
Deze scheiding van waarde en valuta is opzettelijk. Het houdt de Odoo-databasevelden schoon en maakt het mogelijk om de valuta van een record onafhankelijk van de opgeslagen bedragen te wijzigen.
Hoe het veld werkt
Het begrijpen van de mechanismen achter het Monetair veld zal je helpen het correct te gebruiken en de soort afrondings- of weergaveproblemen te vermijden die verrassend vaak voorkomen in aangepaste Odoo-ontwikkeling.
De currency_field Parameter
Elk Monetair veld moet worden gekoppeld aan een Many2one-veld dat naar res.currency wijst. Standaard zoekt Odoo naar een veld met de naam currency_id op hetzelfde model. Je kunt dit overschrijven met de currency_field parameter:
amount = fields.Monetary(string='Bedrag', currency_field='currency_id')
Als het valutaveld ontbreekt of niet is ingesteld op een bepaald record, valt Odoo terug op de bedrijfsvaluta. Dit voorkomt harde fouten, maar in een multi-valuta omgeving zal het onjuiste opmaak produceren. Verklaar altijd het valutaveld expliciet.
Afronding en Precisie
Een van de belangrijkste verschillen tussen Monetair en Float is hoe afronding werkt. Het res.currency model definieert het aantal decimalen en de afrondingsfactor voor elke valuta. Wanneer Odoo een Monetair bedrag leest of weergeeft, past het die regels automatisch toe.
Dit betekent dat een waarde die is opgeslagen als 1.2349999 voor een EUR-veld zal worden weergegeven als 1.23, niet 1.235 of 1.23499. Dit is cruciaal voor belastingberekeningen, factuurtotalen en elk financieel reconciliatieproces. Het gebruik van een gewone Float in die contexten zal uiteindelijk afrondingsverschillen opleveren die moeilijk te traceren zijn.
Interacties met de Odoo ORM
In de Odoo ORM retourneert het lezen van een Monetair veld altijd een Python float. De valutacontext komt van het gekoppelde valutaveld op hetzelfde record. Bij het uitvoeren van berekeningen in Python die Monetair velden omvatten, gebruik de round() methode van de valuta om precisie te behouden:
rounded_value = self.currency_id.round(self.amount)
Dit voorkomt fouten door ophoping van drijvende komma's die kunnen optreden in totalen over meerdere regels of iteratieve berekeningen.
Monetaire Velden in QWeb Rapporten
In QWeb rapporttemplates integreren Monetaire velden met een speciale widget die de waarde correct opmaakt in PDF's en webrapporten:
<span t-esc="record.amount"
t-options='{"widget": "monetary", "display_currency": record.currency_id}'/>
Dit zorgt voor het juiste valutasymbool en decimale opmaak in elk gegenereerd document, ongeacht de valuta op het record.
Zakelijke gebruikscases
Monetaire velden worden gebruikt in standaard Odoo-modules. Hier zijn vijf concrete voorbeelden die illustreren waar en waarom ze belangrijk zijn in echte bedrijfsworkflows.
1. Verkoop: Productprijzen en ordertotalen
Velden zoals price_unit, price_subtotal en amount_total op verkooporders en orderregels zijn allemaal Monetaire velden. Ze respecteren automatisch de valuta die is geselecteerd op de klantorder, die kan verschillen van de operationele valuta van het bedrijf.
Wanneer een verkoopmedewerker een order in USD aanmaakt voor een bedrijf dat in EUR opereert, zorgt Odoo ervoor dat de weergave, afronding en conversie correct zijn, omdat het Monetaire veld altijd werkt in de context van de valuta van het record, niet de systeemvaluta.
2. Boekhouding: Factuurbedragen en belastingregels
In de boekhoudmodule is elke bedragkolom op een factuur een Monetaire veld: amount_untaxed, amount_tax, amount_total. De valuta die op de factuur is ingesteld, stuurt de afronding van al deze waarden.
Dit is geen detail. Onjuiste afronding op belastingregels creëert onbalansen in journaalposten die pijnlijk zijn om te reconciliëren. De valuta-bewuste afronding van het Monetaire veld voorkomt deze problemen op dataniveau.
3. CRM: Verwachte omzet op kansen
Het expected_revenue veld op een CRM-kans is een Monetaire veld. Verkoopteams kunnen pijplijnwaarden vastleggen in de valuta van de prospect, terwijl dashboards en rapporten alles omzetten naar de bedrijfsvaluta voor pijplijnafweging en prognoses.
Deze opzet werkt soepel precies omdat Monetaire velden valuta-informatie meedragen naast hun numerieke waarde.
4. Aankoop: Leveranciersprijzen en inkooporders
Inkooporders gebruiken Monetaire velden voor eenheidsprijzen en totalen, gekoppeld aan de afgesproken valuta van de leverancier. Een leveranciersfactuur in Japanse Yen wordt op dezelfde manier behandeld als een in Euro. Het Monetaire veld zorgt voor precisie en weergave zonder enige handmatige afhandeling van het inkoopteam.
5. Aangepaste Velden: Budget- en Doeltracking
Een zeer veel voorkomende aanpassingsverzoek is het toevoegen van een budgetbedrag, een omzetdoel of een kostenplafond aan een project, afdeling of aangepast model. In al deze gevallen is een Monetair veld de juiste keuze. Het integreert natuurlijk met de bedrijfsvaluta, wordt correct weergegeven in formulieren en lijsten, en gedraagt zich voorspelbaar in rapporten en exports.
Het gebruik van een Float voor dit soort velden is technisch mogelijk, maar leidt tot opmaak-inconsistenties en afrondingsproblemen zodra multi-valuta scenario's zich voordoen.
Het veld maken of aanpassen
Er zijn twee hoofdmethoden om een Monetair veld aan een Odoo-model toe te voegen: via Odoo Studio voor een no-code benadering, of via een aangepaste Python-module voor volledige controle.
Gebruik van Odoo Studio
Odoo Studio bevat een Monetair type in zijn veldcreatiepaneel. Wanneer je Odoo Studio-velden gebruikt om een Monetair veld aan een model toe te voegen, voegt Studio automatisch een currency_id veld toe als er nog geen bestaat op dat model. Dit dekt de meest voorkomende gebruiksscenario's zonder dat er code geschreven hoeft te worden.
Een ding om op te letten: door Studio gemaakte velden gebruiken het x_ voorvoegsel (bijvoorbeeld, x_studio_budget). Als je model al een currency_id veld heeft, zal het nieuwe Monetair veld dit gebruiken. Zo niet, dan zal Studio een nieuwe aanmaken. Wanneer je meerdere Monetair velden op hetzelfde model hebt met mogelijk verschillende valuta's, is het de moeite waard om dit gedeelde valutaveld zorgvuldig te bekijken voordat je live gaat.
Voor eenvoudige scenario's is Studio de snelste manier om velden in Odoo te creëren en werkt goed voor zakelijke gebruikers die geen ontwikkelingstoegang hebben.
Technische Benadering: Python Velden
In een aangepaste Odoo-module vereist het creëren van een Monetair veld twee declaraties: het veld zelf en het bijbehorende valutaveld. Dit is het standaardpatroon in de ontwikkeling van Odoo Python-velden:
from odoo import fields, models
class ProjectTask(models.Model):
_inherit = 'project.task'
x_budget = fields.Monetary(
string='Budget',
currency_field='x_budget_currency_id',
)
x_budget_currency_id = fields.Many2one(
comodel_name='res.currency',
string='Budget Valuta',
default=lambda self: self.env.company.currency_id,
)
Het instellen van de bedrijfsvaluta als standaard is een praktische keuze voor de meeste interne velden. Het voorkomt dat het valutaveld leeg is wanneer een gebruiker een record voor het eerst opent, wat de opmaak van het Monetair veld zou verstoren.
Berekenbare Monetiaire Velden
Monetiaire velden werken goed als odoo berekende velden. Als je lijnbedragen wilt optellen of een formule wilt toepassen die een monetair resultaat oplevert, is dit het standaardpatroon:
x_total_budget = fields.Monetary(
string='Totaal Budget',
currency_field='currency_id',
compute='_compute_total_budget',
store=True,
)
@api.depends('x_line_ids.x_amount')
def _compute_total_budget(self):
for record in self:
record.x_total_budget = sum(record.x_line_ids.mapped('x_amount'))
De store=True eigenschap is belangrijk als je van plan bent om te filteren, sorteren of aggregeren op dit veld in lijstweergaven of rapporten. Niet-opgeslagen berekende velden kunnen niet worden gebruikt in ORM domeinfilters.
Een Monetair Veld Toevoegen via de API
Als je velden in Odoo programmatically wilt aanmaken via XML-RPC (bijvoorbeeld als onderdeel van een extern configuratiescript), kun je het Monetair veld aanmaken via ir.model.fields:
models.execute_kw(ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_budget',
'field_description': 'Budget',
'model_id': model_id,
'ttype': 'monetary',
'currency_field': 'currency_id',
'state': 'manual',
}]
)
Dit maakt deel uit van de bredere odoo aanpassings toolkit die beschikbaar is via de XML-RPC API, die in meer detail wordt behandeld in andere artikelen in deze blogcollectie.
Beste praktijken
Het Monetair veld is eenvoudig te gebruiken zodra je de patronen kent. Hier zijn de praktijken die je implementatie schoon houden en problemen in de toekomst voorkomen.
1. Gebruik Nooit Float voor Financiële Waarden
Dit is de belangrijkste regel in odoo ontwikkeling als het gaat om geld. Als een veld een prijs, een bedrag, een totaal, een budget of een ander valuta-gedenomineerd getal vertegenwoordigt, gebruik dan fields.Monetary. Een Float veld heeft geen valuta-bewustzijn en zal niet correct afronden over verschillende valuta's. Het Monetair veld bestaat precies om dit probleem op te lossen.
2. Verklaar Altijd het Valuta Veld Expliciet
Vertrouw niet op Odoo's fallback naar currency_id tenzij dat veld daadwerkelijk bestaat op jouw model. Stel expliciet de currency_field parameter in en declareer altijd de bijbehorende Many2one naar res.currency. Dit maakt de relatie duidelijk en voorkomt stille fallback-gedragingen in multi-valuta omgevingen.
3. Stel een Standaard Valuta In
Voor interne velden die bijna altijd de bedrijfsvaluta zullen gebruiken, stel een standaard in op het valutaveld: default=lambda self: self.env.company.currency_id. Dit voorkomt dat het veld leeg verschijnt op nieuwe records, wat het valutateken en de opmaak in de UI zou verwijderen.
4. Gebruik store=True op Gecalculeerde Monetair Velden die je van Plan Bent te Doorzoeken
Als je een gecalculeerd Monetair veld definieert en verwacht dat gebruikers of rapporten erop filteren of sorteren, stel dan store=True in. Niet-opgeslagen gecalculeerde velden kunnen niet verschijnen in ORM-domeinen of SQL-gebaseerde weergaven. Dit is een veelvoorkomende bron van verwarring bij het bouwen van aangepaste dashboards in Odoo.
5. Gebruik Currency Round() voor Tussentijdse Berekeningen
Bij het schrijven van Python-code die meerdere rekenkundige stappen uitvoert op Monetair waarden, pas self.currency_id.round(value) toe bij elke betekenisvolle stap in plaats van alleen aan het einde. Foutenmarges in drijvende komma's stapelen zich op over meerdere bewerkingen, en vroegtijdig afronden voorkomt discrepanties in totalen.
6. Wees Intentioneel in Multi-Valuta Rapporten
Bij het aggregeren van Monetair waarden over records met verschillende valuta, tel niet gewoon de ruwe getallen op. Zet eerst alle waarden om naar een gemeenschappelijke valuta met behulp van res.currency.compute(), of maak het rapport valuta-specifiek. Het mengen van valuta in een som produceert getallen die technisch correct zijn op veldniveau, maar financieel betekenisloos.
Veelvoorkomende valkuilen
Zelfs ervaren Odoo-ontwikkelaars lopen tegen problemen aan met Monetair velden. Hier zijn de meest voorkomende fouten en hoe je ze kunt vermijden.
Valstrik 1: Ontbrekend Valutaveld
Het meest voorkomende probleem bij het toevoegen van een Monetair veld is het vergeten om het bijbehorende valuta Many2one veld te creëren. Als currency_id niet bestaat op het model, zal Odoo stilletjes terugvallen op de bedrijfsvaluta in sommige contexten en in andere een foutmelding geven. Maak altijd het valutaveld aan naast het Monetair veld, zelfs als je nooit verwacht dat gebruikers het zullen wijzigen.
Valstrik 2: Twee Monetair Velden die Eén Valuta Veld Delen met Verschillende Bedoelde Valuta's
Als je twee Monetair velden op hetzelfde model hebt die bedoeld zijn om waarden in verschillende valuta's vast te houden (bijvoorbeeld, een klantprijs in EUR en een leverancierskost in USD), kunnen ze niet veilig een enkel currency_id veld delen. Elk heeft zijn eigen valutaverwijzing nodig. Dit niet doen betekent dat één valutainstelling beide velden overschrijft, wat onjuiste gegevens en verwarrend UI-gedrag zal opleveren.
Valstrik 3: Afrondingsverschillen bij het Aggregateren Over Valuta's
Het optellen van Monetair veldwaarden over records met verschillende valuta's zal totalen opleveren die verkeerd lijken, omdat je EUR-bedragen optelt bij USD-bedragen alsof ze dezelfde eenheid zijn. Dit is een veelvoorkomende bron van rapportagefouten in bedrijven die in meerdere valuta's opereren. Normaliseer altijd naar één enkele valuta voordat je aggregeert.
Valstrik 4: Vergelijkingen met Vloeiende Getallen in ORM Zoekopdrachten
Zoeken in een Monetair veld met een exacte gelijkheidscontrole (bijvoorbeeld, zoeken naar records waar amount = 10.0) kan records missen vanwege hoe floats in de database worden opgeslagen. Gebruik >= en <= met een kleine tolerantie, of pas valutafronding toe voordat je waarden in Python-logica vergelijkt. Dit is een algemeen odoo orm probleem met float-gebaseerde velden, niet specifiek voor Monetair, maar het is belangrijker wanneer geld in het spel is.
Valstrik 5: Valutafronding Negeren Tijdens Gegevensimport
Bij het importeren van records via CSV of XML-RPC die Monetair veldwaarden bevatten, worden de geïmporteerde nummers opgeslagen zoals ze zijn geleverd zonder automatische afronding. Als je brongegevens meer decimalen hebben dan de doelvaluta toestaat, zal de opgeslagen waarde technisch correct zijn maar anders worden weergegeven dan verwacht, en kan het kleine discrepanties in totalen veroorzaken. Pas valutafronding toe in je importscripts of gegevensvoorbereidingsstappen voordat je waarden naar Odoo verzendt.
Conclusie
Het Monetair veld is een van die Odoo veldtypes die op het eerste gezicht eenvoudig lijken, maar veel belangrijke gedragingen onder de oppervlakte met zich meedragen. De nauwe relatie met het valutarecord maakt het betrouwbaar voor financiële gegevens: correcte afronding, consistente opmaak en valuta-bewuste weergave door de hele Odoo-interface en rapportmotor.
Het correct gebruiken, wat betekent dat je het altijd koppelt aan een expliciet valutaveld en nooit een Float vervangt voor financiële waarden, zal je behoeden voor een hele categorie subtiele bugs die berucht moeilijk te traceren zijn in productie. Het odoo datamodel is om goede redenen rond dit veldtype opgebouwd.
Of je nu een odoo ontwikkelaarsgids volgt, een standaardmodule aanpast, of iets nieuws vanaf nul bouwt, het goed instellen van je Monetair velden is een van de fundamentele beslissingen die bepaalt hoe betrouwbaar je Odoo-implementatie met geld omgaat.
Hulp nodig bij uw Odoo-implementatie?
Bij Dasolo helpen we bedrijven Odoo te implementeren, aan te passen en te optimaliseren op alle schalen en configuraties. Of je nu een schoon datamodel, een aangepaste veldstrategie, ondersteuning voor meerdere valuta's 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 Monetaire 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.