„AN26000001” pasaka vairāk nekā „S00001”: tas ir piedāvājums, tas ir no 2026. gada, un tas ir pirmais. Daudzi uzņēmumi, galvenokārt tie, kas no vecākas sistēmas pāriet uz Odoo, vēlas saglabāt savus dokumentu numurus tieši tādus. Pats Odoo numurē piedāvājumus, pasūtījumus un pavadzīmes ar savām secībām (S00001, WH/OUT/00001, P00001) un rēķinus ar žurnāla prefiksu un gadu (INV/2026/00001).
Tāpēc mēs uzrakstījām moduli Document Numbering by Prefix and Year (document_number_prefix_year) Odoo 19. Tas ir pieejams kā brīvā programmatūra ar LGPL-3 licenci GitHub:
github.com/Alex0176/odoo-document-number-prefix-year
Vispirms godīgs novērtējums: mēs moduli Biricon IT Services neizmantojam. Mēs to publicējam, jo tas ir gatavs, dokumentēts un apgādāts ar testiem un var citiem ietaupīt darbu. Tiem, kas to izmanto, ieteicams izlasīt sadaļu Ierobežojumi un Testi .
Numuru shēma
Katrs numurs sastāv no trīs daļām: prefiksa katram dokumenta veidam, gada un skaitītāja ar fiksētu ciparu skaitu. Prefiksu, gada formātu (26 vai 2026) un ciparu skaitu katram uzņēmumam iestatāt sadaļā Iestatījumi → Dokumentu numerācija.
Tiek apstrādāti piedāvājumi, klientu pasūtījumi, klientu rēķini un kredītrēķini, pavadzīmes, preču pieņemšanas un iepirkuma pasūtījumi. Attēlā redzamie prefiksi ir tikai piemēri: AN, AU, RE, GU, LI, WE, BE. Kas prefiksu atstāj tukšu, šim dokumenta veidam saglabā Odoo standarta numerāciju. Tātad modulis neko nedara, kamēr Jūs to neiestatāt.
Kā numuri uzvedas
- Katru gadu no jauna. Skaitītājs gadu mijā atkal sākas ar 1.
- Turpināšana pēc importētajiem numuriem. Modulis meklē augstāko esošo numuru ar to pašu prefiksu un gadu, neatkarīgi no tā garuma. Ja datubāzē no vecās sistēmas ir
AN26119, nākamais piedāvājums būsAN26000120. Tas ir iemesls, kāpēc modulis noder pārejai: vecie dokumenti tiek importēti ar oriģinālajiem numuriem, un jaunie dokumenti pievienojas bez pārtraukuma. - Jauns pasūtījuma numurs apstiprinot. Apstiprināts piedāvājums pēc vēlēšanās saņem numuru no pasūtījumu secības. Piedāvājuma numurs paliek laukā Piedāvājuma numurs pasūtījumā un ir redzams formā, sarakstā un meklēšanā.
- Rēķini grāmatojot. Klientu rēķini un kredītrēķini savu numuru saņem tikai grāmatojot, nevis izveidojot. Izdzēsti melnraksti tāpēc neatstāj robu. Gads tiek ņemts no rēķina datuma: rēķins no 30.12.2025, kas tiek grāmatots 2.1.2026, saucas
RE25…. - Viss pārējais paliek. Piegādātāju rēķini, maksājumi, grāmatojumi un ražošanas pasūtījumi saglabā Odoo standarta secības. Esošie nosaukumi netiek pārrakstīti nekad, arī tad, ja moduli atkal izslēdzat.
Jutīgā daļa: divi lietotāji vienlaikus
Sava numuru piešķiršana izskatās vienkārša: atrast augstāko numuru un pieskaitīt vienu. Tā tas nav, tiklīdz divi lietotāji vienā brīdī izveido piedāvājumu. Abi nolasa „augstākais numurs = 0”, abi piešķir AN26000001. Odoo savām secībām šim nolūkam izmanto datubāzes sekvences. Pašbūvētam numuram tā trūkst, un piedāvājumiem un iepirkuma pasūtījumiem Odoo turklāt nav nosaukuma unikalitātes pārbaudes: divi dokumenti ar vienādu numuru tiek vienkārši saglabāti.
Acīmredzama aizsardzība ir slēdzene. Modulis katram uzņēmumam, prefiksam un gadam ņem datubāzes slēdzeni (PostgreSQL Advisory Lock), kas turas līdz darījuma beigām. Otrais lietotājs gaida, kamēr pirmais ir pabeidzis. Taču ar to nepietiek, un mēs to atklājām ar mēģinājumu uz produkcijas datubāzes kopijas:
Odoo darbojas ar izolācijas līmeni REPEATABLE READ. Datubāzes stāvoklis, ko darījums redz, tiek iesaldēts pie tā pirmā vaicājuma. Lietotājam B šis stāvoklis jau ir, pirms A ir pabeidzis. Ja B pēc tam gaida slēdzeni un to saņem, viņš ar savu veco stāvokli nolasa „augstākais numurs = 0” un piešķir numuru otro reizi. Slēdzene ir noregulējusi secību, bet neatjauninājusi zināšanas.
Risinājums ir otrā lasīšana, izmantojot atsevišķu, īslaicīgu datubāzes piekļuvi, kas redz visas jau apstiprinātās rindas. Uzvar lielākā no abām vērtībām. Pirmā lasīšana joprojām ir nepieciešama, jo tikai tā zina numurus, ko tas pats darījums jau ir piešķīris, bet vēl nav apstiprinājis, piemēram, importējot vairākus dokumentus vienā piegājienā.
Mēs to pārbaudījām ar diviem darījumiem, kuros otrais pierādāmi ieguva savu stāvokli pirms pirmā commit un pēc tam gaidīja slēdzeni. Bez otrās lasīšanas abi pasūtījumi saņēma vienu un to pašu numuru, ar to – numurus 1 un 2.
Svarīgi vērtējumam: šis mēģinājums ir manuāla pārbaude. Tas nav automātisko testu daļa, jo tam vajadzīgi divi īsti datubāzes savienojumi, ko Odoo testu vide (viens darījums katram testam) nenodrošina.
Tehniskais risinājums
| Dokuments | Pievienošanas punkts |
|---|---|
| Piedāvājums | sale.order.create, ja nosaukums ir tukšs, / vai New |
| Klienta pasūtījums | sale.order.action_confirm, pirms standarta apstiprināšanas |
| Rēķins, kredītrēķins | account.move._set_next_sequence, tiek izsaukts grāmatojot |
| Pavadzīme, preču pieņemšana | stock.picking.create pēc darbības veida |
| Iepirkuma pasūtījums | purchase.order.create |
- Skaitītājs. Augstāko numuru atrod regulārā izteiksme (
^<Stamm>([0-9]{1,15})$, saknes daļa tiek maskēta) katram uzņēmumam, ieskaitot nosaukumus bez uzņēmuma. - Rēķini.
_set_next_sequenceieraksta nosaukumu un izsauc_compute_split_sequence, lai Odoo secības loģika (prefikss, numurs, gada noteikšana žurnāla nākamajam rēķinam) paliktu saskanīga. - Iestatījumi. Uzņēmuma lauki
document_number_*tiek atspoguļotires.config.settings. Iestatījumi noraida prefiksus ar atstarpi vai ciparu beigās. - Tulkojums. Tulkojums vācu valodā ir iekļauts.
Uzstādīšana un iestatīšana
- Mapi
document_number_prefix_yearievietot addons ceļā. - Atjaunināt lietotņu sarakstu, uzstādīt moduli. Priekšnoteikumi ir Pārdošana, Iepirkums, Noliktava un Grāmatvedība.
- Sadaļā Iestatījumi → Dokumentu numerācija ievadīt prefiksus, gada formātu un ciparu skaitu.
- Vispirms izmēģiniet kopijā. Dokumenta numuru vēlāk nevar automātiski atcelt, un rēķiniem pie numura ir piesaistīts glabāšanas un pārbaudes pienākums.
Ierobežojumi
- Piedāvājumi tiek numurēti izveidojot. Izdzēsti vai atcelti piedāvājumi atstāj robus. Tas pats attiecas uz katru klienta pasūtījumu, ko izveido cits modulis: tīmekļa veikala groziņi (
website_sale) ir pasūtījumi ar statusu Piedāvājums un patērē pa vienam numuram. Bez robiem ir tikai rēķini un kredītrēķini, jo tie tiek numurēti grāmatojot. - Gada formātu nemainiet ekspluatācijas laikā. Ar sakni
AN26modulis esošoAN2026000001nolasa kā skaitītāju26000001. Formātu nosakiet pirms pirmā dokumenta. - Skaitītājs ne vairāk kā 15 cipari. Garākas ciparu virknes aiz saknes tiek ignorētas, meklējot augstāko numuru.
- Nav atsevišķu sēriju katram žurnālam vai noliktavai. Skaitītājs attiecas uz uzņēmumu, prefiksu un gadu. Vairāki pārdošanas žurnāli dala rēķinu skaitītāju.
- Prefiksi nedrīkst saturēt atstarpi un nedrīkst beigties ar ciparu, citādi prefiksu, gadu un skaitītāju vairs nevar nošķirt.
- Tiek apstrādāti tikai minētie dokumentu veidi.
Testi
Modulis nāk ar desmit automātiskiem testiem. Tie pārbauda:
- Piedāvājums un apstiprināšana: piedāvājuma un pasūtījuma numurs, piedāvājuma numura saglabāšana
- Skaitīšanas turpināšana pēc importēta numura (
AN26119→AN26000120) - esošo dokumentu atpakaļejoša pārnumurēšana nenotiek
- Rēķins, kredītrēķins un gadu maiņa pēc rēķina datuma
- Iepirkuma pasūtījums un pavadzīmes
- tukšs prefikss: Odoo standarta numurs paliek
- četrciparu gads
- Prefikss ar speciālajām rakstzīmēm
- vairāki numuri vienā darījumā
- ļoti garas ciparu virknes tiek ignorētas
Izsaukums:
odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init
Testi darbojas ar parastiem darījumiem. Uzvedība, divi lietotāji vienlaikus izveidojot, tajos neietilpst, tā tika pārbaudīta ar roku datubāzes kopijā, kā aprakstīts iepriekš. Kas moduli izmanto sistēmā ar daudziem vienlaicīgiem lietotājiem, lai šo mēģinājumu atkārto savā datubāzē.
Juridiska norāde par rēķina numuru
Rēķiniem saskaņā ar § 11 UStG jāsatur secīgs numurs, kas rēķina identificēšanai tiek piešķirts vienreiz. Modulis rēķinus numurē grāmatojot un ar savu skaitītāju katram prefiksam un gadam, kas tam atbilst. Vai Jūsu konkrētais iestatījums (vairāki žurnāli, kredītrēķini ar savu prefiksu, gadu maiņa) atbilst Jūsu nodokļu konsultanta prasībām, Jums jāizskaidro ar viņu. Šis raksts nav juridiska konsultācija.
Biežāk uzdotie jautājumi
Kāpēc vienkārši nepielāgot Odoo secības?
Rēķiniem tas iespējams ar žurnāla prefiksu. Taču piedāvājumiem, pasūtījumiem, pavadzīmēm un iepirkuma pasūtījumiem nav kopīgas shēmas no prefiksa, gada un skaitītāja ar gadu maiņu, un skaitītājs nepazīst importētos vecos numurus. Tur modulis ir pielietojams.
Vai esošā numerācija tiek pārrakstīta?
Nē. Modulis piešķir tikai jaunus numurus. Jau saglabātie nosaukumi paliek nemainīti, arī izslēdzot.
Kā to atkal izslēgt?
Iztukšojiet dokumenta veida prefiksu. Tad Odoo to atkal numurē pats. Arī atinstalēšana piešķirtos numurus nemaina.
Vai paši to izmantojat?
Nē. Pie mums darbojas Odoo standarta numuri. Mēs moduli esam pārbaudījuši ar automātiskajiem testiem un aprakstīto manuālo mēģinājumu, bet ne ekspluatācijā ar daudziem lietotājiem.
Vai tas darbojas ar Odoo 17 vai 18?
Mēs to esam pārbaudījuši tikai ar Odoo 19.0 Community. Citām versijām tas var derēt vai nederēt, mēs to neesam pārbaudījuši.
Kādai licencei tas pakļauts?
LGPL-3. Kļūdu ziņojumi un uzlabojumi ir laipni gaidīti kā issue GitHub repozitorijā .
Biricon IT Services atbalsts
Mēs apkalpojam Odoo instalācijas mazajiem un vidējiem uzņēmumiem: no ieviešanas, pielāgojumiem un migrācijām līdz pastāvīgai darbībai. Ja pārejot vēlaties saglabāt savus dokumentu numurus, numuru piešķiršanu pārbaudīt slodzes apstākļos vai droši ievest tādu moduli kā šis savā produkcijas instancē, mēs labprāt palīdzēsim. Citas pašu izstrādes: Uzņēmumu reģistrs un adrešu pārbaude Austrijas klientiem, Produktu komplekti piedāvājumā kā sadaļa un Web RBL, bloķēšanas saraksts uzbrukumu datplūsmai.
Stāvoklis uz 2026. gada 3. novembri. Moduļa versija 19.0.1.0.0. Visi numuri piemēros un attēlos ir brīvi izvēlēti.