„AN26000001“ pove več kot „S00001“: gre za ponudbo, izvira iz leta 2026 in je prva. Številna podjetja, zlasti tista, ki prehajajo s starejšega sistema na Odoo, želijo svoje številke dokumentov obdržati točno tako. Odoo sam oštevilčuje ponudbe, naročila in dobavnice z lastnimi zaporedji (S00001, WH/OUT/00001, P00001) in račune s predpono dnevnika in letom (INV/2026/00001).
Za to smo napisali modul Document Numbering by Prefix and Year (document_number_prefix_year) za Odoo 19. Na voljo je kot prosta programska oprema pod licenco LGPL-3 na GitHubu:
github.com/Alex0176/odoo-document-number-prefix-year
Najprej iskrena umestitev: Modula pri Biricon IT Services ne uporabljamo. Objavljamo ga, ker je dokončan, dokumentiran in opremljen s testi ter lahko drugim prihrani delo. Kdor ga uporablja, naj prebere razdelke o omejitvah in Testi .
Shema številk
Vsaka številka je sestavljena iz treh delov: predpone za vsako vrsto dokumenta, leta in števca s stalnim številom mest. Predpono, obliko leta (26 ali 2026) in število mest nastavite za vsako podjetje pod Nastavitve → Oštevilčenje dokumentov.
Obravnavane so ponudbe, naročila strank, računi strank in dobropisi, dobavnice, prejemi blaga in nabavna naročila. Predpone na sliki so samo primeri: AN, AU, RE, GU, LI, WE, BE. Kdor pusti predpono prazno, za to vrsto dokumenta obdrži standardno oštevilčenje Odoo. Modul torej ne naredi ničesar, dokler ga ne nastavite.
Kako se številke obnašajo
- Vsako leto znova. Števec se z menjavo leta spet začne pri 1.
- Nadaljevanje po uvoženih številkah. Modul poišče najvišjo obstoječo številko iste predpone in leta, ne glede na to, kako dolga je. Če je iz starega sistema v bazi podatkov
AN26119, se naslednja ponudba glasiAN26000120. To je razlog, zakaj je modul primeren za prehode: stari dokumenti se uvozijo z izvirnimi številkami, novi pa se brezšivno navežejo. - Nova številka naročila ob potrditvi. Potrjena ponudba na željo dobi številko iz zaporedja naročil. Številka ponudbe ostane ohranjena v polju Številka ponudbe pri naročilu in je vidna v obrazcu, seznamu in iskanju.
- Računi ob knjiženju. Računi strank in dobropisi dobijo številko šele ob knjiženju, ne ob ustvarjanju. Izbrisani osnutki zato ne pustijo vrzeli. Leto izvira iz datuma računa: račun z dne 30. 12. 2025, ki je knjižen 2. 1. 2026, se glasi
RE25…. - Vse drugo ostane. Računi dobaviteljev, plačila, knjižbe in proizvodna naročila obdržijo standardna zaporedja Odoo. Obstoječa imena se nikoli ne prepišejo, tudi če modul spet izklopite.
Občutljivi del: dva uporabnika hkrati
Lastna dodelitev številk je videti preprosta: poišči najvišjo številko, prištej ena. Ni pa taka, takoj ko dva uporabnika v istem trenutku ustvarita ponudbo. Oba prebereta „najvišja številka = 0“, oba dodelita AN26000001. Odoo ima za to pri lastnih zaporedjih zaporedja v bazi podatkov. Pri samodejno zgrajeni številki tega ni, za ponudbe in nabavna naročila pa v Odoo poleg tega ni preverjanja enoličnosti imena: dva dokumenta z enako številko se preprosto shranita.
Očitna zaščita je zaklep. Modul za vsako podjetje, predpono in leto zaklene bazo podatkov (PostgreSQL Advisory Lock), zaklep pa velja do konca transakcije. Drugi uporabnik čaka, dokler prvi ne konča. To pa ne zadostuje, kar smo ugotovili s poskusom na kopiji produkcijske baze podatkov:
Odoo deluje z ravnijo izolacije REPEATABLE READ. Stanje baze podatkov, ki ga transakcija vidi, se zamrzne pri njeni prvi poizvedbi. Uporabnik B ima to stanje že, preden A konča. Če B nato čaka na zaklep in ga dobi, z vsem starim stanjem prebere „najvišja številka = 0“ in številko dodeli drugič. Zaklep je uredil vrstni red, ne pa osvežil znanja.
Rešitev je drugo branje prek lastnega, kratkotrajnega dostopa do baze podatkov, ki vidi vse že potrjene vrstice. Zmaga večja od obeh vrednosti. Prvo branje ostane potrebno, saj samo ono pozna številke, ki jih je ista transakcija že dodelila, a jih še ni potrdila, na primer pri uvozu več dokumentov naenkrat.
To smo preverili z dvema transakcijama, pri katerih je druga dokazano pridobila svoje stanje pred commitom prve in nato čakala na zaklep. Brez drugega branja sta obe naročili dobili isto številko, z njim pa številki 1 in 2.
Pomembno za umestitev: Ta poskus je ročno preverjanje. Ni del samodejnih testov, ker sta za to potrebni dve pravi povezavi z bazo podatkov, ki ju testno okolje Odoo (ena sama transakcija na test) ne zagotavlja.
Tehnična izvedba
| Dokument | Točka priklopa |
|---|---|
| Ponudba | sale.order.create, če je ime prazno, / ali New |
| Naročilo stranke | sale.order.action_confirm, pred standardno potrditvijo |
| Račun, dobropis | account.move._set_next_sequence, kliče se pri knjiženju |
| Dobavnica, prejem blaga | stock.picking.create po vrsti operacije |
| Nabavno naročilo | purchase.order.create |
- Števec. Najvišjo številko najde regularni izraz (
^<Stamm>([0-9]{1,15})$, osnova se maskira) za vsako podjetje, vključno z imeni brez podjetja. - Računi.
_set_next_sequencezapiše ime in pokliče_compute_split_sequence, da logika zaporedij Odoo (predpona, številka, prepoznavanje leta za naslednji račun dnevnika) ostane skladna. - Nastavitve. Polja podjetja
document_number_*se zrcalijo vres.config.settings. Nastavitve zavrnejo predpone s presledkom ali števko na koncu. - Prevod. Nemški prevod je vključen.
Namestitev in nastavitev
- Mapo
document_number_prefix_yearpostavite v pot addonov. - Posodobite seznam aplikacij, namestite modul. Pogoj so Prodaja, Nabava, Skladišče in Računovodstvo.
- Pod Nastavitve → Oštevilčenje dokumentov vnesite predpone, obliko leta in število mest.
- Najprej preizkusite na kopiji. Številke dokumenta pozneje ni mogoče samodejno vrniti, pri računih pa je s številko povezana obveznost hrambe in revidiranja.
omejitvah
- Ponudbe se oštevilčijo ob ustvarjanju. Izbrisane ali storno ponudbe pustijo vrzeli. Enako velja za vsako naročilo stranke, ki ga ustvari drug modul: nakupovalne košarice spletne trgovine (
website_sale) so naročila v stanju Ponudba in porabijo vsaka po eno številko. Brez vrzeli so samo računi in dobropisi, ker se oštevilčijo ob knjiženju. - Oblike leta ne spreminjajte med obratovanjem. Z osnovo
AN26modul obstoječoAN2026000001prebere kot števec26000001. Obliko določite pred prvim dokumentom. - Števec največ 15 mest. Daljša zaporedja števk za osnovo se pri iskanju najvišje številke ignorirajo.
- Ni ločenih serij za dnevnik ali skladišče. Števec velja za podjetje, predpono in leto. Več prodajnih dnevnikov si deli števec računov.
- Predpone ne smejo vsebovati presledka in se ne smejo končati s števko, sicer predpone, leta in števca ni več mogoče ločiti.
- Obravnavane so samo navedene vrste dokumentov.
Testi
Modul vsebuje deset samodejnih testov. Preverjajo:
- Ponudba in potrditev: številka ponudbe in naročila, ohranitev številke ponudbe
- nadaljevanje štetja po uvoženi številki (
AN26119→AN26000120) - brez naknadnega preoštevilčenja obstoječih dokumentov
- račun, dobropis in menjava leta glede na datum računa
- nabavno naročilo in dobavnice
- prazna predpona: standardna številka Odoo ostane
- štirimestno leto
- predpona s posebnimi znaki
- več številk v eni transakciji
- zelo dolga zaporedja števk se ignorirajo
Klic:
odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init
Testi tečejo z navadnimi transakcijami. Obnašanje pri hkratnem ustvarjanju dveh uporabnikov ni del njih, preverjeno je bilo ročno na kopiji baze podatkov, kot je opisano zgoraj. Kdor modul uporablja v sistemu z mnogo hkratnimi uporabniki, naj ta poskus ponovi na svoji bazi podatkov.
Pravno opozorilo glede številke računa
Računi morajo po § 11 UStG nositi zaporedno številko, ki je dodeljena enkratno za identifikacijo računa. Modul oštevilči račune ob knjiženju in z lastnim števcem za vsako predpono in leto, kar se s tem ujema. Ali vaša konkretna nastavitev (več dnevnikov, dobropisi z lastno predpono, menjava leta) izpolnjuje zahteve vašega davčnega svetovalca, morate razčistiti z njim. Ta prispevek ni pravno svetovanje.
Pogosta vprašanja
Zakaj preprosto ne prilagodim zaporedij Odoo?
Za račune gre to prek predpone dnevnika. Pri ponudbah, naročilih, dobavnicah in naročilnicah pa ni skupne sheme iz predpone, leta in števca z menjavo leta, števec pa ne pozna uvoženih starih številk. Tu se modul vključi.
Ali se obstoječe oštevilčenje prepiše?
Ne. Modul dodeljuje samo nove številke. Že shranjena imena ostanejo nespremenjena, tudi ob izklopu.
Kako ga spet izklopim?
Izpraznite predpono vrste dokumenta. Potem jo Odoo spet oštevilčuje sam. Tudi odstranitev ne spremeni dodeljenih številk.
Ali ga uporabljate sami?
Ne. Pri nas tečejo standardne številke Odoo. Modul smo preverili s samodejnimi testi in opisanim ročnim poskusom, ne pa v tekočem obratovanju z mnogo uporabniki.
Ali deluje z Odoo 17 ali 18?
Testirali smo ga samo z Odoo 19.0 Community. Za druge različice morda ustreza ali ne, nismo preverili.
Pod katero licenco je?
Pod LGPL-3. Napake in izboljšave so dobrodošle kot issue v repozitoriju GitHub .
Podpora podjetja Biricon IT Services
Oskrbujemo namestitve Odoo za mala in srednja podjetja: od uvedbe prek prilagoditev in migracij do tekočega obratovanja. Če želite pri prehodu ohraniti številke dokumentov, preveriti dodeljevanje številk pod obremenitvijo ali varno prenesti tak modul v svojo produkcijsko instanco, vam z veseljem pomagamo. Druge lastne razvoje: Firmenbuch in preverjanje naslovov za avstrijske stranke, Kompleti izdelkov v ponudbi kot razdelek in Web RBL, črna lista za napadalni promet.
Stanje: 3. november 2026. Različica modula 19.0.1.0.0. Vse številke v primerih in slikah so poljubno izbrane.