Johdanto
Monetary‑kenttä on Odoon rahaa käsittelevien kenttätyyppien käytännöllisin — ja samalla sekaisin käytetty. Pinnalta se näyttää numerolta ja tallentaa liukulukuna, mutta käyttäytyy eri tavalla kuin tavallinen Float. Kun erot ymmärtää, et halua enää koskaan käyttää tavallista Float‑kenttää rahan arvoihin.
Jos olet katsonut myyntitilauksen kokonaissummaa, laskun arvoa tai tuotteen hintaa Odoossa, olet jo törmännyt Monetary‑kenttään. Sitä on mallissa kaikkialla: se huolehtii valuuttamuotoilusta, pyöristyssäännöistä ja tarkkuudesta taustalla ilman käyttäjän huomioita.
Tämä opas on tarkoitettu Odoo‑kehittäjille, konsultteihin ja teknisesti suuntautuneille liiketoiminnan käyttäjille, jotka haluavat ymmärtää Monetary‑kentän todellisen toiminnan. Olipa tavoitteena oppia kenttien periaatteet, rakentaa moduuli tai paikallistaa pyöristysongelmia, tästä saat tarvittavat käytännön ohjeet.
Mikä on Monetary-kenttä Odoossa
fields.Monetary on Odoon ydinkenttä, suunniteltu nimenomaan valuuttalukuja varten: hintoja, summia, budjetteja ja muita rahamääräisiä muuttujia. Se ei ole vain numero—se on numero + valuutan konteksti.
Merkittävin ero tavalliseen Floatiin verrattuna on se, että Monetary‑kenttä liittyy aina valuuttaan. Kenttä tietää, mitä valuuttaa se edustaa, ja käyttää valuuttatietoa esimerkiksi desimaalien määrän ja pyöristyksen määrittelyyn.
Miten se näkyy käyttöliittymässä
Käyttöliittymässä Monetary‑kenttä näyttää arvon valuutan mukaisesti muotoiltuna: euroissa näet esimerkiksi “€ 1 234,50” ja dollareissa “$ 1,234.50”. Desimaalien määrä ja symboli perustuvat siihen res.currency‑tietueeseen, johon kenttä viittaa.
Kenttä on muokattavissa lomakkeissa, selkeä listanäkymissä ja käyttäytyy ennakoitavasti raporteissa sekä pivot‑tauluissa. Käyttäjän ei tarvitse huolehtia muotoilusta — Odoo hoitaa sen automaattisesti.
Taustalla käytetty tietotyyppi
Tietokannassa Monetary‑kenttä tallentuu PostgreSQL:ssä double precision ‑lukuna. Valuutan tieto ei ole samassa sarakkeessa: se on oma Many2one‑kenttä, joka viittaa res.currency‑malliin samassa tietueessa.
Arvon ja valuutan eriyttäminen on tarkoituksellista. Näin tietokentät pysyvät selkeinä ja valuutan voi tarvittaessa vaihtaa erikseen ilman, että numerot muuttuvat hukkaan.
Miten kenttä toimii
Kun ymmärrät Monetary‑kentän mekanismin, voit välttyä odottamattomilta pyöristys‑ ja näyttöongelmilta, jotka usein syntyvät räätälöinneissä ja monivaluuttaympäristöissä.
currency_field‑parametri
Jokaisella Monetary‑kentällä tulee olla rinnalla Many2one‑kenttä, joka osoittaa res.currency‑tietueeseen. Odoon oletus on kenttä nimeltä currency_id, mutta voit määrittää oman kentän currency_field‑parametrilla:
amount = fields.Monetary(string='Amount', currency_field='currency_id')
Jos valuuttakenttä puuttuu tai arvo on tyhjä, Odoo käyttää varavarianttina yhtiön valuuttaa. Tämä estää kovia virheitä, mutta monivaluuttaympäristössä voi saada väärän muotoilun. Määrittele valuuttakenttä aina selkeästi.
Pyöristys ja tarkkuus
Yksi Monetary‑kentän tärkeimmistä eroista Floatiin on pyöristystapa. res.currency‑mallissa määritellään desimaalien määrä ja pyöristyskertoimet kullekin valuutalle. Kun Odoo näyttää tai lukee Monetary‑arvon, se soveltaa näitä sääntöjä automaattisesti.
Esimerkiksi arvo 1.2349999 EUR‑kentässä esitetään käyttäjälle 1,23 — ei 1,235 tai 1,23499. Tämä on kriittistä verolaskelmissa, laskujen loppusummissa ja kirjanpidon täsmäytyksissä. Pelkkä Float johtaa helposti vaikeasti jäljitettäviin pyöristuseroihin.
Vuorovaikutus Odoo ORM:n kanssa
ORMissa Monetary‑kenttä palauttaa Pythonissa floatin. Valuutan konteksti tulee samasta tietueen valuuttakentästä. Kun teet laskelmia Pythonissa, käytä valuutan round()‑metodia säilyttääksesi oikean tarkkuuden:
rounded_value = self.currency_id.round(self.amount)
Tämä estää liukulukujen kertymisestä aiheutuvat virheet, joita voi syntyä esimerkiksi monirivisissä summissa tai toistuviin laskentavaiheisiin perustuvissa kaavoissa.
Monetary‑kentät QWeb‑raporteissa
QWeb‑raporteissa Monetary‑kentät yhdistävät widgetin, joka varmistaa oikean muotoilun sekä PDF:issä että verkko‑raporteissa:
<span t-esc="record.amount"
t-options='{"widget": "monetary", "display_currency": record.currency_id}'/>
Tämä takaa, että oikea valuuttasymboli ja desimaaliasettelu näkyvät kaikissa luoduissa dokumenteissa, riippumatta siitä, mikä valuutta on tallennettu tietueelle.
Liiketoimintatapaukset
Missä käytännössä Monetary‑kenttiä käytetään
1. Myynti: Tuotehinnat ja tilausten summat
Myyntimoduulissa kentät kuten price_unit, price_subtotal ja amount_total ovat Monetary‑tyyppiä. Ne noudattavat asiakkaan tilaukselle valitsemaa valuuttaa ja näyttävät summat sekä pyöristyksen oikein riippumatta yrityksen kotivaluutasta.
Esimerkiksi myyntitilaus USD‑valuutassa yrityksen ollessa EUR‑ympäristössä näyttää ja laskee summat oikein, koska kenttä käyttää oman tietueensa valuuttakontekstia.
2. Kirjanpito: Laskujen summat ja verorivit
Kirjanpidossa kaikki laskun numerokolumnit ovat Monetary‑kenttiä: amount_untaxed, amount_tax, amount_total. Laskulle asetettu valuutta ohjaa näiden kenttien pyöristyksen.
Väärät pyöristykset veroriveillä johtavat helposti tilinpäätöksen epätasapainoihin. Monetary‑kentän valuuttatieto ehkäisee tällaisia virheitä jo tietotason tasolla.
3. CRM: Odotettu liikevaihto mahdollisuuksissa
CRM‑mahdollisuuden expected_revenue‑kenttä on Monetary. Myyntitiimit voivat kirjata arvion asiakkaan valuutassa, ja raportit voivat konvertoida luvut yrityksen valuuttaan ennusteanalyysiä varten.
Tämä toimii luotettavasti juuri siksi, että kenttiin liittyy aina valuuttatieto.
4. Hankinnat: Toimittajan hinnat ja ostotilaukset
Ostotilaukset käyttävät Monetary‑kenttiä yksikköhintoihin ja loppusummiin, sidottuna toimittajan valuuttaan. Esimerkiksi toimittajalasku japanilaisissa jeneissä käsitellään täsmälleen samalla mekanismilla kuin eurolasku.
5. Räätälöidyt kentät: Budjetointi ja tavoitteet
Kun lisäät projekteille, osastoille tai omille malleille budjetin, tavoitteen tai kustannokatton, Monetary on oikea valinta. Se liittyy saumattomasti yrityksen valuuttaan ja käyttäytyy ennustettavasti lomakkeissa, listoissa ja raporteissa.
Teknisesti Float voi toimia mutta johtaa nopeasti muotoilu‑ ja pyöristysongelmiin erityisesti monivaluutta‑tilanteissa.
Kentän luominen tai muokkaaminen
Monetary‑kentän lisääminen onnistuu kahdella yleisellä tavalla: Odoo Studion kautta koodittomasti tai räätälöidyn Python‑moduulin kautta, kun tarvitset täydellistä hallintaa.
Odoo Studio
Studio tarjoaa kenttätyyppejä, mukaan lukien Monetary. Kun lisäät kentän Studiolla, se luo automaattisesti currency_id‑kentän, jos mallissa ei vielä ole yhtä. Tämä ratkaisee yleisimmät tapaukset ilman koodia.
Huomaa, että Studio‑kentät saavat x_‑etuliitteen (esim. x_studio_budget). Jos mallissa on jo currency_id, uusi kenttä käyttää sitä; muuten Studio luo oman valuuttakentän. Jos samalla mallilla on useita Monetary‑kenttiä ja ne saattavat edustaa eri valuuttoja, kannattaa tarkistaa kenttien välinen arkkitehtuuri ennen käyttöönottoa.
Yksinkertaisissa tarpeissa Studio on nopea ja toimiva ratkaisu liiketoiminnan käyttäjille ilman kehittäjäpääsyä.
Tekninen lähestymistapa: Python‑kentät
Räätälöidyssä moduulissa Monetary‑kenttä vaatii kaksi määritystä: itse kentän ja siihen liittyvän valuuttakentän. Tämä on vakiomalli Odoo‑kehityksessä.
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,
)
Yrityksen valuutan asettaminen oletukseksi on käytännöllinen valinta sisäisille kentille. Se estää valuuttakentän jäämisen tyhjäksi uudella tietueella ja säilyttää muotoilun käyttöliittymässä.
Lasketut Monetary‑kentät
Monetary toimi hyvin myös lasketuissa kentissä. Jos keräät rivisummia tai tuot laskelmasta rahallisen arvon, määritä kenttä Monetary‑tyyppinä ja tee laskenta tavanomaisesti.
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'))
store=True on tärkeä, jos aiot suodattaa, järjestää tai aggregoida kenttää listoissa tai raporteissa. Tallentamattomia laskettuja kenttiä ei voi käyttää ORM‑domeneissa tai SQL‑pohjaisissa näkymissä.
Kentän lisääminen API:n kautta
Jos käytät XML‑RPC:tä ohjelmalliseen kenttien luontiin (esim. etäkonfigurointiskriptissä), Monetary‑kentän voi luoda ir.model.fields‑mallin kautta.
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',
}]
)
Tämä on osa laajempaa Odoo‑muokkaustyökalupakkia, jota voi hyödyntää etähallinnassa ja migraatioissa — aiheesta löytyy lisää blogisarjan muissa artikkeleissa.
Parhaat käytännöt
Parhaat käytännöt, joiden noudattaminen säästää päänvaivaa
1. Älä koskaan käytä Floatia rahalle
Tärkein sääntö: jos kenttä edustaa hintaa, summaa, budjettia tai mitään valuuttapohjaista lukua, käytä fields.Monetary‑tyyppiä. Float ei tunne valuuttaa eikä pyöristä oikein eri valuutoissa — Monetary ratkaisee tämän ongelman.
2. Määrittele valuuttakenttä aina eksplisiittisesti
Älä luota siihen, että Odoo automaattisesti käyttää currency_id:ä, ellei kenttä ole todellisuudessa mallissa. Aseta currency_field‑parametri ja luo vastaava Many2one res.currencyiin. Näin vältät hiljaiset varavaihtoehdot monivaluuttaympäristössä.
3. Aseta oletusvaluutta
Sisäisiin kenttiin, jotka lähes aina käyttävät yrityksen valuuttaa, anna valuuttakentälle oletus: default=lambda self: self.env.company.currency_id. Tämä estää tyhjät arvot uusilla tietueilla ja säilyttää valuuttamuotoilun.
4. Käytä store=True, jos aiot hakea kenttää
Lasketuille Monetary‑kentille, joita haluat suodattaa tai järjestää, aseta store=True. Muuten ORM‑domeneissa ja raporteissa on rajoituksia.
5. Pyöristä väliarvot valuutan round()‑metodilla
Kun teet useita aritmeettisia vaiheita, kutsu self.currency_id.round(value) jokaisen merkittävän vaiheen jälkeen. Tämä vähentää liukulukujen kertymisestä johtuvia eroja lopputuloksissa.
6. Ole johdonmukainen monivaluuttaraporteissa
Kun yhdistät eri valuutoissa olevia rivejä, älä summaa raakaarvoja sellaisenaan. Muunna kaikki arvot yhteen vertailuvaluuttaan res.currency.compute():lla tai tee raportit valuuttakohtaisiksi. Eri valuuttojen summat voivat olla kenttäkohtaisesti oikeita mutta taloudellisesti merkityksettömiä ilman konversiota.
Yleisiä sudenkuoppia
Usein toistuvat virheet ja niiden korjauskeinot
Yleisimmät sudenkuopat Monetary‑kentissä
Sudenkuoppa 1: Puuttuva valuuttakenttä
Yleisin virhe on unohtaa luoda Many2one‑valuuttakenttä. Jos currency_id ei ole mallissa, Odoo saattaa jossain konteksteissa pudota yrityksen valuuttaan hiljaisesti ja toisissa nostaa virheen. Luo valuuttakenttä aina samalla kertaa kuin Monetary‑kenttä, vaikka käyttäjät eivät sitä muuttaisikaan.
Sudenkuoppa 2: Kaksi Monetary‑kenttää jakamassa samaa valuuttakenttää eri tarkoituksiin
Jos mallissa on kaksi rahakenttää, jotka tarkoitetaan eri valuutoille (esim. asiakkaan hinta EUR ja toimittajan kustannus USD), ne eivät voi jakaa samaa currency_id‑kenttää. Jokainen tarvitsee oman valuuttaviittauksensa, muuten toinen asetus peittää molemmat ja synnyttää virheellisiä arvoja ja hämmentävää käyttöliittymäkäyttäytymistä.
Sudenkuoppa 3: Pyöristysongelmat, kun aggregoidaan eri valuuttoja
Summat eri valuutoissa näyttävät usein virheellisiltä, kun arvoja lisätään yhteen ilman konversiota. Tämä on tyypillinen raportointivirhe niissä yrityksissä, jotka toimivat useissa valuutoissa. Normalisoi ensin arvot yhteiseen valuuttaan ennen aggregointia.
Sudenkuoppa 4: Liukulukujen vertailu ORM‑hauissa
Tarkat vertailut, kuten amount = 10.0, voivat ohittaa tietueita liukulukujen tallennusmuodon vuoksi. Käytä mieluummin >= ja <= pienellä toleranssilla tai pyöristä arvoja ennen vertailua Pythonissa. Tämä ei ole pelkästään Monetary‑ongelma, mutta rahaan liittyvissä hauissa se korostuu.
Sudenkuoppa 5: Valuutan pyöristyksen laiminlyönti tuonnissa
Yhteenveto
CSV‑ tai XML‑RPC‑tuonnissa lähetetyt rahaluvut tallennetaan sellaisenaan ilman automaattista pyöristystä. Jos lähdeaineistossa on enemmän desimaaleja kuin valuutta sallii, tallennettu arvo voi näyttää erilaiselta ja aiheuttaa pieniä poikkeamia summissa. Pyöristä arvot ennen tuontia.
Yhteenveto: miksi Monetary on tärkeä
Monetary‑kenttä vaikuttaa yksinkertaiselta, mutta sen valuuttatieto ja pyöristyssäännöt tekevät siitä olennaisen taloustietojen hallinnassa. Käyttämällä sitä oikein — aina valuuttakentän kanssa ja korvaamalla Float rahakentissä — vältät monta hankalaa tuotantovirhettä. Odoon tietomalli on rakennettu tätä kenttätapaa silmällä pitäen, ja se toimii parhaiten kun sitä käytetään oikein.
Tarvitsetko apua Odoo‑projektissasi?
Dasolo auttaa yrityksiä käyttöönotossa, räätälöinneissä ja Odoo‑optimoinnissa eri kokoisissa ympäristöissä. Tarjoamme apua tietomallin suunnitteluun, kenttästrategiaan, monivaluuttatukeen ja koko Odoo‑käyttöönottoon teknisestä ja toiminnallisesta näkökulmasta.
Jos sinulla on kysymyksiä Monetary‑kentistä tai muista Odoo‑aiheista, autamme mielellämme. Ota yhteyttä meihin ja jutellaan, mitä olet rakentamassa.