Siirry sisältöön

Odoo 19 -asiakirjanumerot etuliitteestä, vuodesta ja laskurista – moduuli document_number_prefix_year ja samanaikaisen luomisen ansa

3. marraskuuta 2026 | Odoo 19 Community | Oma kehitys
3. marraskuuta 2026 kirjoittanut
Odoo 19 -asiakirjanumerot etuliitteestä, vuodesta ja laskurista – moduuli document_number_prefix_year ja samanaikaisen luomisen ansa

Odoo 19 -moduuli document_number_prefix_year: asiakirjanumerot etuliitteestä, vuodesta ja laskurista

”AN26000001” kertoo enemmän kuin ”S00001”: se on tarjous, se on vuodelta 2026, ja se on ensimmäinen. Monet yritykset, etenkin ne, jotka siirtyvät vanhasta järjestelmästä Odooon, haluavat säilyttää asiakirjanumeronsa juuri tällaisina. Odoo itse numeroi tarjoukset, tilaukset ja lähetteet omilla sarjoillaan (S00001, WH/OUT/00001, P00001) ja laskut päiväkirjan etuliitteellä ja vuodella (INV/2026/00001).

Kirjoitimme tätä varten moduulin Document Numbering by Prefix and Year (document_number_prefix_year) Odoo 19:lle. Se on saatavilla GitHubissa vapaana ohjelmistona LGPL-3-lisenssillä:

github.com/Alex0176/odoo-document-number-prefix-year

Ensin rehellinen arvio: Emme käytä moduulia Biricon IT Services -yrityksessä. Julkaisemme sen, koska se on valmis, dokumentoitu ja testein varustettu ja voi säästää muiden työtä. Käyttäjän kannattaa lukea osio Rajoitukset ja Testit .

Numerointimalli

Jokainen numero koostuu kolmesta osasta: asiakirjalajikohtaisesta etuliitteestä, vuodesta ja kiinteän pituisesta laskurista. Etuliitteen, vuoden muodon (26 tai 2026) ja numeroiden määrän asetatte yrityskohtaisesti kohdassa Asetukset → Asiakirjojen numerointi.

Asiakirjanumeron AN26000001 rakenne etuliitteestä, vuodesta ja laskurista sekä asiakirjalajien taulukko

Käsiteltävät ovat tarjoukset, asiakastilaukset, asiakaslaskut ja hyvityslaskut, lähetteet, tavaranvastaanotot ja ostotilaukset. Kuvan etuliitteet ovat vain esimerkkejä: AN, AU, RE, GU, LI, WE, BE. Jos jätätte etuliitteen tyhjäksi, kyseinen asiakirjalaji säilyttää Odoon vakionumeroinnin. Moduuli ei siis tee mitään, ennen kuin määritätte sen.

Miten numerot käyttäytyvät

  • Joka vuosi alusta. Laskuri alkaa vuodenvaihteessa taas luvusta 1.
  • Jatko tuotujen numeroiden jälkeen. Moduuli etsii saman etuliitteen ja vuoden suurimman olemassa olevan numeron pituudesta riippumatta. Jos tietokannassa on vanhasta järjestelmästä AN26119, seuraava tarjous on AN26000120. Tästä syystä moduuli soveltuu siirtymiin: vanhat asiakirjat tuodaan alkuperäisine numeroineen, ja uudet asiakirjat jatkavat saumattomasti.
  • Uusi tilausnumero vahvistettaessa. Vahvistettu tarjous saa halutessa numeron tilaussarjasta. Tarjouksen numero säilyy tilauksen kentässä Tarjousnumero ja näkyy lomakkeella, luettelossa ja haussa.
  • Laskut kirjattaessa. Asiakaslaskut ja hyvityslaskut saavat numeronsa vasta kirjattaessa, eivät luotaessa. Poistetuista luonnoksista ei siksi jää aukkoa. Vuosi otetaan laskun päivämäärästä: lasku, jonka päivämäärä on 30.12.2025 ja joka kirjataan 2.1.2026, saa numeron RE25….
  • Kaikki muu säilyy. Toimittajalaskut, maksut, kirjaukset ja valmistustilaukset säilyttävät Odoon vakiosarjat. Olemassa olevia nimiä ei koskaan kirjoiteta uudelleen, ei silloinkaan, kun moduuli kytketään pois päältä.

Hankala kohta: kaksi käyttäjää samanaikaisesti

Oma numerointi näyttää yksinkertaiselta: etsitään suurin numero ja lisätään yksi. Se ei ole sitä, heti kun kaksi käyttäjää luo tarjouksen samalla hetkellä. Molemmat lukevat ”suurin numero = 0”, molemmat antavat numeron AN26000001. Odoolla on omia sarjojaan varten tietokannan sekvenssit. Itse rakennetulta numerolta ne puuttuvat, ja tarjouksille ja ostotilauksille Odoossa ei lisäksi ole nimen yksilöllisyystarkistusta: kaksi samannumeroista asiakirjaa tallennetaan sellaisenaan.

Ilmeinen suoja on lukitus. Moduuli ottaa yritystä, etuliitettä ja vuotta kohti tietokannan lukituksen (PostgreSQL Advisory Lock), joka pysyy voimassa transaktion loppuun asti. Toinen käyttäjä odottaa, kunnes ensimmäinen on valmis. Se ei kuitenkaan riitä, ja havaitsimme sen kokeella tuotantotietokannan kopiolla:

Kahden käyttäjän aikajana: ilman toista lukukertaa molemmat antavat saman numeron, toisen lukukerran kanssa toinen saa seuraavan numeron

Odoo käyttää eristystasoa REPEATABLE READ. Tietokannan tila, jonka transaktio näkee, jäädytetään sen ensimmäisen kyselyn yhteydessä. Käyttäjällä B on tämä tila jo ennen kuin A on valmis. Jos B odottaa sen jälkeen lukitusta ja saa sen, hän lukee vanhalla tilallaan ”suurin numero = 0” ja antaa numeron toisen kerran. Lukitus järjesti järjestyksen, mutta ei päivittänyt tietoa.

Ratkaisu on toinen lukukerta omalla, lyhytikäisellä tietokantayhteydellä, joka näkee kaikki jo vahvistetut rivit. Suurempi kahdesta arvosta voittaa. Ensimmäinen lukukerta on silti tarpeen, koska vain se tuntee numerot, jotka sama transaktio on jo antanut mutta ei ole vielä vahvistanut, esimerkiksi kun useita asiakirjoja tuodaan kerralla.

Testasimme tämän kahdella transaktiolla, joista toinen todistettavasti haki tilansa ennen ensimmäisen commitia ja odotti sitten lukitusta. Ilman toista lukukertaa molemmat tilaukset saivat saman numeron, sen kanssa numerot 1 ja 2.

Tärkeää arvioinnin kannalta: Tämä koe on käsin tehty tarkistus. Se ei kuulu automaattisiin testeihin, koska se vaatii kaksi oikeaa tietokantayhteyttä, joita Odoon testiympäristö (yksi transaktio testiä kohti) ei tarjoa.

Tekninen toteutus

AsiakirjaLiityntäkohta
Tarjoussale.order.create, kun nimi on tyhjä, / tai New
Asiakastilaussale.order.action_confirm, ennen vakiovahvistusta
Lasku, hyvityslaskuaccount.move._set_next_sequence, kutsutaan kirjattaessa
Lähete, tavaranvastaanottostock.picking.create toimintotyypin mukaan
Ostotilauspurchase.order.create
  • Laskuri. Suurimman numeron löytää säännöllinen lauseke (^<Stamm>([0-9]{1,15})$, runko suojataan) yritystä kohti, myös ilman yritystä olevat nimet mukaan lukien.
  • Laskut. _set_next_sequence kirjoittaa nimen ja kutsuu metodia _compute_split_sequence, jotta Odoon sekvenssilogiikka (etuliite, numero, vuoden tunnistus päiväkirjan seuraavaa laskua varten) pysyy yhtenäisenä.
  • Asetukset. Yrityksen kentät document_number_* peilataan malliin res.config.settings. Asetukset hylkäävät etuliitteet, joissa on välilyönti tai numero lopussa.
  • Käännös. Saksankielinen käännös on mukana.

Asennus ja käyttöönotto

  1. Asettakaa kansio document_number_prefix_year lisäosien polkuun.
  2. Päivittäkää sovellusluettelo, asentakaa moduuli. Edellytyksenä ovat Myynti, Osto, Varasto ja Kirjanpito.
  3. Syöttäkää kohdassa Asetukset → Asiakirjojen numerointi etuliitteet, vuoden muoto ja numeroiden määrä.
  4. Kokeilkaa ensin kopiolla. Asiakirjan numeroa ei voi myöhemmin automaattisesti perua, ja laskuilla numeroon liittyy säilytys- ja tarkastusvelvollisuus.

Rajoitukset

Moduulin kuusi rajoitusta: ostoskorit, vuoden muoto, yksi sarja yritystä kohti, etuliitesäännöt, vähän testejä, vain mainitut asiakirjat

  • Tarjoukset numeroidaan luotaessa. Poistetut tai peruutetut tarjoukset jättävät aukkoja. Sama koskee jokaista asiakastilausta, jonka jokin toinen moduuli luo: verkkokaupan ostoskorit (website_sale) ovat tilauksia tilassa Tarjous ja kuluttavat kukin yhden numeron. Aukottomia ovat vain laskut ja hyvityslaskut, koska ne numeroidaan kirjattaessa.
  • Älkää muuttako vuoden muotoa käytön aikana. Rungolla AN26 moduuli lukee olemassa olevan AN2026000001:n laskurina 26000001. Määrittäkää muoto ennen ensimmäistä asiakirjaa.
  • Laskuri enintään 15 numeroa. Rungon jälkeen tulevat pidemmät numerojonot ohitetaan etsittäessä suurinta numeroa.
  • Ei erillisiä sarjoja päiväkirjaa tai varastoa kohti. Laskuri on voimassa yritystä, etuliitettä ja vuotta kohti. Useat myyntipäiväkirjat jakavat laskulaskurin.
  • Etuliitteissä ei saa olla välilyöntiä, eivätkä ne saa päättyä numeroon, muuten etuliitettä, vuotta ja laskuria ei voi enää erottaa toisistaan.
  • Vain mainitut asiakirjalajit käsitellään.

Testit

Moduulin mukana tulee kymmenen automaattista testiä. Ne tarkistavat:

  • Tarjous ja vahvistus: tarjouksen ja tilauksen numero, tarjousnumeron säilyminen
  • Jatkaminen tuodun numeron jälkeen (AN26119 → AN26000120)
  • olemassa olevien asiakirjojen uudelleennumerointia ei tehdä jälkikäteen
  • Lasku, hyvityslasku ja vuodenvaihde laskun päivämäärän mukaan
  • Ostotilaus ja lähetteet
  • tyhjä etuliite: Odoon vakionumero säilyy
  • nelinumeroinen vuosi
  • Erikoismerkkejä sisältävä etuliite
  • useita numeroita yhdessä transaktiossa
  • hyvin pitkät numerojonot ohitetaan

Kutsu:

odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init

Testit ajetaan tavallisilla transaktioilla. Toimintaa kahden käyttäjän samanaikaisessa luomisessa ei testata niissä, vaan se tarkistettiin yllä kuvatulla tavalla käsin tietokannan kopiolla. Jos moduulia käytetään järjestelmässä, jossa on paljon samanaikaisia käyttäjiä, tämä koe kannattaa toistaa omalla tietokannalla.

Oikeudellinen huomautus laskun numerosta

Laskuilla on oltava UStG:n 11 §:n mukaan juokseva numero, joka annetaan laskun yksilöimiseksi vain kerran. Moduuli numeroi laskut kirjattaessa ja omalla laskurilla etuliitettä ja vuotta kohti, mikä sopii tähän. Täyttääkö konkreettinen asetuksenne (useita päiväkirjoja, omalla etuliitteellä varustetut hyvityslaskut, vuodenvaihde) veroneuvojanne vaatimukset, teidän on selvitettävä hänen kanssaan. Tämä artikkeli ei ole oikeudellista neuvontaa.

Usein kysytyt kysymykset

Miksei Odoon sarjoja vain mukauteta?

Laskuille se onnistuu päiväkirjan etuliitteellä. Tarjouksille, tilauksille, lähetteille ja ostotilauksille ei kuitenkaan ole yhteistä mallia, jossa on etuliite, vuosi ja laskuri vuodenvaihteen kera, eikä laskuri tunne tuotuja vanhoja numeroita. Siihen moduuli tarttuu.

Ylikirjoitetaanko nykyinen numerointi?

Ei. Moduuli antaa vain uusia numeroita. Jo tallennetut nimet säilyvät muuttumattomina, myös käytöstä poistettaessa.

Miten sen saa pois päältä?

Tyhjentäkää asiakirjalajin etuliite. Silloin Odoo numeroi sen taas itse. Myöskään asennuksen poistaminen ei muuta annettuja numeroita.

Käyttekö sitä itse?

Emme. Meillä toimivat Odoon vakionumerot. Olemme testanneet moduulin automaattisilla testeillä ja kuvatulla käsikokeella, mutta emme käynnissä olevassa toiminnassa, jossa on paljon käyttäjiä.

Toimiiko se Odoo 17:llä tai 18:lla?

Olemme testanneet sen vain Odoo 19.0 Communityllä. Muille versioille se voi sopia tai olla sopimatta, emme ole tarkistaneet.

Millä lisenssillä se julkaistaan?

LGPL-3-lisenssillä. Virheet ja parannukset ovat tervetulleita issueina GitHub-arkistossa .

Biricon IT Servicesin tuki

Huollamme Odoo-asennuksia pienille ja keskisuurille yrityksille: käyttöönotosta mukautuksiin ja migraatioihin sekä jatkuvaan käyttöön. Jos haluatte säilyttää asiakirjanumeronne siirtymässä, tarkistuttaa numeroinnin kuormituksessa tai viedä tämän kaltaisen moduulin turvallisesti tuotantoinstanssiinne, autamme mielellämme. Muita omia kehityshankkeita: Kaupparekisteri ja osoitetarkistus itävaltalaisille asiakkaille, Tuotesetit tarjouksessa osiona ja Web RBL, hyökkäysliikenteen estolista.

Ottakaa yhteyttä nyt

Tilanne: 3. marraskuuta 2026. Moduulin versio 19.0.1.0.0. Kaikki esimerkkien ja kuvien numerot on valittu vapaasti.