Hoppa till innehåll

Fältet "Monetary" i Odoo: Hur det fungerar och när du ska använda det

En handfast guide för att hantera valutavärden korrekt i Odoos datamodell
6 mars 2026 av
Fältet "Monetary" i Odoo: Hur det fungerar och när du ska använda det
Dasolo
| Inga kommentarer ännu

Introduktion


Monetary-fältet är ett av de mest kraftfulla — och samtidigt oftast missförstådda — fälttyperna i Odoo. Det ser ut som ett tal och sparas som ett flyttal, men dess beteende styrs av valutaegenskaper. När du väl behärskar logiken kommer du aldrig att välja en vanlig Float för ett penningvärde igen.


Om du någon gång kollat en ordertotal, en fakturasumma eller ett artikelpris i Odoo så har du redan använt ett Monetary-fält. De finns överallt i datamodellen och sköter diskret formatering, avrundning och precision för valutor åt dig.

Den här guiden vänder sig till Odoo-utvecklare, konsulter och tekniskt intresserade användare som vill förstå exakt hur Monetary-fältet fungerar. Oavsett om du bygger en modul, följer en instruktionsvideo eller felsöker oväntade avrundningar — här får du den tekniska referensen du behöver.

Vad är ett Monetary-fält i Odoo


Typen fields.Monetary är en grundläggande fälttyp i Odoo. Den är avsedd för värden som representerar pengar: priser, belopp, totaler och budgetar — kort sagt allt som är valuta-bundet.


Det som skiljer den från en vanlig Float är att ett Monetary-fält alltid är kopplat till en valuta. Fältet vet vilken valuta det gäller och använder den informationen för visningsprecision och avrundningsregler.


Hur det syns i gränssnittet

I Odoo-gränssnittet visas ett Monetary-värde enligt den tillhörande valutans format. Euro visar exempelvis «€ 1 234,50» medan US-dollar visas som «$ 1,234.50». Antalet decimaler och symbolplacering styrs av valutans konfiguration.


Fältet går att ändra i formulärvyer, visas snyggt i listor och fungerar i pivotrapporter och finansiella rapporter. Slutanvändaren behöver inte tänka på formatering — Odoo sköter allt.


Underliggande datatyp

I databasen lagras Monetary-värdet som ett flyttal (double precision) i PostgreSQL. Själva valutainformationen finner du inte i samma kolumn utan i en separat Many2one-relation till res.currency på samma modell.


Denna separation mellan belopp och valuta är avsiktlig. Den håller databasen ren och gör det möjligt att ändra valuta på en post utan att direkt skriva över det numeriska värdet.


Hur fältet fungerar


Att förstå mekaniken bakom Monetary-fältet hjälper dig att använda det rätt och undvika de avrundnings- och visningsproblem som ofta dyker upp i anpassade Odoo-lösningar.


Parametern currency_field

Varje Monetary-fält måste kopplas till en Many2one som pekar på res.currency. Som standard söker Odoo efter ett fält som heter currency_id på samma modell, men du kan styra det med parametern currency_field:


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

Om valutafältet saknas eller inte är satt på en post faller Odoo tillbaka på företagets valuta. Det förhindrar kritiska fel, men i en multivalutamiljö ger det felaktig formatering — deklarera därför valutafältet uttryckligen.


Avrundning och precision

En central skillnad mot Float är hur avrundning hanteras. Valutakonfigurationen i res.currency avgör antal decimaler och avrundningssteg. När Odoo läser eller visar ett Monetary-värde tillämpas dessa regler automatiskt.

Det innebär att ett lagrat värde som 1.2349999 för EUR kan visas som 1,23 enligt valutans regler — inte som 1,235. Det är avgörande för skatteberäkningar, fakturatotaler och avstämningar. Att använda Float här leder lätt till svårspårade avrundningsdifferenser.


Samspelet med Odoo ORM

När du läser ett Monetary-fält via Odoo ORM returneras alltid ett Python-float. Valutakonteksten hämtas från det tillhörande valutafältet på samma post. Vid beräkningar i Python bör du använda valutans round()-metod för att bevara korrekt precision:


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

Detta minskar ackumulering av flyttalsfel vid summeringar eller upprepade beräkningar.


Monetary i QWeb-rapporter

I QWeb-mallar finns ett särskilt widget-stöd som formaterar Monetary-värden korrekt i både PDF och webb:


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

Det försäkrar att rätt valutasymbol och decimalformat används i genererade dokument oavsett postens valuta.

Affärsscenarier där det används


Monetary-fält förekommer i Odoos standardmoduler. Följande fem exempel visar konkreta situationer där de är viktiga i verkliga arbetsflöden.


1. Försäljning: produktpriser och ordertotaler

Fält som price_unit, price_subtotal och amount_total på försäljningsorder och orderrader är Monetary-fält. De tar hänsyn till den valuta som valts på kundordern, vilket kan skilja sig från bolagets valuta.


Om en säljare skapar en order i USD för ett företag som arbetar i EUR hanterar Odoo visning, avrundning och eventuella konverteringar korrekt eftersom varje Monetary-fält arbetar i postens valutakontekst.


2. Redovisning: fakturasummor och momslinjer

I bokföringen är varje beloppskolumn på en faktura ett Monetary-fält: amount_untaxed, amount_tax, amount_total. Fakturans valuta bestämmer avrundningen för dessa värden.


Det här är inte bara en detalj — fel avrundning på momslinjer skapar obalanser i verifikat som blir tidskrävande att rätta. Monetary-fältets valuta-medvetna avrundning förebygger sådana problem.


3. CRM: förväntade intäkter

Fältet expected_revenue på en affärsmöjlighet är ett Monetary-fält. Säljteam kan ange pipeline-värden i kundens valuta, samtidigt som rapporter kan omvandla värden till bolagets valuta för prognoser och analys.


Denna lösning fungerar smidigt eftersom Monetary-fältet bär med sig valuta-information tillsammans med siffran.


4. Inköp: leverantörspriser och inköpsorder

Inköpsordrar använder Monetary-fält för enhetspriser och totaler, kopplat till leverantörens valuta. En leverantörsfaktura i japanska yen hanteras på samma sätt som en i euro — fältet sköter precision och visning utan manuella ingrepp.


5. Anpassade fält: budget och målsättning

Vanliga anpassningar inkluderar budgetbelopp, intäktsmål eller kostnadsramar för projekt, avdelningar eller egna modeller. För dessa ändamål är Monetary-fält rätt val — de integreras med företagets valuta, visas korrekt i gränssnittet och fungerar för rapporter och export.

Tekniskt går det att använda Float, men det leder snabbt till formateringsproblem och avrundningsfel i multivalutascenarier.


Skapa eller anpassa fältet


Det finns två huvudsätt att lägga till ett Monetary-fält i en modell: via Odoo Studio för no-code eller i en egen Python-modul för full kontroll.


Använda Odoo Studio

Odoo Studio erbjuder Monetary som val när du skapar fält. Studio lägger automatiskt till ett currency_id-fält om det saknas, vilket täcker vanliga scenarier utan kod.


Observera att Studio-fält får prefixet x_ (t.ex. x_studio_budget). Om modellen redan har ett currency_id använder det nya fältet detta; annars skapar Studio en ny valuta-relation. Har du flera Monetary-fält som potentiellt ska hantera olika valutor bör du granska denna del innan du går live.


För enkla behov är Studio snabbast och fungerar bra för användare utan utvecklarrättigheter.


Teknisk väg: Python-fält

I ett anpassat modulpaket deklarerar du alltid två fält: själva Monetary-fältet och den Many2one som pekar på valuta. Det är standardmönstret i Odoo-utveckling:


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

Att sätta företagets valuta som standard är ofta klokt för interna fält. Det förhindrar att valutafältet står tomt för nya poster, vilket skulle göra att symboler och formatering saknas i UI.


Beräknade Monetary-fält

Monetary-fält fungerar utmärkt som beräknade fält. Om du summerar rader eller beräknar ett monetärt resultat är detta mönstret att använda:


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

Använd store=True om du planerar att filtrera, sortera eller aggregera på fältet — icke-lagrade beräknade fält kan inte användas i ORM-domain-filter.


Lägga till ett Monetary-fält via API

Vill du skapa fält programmatisk via XML-RPC (till exempel i ett fjärrskript) kan du skapa posten i 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',
    }]
)

Detta är en del av Odoos anpassningsmöjligheter via XML-RPC, vilket behandlas närmare i andra inlägg i vår artikelserie.

Rekommenderade arbetssätt


Monetary-fältet är enkelt att arbeta med när du följer några grundregler. Här är goda praxis som minskar framtida problem.


1. Använd aldrig Float för penningvärden

Det viktigaste rådet: om ett fält representerar pris, belopp, total eller budget — använd fields.Monetary. Float saknar valutamedvetenhet och ger inte korrekt avrundning i multivalutasituationer.


2. Deklarera valutafältet alltid uttryckligen

Lita inte på att Odoo automatiskt hittar eller skapar currency_id. Ange currency_field uttryckligen och definiera motsvarande Many2one till res.currency så att relationen blir tydlig.


3. Sätt standardvaluta där det är lämpligt

För interna fält som normalt använder företagets valuta, ange standard via default=lambda self: self.env.company.currency_id. Då visas valuta och symbol korrekt från första gången en post öppnas.


4. Använd store=True för beräknade fält som ska kunna sökas

Har du en beräknad Monetary-kolumn som ska kunna filtreras eller sorteras, sätt store=True. Annars går det inte att använda fältet i ORM-domäner eller SQL-baserade vyer.


5. Använd currency.round() i mellanberäkningar

När du utför flera aritmetiska steg på monetära värden — avrunda med self.currency_id.round(value) efter relevanta steg i stället för endast i slutet för att undvika uppbyggda flyttalsfel.


6. Var tydlig i multivalutarapporter

När du aggregerar värden från poster i olika valutor, konvertera alltid värdena till en gemensam valuta med res.currency.compute() innan summan tas. Att summera råa tal i olika valutor ger visserligen numeriska resultat, men ekonomiskt meningslösa sådana.

Vanliga fallgropar


Även erfarna Odoo-utvecklare snubblar över Monetary-relaterade problem. Nedan följer typiska misstag och hur du undviker dem.


Fallgrop 1: Saknat valutafält

Vanligast är att man glömmer att skapa den tillhörande currency Many2one. Om currency_id saknas faller Odoo ibland tillbaka på företagets valuta och i andra fall kastar ett fel. Skapa alltid valutafältet tillsammans med Monetary-fältet, även om du tror att det aldrig ska ändras.


Fallgrop 2: Flera Monetary-fält delar ett valutafält men avser olika valutor

Om två Monetary-fält på samma modell avser olika valutor (t.ex. kundpris i EUR och leverantörskostnad i USD) får de inte dela ett och samma currency_id. Varje fält behöver sin egen referens — annars styrs båda av samma valutainställning och datan blir felaktig.


Fallgrop 3: Avrundningsskillnader vid aggregering över valutor

Att summera Monetary-fält över poster i olika valutor ger ofta totalsummor som ser felaktiga ut. Normalisera först till en gemensam valuta — annars får du rapporter som inte går att lita på.


Fallgrop 4: Flyttalsjämförelser i ORM-sökningar

Att söka på exakt likhet (t.ex. amount = 10.0) kan missa poster på grund av hur flyttal sparas. Använd intervall (>= och <=) med marginal, eller avrunda värdet innan jämförelse i Python-logik.


Fallgrop 5: Ignorera valutaavrundning vid dataimport

Vid import via CSV eller API sparas tal precis som de skickas utan automatisk avrundning. Om källdata har fler decimaler än målets valuta tillåter, kan det ge oväntade visningar och små differenser i totalsummor. Avrunda i förväg i importskriptet.


Sammanfattning


Monetary-fältet är ett fält som vid första anblick kan verka enkelt men som bär mycket viktig funktionalitet: korrekt avrundning, konsekvent visning och valuta-medvetenhet genom hela Odoo.


Använd det rätt — alltid ihop med ett uttryckligt valutafält och aldrig som en ersättning med Float när pengar är inblandade — så undviker du svårspårade buggar i produktion. Odoos datamodell bygger på detta av goda skäl.


Oavsett om du följer en utvecklarguide, anpassar en standardmodul eller bygger något nytt så är rätt hantering av Monetary-fält ett fundament som avgör hur väl ditt Odoo-system hanterar pengar.

Behöver du hjälp med din Odoo-implementation?


Dasolo hjälper vi företag med implementation, anpassning och optimering av Odoo i alla storlekar och konfigurationer. Behöver du en korrekt datamodell, en strategi för anpassade fält, multivalutastöd eller en full rollout så har vårt team kompetensen att göra det rätt.


Har du frågor om Monetary-fält eller andra delar av din Odoo-lösning hjälper vi gärna till. Kontakta oss så tar vi ett samtal om vad du bygger.

Fältet "Monetary" i Odoo: Hur det fungerar och när du ska använda det
Dasolo 6 mars 2026
Dela detta inlägg
Logga in att lämna en kommentar