Overslaan naar inhoud

Het Monetary Field in Odoo: Werking en Wanneer Gebruiken

Een praktische handleiding om valuta correct te verwerken in het Odoo-datamodel
6 maart 2026 in
Het Monetary Field in Odoo: Werking en Wanneer Gebruiken
Dasolo
| Nog geen reacties

Introductie


Het Monetary-veld in Odoo lijkt op een gewoon getal, maar gedraagt zich als een speciaal type dat ontworpen is voor geldwaardes. Het is geen eenvoudige Float en ook geen puur tekstveld — het combineert een numerieke waarde met kennis van valuta, waardoor bedragen correct worden weergegeven en afgerond. Zodra je dit principe begrijpt, wil je geen gewone Float meer gebruiken voor financiële velden.


Als je ooit een totaal op een verkooporder, het bedrag op een factuur of een productprijs in Odoo bekeken hebt, dan heb je al met Monetary-velden gewerkt. Ze zitten doorheen het datamodel en regelen automatisch zaken als valutaweergave, afrondingsregels en precisie, zonder dat de eindgebruiker daar iets voor moet doen.

Deze handleiding is geschreven voor Odoo-developers, consultants en technisch onderlegde gebruikers die willen weten wat er echt gebeurt achter een Monetary-veld. Of je nu een custom module bouwt, een veld wilt debuggen dat vreemd afrondt, of gewoon best practices zoekt — dit is je compacte technische naslagwerk.

Wat is het Monetary-veld in Odoo?


Het type fields.Monetary is een van de standaard veldtypes in Odoo en is expliciet bedoeld voor waardes met een valuta: prijzen, bedragen, totalen, budgetten — kortom: alles wat ‘euro’, ‘dollar’ of een andere munteenheid vertegenwoordigt.


Wat het onderscheidt van een gewone Float is dat het altijd gekoppeld is aan een valuta. Een Monetary-veld weet welke valuta het gebruikt en past weergave- en afrondingsregels toe op basis van dat valuta-record.


Hoe het eruitziet in de interface

In de Odoo-interface wordt een Monetary-waarde getoond met het correcte valutateken en het juiste aantal decimalen. Bij Euro zie je bijvoorbeeld iets als € 1.234,50 (afhankelijk van lokale instellingen), bij Amerikaanse dollars $ 1,234.50. De precieze opmaak volgt de instellingen van het gekoppelde valuta-record.


Het veld is bewerkbaar in formulierweergaven, toont netjes in lijstweergaven en werkt probleemloos in draaitabellen en financiële rapporten. Gebruikers hoeven zich niet bezig te houden met formaatregels — Odoo regelt dat op de achtergrond.


De onderliggende datatype

Op databaseniveau wordt een Monetary-veld als een floating-point waarde (double precision) opgeslagen in PostgreSQL. De valuta zelf staat niet in diezelfde kolom, maar in een apart gerelateerd record (res.currency) dat via een Many2one-veld op hetzelfde model gekoppeld is.


Deze scheiding tussen bedrag en valuta is bewust: zo blijven de databasetabellen overzichtelijk en kun je de valuta van een record wijzigen zonder de numerieke kolomstructuur te veranderen.


Hoe het veld precies werkt


Wie de interne werking van Monetary-velden kent, kan ze doelbewust inzetten en veelvoorkomende afrondings- of weergaveproblemen vermijden die bij custom ontwikkeling regelmatig optreden.


De currency_field-parameter

Elk Monetary-veld moet gekoppeld zijn aan een Many2one-veld naar res.currency. Standaard zoekt Odoo naar een veld genaamd currency_id op hetzelfde model, maar je kunt dit expliciet instellen met de currency_field-parameter.


amount = fields.Monetary(string='Bedrag', currency_field='currency_id')

Als het valuta-veld ontbreekt of niet ingevuld is, valt Odoo terug op de bedrijfsvaluta. Dat voorkomt directe fouten, maar in een multicurrency-omgeving geeft dat onjuiste weergave en verwarring. Declareer het valuta-veld dus altijd expliciet.


Afronden en precisie

Een belangrijk verschil met Float is hoe afronding wordt toegepast. Het res.currency-record bepaalt hoeveel decimalen en welke afrondingsfactor gebruikt wordt. Odoo past deze regels toe bij uitlezen en weergave van een Monetary-waarde.

Dat betekent dat een opgeslagen waarde zoals 1.2349999 voor een EUR-veld eruit kan zien als 1,23 in de UI. Voor belastingberekeningen, factuurtotalen en financiële afstemming is die consistente afronding cruciaal; een gewone Float veroorzaakt vroeg of laat moeilijk traceerbare afwijkingen.


Samenwerking met de Odoo ORM

In de ORM levert een Monetary-veld altijd een Python float terug. De valutacontetxt komt van het gekoppelde currency-veld op hetzelfde record. Bij berekeningen in Python gebruik je best de round()-methode van het valuta-record om precisie te behouden.


rounded_value = self.currency_id.round(self.amount)

Zo voorkom je accumulatie van floating-point fouten bij totalen of iteratieve berekeningen.


Monetary in QWeb-rapporten

In QWeb-templates bestaan er widgets die Monetary-waarden correct formatteren in PDF's en webrapporten.


<span t-esc="record.amount"
      t-options='{"widget": "monetary", "display_currency": record.currency_id}'/>

Op die manier verschijnt altijd het juiste valutateken en de correcte decimale notatie in elk gegenereerd document, ongeacht de valuta op het record.

Praktische bedrijfsvoorbeelden


Waar Monetary-velden in de praktijk het verschil maken


1. Verkoop: productprijzen en ordertotalen

Velden zoals price_unit, price_subtotal en amount_total op verkooporders en orderregels zijn Monetary-velden. Ze respecteren automatisch de valuta van de klantorder, ook als die verschilt van de bedrijfsvaluta.


Als een verkoper een order in USD aanmaakt voor een bedrijf dat in EUR opereert, zorgt het Monetary-veld voor correcte weergave en afronding omdat het altijd in de context van de ordervaluta werkt.


2. Boekhouding: factuurbedragen en belastingregels

In accounting zijn de kolommen op een factuur — amount_untaxed, amount_tax, amount_total — Monetary-velden. De valuta op de factuur bepaalt de afronding van die bedragen.


Dat is geen detail: foutieve afronding op belastingregels leidt tot niet-kloppende journaals en moeilijk te reconciliëren fouten. De valuta-bewuste afronding van Monetary-velden voorkomt zulke problemen.


3. CRM: verwachte omzet bij opportunities

Het veld expected_revenue op een opportunity is een Monetary-veld. Verkoopteams kunnen pipelinewaardes in de valuta van de prospect vastleggen, terwijl rapporten die waarden naar bedrijfsvaluta omrekenen voor forecasting.


Dit werkt omdat Monetary-velden zowel de numerieke waarde als de valutacontext bijhouden.


4. Inkoop: leveranciersprijzen en inkooporders

Inkooporders gebruiken Monetary-velden voor eenheidsprijzen en totalen, gekoppeld aan de valuta van de leverancier. Of een leverancier in Yen of Euro factureert, het Monetary-veld regelt precisie en weergave zonder manuele tussenkomst.


5. Custom velden: budgetten en targets

Een veelgevraagde aanpassing is het toevoegen van budgetbedragen of targets aan projecten, afdelingen of custom modellen. Hiervoor is een Monetary-veld meestal de juiste keuze: het sluit naadloos aan op bedrijfsvaluta, toont correct in formulieren en rapporteert betrouwbaar.

Een gewone Float kan technisch werken, maar leidt bij multi-currency snel tot weergaveverschillen en afrondingsproblemen.


Een Monetary-veld aanmaken of aanpassen


Manieren om een Monetary-veld toe te voegen


Je kunt een Monetary-veld toevoegen via Odoo Studio voor een no-code oplossing, of via een custom Python-module voor volledige controle.

Gebruik van Odoo Studio


Studio biedt een Monetary-type in het veldaanmaakscherm. Studio voegt automatisch een currency_id toe als dat nog niet bestaat. Studio-velden krijgen het x_-prefix (bv. x_studio_budget). Als je meerdere Monetary-velden gebruikt die verschillende valuta moeten bijhouden, controleer dan welke currency-velden Studio heeft aangemaakt of gedeeld.


Voor eenvoudige gevallen is Studio de snelste manier en ideaal voor functionele gebruikers zonder ontwikkeltoegang.


Technische aanpak: Python-velden

In een custom module declareer je doorgaans twee velden: het Monetary-veld zelf en het bijhorende Many2one-veld naar res.currency. Dit is het gangbare patroon in Odoo-ontwikkeling.


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='Budgetvaluta',
        default=lambda self: self.env.company.currency_id,
    )

Het instellen van de bedrijfsvaluta als default is praktisch: nieuwe records tonen meteen de juiste valuta, waardoor de vormgeving en het gedrag van het Monetary-veld consistent blijven.


Computed Monetary-velden

Monetary-velden werken goed als berekende velden. Als je regelbedragen optelt of een formule toepast die tot een monetaire waarde leidt, definieer je het veld als compute en koppel je het aan een valuta-veld.


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'))

Gebruik store=True als je wilt filteren, sorteren of aggregeren op het veld. Niet-opgeslagen computed velden kunnen namelijk niet in ORM-domains of SQL-views gebruikt worden.


Velden toevoegen via de API

Als je velden programatisch wilt aanmaken via XML-RPC (bijvoorbeeld in een remote setup-script), kun je het Monetary-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 het bredere aanpassingsarsenaal via de XML-RPC API, dat in andere artikelen uitgebreider behandeld wordt.

Aanbevolen werkwijzen


Samenvatting van beste praktijken


1. Gebruik nooit Float voor geldwaarden

Dit is misschien de belangrijkste regel: als een veld een prijs, bedrag, totaal of budget voorstelt, gebruik dan fields.Monetary. Float-velden missen valuta-awareness en leveren onbetrouwbare afronding op in multi-currency contexten.


2. Geef het currency_field altijd expliciet op

Vertrouw niet blind op Odoo's fallback. Stel currency_field expliciet in en declareer de bijbehorende Many2one naar res.currency. Zo vermijd je stille fouten in multicurrency-omgevingen.


3. Stel een standaardvaluta in

Voor velden die meestal in de bedrijfsvaluta gebruikt worden, geef een default: default=lambda self: self.env.company.currency_id. Dat voorkomt lege valuta-instellingen op nieuwe records.


4. Gebruik store=True voor berekende Monetary-velden die je wil doorzoeken

Als gebruikers of rapporten moeten filteren of sorteren op een computed Monetary-veld, sla het dan op met store=True. Anders kun je het niet in ORM-queries gebruiken.


5. Rond tussentijds af met currency.round()

Bij meerdere rekenstappen op Monetary-waarden roep je best self.currency_id.round(value) op bij betekenisvolle tussenresultaten om floating-point afwijkingen te beperken.


6. Wees bewust bij multicurrency-rapporten

Agregeer nooit ruwe bedragen uit verschillende valuta zonder conversie. Normaliseer eerst naar één valuta met res.currency.compute() of maak rapporten valuta-specifiek.

Veelvoorkomende valkuilen


Veelgemaakte fouten en hoe ze te vermijden


Valkuil 1: Ontbrekend valuta-veld

Een veelvoorkomende fout is dat ontwikkelaars het bijhorende Many2one-valuta-veld vergeten. Als currency_id ontbreekt, valt Odoo soms stilletjes terug op de bedrijfsvaluta en veroorzaakt dat verwarring of zelfs fouten. Maak het valuta-veld altijd tegelijk aan met het Monetary-veld.


Valkuil 2: Meerdere Monetary-velden delen één valuta terwijl ze verschillende valuta zouden moeten hebben

Als twee Monetary-velden op hetzelfde model verschillende valuta moeten bijhouden (bv. klantprijs in EUR en leverancierskost in USD), mogen ze niet dezelfde currency_id delen. Elk veld moet zijn eigen valuta-referentie hebben om verkeerde data en verwarrend gedrag te voorkomen.


Valkuil 3: Afrondingsverschillen bij aggregatie over valuta's

Een optelsom van bedragen in verschillende valuta ziet er fout uit als je de waarden niet eerst converteert. Dit zorgt vaak voor onjuiste rapporten in bedrijven met meerdere valuta. Normaliseer altijd naar één munteenheid vóór aggregatie.


Valkuil 4: Exacte vergelijkingen met floats in ORM-searches

Zoeken met exacte gelijkheid (bv. amount = 10.0) kan records missen door opslag van floats in de database. Gebruik liever bereikchecks (>=/<= met tolerantie) of rond bedragen af voordat je vergelijkt.


Valkuil 5: Valuta-afronding negeren bij data-import

Bij imports via CSV of XML-RPC worden waarden precies opgeslagen zoals aangeleverd, zonder automatische afronding naar de valuta-precisie. Als je brondata meer decimalen bevat dan de valuta toelaat, zal de weergave afwijken. Rond daarom bedragen af in je importscript of in de voorbewerkingsstap.


Slotwoord


Het Monetary-veld is een kenniselement in Odoo: ogenschijnlijk eenvoudig, maar met veel implicaties voor hoe geld in het systeem behandeld wordt. De koppeling met het valuta-record zorgt voor betrouwbare afronding, consistente weergave en correcte verwerking doorheen UI en rapportage.


Als je het juist toepast — altijd gekoppeld aan een expliciet valuta-veld en nooit vervangen door een gewone Float — voorkom je een reeks subtiele fouten die in productie lastig op te sporen zijn. Odoo’s datamodel vertrouwt op dit veldtype om financiële juistheid te garanderen.


Of je nu een developer-gids volgt, een standaardmodule aanpast of iets volledig nieuws bouwt: zorgen dat je Monetary-velden correct zijn opgezet is een van de fundamentele keuzes die bepalen hoe betrouwbaar je Odoo-omgeving met geld omgaat.

Hulp nodig bij je Odoo-implementatie?


Bij Dasolo begeleiden we organisaties bij implementatie, maatwerk en optimalisatie van Odoo — van eenvoudige datamodelaanpassingen tot volledige roll-outs met multi-currency ondersteuning. We combineren functionele kennis met technische diepgang om het correct op te zetten.


Heb je vragen over Monetary-velden of andere onderdelen van je Odoo-implementatie? We beantwoorden ze graag. Neem contact met ons op en laten we samen bespreken wat jij wilt bouwen.

Het Monetary Field in Odoo: Werking en Wanneer Gebruiken
Dasolo 6 maart 2026
Deel deze post
Aanmelden om een reactie achter te laten