Skip to Content

Feltet "Monetary" i Odoo: Hva Det Er Og Når Du Bruker Det

En praktisk veiledning for riktig håndtering av valuta i Odoo-modellen — hvordan lagre, vise og regne med penger uten feil og forvirring.
6. mars 2026 etter
Feltet "Monetary" i Odoo: Hva Det Er Og Når Du Bruker Det
Dasolo
| No comments yet

Innledning


Monetary-feltet er et av de mest nyttige — og samtidig oftest misforståtte — felttypene i Odoo. Det ser ut som et tall og ligger lagret som et flyttall, men oppfører seg annerledes enn et vanlig Float. Når du først skjønner hva som skiller det, vil du ikke bruke vanlige Float-felt til pengeverdier lenger.


Om du har sett på totalbeløpet på en salgsordre, en faktura eller prisfeltet på et produkt i Odoo, har du sannsynligvis brukt et Monetary-felt uten å tenke over det. De finnes overalt i datamodellen og sørger for valutaformattering, avrunding og presisjon i bakgrunnen.

Denne guiden er laget for utviklere, konsulenter og teknisk interesserte sluttbrukere som vil vite hva Monetary-feltet faktisk gjør. Enten du følger en opplæring, utvikler en modul eller feilsøker uventede avrundingsresultater, får du her den nødvendige referansen.

Hva er Monetary-feltet i Odoo


Typen fields.Monetary er en grunnleggende felttype i Odoo-rammeverket. Den er spesiallaget for verdier som representerer penger: priser, beløp, totaler, budsjetter — kort sagt alle tall som har en tilknyttet valuta.


Det som skiller den fra et vanlig Float-felt, er at Monetary alltid er koblet til en valuta. Feltet vet hvilken valuta det arbeider med, og bruker denne informasjonen for å bestemme hvor mange desimaler som vises og hvilken avrundingslogikk som skal gjelde.


Slik vises feltet i brukergrensesnittet

I Odoo-grensesnittet vises Monetary-feltet formatert etter valutaen det er knyttet til. For en euro-kurs får du for eksempel «€ 1 234,50», og for dollar «$ 1,234.50». Antall desimaler og symbol følger valutaoppsettet i res.currency.


Feltet er redigerbart i skjemaer, ser ryddig ut i listevisninger og fungerer sømløst i pivottabeller og finansielle rapporter. Sluttbrukeren trenger ikke å tenke på formatering — Odoo tar seg av det.


Hva som ligger under panseret

I databasen lagres Monetary-feltet som et dobbelpresisjons-flyttall (double precision) i PostgreSQL. Selve valutaen ligger ikke i samme kolonne — den hentes fra en relatert res.currency-post via en Many2one-felt på samme modell.


Denne separasjonen mellom verdi og valuta er bevisst. Den holder databasemodellen ryddig og gjør det mulig å endre valutaen uavhengig av selve beløpet.


Slik fungerer feltet


Å forstå mekanikkene bak Monetary-feltet hjelper deg å bruke det riktig og unngå avrundings- og visningsproblemer som ofte oppstår i tilpasset utvikling.


Parameteren currency_field

Hvert Monetary-felt må ha en Many2one-referanse til res.currency. Odoo forventer som standard et felt kalt currency_id på samme modell, men du kan sette dette eksplisitt med currency_field:


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

Hvis valutafeltet mangler eller ikke er satt på en post, faller Odoo tilbake til selskapets valuta. Det hindrer krasj, men i et multivalutamiljø gir det ofte feil visning. Derfor bør du alltid deklarere valutafeltet tydelig.


Avrunding og presisjon

En viktig forskjell mellom Monetary og Float er hvordan avrunding håndteres. Modellen res.currency definerer antall desimaler og avrundingsfaktor for hver valuta. Når Odoo viser et Monetary-felt, bruker det de reglene automatisk.

Det betyr at en verdi som er lagret som 1.2349999 i EUR, vil vises som 1,23 — ikke 1,235 eller 1,23499. Dette er avgjørende for skatteberegninger, fakturatotaler og avstemminger. Å bruke et vanlig Float-felt i slike sammenhenger fører fort til uoversiktlige avrundingsavvik.


Samspill med Odoo ORM

Når du leser et Monetary-felt gjennom Odoo ORM, får du alltid en Python-float tilbake. Konteksten for valutaen kommer fra det tilknyttede Many2one-feltet på samme post. Ved beregninger i Python bør du bruke valutaens eget round()-metode for å bevare riktig presisjon:


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

Dette reduserer risikoen for flyttallsfeil som kan hope seg opp ved summering av linjer eller iterative regneoperasjoner.


Monetary i QWeb-rapporter

I QWeb-maler finnes det en widget som formaterer Monetary-felt korrekt i både PDF og nettvisning:


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

Dette sikrer riktig valuta-symbol og desimalformat i alle genererte dokumenter, uansett hvilken valuta posten bruker.

Hvorfor dette betyr noe for bedriften


Praktiske eksempler fra standardmodulene


1. Salg: produktpriser og ordrebeløp

I salgsmodulen er felter som price_unit, price_subtotal og amount_total Monetary-felt. De respekterer valutaen som er valgt på kundeordren og håndterer visning, avrunding og eventuell konvertering automatisk.


Hvis en selger oppretter en ordre i USD for et selskap som opererer i EUR, sørger Monetary-feltet for at visningen og avrundingen skjer i riktig kontekst — feltet tar utgangspunkt i ordrepostens valuta, ikke systemvalutaen.


2. Regnskap: fakturabeløp og skatteposter

I regnskapsmodulen er alle beløpskolonner på en faktura Monetary-felt: amount_untaxed, amount_tax, amount_total. Fakturavalutaen styrer avrundingen av disse verdiene.


Dette er ikke detaljstreker — feil avrunding på skatteposter kan gi ubalanserte bokføringer som er vanskelige å rette opp. Monetary-feltets valuta-bevisste avrunding forhindrer slike problemer.


3. CRM: forventet inntekt i salgsprospekter

Feltet expected_revenue på en mulighet i CRM er et Monetary-felt. Selgerne kan lagre pipeline-verdier i prospektets valuta, mens dashbord og rapporter konverterer tallene til selskapets valuta for analyse og prognoser.


Dette fungerer godt fordi Monetary-feltene bærer valuta-informasjon sammen med selve beløpet.


4. Innkjøp: leverandørpriser og bestillinger

Innkjørsordre bruker Monetary-felt for enhetspriser og totaler, knyttet til leverandørens valuta. Enten fakturaen er i japanske yen eller euro, håndterer feltet presisjon og visning uten manuelt arbeid fra innkjøpsteamet.


5. Egne felter: budsjetter og mål

En vanlig tilpasning er å legge inn budsjettbeløp eller inntektsmål på prosjekter, avdelinger eller egendefinerte modeller. Her bør du alltid bruke Monetary-felt — de integrerer naturlig med selskapets valuta, vises riktig og oppfører seg forutsigbart i rapporter og eksport.

Teknisk sett kan du bruke Float, men det skaper raskt formateringsinkonsekvenser og avrundingsproblemer når flere valutaer er i spill.


Slik oppretter eller tilpasser du feltet


Hvordan legge til et Monetary-felt


Du kan gjøre det uten kode via Odoo Studio, eller med full kontroll ved å lage en Python-modul. Begge tilnærmingene har sine bruksområder.

Ved bruk av Odoo Studio


Studio lar deg opprette Monetary-felt i et grafisk grensesnitt. Om modellen ikke har et currency_id-felt fra før, oppretter Studio ett automatisk. Studio-felter får prefikset x_, for eksempel x_studio_budget.


For enkle behov er Studio den raskeste og mest tilgjengelige måten å legge til felt på, særlig for brukere uten utviklertilgang.


Teknisk: definere felt i Python

I en custom modul må du deklarere både Monetary-feltet og det tilhørende valutafeltet. Dette er standardmønsteret i Odoo-utvikling:


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

Å sette selskapets valuta som standard er ofte fornuftig for interne felt. Det gjør at nye poster ikke får et tomt valuta-felt som bryter visningen.


Beregnede Monetary-felt

Monetary-felt fungerer godt som beregnede felt. Når du summerer linjeelementer eller bruker formler som gir et pengebeløp, bør resultatfeltet være av typen Monetary:


x_total_budget = fields.Monetary(
    string='Total 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'))

Merk at store=True er viktig om du vil kunne søke, sortere eller aggregere på feltet i lister og rapporter. Ikke-lagret beregnet felt kan ikke brukes i ORM-domener.


Opprett felt via API

Om du må lage felt programmert via XML-RPC (for eksempel i et oppsettsskript), kan du opprette en Monetary-kolonne gjennom 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',
    }]
)

Dette er én del av Odoos tilpasningsmuligheter via API, og passer i automatiserte deploy- eller migreringsskripter.

Anbefalte fremgangsmåter


Gode vaner for stabile implementasjoner


1. Ikke bruk Float for pengesummer

Dette er det viktigste rådet: alle felt som representerer penger må være fields.Monetary. Float-felt har ingen valuta-bevissthet og gir feil avrunding i multivaluta-scenarier. Monetary-feltet finnes for å løse akkurat dette.


2. Definer valuta-feltet eksplisitt

Ikke stol på at Odoo automatisk bruker currency_id med mindre det faktisk finnes på modellen. Sett currency_field eksplisitt og deklarer Many2one til res.currency. Det forhindrer skjulte fallback-situasjoner.


3. Sett en standardvaluta

For interne felt som normalt bruker selskapets valuta, sett default til self.env.company.currency_id. Det hindrer at nye poster viser tom valuta og manglende format.


4. Bruk store=True for søkbare beregnede felt

Hvis et beregnet Monetary-felt skal inngå i søk eller rapportfiltre, må det være lagret. Ulagrede felt kan ikke brukes i ORM-domener, noe som ofte fører til forvirring.


5. Avrund mellomregninger med currency.round()

Ved flertrinnsberegninger på pengeverdier, bruk self.currency_id.round(value) underveis, ikke bare til slutt. Flyttallsavrundingsfeil kan akkumulere, og tidlig avrunding gir forutsigbare summer.


6. Vær målrettet i multivaluta-rapporter

Når du aggregerer verdier fra poster med ulik valuta, må du først konvertere alt til én valuta med res.currency.compute(), eller gjøre rapporten valuta-spesifikk. Å summere råbeløp på tvers av valutaer gir meningsløse tall.

Vanlige fallgruver


Typiske feil utviklere gjør


Feil 1: Manglende valuta-felt

Den vanligste feilen er å glemme å opprette Many2one-feltet til valutaen. Uten det faller Odoo tilbake til selskapets valuta i noen sammenhenger og kaster feil i andre. Lag alltid valutafeltet samtidig som Monetary-feltet.


Feil 2: Flere Monetary-felt som deler én valuta når de burde være ulike

Hvis to Monetary-felt på samme modell skal holde verdier i forskjellige valutaer (f.eks. kundens pris i EUR og leverandørkostnad i USD), kan de ikke dele ett currency_id. Hvert felt trenger sin egen referanse for å unngå at én valuta overstyrer begge.


Feil 3: Avrundingsproblemer ved aggregering over valutaer

Å summere Monetary-felt fra poster med ulik valuta uten konvertering gir resultater som ser gale ut. Dette er en vanlig feilkilde i selskaper med internasjonal virksomhet. Normaliser til en felles valuta før summering.


Feil 4: Eksakte flyttalls-søk i ORM

Søk med eksakt likhet på flyttall (f.eks. amount = 10.0) kan bomme på poster på grunn av hvordan tallene er lagret. Bruk heller interval-søk (>= / <=) med toleranse, eller rund av før sammenligning i Python.


Feil 5: Overser valuta-avrunding ved import

Ved import (CSV eller XML-RPC) lagres de tallene du sender. Har kilde-data for mange desimaler i forhold til målvalutaen, kan det gi avvik i visning og små differanser i summer. Rund av i importscriptet før du sender data til Odoo.


Oppsummering


Monetary-feltet er et felt som tilsynelatende er enkelt, men som bærer med seg viktig funksjonalitet. Den nære koblingen til valuta-posten gir korrekt avrunding, konsekvent formatering og valuta-tilpasset visning i hele Odoo.


Riktig bruk — alltid parre feltet med et eksplisitt valuta-felt og aldri bruke Float for pengeverdier — sparer deg for mange subtile feil som ofte er vanskelige å feilsøke i produksjon. Odoo-modellen er bygget rundt denne felttypen av en grunn.


Enten du følger en utviklerguide, tilpasser en standardmodul eller bygger noe nytt, er riktige Monetary-felt et av grunnprinsippene som avgjør hvor godt systemet ditt håndterer penger.

Trenger du hjelp med Odoo-implementeringen?


Hos Dasolo bistår vi selskaper med implementasjon, tilpasning og optimalisering av Odoo, uansett størrelse. Enten dere trenger en ryddig datamodell, strategi for egne felt, multivalutasupport eller full utrulling, har vi både funksjonell og teknisk kompetanse.


Har du spørsmål om Monetary-felt eller andre sider av din Odoo-løsning, hjelper vi gjerne. Ta kontakt med oss så tar vi en prat om hva dere bygger.

Feltet "Monetary" i Odoo: Hva Det Er Og Når Du Bruker Det
Dasolo 6. mars 2026
Share this post
Logg inn to leave a comment