„AN26000001“ pasako daugiau nei „S00001“: tai pasiūlymas, jis iš 2026 m. ir tai pirmasis. Daugelis įmonių, ypač pereinančių iš senesnės sistemos į Odoo, nori išsaugoti savo dokumentų numerius būtent tokius. Pati Odoo pasiūlymus, užsakymus ir važtaraščius numeruoja savo sekomis (S00001, WH/OUT/00001, P00001), o sąskaitas – su žurnalo prefiksu ir metais (INV/2026/00001).
Todėl parašėme modulį Document Numbering by Prefix and Year (document_number_prefix_year), skirtą Odoo 19. Jis kaip laisvoji programinė įranga pagal LGPL-3 licenciją prieinamas GitHub:
github.com/Alex0176/odoo-document-number-prefix-year
Iš anksto sąžiningas įvertinimas: mes šio modulio Biricon IT Services nenaudojame. Skelbiame jį todėl, kad jis baigtas, dokumentuotas, turi testus ir gali kitiems sutaupyti darbo. Kas jį naudos, turėtų perskaityti skyrius apie apribojimus ir Testai .
Numeracijos schema
Kiekvienas numeris susideda iš trijų dalių: kiekvienai dokumento rūšiai skirto prefikso, metų ir fiksuoto skaitmenų skaičiaus skaitiklio. Prefiksą, metų formatą (26 arba 2026) ir skaitmenų skaičių nustatote kiekvienai įmonei skiltyje Nustatymai → Dokumentų numeravimas.
Apdorojami pasiūlymai, klientų užsakymai, klientų sąskaitos ir kreditinės sąskaitos, važtaraščiai, prekių priėmimai ir pirkimo užsakymai. Paveiksle nurodyti prefiksai yra tik pavyzdžiai: AN, AU, RE, GU, LI, WE, BE. Jei prefiksą paliekate tuščią, šiai dokumento rūšiai lieka standartinė Odoo numeracija. Taigi modulis nieko nedaro, kol jo nenustatote.
Kaip elgiasi numeriai
- Kiekvienais metais iš naujo. Skaitiklis metų sandūroje vėl prasideda nuo 1.
- Tęsiama po importuotų numerių. Modulis ieško didžiausio esamo to paties prefikso ir metų numerio, nesvarbu, kokio jis ilgio. Jei iš senosios sistemos duomenų bazėje yra
AN26119, kitas pasiūlymas busAN26000120. Todėl modulis tinka perėjimams: seni dokumentai importuojami su originaliais numeriais, o nauji tęsia sklandžiai. - Naujas užsakymo numeris patvirtinant. Patvirtintas pasiūlymas pageidaujant gauna numerį iš užsakymų sekos. Pasiūlymo numeris išlieka užsakymo lauke Pasiūlymo numeris ir yra matomas formoje, sąraše ir paieškoje.
- Sąskaitos įrašant. Klientų sąskaitos ir kreditinės sąskaitos numerį gauna tik įrašant (užregistruojant), o ne kuriant. Todėl ištrinti juodraščiai nepalieka spragos. Metai paimami iš sąskaitos datos: 2025 m. gruodžio 30 d. sąskaita, užregistruota 2026 m. sausio 2 d., vadinasi
RE25…. - Visa kita lieka. Tiekėjų sąskaitos, mokėjimai, buhalterijos įrašai ir gamybos užsakymai išlaiko standartines Odoo sekas. Esami pavadinimai niekada neperrašomi, net jei modulį vėl išjungiate.
Jautri dalis: du naudotojai vienu metu
Nuosavas numerių priskyrimas atrodo paprastas: surasti didžiausią numerį ir pridėti vienetą. Taip nebėra, kai du naudotojai tuo pačiu metu sukuria pasiūlymą. Abu perskaito „didžiausias numeris = 0“, abu priskiria AN26000001. Savo sekoms Odoo tam turi duomenų bazės sekas. Pačių sukurtam numeriui jų nėra, o pasiūlymams ir pirkimo užsakymams Odoo dar ir netikrina pavadinimo unikalumo: du dokumentai su tuo pačiu numeriu tiesiog išsaugomi.
Akivaizdi apsauga yra užraktas. Modulis kiekvienai įmonei, prefiksui ir metams paima duomenų bazės užraktą (PostgreSQL Advisory Lock), kuris laikosi iki sandorio pabaigos. Antrasis naudotojas laukia, kol pirmasis baigs. Bet to nepakanka, ir tai radome bandydami su produkcinės duomenų bazės kopija:
Odoo dirba su izoliacijos lygiu REPEATABLE READ. Duomenų bazės būsena, kurią mato sandoris, užšaldoma jo pirmosios užklausos metu. Naudotojas B šią būseną turi jau prieš A baigiant. Jei B vėliau laukia užrakto ir jį gauna, jis su sena būsena perskaito „didžiausias numeris = 0“ ir numerį priskiria antrą kartą. Užraktas sutvarkė eilę, bet neatnaujino žinių.
Sprendimas yra antras skaitymas per atskirą, trumpalaikę duomenų bazės prieigą, kuri mato visas jau patvirtintas eilutes. Laimi didesnė iš dviejų reikšmių. Pirmas skaitymas lieka būtinas, nes tik jis žino numerius, kuriuos tas pats sandoris jau priskyrė, bet dar nepatvirtino, pavyzdžiui, importuojant kelis dokumentus vienu ypu.
Tai patikrinome su dviem sandoriais, kurių antrasis, kaip įrodyta, savo būseną gavo prieš pirmojo patvirtinimą (commit), o paskui laukė užrakto. Be antrojo skaitymo abu užsakymai gavo tą patį numerį, su juo – numerius 1 ir 2.
Svarbu vertinant: šis bandymas yra rankinis patikrinimas. Jis nėra automatinių testų dalis, nes tam reikia dviejų tikrų duomenų bazės ryšių, kurių Odoo testavimo aplinka (vienas sandoris vienam testui) neteikia.
Techninis įgyvendinimas
| Dokumentas | Prijungimo taškas |
|---|---|
| Pasiūlymas | sale.order.create, kai pavadinimas tuščias, / arba New |
| Klientų užsakymas | sale.order.action_confirm, prieš standartinį patvirtinimą |
| Sąskaita, kreditinė sąskaita | account.move._set_next_sequence, iškviečiama įrašant |
| Važtaraštis, prekių priėmimas | stock.picking.create pagal operacijos tipą |
| Pirkimo užsakymas | purchase.order.create |
- Skaitiklis. Didžiausią numerį randa reguliarioji išraiška (
^<Stamm>([0-9]{1,15})$, kamienas maskuojamas) kiekvienai įmonei, įskaitant pavadinimus be įmonės. - Sąskaitos.
_set_next_sequenceįrašo pavadinimą ir iškviečia_compute_split_sequence, kad Odoo sekų logika (prefiksas, numeris, metų atpažinimas kitai žurnalo sąskaitai) išliktų nuosekli. - Nustatymai. Įmonės laukai
document_number_*atspindimires.config.settings. Nustatymai atmeta prefiksus su tarpu arba skaitmeniu gale. - Vertimas. Vokiečių kalbos vertimas įtrauktas.
Diegimas ir nustatymas
- Aplanką
document_number_prefix_yearįdėti į priedų (addons) kelią. - Atnaujinti programų sąrašą, įdiegti modulį. Reikalingos programos Pardavimai, Pirkimai, Sandėlis ir Apskaita.
- Skiltyje Nustatymai → Dokumentų numeravimas įvesti prefiksus, metų formatą ir skaitmenų skaičių.
- Pirmiausia išbandykite su kopija. Dokumento numerio vėliau automatiškai atsukti atgal negalima, o sąskaitų numeriams taikoma saugojimo ir patikros prievolė.
apribojimus
- Pasiūlymai numeruojami kuriant. Ištrinti ar atšaukti pasiūlymai palieka spragas. Tas pats galioja kiekvienam klientų užsakymui, kurį sukuria kitas modulis: internetinės parduotuvės krepšeliai (
website_sale) yra užsakymai su būsena Pasiūlymas ir sunaudoja po vieną numerį. Be spragų yra tik sąskaitos ir kreditinės sąskaitos, nes jos numeruojamos įrašant. - Metų formato nekeiskite veikiant sistemai. Su kamienu
AN26modulis esamąAN2026000001nuskaito kaip skaitiklį26000001. Formatą nustatykite prieš pirmąjį dokumentą. - Skaitiklis daugiausia 15 skaitmenų. Ilgesnės skaitmenų sekos po kamieno ieškant didžiausio numerio ignoruojamos.
- Jokių atskirų serijų pagal žurnalą ar sandėlį. Skaitiklis galioja kiekvienai įmonei, prefiksui ir metams. Keli pardavimų žurnalai dalijasi sąskaitų skaitikliu.
- Prefiksuose negali būti tarpo ir jie negali baigtis skaitmeniu, kitaip prefikso, metų ir skaitiklio nebegalima atskirti.
- Apdorojamos tik nurodytos dokumentų rūšys.
Testai
Modulis turi dešimt automatinių testų. Jie tikrina:
- Pasiūlymas ir patvirtinimas: pasiūlymo ir užsakymo numeris, pasiūlymo numerio išsaugojimas
- Skaičiavimas toliau po importuoto numerio (
AN26119→AN26000120) - esamų dokumentų nenumeruoti iš naujo
- Sąskaita, kreditinė sąskaita ir metų kaita pagal sąskaitos datą
- Pirkimo užsakymas ir važtaraščiai
- tuščias prefiksas: išlieka standartinis Odoo numeris
- keturženkliai metai
- Prefiksas su specialiaisiais simboliais
- keli numeriai viename sandoryje
- labai ilgos skaitmenų sekos ignoruojamos
Paleidimas:
odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init
Testai vykdomi su įprastais sandoriais. Elgsena, kai du naudotojai kuria vienu metu, į juos neįeina, ji buvo patikrinta rankiniu būdu su duomenų bazės kopija, kaip aprašyta aukščiau. Kas modulį naudoja sistemoje su daug vienu metu dirbančių naudotojų, šį bandymą turėtų pakartoti savo duomenų bazėje.
Teisinė pastaba dėl sąskaitos numerio
Sąskaitos pagal UStG 11 § turi turėti nuoseklų numerį, kuris sąskaitai identifikuoti suteikiamas vieną kartą. Modulis sąskaitas numeruoja įrašant ir su atskiru skaitikliu kiekvienam prefiksui ir metams, o tai tinka. Ar jūsų konkretus nustatymas (keli žurnalai, kreditinės sąskaitos su savo prefiksu, metų kaita) atitinka jūsų mokesčių konsultanto reikalavimus, turite išsiaiškinti su juo. Šis straipsnis nėra teisinė konsultacija.
Dažniausiai užduodami klausimai
Kodėl tiesiog nepakeitus Odoo sekų?
Sąskaitoms tai įmanoma per žurnalo prefiksą. Tačiau pasiūlymams, pardavimo užsakymams, važtaraščiams ir pirkimo užsakymams nėra bendros prefikso, metų ir skaitiklio schemos su metų kaita, o skaitiklis nežino importuotų senų numerių. Čia modulis ir įsikiša.
Ar esama numeracija perrašoma?
Ne. Modulis priskiria tik naujus numerius. Jau išsaugoti pavadinimai nesikeičia, net išjungus.
Kaip jį vėl išjungti?
Ištuštinkite dokumento rūšies prefiksą. Tuomet Odoo vėl numeruoja pati. Net pašalinant modulį jau priskirti numeriai nesikeičia.
Ar patys jį naudojate?
Ne. Pas mus veikia standartiniai Odoo numeriai. Modulį patikrinome su automatiniais testais ir aprašytu rankiniu bandymu, bet ne veikiančioje sistemoje su daug naudotojų.
Ar veikia su Odoo 17 ar 18?
Išbandėme tik su Odoo 19.0 Community. Kitoms versijoms gali tikti arba ne, jų netikrinome.
Pagal kokią licenciją platinamas?
Pagal LGPL-3. Apie klaidas ir patobulinimus laukiame pranešimų užduočių (issue) pavidalu GitHub saugykloje .
Biricon IT Services palaikymas
Prižiūrime Odoo diegimus mažoms ir vidutinėms įmonėms: nuo įdiegimo, pritaikymų ir migracijų iki nuolatinio veikimo. Jei norite pereidami į Odoo išsaugoti savo dokumentų numerius, patikrinti numerių priskyrimą esant apkrovai arba saugiai perkelti tokį modulį į savo produkcinę sistemą, mielai padėsime. Kiti nuosavi kūriniai: Įmonių registras ir adresų patikra Austrijos klientams, Produktų rinkiniai pasiūlyme kaip skyrius ir Web RBL, atakų srauto juodasis sąrašas.
Būklė: 2026 m. lapkričio 3 d. Modulio versija 19.0.1.0.0. Visi numeriai pavyzdžiuose ir paveiksluose parinkti laisvai.