„AN26000001“ govori više od „S00001“: riječ je o ponudi iz 2026. godine, i to prvoj. Mnoge kompanije, posebno one koje prelaze sa starijeg sistema na Odoo, žele zadržati upravo takve brojeve dokumenata. Odoo inače numerira ponude, naloge i otpremnice vlastitim nizovima (S00001, WH/OUT/00001, P00001), a račune prefiksom dnevnika i godinom (INV/2026/00001).
Za tu svrhu razvili smo modul Document Numbering by Prefix and Year (document_number_prefix_year) za Odoo 19. Dostupan je na GitHubu kao slobodni softver pod licencom LGPL-3:
github.com/Alex0176/odoo-document-number-prefix-year
Na početku, iskreno o kontekstu: u kompaniji Biricon IT Services ovaj modul ne koristimo. Objavljujemo ga jer je dovršen, dokumentiran i opremljen testovima te drugima može uštedjeti trud. Svako ko ga želi koristiti trebao bi odjeljke Ograničenja i Testovi pročitati.
Shema numeracije
Svaki broj sastoji se od tri dijela: prefiksa za određenu vrstu dokumenta, godine i brojača s fiksnim brojem cifara. Prefiks, format godine (26 ili 2026) i broj cifara podešavate za svaku kompaniju u odjeljku Postavke → Numeracija dokumenata.
Obuhvaćene su ponude, prodajni nalozi, izlazni računi i knjižna odobrenja, otpremnice, prijemi robe i narudžbenice. Prefiksi na slici služe samo kao primjeri: AN, AU, RE, GU, LI, WE, BE. Ako prefiks ostavite prazan, za tu vrstu dokumenta zadržava se standardna numeracija sistema Odoo. Modul, dakle, ne radi ništa dok ga ne podesite.
Kako funkcionira numeracija
- Svake godine ispočetka. Na početku nove godine brojač ponovo kreće od 1.
- Nastavak nakon uvezenih brojeva. Modul traži najveći postojeći broj s istim prefiksom i godinom, bez obzira na njegovu dužinu. Ako se u bazi nalazi
AN26119iz starog sistema, sljedeća ponuda imat će brojAN26000120. Zato je modul pogodan za prelazak s drugog sistema: stari dokumenti uvoze se s izvornim brojevima, a numeracija novih dokumenata nastavlja se bez prekida. - Novi broj prodajnog naloga pri potvrdi. Potvrđena ponuda po želji dobiva broj iz niza za prodajne naloge. Broj ponude ostaje sačuvan u polju Broj ponude na prodajnom nalogu i vidljiv je u obrascu, listi i pretrazi.
- Računi pri knjiženju. Izlazni računi i knjižna odobrenja dobivaju broj tek pri knjiženju, a ne pri kreiranju. Zato brisanje nacrta ne ostavlja praznine u numeraciji. Godina se preuzima iz polja Datum računa: račun s datumom 30.12.2025. koji se knjiži 2.1.2026. imat će broj
RE25…. - Sve ostalo ostaje isto. Ulazni računi, plaćanja, knjiženja i proizvodni nalozi zadržavaju standardne nizove sistema Odoo. Postojeći nazivi nikada se ne mijenjaju, čak ni ako ponovo isključite modul.
Osjetljivi dio: dva korisnika istovremeno
Vlastita dodjela brojeva djeluje jednostavno: pronađete najveći broj i dodate jedan. Međutim, to prestaje biti jednostavno čim dva korisnika istovremeno kreiraju ponudu. Oba pročitaju „najveći broj = 0“ i oba dodijele AN26000001. Odoo za vlastite nizove koristi sekvence baze podataka. Kod vlastite numeracije toga nema, a za ponude i narudžbenice u sistemu Odoo dodatno ne postoji provjera jedinstvenosti naziva: dva dokumenta s istim brojem jednostavno se sačuvaju.
Očigledna zaštita je zaključavanje. Modul za svaku kombinaciju kompanije, prefiksa i godine postavlja zaključavanje u bazi podataka (PostgreSQL Advisory Lock), koje traje do kraja transakcije. Drugi korisnik čeka dok prvi ne završi. Ali to nije dovoljno, što smo otkrili eksperimentom na kopiji produkcijske baze podataka:
Odoo radi na nivou izolacije REPEATABLE READ. Stanje baze podataka koje transakcija vidi zamrzava se pri njenom prvom upitu. Korisnik B već ima to stanje prije nego što A završi. Ako B zatim čeka na zaključavanje i dobije ga, iz svog starog stanja čita „najveći broj = 0“ i drugi put dodjeljuje isti broj. Zaključavanje je uredilo redoslijed, ali nije ažuriralo podatke koje transakcija vidi.
Rješenje je drugo čitanje putem zasebne, kratkotrajne veze s bazom podataka, koja vidi sve već potvrđene redove. Uzima se veća od dvije vrijednosti. Prvo čitanje i dalje je potrebno jer samo ono vidi brojeve koje je ista transakcija već dodijelila, ali još nije potvrdila, naprimjer pri uvozu više dokumenata odjednom.
To smo provjerili s dvije transakcije, pri čemu je druga dokazano preuzela svoje stanje prije potvrde prve transakcije, a zatim čekala na zaključavanje. Bez drugog čitanja oba naloga dobila su isti broj, a s njim brojeve 1 i 2.
Važno za procjenu: ovaj eksperiment je ručna provjera. On nije dio automatskih testova jer su za njega potrebne dvije stvarne veze s bazom podataka, što Odoo testno okruženje ne omogućava jer koristi samo jednu transakciju po testu.
Tehnička implementacija
| Dokument | Tačka integracije |
|---|---|
| Ponuda | sale.order.create, kada je naziv prazan, / ili New |
| Prodajni nalog | sale.order.action_confirm, prije standardne potvrde |
| Račun, knjižno odobrenje | account.move._set_next_sequence, poziva se pri knjiženju |
| Otpremnica, prijem robe | stock.picking.create prema vrsti operacije |
| Narudžbenica | purchase.order.create |
- Brojač. Najveći broj pronalazi se regularnim izrazom (
^<Stamm>([0-9]{1,15})$, pri čemu se posebni znakovi u osnovi izraza štite) za svaku kompaniju, uključujući i nazive bez pridružene kompanije. - Računi.
_set_next_sequenceupisuje naziv i poziva_compute_split_sequencekako bi logika sekvenci sistema Odoo ostala dosljedna: prefiks, broj i prepoznavanje godine za sljedeći račun u dnevniku. - Postavke. Polja kompanije
document_number_*preslikavaju se ures.config.settings. U postavkama se odbijaju prefiksi koji sadrže razmake ili završavaju cifrom. - Prijevod. Uključen je prijevod na njemački.
Instalacija i podešavanje
- Smjestite direktorij
document_number_prefix_yearna putanju dodataka. - Ažurirajte listu aplikacija i instalirajte modul. Potrebne su aplikacije Prodaja, Nabavka, Skladište i Računovodstvo.
- U odjeljku Postavke → Numeracija dokumenata unesite prefikse, format godine i broj cifara.
- Prvo isprobajte na kopiji. Broj dokumenta kasnije se ne može automatski vratiti na prethodni, a kod računa broj je povezan s obavezom čuvanja dokumentacije i omogućavanja kontrole.
Ograničenja
- Ponude se numeriraju pri kreiranju. Izbrisane ili otkazane ponude ostavljaju praznine u numeraciji. Isto vrijedi za svaki prodajni nalog koji kreira drugi modul: korpe internetske trgovine (
website_sale) zapravo su nalozi sa statusom Ponuda i svaka troši po jedan broj. Samo računi i knjižna odobrenja imaju numeraciju bez praznina jer se numeriraju pri knjiženju. - Ne mijenjajte format godine tokom redovnog rada. Uz osnovu
AN26modul postojeći brojAN2026000001čita kao vrijednost brojača26000001. Odredite format prije kreiranja prvog dokumenta. - Brojač ima najviše 15 cifara. Duži nizovi cifara nakon osnove zanemaruju se pri traženju najvećeg broja.
- Nema zasebnih serija po dnevniku ili skladištu. Brojač važi za svaku kombinaciju firme, prefiksa i godine. Više prodajnih dnevnika dijeli isti brojač računa.
- Prefiksi ne smiju sadržavati razmake niti završavati cifrom, jer se u suprotnom prefiks, godina i brojač više ne mogu razdvojiti.
- Obuhvaćene su samo navedene vrste dokumenata.
Testovi
Modul sadrži deset automatskih testova. Oni provjeravaju:
- ponudu i potvrdu: broj ponude i prodajnog naloga, zadržavanje broja ponude
- nastavak brojanja nakon uvezenog broja (
AN26119→AN26000120) - bez naknadnog mijenjanja brojeva postojećih dokumenata
- račun, knjižno odobrenje i prelazak u novu godinu prema datumu računa
- narudžbenica i otpremnice
- prazan prefiks: zadržava se standardni broj koji dodjeljuje Odoo
- četverocifrena godina
- prefiks s posebnim znakovima
- više brojeva u jednoj transakciji
- veoma dugi nizovi cifara se zanemaruju
Pokretanje:
odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init
Testovi se izvršavaju u uobičajenim transakcijama. Ne obuhvataju ponašanje pri istovremenom kreiranju dokumenata koje pokreću dva korisnika; to je ručno provjereno na kopiji baze podataka, kako je gore opisano. Ako modul koristite u sistemu s mnogo istovremenih korisnika, ovaj postupak trebate ponoviti na vlastitoj bazi podataka.
Pravna napomena o broju računa
Prema § 11 UStG-a, računi moraju imati redni broj koji se dodjeljuje samo jednom radi identifikacije računa. Modul dodjeljuje brojeve računima pri knjiženju, uz zaseban brojač za svaki prefiks i godinu, što odgovara tom zahtjevu. Sa svojim poreznim savjetnikom morate provjeriti ispunjavaju li vaše konkretne postavke (više dnevnika, knjižna odobrenja s vlastitim prefiksom, prelazak u novu godinu) njegove zahtjeve. Ovaj članak ne predstavlja pravni savjet.
Česta pitanja
Zašto jednostavno ne prilagoditi sekvence u Odoou?
Za račune je to moguće putem prefiksa dnevnika. Međutim, za ponude, prodajne naloge, otpremnice i narudžbenice ne postoji zajednička šema od prefiksa, godine i brojača s prelaskom u novu godinu, a brojač ne prepoznaje uvezene stare brojeve. Tu pomaže ovaj modul.
Mijenja li se postojeća numeracija?
Ne. Modul dodjeljuje samo nove brojeve. Već sačuvani nazivi ostaju nepromijenjeni, čak i nakon isključivanja.
Kako da ga ponovo isključim?
Obrišite prefiks za tu vrstu dokumenta. Odoo će zatim ponovo sam dodjeljivati brojeve. Ni deinstalacija ne mijenja već dodijeljene brojeve.
Koristite li ga i sami?
Ne. Mi koristimo standardnu numeraciju u Odoou. Modul smo provjerili automatskim testovima i opisanim ručnim postupkom, ali ne i u stvarnom radu s mnogo korisnika.
Radi li s Odoo 17 ili 18?
Testirali smo ga samo s Odoo 19.0 Community. Možda radi i s drugim verzijama, ali to nismo provjerili.
Pod kojom je licencom dostupan?
Pod licencom LGPL-3. Prijave grešaka i prijedlozi poboljšanja dobrodošli su kao prijave problema u GitHub repozitoriju .
Podrška kompanije Biricon IT Services
Pružamo podršku za Odoo instalacije malim i srednjim preduzećima: od uvođenja, preko prilagodbi i migracija, do svakodnevnog rada. Rado ćemo vam pomoći ako pri prelasku želite sačuvati brojeve dokumenata, provjeriti dodjelu brojeva pod opterećenjem ili sigurno uvesti ovakav modul u svoje produkcijsko okruženje. Ostala vlastita rješenja: Registar preduzeća i provjera adresa za austrijske klijente, Kompleti proizvoda kao odjeljak u ponudi i Web RBL, lista za blokiranje napadačkog saobraćaja.
Stanje na dan: 3. novembar 2026. Verzija modula 19.0.1.0.0. Svi brojevi u primjerima i na slikama proizvoljno su odabrani.