Siirry sisältöön

Odoon Rahakenttä: Toiminta ja Käyttötilanteet

Käytännön opas valuuttarajojen käsittelyyn oikein Odoo-tietomallissa
6. maaliskuuta 2026 kirjoittanut
Odoon Rahakenttä: Toiminta ja Käyttötilanteet
Dasolo
| Ei vielä kommentteja

Johdanto


Rahakenttä on yksi hyödyllisimmistä ja eniten väärinkäytetyistä kenttätyypeistä Odoossa. Se näyttää numerolta, tallentaa kuten liukuluku, mutta käyttäytyy kuin ei kumpikaan. Kun ymmärrät, mikä tekee siitä erilaisen, et koskaan käytä tavallista liukuluku kenttää taloudelliselle arvolle uudelleen.


Jos olet koskaan katsonut myyntitilausten kokonaissummaa, laskun määrää tai tuotteen hintaa Odoossa, olet jo käyttänyt rahakenttää. Ne ovat kaikkialla Odoo-tietomallissa, ja ne tekevät hiljaa paljon raskasta työtä valuutan muotoilun, pyöristyksen ja tarkkuuden ympärillä.

Tämä opas on Odoo-kehittäjille, konsultteille ja teknisesti suuntautuneille liiketoimintakäyttäjille, jotka haluavat ymmärtää, kuinka rahakenttä todellisuudessa toimii. Olitpa sitten seuraamassa Odoo-kenttäopasta, rakentamassa mukautettua moduulia tai vain yrittämässä ymmärtää, miksi määrät pyöristyvät eri tavalla kuin odotit, tämä on tarvitsemasi viite.

Mikä on rahakenttä Odoossa


Tyypin fields.Monetary on yksi Odoo-kehyksen ydinkenttätyypeistä. Se on suunniteltu erityisesti valuuttaan sidottujen arvojen tallentamiseen: hintoihin, määriin, kokonaisiin summiin, budjetteihin tai mihin tahansa lukuun, joka edustaa rahaa.


Mikä tekee siitä erottuvan tavallisesta Float-tyypistä, on pakollinen suhde valuuttaan. Monetary-kenttä tietää aina, minkä valuutan kanssa se työskentelee, ja se käyttää tätä valuuttaa määrittääkseen, kuinka monta desimaalia näytetään ja kuinka tallennettuja arvoja pyöristetään.


Miten se näkyy käyttöliittymässä

Odoo-käyttöliittymässä Monetary-kenttä näyttää arvon muotoiltuna liitetyn valuutan mukaan. Jos valuutta on euro, näet jotain kuten € 1,234.50. Jos se on Yhdysvaltain dollari, näet $ 1,234.50. Desimaalien määrä seuraa valuuttatietueen asetuksia.


Kenttä on täysin muokattavissa lomakekatseluissa, se näkyy siististi luettelonäkymissä ja se integroituu luonnollisesti pivot-taulukoihin ja talousraportteihin. Loppukäyttäjien ei tarvitse miettiä muotoilua lainkaan. Odoo hoitaa sen läpinäkyvästi.


Taustalla oleva tietotyyppi

Tietokannan tasolla Monetary-kenttä tallennetaan kaksoistarkkuuden liukulukuna PostgreSQL:ssä. Valuuttatietoja ei tallenneta samaan sarakkeeseen. Ne tulevat liittyvästä res.currency -tietueesta, joka on linkitetty erillisen Many2one-kentän kautta samassa mallissa.


Tämä arvon ja valuutan erottaminen on tarkoituksellista. Se pitää Odoo-tietokannan kentät siisteinä ja mahdollistaa tietueen valuutan muuttamisen riippumatta sen tallennetuista määristä.


Kuinka kenttä toimii


Ymmärtäminen, miten Monetary-kenttä toimii, auttaa sinua käyttämään sitä oikein ja välttämään yllättävän yleisiä pyöristys- tai näyttöongelmia mukautetussa Odoo-kehityksessä.


currency_field-parametri

Jokaisen Monetary-kentän on oltava paritettu Many2one-kentän kanssa, joka osoittaa res.currency:iin. Odoossa etsitään oletuksena kenttää nimeltä currency_id samasta mallista. Voit ohittaa tämän currency_field -parametrilla:


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

Jos valuuttakenttä puuttuu tai ei ole asetettu tietyssä tietueessa, Odoo käyttää yrityksen valuuttaa. Tämä estää vakavia virheitä, mutta monivaluuttaympäristössä se tuottaa virheellistä muotoilua. Ilmoita aina valuuttakenttä selvästi.


Pyöristys ja tarkkuus

Yksi keskeisistä eroista rahallisten ja liukulukuisten kenttien välillä on se, miten pyöristys toimii. res.currency -malli määrittelee desimaalien määrän ja pyöristystekijän jokaiselle valuutalle. Kun Odoo lukee tai näyttää rahallisen arvon, se soveltaa näitä sääntöjä automaattisesti.

Tämä tarkoittaa, että arvo, joka on tallennettu 1.2349999 EUR-kenttään, näytetään muodossa 1.23, ei 1.235 tai 1.23499. Tämä on kriittistä verolaskelmissa, laskujen kokonaismäärissä ja kaikissa taloudellisissa sovitusprosesseissa. Yksinkertaisen liukuluvun käyttäminen näissä yhteyksissä tuottaa lopulta pyöristyspoikkeamia, joita on vaikea jäljittää.


Vuorovaikutus Odoo ORM:n kanssa

Odoo ORM:ssa rahallisen kentän lukeminen palauttaa aina Pythonin liukuluvun. Valuuttayhteys tulee samassa tietueessa olevasta paritetusta valuuttakentästä. Kun teet laskelmia Pythonissa, jotka sisältävät rahallisia kenttiä, käytä valuutan round() -menetelmää tarkkuuden säilyttämiseksi:


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

Tämä välttää liukulukuisten kertymävirheiden syntymisen, jotka voivat ilmetä monirivisten kokonaismäärien tai iteratiivisten laskelmien yhteydessä.


Rahalliset kentät QWeb-raporteissa

QWeb-raporttipohjissa rahalliset kentät integroituvat erityiseen widgettiin, joka muotoilee arvon oikein PDF- ja verkkoraporteissa:


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

Tämä varmistaa oikean valuuttasymbolin ja desimaalimuotoilun jokaisessa luodussa asiakirjassa riippumatta tietueen valuutasta.

Liiketoimintakäyttötapaukset


Rahakenttiä käytetään koko ajan Odoo-standardimoduuleissa. Tässä on viisi konkreettista esimerkkiä, jotka havainnollistavat, missä ja miksi ne ovat tärkeitä todellisissa liiketoimintatyönkuluissa.


1. Myynti: Tuotteiden hinnat ja tilauksen kokonaismäärät

Kentät kuten price_unit, price_subtotal ja amount_total myyntitilauksissa ja tilausriveillä ovat kaikki rahakenttiä. Ne kunnioittavat automaattisesti asiakastilauksessa valittua valuuttaa, joka saattaa poiketa yrityksen toimintavaluutasta.


Kun myyntiedustaja luo tilauksen Yhdysvaltain dollareissa yritykselle, joka toimii euroissa, Odoo hoitaa näyttämisen, pyöristyksen ja muuntamisen oikein, koska rahakenttä toimii aina tietueen valuutan kontekstissa, ei järjestelmän valuutassa.


2. Kirjanpito: Laskujen summat ja verorivit

Kirjanpitomoduulissa jokainen summakenttä laskussa on rahakenttä: amount_untaxed, amount_tax, amount_total. Laskussa asetettu valuutta ohjaa kaikkien näiden arvojen pyöristystä.


Tämä ei ole yksityiskohta. Virheellinen pyöristys veroriveillä aiheuttaa päiväkirjamerkintöjen epätasapainoa, joka on tuskallista sovittaa yhteen. Rahakentän valuuttaan perustuva pyöristys estää näitä ongelmia tietotasolla.


3. CRM: Odotettu liikevaihto mahdollisuuksissa

CRM-mahdollisuudessa expected_revenue -kenttä on rahakenttä. Myyntitiimit voivat tallentaa putkistojen arvot asiakkaan valuutassa, kun taas hallintapaneelit ja raportit muuntavat kaiken yrityksen valuuttaan putkistoanalyysiä ja ennustamista varten.


Tämä asetelma toimii puhtaasti juuri siksi, että rahakentät kuljettavat valuutatietoa numeerisen arvonsa ohella.


4. Ostot: Toimittajien hinnat ja ostotilaukset

Ostotilauksissa käytetään rahakenttiä yksikköhintojen ja kokonaismäärien osalta, jotka liittyvät toimittajan sopimaan valuuttaan. Toimittajalasku Japanin jeneissä käsitellään samalla tavalla kuin euroissa. Rahakenttä huolehtii tarkkuudesta ja näyttämisestä ilman manuaalista käsittelyä ostotiimiltä.


5. Mukautetut kentät: Budjetin ja tavoitteen seuranta

Erittäin yleinen mukautuspyyntö on budjetin, tulotavoitteen tai kustannuskaton lisääminen projektiin, osastoon tai mukautettuun malliin. Kaikissa näissä tapauksissa rahakenttä on oikea valinta. Se integroituu luonnollisesti yrityksen valuuttaan, näkyy oikein lomakkeissa ja listoissa, ja käyttäytyy ennakoitavasti raporteissa ja vientitiedostoissa.

Tällaisen kentän lisääminen liukulukuna on teknisesti mahdollista, mutta se johtaa muotoilueroihin ja pyöristysongelmiin heti, kun monivaluuttaskenaariot ilmenevät.


Kentän luominen tai mukauttaminen


Rahakentän lisäämiseen Odoo-malliin on kaksi pääasiallista tapaa: Odoo Studion kautta koodittomaan lähestymistapaan tai mukautetun Python-moduulin kautta täydelliseen hallintaan.


Odoo Studion käyttö

Odoo Studio sisältää rahatyypin kentän luontipaneelissaan. Kun käytät Odoo Studion kenttiä lisätäksesi rahakentän malliin, Studio lisää automaattisesti currency_id -kentän, jos sellaista ei jo ole kyseisessä mallissa. Tämä kattaa yleisimmät käyttötapaukset ilman koodin kirjoittamista.


Yksi asia, josta on syytä olla tietoinen: Studion luomat kentät käyttävät x_-etuliitettä (esimerkiksi x_studio_budget). Jos mallillasi on jo currency_id -kenttä, uusi rahakenttä käyttää sitä. Jos ei, Studio luo uuden. Kun sinulla on useita rahakenttiä samassa mallissa, joilla voi olla eri valuuttoja, tämä jaettu valuuttakenttä kannattaa tarkistaa huolellisesti ennen käyttöönottoa.


Yksinkertaisissa skenaarioissa Studio on nopein tapa luoda kenttiä Odoossa ja toimii hyvin liiketoimintakäyttäjille, joilla ei ole kehitysoikeuksia.


Tekninen lähestymistapa: Python-kentät

Mukautetussa Odoo-moduulissa rahakentän luominen vaatii kaksi ilmoitusta: itse kenttä ja siihen liittyvä valuuttakenttä. Tämä on standardimalli Odoo Python -kenttien kehityksessä:


from odoo import fields, models

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

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

Yrityksen valuutan asettaminen oletukseksi on käytännöllinen valinta useimmille sisäisille kentille. Se estää valuuttakentän näkymästä tyhjältä, kun käyttäjä avaa ensimmäisen kerran tietueen, mikä rikkoisi rahakentän muotoilun.


Laskennalliset rahakentät

Rahakentät toimivat hyvin Odoo-laskennallisina kenttinä. Jos sinun tarvitsee laskea rivisummia tai soveltaa kaavaa, joka tuottaa rahallisen tuloksen, tämä on standardimalli:


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

store=True -attribuutti on tärkeä, jos suunnittelet suodattavasi, lajittelevasi tai aggregoivasi tätä kenttää listanäkymissä tai raporteissa. Ei-tallennettuja laskennallisia kenttiä ei voida käyttää ORM-alueen suodattimissa.


Rahakentän lisääminen API:n kautta

Jos sinun tarvitsee luoda kenttiä Odoo:ssa ohjelmallisesti XML-RPC:n kautta (esimerkiksi osana etäkonfiguraatioskriptiä), voit luoda rahakentän ir.model.fields -kautta:


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

Tämä on osa laajempaa Odoo-mukautustyökalupakkia, joka on saatavilla XML-RPC API:n kautta, ja josta käsitellään tarkemmin muissa artikkeleissa tässä blogikokoelmassa.

Parhaat käytännöt


Rahakenttä on helppo käyttää, kun tunnet mallit. Tässä ovat käytännöt, jotka pitävät toteutuksesi siistinä ja estävät ongelmia tulevaisuudessa.


1. Älä koskaan käytä Float-arvoja taloudellisille arvoille

Tämä on tärkein sääntö Odoo-kehityksessä, kun on kyse rahasta. Jos kenttä edustaa hintaa, määrää, kokonaissummaa, budjettia tai mitä tahansa valuuttapohjaista numeroa, käytä fields.Monetary. Float-kenttä ei ole tietoinen valuutasta eikä pyöristä oikein eri valuuttojen välillä. Rahakenttä on olemassa juuri tämän ongelman ratkaisemiseksi.


2. Ilmoita valuuttakenttä aina selvästi

Älä luota Odoon varajärjestelmään currency_id -kenttään, ellei tämä kenttä todella ole olemassa mallissasi. Aseta nimenomaan currency_field -parametri ja ilmoita aina vastaava Many2one res.currency -kenttä. Tämä tekee suhteesta selkeän ja estää hiljaisen varajärjestelmän käytön monivaluuttaympäristöissä.


3. Aseta Oletusvaluutta

Sisäisille kentille, jotka lähes aina käyttävät yrityksen valuuttaa, aseta oletus valuuttakenttään: default=lambda self: self.env.company.currency_id. Tämä estää kenttää näkymästä tyhjältä uusilla rekistereillä, mikä poistaa valuuttasymbolin ja muotoilun käyttöliittymässä.


4. Käytä store=True lasketuissa rahakentissä, joita aiot etsiä

Jos määrität lasketun rahakentän ja odotat käyttäjien tai raporttien suodattavan tai lajittelevan sen mukaan, aseta store=True. Ei-tallennettuja laskettuja kenttiä ei voi käyttää ORM-alueilla tai SQL-pohjaisissa näkymissä. Tämä on yleinen sekaannuksen lähde mukautettuja koontinäyttöjä rakennettaessa Odoossa.


5. Käytä Currency Round() -toimintoa väliin jääville laskelmille

Kun kirjoitat Python-koodia, joka suorittaa useita laskentavaiheita rahasummille, käytä self.currency_id.round(value) joka vaiheessa, joka on merkityksellinen, eikä vain lopussa. Liukulukujen virheet kasaantuvat useiden operaatioiden aikana, ja pyöristyksen soveltaminen aikaisemmin estää eroja kokonaismäärissä.


6. Ole tarkoituksellinen monivaluuttaraporteissa

Kun kokoat rahasummia eri valuutoissa olevista rekistereistä, älä yksinkertaisesti lisää raakalukemia yhteen. Muunna kaikki arvot ensin yhteiseen valuuttaan käyttäen res.currency.compute(), tai tee raportista valuuttakohtainen. Eri valuuttojen sekoittaminen yhteenlaskussa tuottaa lukuja, jotka ovat teknisesti oikein kenttätasolla, mutta taloudellisesti merkityksettömiä.

Yleisimmät sudenkuopat


Jopa kokeneet Odoo-kehittäjät kohtaavat ongelmia rahakenttien kanssa. Tässä ovat yleisimmät virheet ja miten välttää ne.


Ansakuoppa 1: Puuttuva valuuttakenttä

Yleisimmät ongelmat rahakentän lisäämisessä liittyvät siihen, että unohtaa luoda siihen liittyvän valuutta Many2one -kentän. Jos currency_id ei ole olemassa mallissa, Odoo siirtyy hiljaa yrityksen valuuttaan joissakin konteksteissa ja nostaa virheen toisissa. Luo aina valuuttakenttä yhdessä rahakentän kanssa, vaikka et koskaan odottaisi käyttäjien muuttavan sitä.


Käytävä 2: Kaksi rahakenttää jakamassa yhden valuuttakentän eri tarkoitettujen valuuttojen kanssa

Jos sinulla on kaksi rahakenttää samassa mallissa, jotka on tarkoitettu pitämään arvoja eri valuutoissa (esimerkiksi asiakashinta EUR:ssä ja myyjän kustannus USD:ssä), ne eivät voi turvallisesti jakaa yhtä currency_id kenttää. Jokaisella on oltava oma valuuttaviittauksensa. Tämän laiminlyönti tarkoittaa, että yksi valuuttasettings ohittaa molemmat kentät, mikä tuottaa virheellisiä tietoja ja hämmentävää käyttöliittymäkäyttäytymistä.


Käytävä 3: Pyöristysongelmat valuuttojen yhdistämisessä

Rahakenttäarvojen summaaminen eri valuutoilla olevien tietueiden välillä tuottaa kokonaislukuja, jotka näyttävät vääriltä, koska lisäät EUR-määriä USD-määriin ikään kuin ne olisivat sama yksikkö. Tämä on yleinen raportointivirheiden lähde yrityksissä, jotka toimivat useissa valuutoissa. Normalisoi aina yhteen valuuttaan ennen aggregointia.


Käytävä 4: Liukulukujen vertailut ORM-hauissa

Rahakenttää etsiminen tarkan yhtäläisyysvertailun avulla (esimerkiksi etsimällä tietueita, joissa amount = 10.0) voi jättää tietueita huomaamatta sen vuoksi, miten liukulukuja tallennetaan tietokantaan. Käytä >= ja <= pienen toleranssin kanssa tai sovella valuuttapyöristystä ennen arvojen vertailua Python-logiikassa. Tämä on yleinen Odoo ORM -ongelma liukulukupohjaisilla kentillä, ei erityisesti rahakentille, mutta se on tärkeämpää, kun raha on kyseessä.


Käytävä 5: Valuuttapyöristyksen huomioimatta jättäminen tietojen tuonnissa

Kun tuodaan tietueita CSV- tai XML-RPC:n kautta, jotka sisältävät rahakenttäarvoja, tuodut numerot tallennetaan sellaisina kuin ne on annettu ilman automaattista pyöristystä. Jos lähdedatassasi on enemmän desimaaleja kuin kohdevaluutta sallii, tallennettu arvo on teknisesti oikea, mutta se näyttää erilaiselta kuin odotettiin ja voi aiheuttaa pieniä eroja kokonaismäärissä. Sovella valuuttapyöristystä tuontiskripteissäsi tai tietojen valmisteluvaiheissa ennen arvojen lähettämistä Odoo:lle.


Yhteenveto


Rahakenttä on yksi niistä Odoo-kenttätyypeistä, joka näyttää pinnalta yksinkertaiselta, mutta kantaa paljon tärkeitä käyttäytymisiä sen alla. Sen tiukka suhde valuuttatietueeseen tekee siitä luotettavan taloustiedoille: oikea pyöristys, johdonmukainen muotoilu ja valuuttatietoisen esityksen koko Odoo-käyttöliittymässä ja raportointimoottorissa.


Sen oikea käyttö, mikä tarkoittaa aina sen yhdistämistä erilliseen valuuttakenttään ja koskaan liukuluvun käyttämistä taloudellisten arvojen sijasta, pelastaa sinut koko joukolta hienovaraisia bugeja, jotka ovat tunnetusti vaikeita jäljittää tuotannossa. Odoo-tietomalli on rakennettu tämän kenttätyypin ympärille hyvästä syystä.


Olitpa sitten seuraamassa Odoo-kehittäjän opasta, mukauttamassa vakiomoduulia tai rakentamassa jotain uutta alusta alkaen, rahakenttien oikea käsittely on yksi perustavanlaatuisista päätöksistä, jotka muovaavat sitä, kuinka luotettavasti Odoo-toteutuksesi käsittelee rahaa.

Tarvitsetko apua Odoo-toteutuksessasi?


Me Dasolossa autamme yrityksiä toteuttamaan, mukauttamaan ja optimoimaan Odoo:ta kaikilla mittakaavoilla ja kokoonpanoilla. Olitpa sitten tarvitsemasi puhdasta tietomallia, mukautettua kenttästrategiaa, monivaluuttatukea tai täydellistä Odoo-käyttöönottoa, tiimillämme on teknistä ja toiminnallista syvyyttä tehdä se oikein.


Jos sinulla on kysymyksiä rahakentistä tai mistä tahansa muusta Odoo-toteutuksesi osa-alueesta, autamme mielellämme. Ota meihin yhteyttä ja keskustellaan siitä, mitä olet rakentamassa.

Odoon Rahakenttä: Toiminta ja Käyttötilanteet
Dasolo 6. maaliskuuta 2026
Jaa tämä kirjoitus
Kirjaudu sisään jättääksesi kommentin