Skip to Content

Det Monetære Feltet i Odoo: Slik Fungerer Det og Når Du Skal Bruke Det

En praktisk guide til riktig håndtering av valutaverdier i Odoo datamodellen
6. mars 2026 etter
Det Monetære Feltet i Odoo: Slik Fungerer Det og Når Du Skal Bruke Det
Dasolo
| No comments yet

Introduksjon


Det Monetary-feltet er en av de mest nyttige og mest misbrukte felttypene i Odoo. Det ser ut som et tall, lagres som en float, men oppfører seg som verken. Når du først forstår hva som gjør det annerledes, vil du aldri bruke en vanlig Float for en finansverdi igjen.


Hvis du noen gang har sett på totalen for en salgsordre, et fakturabeløp eller en produktpris i Odoo, har du allerede brukt et Monetary-felt. De er overalt i Odoo-datamodellen, og de gjør stille mye av det tunge arbeidet rundt valutautforming, avrunding og presisjon.

Denne guiden er for Odoo-utviklere, konsulenter og teknisk orienterte forretningsbrukere som ønsker å forstå hvordan Monetary-feltet faktisk fungerer. Enten du følger en Odoo-feltveiledning, bygger et tilpasset modul, eller bare prøver å forstå hvorfor beløpene dine avrundes annerledes enn forventet, er dette referansen du trenger.

Hva er Monetary-feltet i Odoo


Typen fields.Monetary er en av de grunnleggende odoo-felttypene i Odoo-rammeverket. Den er spesialdesignet for å lagre verdier i valuta: priser, beløp, totaler, budsjetter eller ethvert tall som representerer penger.


Det som gjør den distinkt fra en vanlig Float, er det obligatoriske forholdet til en valuta. Et Monetary-felt vet alltid hvilken valuta det arbeider med, og det bruker den valutaen til å bestemme hvor mange desimaler som skal vises og hvordan lagrede verdier skal avrundes.


Hvordan det vises i grensesnittet

I Odoo-grensesnittet viser et Monetary-felt verdien formatert i henhold til den tilknyttede valutaen. Hvis valutaen er Euro, ser du noe som € 1.234,50. Hvis det er den amerikanske dollaren, ser du $ 1.234,50. Antallet desimaler følger konfigurasjonen av valutaposten.


Feltet er fullt redigerbart i skjemaer, vises pent i listevisninger, og integreres naturlig i pivottabeller og finansielle rapporter. Sluttbrukere trenger ikke å tenke på formatering i det hele tatt. Odoo håndterer det transparent.


Den underliggende datatypen

På databasens nivå lagres et Monetary-felt som en dobbel presisjonsflyttall i PostgreSQL. Valutainformasjonen lagres ikke i samme kolonne. Den kommer fra en relatert res.currency-post, koblet gjennom et eget Many2one-felt på samme modell.


Denne separasjonen av verdi og valuta er bevisst. Den holder odoo-databasefeltene rene og gjør det mulig å endre en post sin valuta uavhengig av de lagrede beløpene.


Hvordan feltet fungerer


Å forstå mekanikken bak Monetary-feltet vil hjelpe deg å bruke det riktig og unngå den typen avrundings- eller visningsproblemer som er overraskende vanlige i tilpasset Odoo-utvikling.


Parameteren currency_field

Hvert Monetary-felt må pares med et Many2one-felt som peker til res.currency. Som standard ser Odoo etter et felt med navnet currency_id på samme modell. Du kan overstyre dette med parameteren currency_field:


amount = fields.Monetary(string='Beløp', currency_field='currency_id')

Hvis valutafeltet mangler eller ikke er satt på en gitt post, faller Odoo tilbake til selskapets valuta. Dette forhindrer harde feil, men i et flervaluta-miljø vil det produsere feil formatering. Alltid deklarer valutafeltet eksplisitt.


Runding og presisjon

En av de viktigste forskjellene mellom Monetær og Float er hvordan runding fungerer. Modellen res.currency definerer antall desimaler og rundingsfaktoren for hver valuta. Når Odoo leser eller viser en monetær verdi, anvender den disse reglene automatisk.

Dette betyr at en verdi lagret som 1.2349999 for et EUR-felt vil vises som 1.23, ikke 1.235 eller 1.23499. Dette er kritisk for skatteberegninger, fakturatotaler og enhver finansiell avstemmingsprosess. Å bruke en vanlig Float i disse sammenhengene vil til slutt produsere rundingsavvik som er vanskelige å spore.


Interaksjon med Odoo ORM

I Odoo ORM returnerer lesing av et monetært felt alltid en Python float. Valutakonteksten kommer fra det tilknyttede valutafeltet på den samme posten. Når du gjør beregninger i Python som involverer monetære felt, bruk valutaens round()-metode for å bevare presisjon:


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

Dette unngår flyttallsakkumuleringsfeil som kan oppstå i flerlinjetotaler eller iterative beregninger.


Monetære felt i QWeb-rapporter

I QWeb-rapportmaler integreres monetære felt med en dedikert widget som formaterer verdien riktig i PDF-er og nett-rapporter:


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

Dette sikrer riktig valutategn og desimalformatering i hvert generert dokument, uavhengig av valutaen på posten.

Forretningsbrukstilfeller


Monetære felt brukes gjennom standard Odoo-moduler. Her er fem konkrete eksempler som illustrerer hvor og hvorfor de er viktige i virkelige forretningsarbeidsflyter.


1. Salg: Produktpriser og ordrebeløp

Felt som price_unit, price_subtotal og amount_total på salgsordrer og ordrelinjer er alle monetære felt. De respekterer automatisk valutaen som er valgt på kundeordren, som kan være forskjellig fra selskapets driftsvaluta.


Når en salgsrepresentant oppretter en ordre i USD for et selskap som opererer i EUR, håndterer Odoo visning, avrunding og konvertering korrekt fordi det monetære feltet alltid fungerer i konteksten av postens valuta, ikke systemvalutaen.


2. Regnskap: Fakturabeløp og skatteposter

I regnskapsmodulen er hver beløpskolonne på en faktura et monetært felt: amount_untaxed, amount_tax, amount_total. Valutaen som er satt på fakturaen styrer avrundingen av alle disse verdiene.


Dette er ikke en detalj. Feil avrunding på skatteposter skaper ubalanser i journaloppføringer som er smertefulle å avstemme. Det monetære feltets valuta-bevisste avrunding er det som forhindrer disse problemene på datanivå.


3. CRM: Forventet inntekt på muligheter

Feltet expected_revenue på en CRM-mulighet er et monetært felt. Salgsteam kan fange opp pipeline-verdier i prospektets valuta, mens dashbord og rapporter konverterer alt til selskapets valuta for pipeline-analyse og prognoser.


Denne oppsettet fungerer sømløst nettopp fordi monetære felt bærer valutainformasjon sammen med sin numeriske verdi.


4. Innkjøp: Leverandørpriser og innkjøpsordrer

Innkjøpsordrer bruker monetære felt for enhetspriser og totaler, knyttet til leverandørens avtalte valuta. En leverandørfaktura i japanske yen håndteres på samme måte som en i euro. Det monetære feltet tar seg av presisjon og visning uten noen manuell håndtering fra innkjøpsteamet.


5. Tilpassede felt: Budsjett- og målsporing

En veldig vanlig tilpasningsforespørsel er å legge til et budsjettbeløp, et inntektsmål eller et kostnadstak til et prosjekt, en avdeling eller en tilpasset modell. I alle disse tilfellene er et Monetært felt det riktige valget. Det integreres naturlig med selskapets valuta, vises korrekt i skjemaer og lister, og oppfører seg forutsigbart i rapporter og eksport.

Å bruke et Float for denne typen felt er teknisk mulig, men fører til formateringsinkonsistenser og avrundingsproblemer så snart flervaluta-scenarier oppstår.


Opprette eller tilpasse feltet


Det er to hovedmåter å legge til et Monetært felt til en Odoo-modell: gjennom Odoo Studio for en kodefri tilnærming, eller gjennom et tilpasset Python-modul for full kontroll.


Bruke Odoo Studio

Odoo Studio inkluderer en Monetær type i panelet for feltopprettelse. Når du bruker Odoo Studio-felt for å legge til et Monetært felt til en modell, legger Studio automatisk til et currency_id-felt hvis det ikke allerede finnes på den modellen. Dette dekker de vanligste bruksområdene uten å skrive noe kode.


En ting å være oppmerksom på: Studio-opprettede felt bruker x_-prefikset (for eksempel x_studio_budget). Hvis modellen din allerede har et currency_id-felt, vil det nye Monetære feltet bruke det. Hvis ikke, vil Studio opprette et nytt. Når du har flere Monetære felt på den samme modellen med potensielt forskjellige valutaer, er det verdt å gjennomgå dette delte valutafeltet nøye før du går live.


For enkle scenarier er Studio den raskeste måten å opprette felt i Odoo på, og fungerer godt for forretningsbrukere som ikke har utviklingstilgang.


Teknisk tilnærming: Python-felt

I et tilpasset Odoo-modul krever opprettelse av et Monetært felt to erklæringer: selve feltet og det tilknyttede valutafeltet. Dette er den standardmønsteret i Odoo Python-feltutvikling:


from odoo import fields, models

class ProjectTask(models.Model):
    _inherit = 'project.task'

    x_budget = fields.Monetary(
        string='Budsjett',
        currency_field='x_budget_currency_id',
    )
    x_budget_currency_id = fields.Many2one(
        comodel_name='res.currency',
        string='Budsjettvaluta',
        default=lambda self: self.env.company.currency_id,
    )

Å sette selskapets valuta som standard er et praktisk valg for de fleste interne felt. Det forhindrer at valutafeltet vises som tomt når en bruker først åpner en post, noe som ville ødelagt formateringen av det Monetære feltet.


Beregnede monetære felt

Monetære felt fungerer godt som Odoo-beregnete felt. Hvis du trenger å totalisere linjebeløp eller bruke en formel som gir et monetært resultat, er dette den standard mønsteret:


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

Attributten store=True er viktig hvis du planlegger å filtrere, sortere eller aggregere på dette feltet i listevisninger eller rapporter. Ikke-lagrende beregnede felt kan ikke brukes i ORM-domene filtre.


Legge til et monetært felt via API-en

Hvis du trenger å opprette felt i Odoo programmatisk via XML-RPC (for eksempel som en del av et eksternt konfigurasjonsskript), kan du opprette det monetære feltet gjennom ir.model.fields:


models.execute_kw(ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_budget',
        'field_description': 'Budsjett',
        'model_id': model_id,
        'ttype': 'monetary',
        'currency_field': 'currency_id',
        'state': 'manual',
    }]
)

Dette er en del av det bredere Odoo-tilpasningsverktøysettet tilgjengelig gjennom XML-RPC API-en, som dekkes mer detaljert i andre artikler i denne bloggkolleksjonen.

Beste praksis


Det monetære feltet er enkelt å bruke når du kjenner mønstrene. Her er praksisene som vil holde implementeringen din ren og forhindre problemer senere.


1. Aldri bruk Float for finansielle verdier

Dette er den viktigste regelen i Odoo-utvikling når det gjelder penger. Hvis et felt representerer en pris, et beløp, en total, et budsjett eller et hvilket som helst valutadominert tall, bruk fields.Monetary. Et Float-felt har ingen valutabevissthet og vil ikke runde riktig på tvers av forskjellige valutaer. Det monetære feltet eksisterer nettopp for å løse dette problemet.


2. Alltid deklarer valutafeltet eksplisitt

Ikke stol på Odoos tilbakefall til currency_id med mindre dette feltet faktisk eksisterer i modellen din. Sett eksplisitt parameteren currency_field og deklarer alltid den tilsvarende Many2one til res.currency. Dette gjør forholdet klart og forhindrer stille tilbakefallsatferd i flervaluta-miljøer.


3. Sett en standard valuta

For interne felt som nesten alltid vil bruke selskapets valuta, sett en standard på valutafeltet: default=lambda self: self.env.company.currency_id. Dette forhindrer at feltet vises som tomt på nye poster, noe som ville fjernet valutategnet og formateringen i brukergrensesnittet.


4. Bruk store=True på beregnede monetære felt du planlegger å søke i

Hvis du definerer et beregnet monetært felt og forventer at brukere eller rapporter skal filtrere eller sortere etter det, sett store=True. Ikke-lagrede beregnede felt kan ikke vises i ORM-domener eller SQL-baserte visninger. Dette er en vanlig kilde til forvirring når man bygger tilpassede dashbord i Odoo.


5. Bruk Currency Round() for mellomregninger

Når du skriver Python-kode som utfører flere aritmetiske trinn på monetære verdier, bruk self.currency_id.round(value) ved hvert meningsfylt trinn i stedet for bare på slutten. Flyttallsfeil akkumuleres over flere operasjoner, og tidlig avrunding forhindrer avvik i totalene.


6. Vær bevisst i flervaluta-rapporter

Når du aggregerer monetære verdier på tvers av poster med forskjellige valutaer, ikke bare summer de rå tallene. Konverter alle verdier til en felles valuta først ved å bruke res.currency.compute(), eller gjør rapporten valuta-spesifikk. Å blande valutaer i en sum gir tall som teknisk sett er korrekte på felt-nivå, men økonomisk meningsløse.

Vanlige fallgruver


Selv erfarne Odoo-utviklere støter på problemer med monetære felt. Her er de vanligste feilene og hvordan du unngår dem.


Felle 1: Manglende valutafelt

Det vanligste problemet når man legger til et monetært felt er å glemme å opprette det tilknyttede valutafeltet Many2one. Hvis currency_id ikke eksisterer i modellen, vil Odoo stille falle tilbake til selskapets valuta i noen sammenhenger og heve en feil i andre. Opprett alltid valutafeltet sammen med det monetære feltet, selv om du aldri forventer at brukere skal endre det.


Felle 2: To monetære felt som deler ett valutafelt med forskjellige tiltenkte valutaer

Hvis du har to monetære felt på samme modell som er ment å holde verdier i forskjellige valutaer (for eksempel, en kundepris i EUR og en leverandørkostnad i USD), kan de ikke trygt dele ett enkelt currency_id felt. Hvert felt trenger sin egen valutareferanse. Å unngå dette betyr at én valutainnstilling overskriver begge feltene, noe som vil produsere feil data og forvirrende brukergrensesnittatferd.


Felle 3: Avrundingsforskjeller ved aggregasjon på tvers av valutaer

Å summere monetære feltverdier på tvers av poster med forskjellige valutaer vil gi totaler som ser feil ut, fordi du legger EUR-beløp til USD-beløp som om de var samme enhet. Dette er en vanlig kilde til rapporteringsfeil i selskaper som opererer med flere valutaer. Normaliser alltid til en enkelt valuta før aggregasjon.


Felle 4: Flyttalls sammenligninger i ORM-søk

Å søke i et monetært felt med en nøyaktig likhetskontroll (for eksempel, se etter poster der amount = 10.0) kan gå glipp av poster på grunn av hvordan flyttall lagres i databasen. Bruk >= og <= med en liten toleranse, eller anvend valutavrunding før du sammenligner verdier i Python-logikk. Dette er et generelt odoo orm-problem med flyttallsbaserte felt, ikke spesifikt for monetære felt, men det er viktigere når penger er involvert.


Felle 5: Ignorere valutavrunding under dataimport

Når du importerer poster via CSV eller XML-RPC som inkluderer monetære feltverdier, lagres de importerte tallene som de er gitt uten automatisk avrunding. Hvis kilde dataene dine har flere desimaler enn målvalutaen tillater, vil den lagrede verdien være teknisk korrekt, men vil vises annerledes enn forventet, og kan forårsake små avvik i totalene. Anvend valutavrunding i importskriptene dine eller databehandlingssteg før du sender verdier til Odoo.


Konklusjon


Det monetære feltet er en av de Odoo-felttypene som ser enkel ut på overflaten, men har mye viktig atferd under overflaten. Dens tette forhold til valutaposten er det som gjør den pålitelig for finansielle data: korrekt avrunding, konsistent formatering, og valuta-bevisst visning på tvers av hele Odoo-grensesnittet og rapportmotoren.


Å bruke det riktig, som betyr alltid å pare det med et eksplisitt valutafelt og aldri erstatte et flyttall for finansielle verdier, vil redde deg fra en hel kategori av subtile feil som er notorisk vanskelig å spore i produksjon. Odoo-datamodellen er bygget rundt denne felt-typen av god grunn.


Enten du følger en Odoo utviklerguide, tilpasser et standardmodul, eller bygger noe nytt fra bunnen av, er det å få de monetære feltene dine riktig en av de grunnleggende beslutningene som former hvor pålitelig din Odoo-implementering håndterer penger.

Trenger du hjelp med Odoo-implementeringen din?


Hos Dasolo hjelper vi selskaper med å implementere, tilpasse og optimalisere Odoo på tvers av alle skalaer og konfigurasjoner. Enten du trenger en ren datamodell, en tilpasset feltstrategi, støtte for flere valutaer, eller en full Odoo utrulling, har teamet vårt den tekniske og funksjonelle dybden til å få det riktig.


Hvis du har spørsmål om monetære felt eller andre aspekter ved din Odoo-implementering, er vi glade for å hjelpe. Ta kontakt med oss og la oss snakke om hva du bygger.

Det Monetære Feltet i Odoo: Slik Fungerer Det og Når Du Skal Bruke Det
Dasolo 6. mars 2026
Share this post
Logg inn to leave a comment