Johdanto
Odoossa tiedot järjestetään malleihin: jokainen liiketoiminnan olio — tilaus, lasku tai asiakas — tallennetaan oman mallinsa riveiksi ja kentiksi tietokantaan.
Odoon malleihin perehtyminen on pakollinen taito sekä kehittäjälle että toiminnalliselle konsultille. Mallit muodostavat sovelluksen tietorakenteen, määrittävät kentät, suhteet ja sen, missä liiketoimintasääntöjä ajetaan.
Tässä artikkelissa syvennytään yhteen myynnin ytimessä olevaan malliin: sales.order. Olitpa rakentamassa moduulia, integroimassa ulkoisia järjestelmiä tai määrittämässä myyntiprosesseja, tähän malliin törmäät varmasti.
Mikä on sales.order‑malli
sales.order edustaa tarjouksia ja myyntitilauksia Odoossa — se on paikka, johon kaikki myyntitapahtuman tiedot kerätään ennen laskutusta ja toimitusta.
Mallia käyttää Odoon Myyntimoduuli (=Sales), joka hoitaa tarjousten luomisen, vahvistuksen ja niihin liittyvät prosessit.
Myyjä luo tarjouksen sales.order‑tietueena. Kun asiakas hyväksyy, tila kirjaa tilan muutoksen luonnoksesta vahvistetuksi. Sama malli pitää sisällään sekä luonnokset että vahvistetut tilaukset; lifecycle‑tila (state) kertoo missä vaiheessa ollaan.
Muita moduuleja laajentavat sales.orderia periytyvillä lisillä: CRM voi linkittää mahdollisuuden tilaukseen, kirjanpito lisätä laskutukseen liittyviä kenttiä ja varasto tuoda toimitusaikoja. Laajennukset lisäävät oman logiikkansa ilman, että core‑rakenne kopioidaan.
Mallin keskeiset kentät
Seuraavaksi käydään läpi tärkeimmät kentät, joiden tuntemus helpottaa tarjousten ja tilausten käsittelyä ja raportointia.
1. name
Tyyppi: Char. Tilaus- tai tarjousviite, usein automaattisesti generoitu (esim. SO00042). Näkyy listoissa ja tulostusmateriaaleissa — perusidentifikaattori tilaukselle.
2. state
Tyyppi: Selection. Seuraa tilauksen elinkaarta: draft (luonnos), sent (lähetetty), sale (vahvistettu), done (toimitettu/laskutettu) ja cancel (peruttu). Tilakenttä määrää, mitä toimintoja voidaan suorittaa.
3. partner_id
Tyyppi: Many2one (res.partner). Asiakas tai pääkontakti. Pakollinen kenttä, jota käytetään kaikkeen asiakaskohtaiseen logiikkaan ja raportointiin.
4. partner_invoice_id
Tyyppi: Many2one (res.partner). Laskutusosoite. Jos jätetään tyhjäksi, käytetään partner_id:tä. Käytetään tapauksissa, joissa laskutusosoite poikkeaa pääyhteyshenkilöstä.
5. partner_shipping_id
Tyyppi: Many2one (res.partner). Toimitusosoite. Oletuksena partner_id. Vaikuttaa toimituksiin ja kulkulaskentaan.
6. user_id
Tyyppi: Many2one (res.users). Myyjä tai vastuuhenkilö. Käytetään CRM‑raportoinnissa, provisioissa ja aktiviteettien kohdistamisessa.
7. team_id
Tyyppi: Many2one (crm.team). Myyntitiimi. Ryhmittelyt ja tiimikohtainen seuranta perustuvat tähän kenttään.
8. date_order
Tyyppi: Datetime. Tilauksen päivämäärä: luonnoksilla tyypillisesti luonnoksen luontipäivä, vahvistetuilla tilannevoreilla vahvistuspäivä. Tärkeä kenttä raportoinnissa.
9. validity_date
Tyyppi: Date. Tarjouksen voimassaoloaika. Tämän jälkeen tarjous voi vanhentua — hyödyllinen määräaikaisissa tarjouksissa.
10. commitment_date
Tyyppi: Datetime. Sovittu toimituspäivä. Kun asetetaan, toimitukset ajoitetaan tämän mukaan, mikä auttaa lupausten pitämisessä.
11. order_line
Tyyppi: One2many (sale.order.line). Tilausrivit — jokaisella rivillä tuote, määrä, hinta ja verot. Tämä osa sisältää tilauksen varsinaisen sisällön.
12. amount_untaxed
Tyyppi: Float. Summa ilman veroja. Lasketaan tilauserivien perusteella, käytetään näyttöön ja raportointiin.
13. amount_tax
Tyyppi: Float. Verojen yhteismäärä. Lasketaan rivikohtaisten verojen perusteella ja näytetään tilauksella ja laskulla.
14. amount_total
Tyyppi: Float. Kokonaismäärä sisältäen verot — olennainen summa laskutusta ja raportointia varten.
15. currency_id
Tyyppi: Many2one (res.currency). Valuutta. Periytyy yleensä yritykseltä tai hinnastolta; kaikki rahakentät käyttävät tätä valuuttaa.
16. pricelist_id
Tyyppi: Many2one (product.pricelist). Hinnasto, joka määrittää yksikköhinnat riville. Voidaan asettaa asiakkaan kautta tai manuaalisesti.
17. payment_term_id
Tyyppi: Many2one (account.payment.term). Maksuehdot (esim. 14 pv, 50% etukäteen). Käytetään laskutusta luotaessa.
18. fiscal_position_id
Tyyppi: Many2one (account.fiscal.position). Verotuksen kartoituspaikka—käytetään, kun asiakkaalla on erityinen verokäytäntö tai eri maa.
19. client_order_ref
Tyyppi: Char. Asiakkaan oma viitenumero tai ostotilausnumero. Näkyy dokumenteissa ja raportoinnissa.
20. origin
Tyyppi: Char. Lähdedokumentti tai brändätty alkuperä (esim. voittoketju CRM‑mahdollisuudesta). Auttaa jäljitettävyydessä.
21. create_date
Tyyppi: Datetime. Tallenna tietueen luontiajankohdan automaattisesti — hyödyllinen auditoinneissa.
22. write_date
Tyyppi: Datetime. Viimeisin muokkausaika, myös automaattinen — kertoo, milloin tietoja viimeksi muutettiin.
23. note
Tyyppi: Text. Lisäehdot, sisäiset muistiinpanot tai mukaansopivat ehdot, jotka voidaan halutessa näyttää tarjouksella tai laskulla.
24. require_signature
Tyyppi: Boolean. Jos päällä, asiakas tarvitsee sähköisen allekirjoituksen ennen vahvistusta — käytetään verkkokaupassa ja portaalissa.
25. require_payment
Tyyppi: Boolean. Jos päällä, maksu vaaditaan ennen tilausta — tyypillinen ennakkomaksu‑ tai käsirahamalli.
26. invoice_status
Tyyppi: Selection. Seuraa laskutuksen tilaa: no (ei laskutettu), to invoice (laskutettavissa), invoiced (laskutettu), upsell (lisälaskutusmahdollisuus).
27. locked
Tyyppi: Boolean. Kun päällä, tilausta ei voi muokata — asetetaan automaattisesti vahvistuksen tai muistiinpanojen jälkeen.
28. company_id
Tyyppi: Many2one (res.company). Moniyritysympäristössä tämä kertoo, mille yritykselle tilaus kuuluu ja määrittää näkyvyyden sekä käyttöoikeudet.
29. tag_ids
Tyyppi: Many2many (crm.tag). Merkinnät luokitteluun: suodatus, segmentointi ja mukautetut työnkulut hyödyntävät tageja.
30. signed_by
Tyyppi: Char. Nimen kenttä, joka tallentaa allekirjoittajan, jos allekirjoitus vaadittiin — hyödyllinen auditissa.
31. signed_on
Tyyppi: Datetime. Allekirjoitusajankohta — kertoo, milloin asiakas hyväksyi sähköisesti.
32. prepayment_percent
Tyyppi: Float. Ennakkomaksun prosentti tilauksen loppusummasta. Käytetään yhdessä require_paymentin kanssa käsiraha‑toiminnoissa.
Miten malli linkittyy liiketoimintaprosesseihin
1. Tarjouksesta vahvistettuun tilaukseen
Myyjä laatii tarjouksen, lisää rivit ja hinnat ja lähettää asiakkaalle. Asiakas hyväksyy — tila muuttuu luonnoksesta vahvistetuksi ja tilauksesta voidaan luoda lasku tai toimitusasiakirjat.
2. Verkkokauppa ja asiakasportaali
Verkkokaupan tilaukset syntyvät sales.order‑tietueiksi. Asetukset kuten require_signature ja require_payment mahdollistavat, että verkko‑ostoksessa vaaditaan maksu tai allekirjoitus ennen vahvistusta.
3. CRM‑mahdollisuudesta tilaukseksi
Voitetusta mahdollisuudesta luodaan tarjous, joka linkittyy alkuperäiseen mahdollisuuteen origin‑kentässä. user_id ja team_id ohjaavat raportointia ja provisiolaskentaa.
4. Laskutusprosessit
Vahvistetusta tilauksesta luodaan laskuja: rivit tuodaan tilaukselta, maksuehdot ja verokäytännöt periytyvät, ja invoice_status seuraa etenemistä.
5. Toimitukset ja toimituslupaukset
commitment_date ohjaa toimitusaikataulutusta: kun se on asetettu, varaston lähdöt ajoittuvat sen mukaan ja partner_shipping_id määrittää toimitusosoitteen.
Miten kehittäjät laajentavat mallia
Kehittäjät laajentavat sales.orderia eri tavoilla; tyypillisin tapa on Odoon periytyvä malli‑inheritance.
Mallien periytyminen
Käytä _inherit = 'sale.order' luodaksesi laajennuksen. Lisää kenttiä, ylikirjoita metodeja tai lisää rajoitteita. Muutos pidetään erillisessä moduulissa, mikä helpottaa päivityksiä ja ylläpitoa.
Uusien kenttien lisääminen
Määrittele kentät periytetyssä mallissa oikealla tyypillä: Char, Many2one, Boolean, Integer, Text tai Selection. Huomioi myös yrityskohtaiset kentät moniyritysmalleissa.
Python‑laajennukset
Ylikirjoita metodeja kuten action_confirm, create tai write lisälogiikan tarpeen mukaan. Käytä aina super()‑kutsua alkuperäisen toiminnallisuuden säilyttämiseksi ja huomioi laskettujen kenttien riippuvuudet.
Odoo Studio
Odoo Studio soveltuu nopeisiin kenttä‑ ja näkymämuutoksiin ilman koodausta. Monimutkaisissa tai pitkän elinkaaren muutoksissa custom‑moduuli on usein kestävämpi ratkaisu.
Parhaat käytännöt
- Käytä oikeaa tilaa (state) jokaisessa prosessivaiheessa — älä ohita tilojen logiikkaa tai pakota tilaa manuaalisesti.
- Aseta commitment_date aina, kun asiakkaalle on luvattu tietty toimituspäivä: se parantaa varaston ajoitusta ja lupauksen pitämistä.
- Kun tarvitset ylin yritys‑tai konsernitason asiakasyhteenvetoja (esim. luottoarviot), käytä commercial_partner_id:tä — se ryhmittelee tytäryhtiöiden tiedot oikein.
- API‑integraatioissa käytä XML‑RPC:tä tai JSON‑RPC:tä; sales.order on saatavilla ja ulkoisten ID‑kenttien kartoitus kannattaa tehdä huolella.
- Oman kentän nimeämisessä suositaan x_‑ tai moduuliprefiksiä välttämään konfliktit tulevien Odoo‑versioiden kanssa.
Yleisimmät virheet
- Kun muokkaat vahvistettua tilausta, tarkista locked‑kenttä. Lukittuja tilauksia ei voi muuttaa suoraan — tee uusi revisio tai käytä oikeaa työnkulkua.
- Yleisimmät osoitevirheet syntyvät partner_id, partner_invoice_id ja partner_shipping_id sekoittamisesta — käytä kaikkia, jos osoitteet eroavat toisistaan.
- Älä ylikirjoita action_confirmia ilman super()‑kutsua — se rikkoo muiden moduulien odotuksia ja vaikeuttaa päivityksiä.
- Lisääntöjen vaatimat pakolliset kentät ilman oletusarvoja aiheuttavat validointivirheitä olemassa oleville tilauksille päivityksissä.
- Unohdetut hinnastot tai väärä currency_id johtavat virheelliseen hinnoitteluun ja laskutukseen — muista asettaa pricelist_id oikein.
Yhteenveto
sales.order on myynnin keskeinen malli Odoossa: tarjousten ja tilausten tallennus, tilan seuranta ja laajennettavuus tekevät siitä avainkomponentin järjestelmässä.
Toiminnallista prosessikartoitusta tekeville ja kehittäjille perusteellinen sales.order‑osaaminen säästää aikaa ja ehkäisee virheitä toteutuksissa.
Tarvitsetko apua Odoo‑käyttöönotossa?
Dasolo tarjoaa apua Odoo‑käyttöönotossa, integroitumisessa ja räätälöinneissä. Meillä on syvä kokemus Odoon tietomalleista ja erityisesti sales.orderin kaltaisista ydinkomponenteista.
Tarvitsetko apua Odoo‑projektiisi, moduulatekniikkaan tai integraatioihin? Ota yhteyttä — autamme mielellämme. Varaa demonstraatio keskustellaksesi projektistasi.