„AN26000001“ govori više od „S00001“: to je ponuda, potiče iz 2026. i prva je. Mnoga preduzeća, pre svega ona koja prelaze sa starijeg sistema na Odoo, žele da zadrže upravo takve brojeve dokumenata. Sam Odoo numeriše ponude, naloge i otpremnice sopstvenim nizovima (S00001, WH/OUT/00001, P00001), a fakture prefiksom dnevnika i godinom (INV/2026/00001).
Zato smo napisali modul Document Numbering by Prefix and Year (document_number_prefix_year) za Odoo 19. Dostupan je kao slobodan softver pod LGPL-3 licencom na GitHubu:
github.com/Alex0176/odoo-document-number-prefix-year
Unapred iskrena napomena: Ovaj modul u Biricon IT Services ne koristimo. Objavljujemo ga zato što je gotov, dokumentovan i opremljen testovima i drugima može uštedeti posao. Ko ga koristi, trebalo bi da pročita odeljke o ograničenjima i Testovi .
Šema numerisanja
Svaki broj se sastoji od tri dela: prefiksa po vrsti dokumenta, godine i brojača sa fiksnim brojem cifara. Prefiks, format godine (26 ili 2026) i broj cifara podešavate po firmi pod Podešavanja → Numerisanje dokumenata.
Obrađuju se ponude, narudžbine klijenata, fakture klijentima i knjižna odobrenja, otpremnice, prijemi robe i nabavne narudžbine. Prefiksi na slici su samo primeri: AN, AU, RE, GU, LI, WE, BE. Ko ostavi prefiks praznim, za tu vrstu dokumenta zadržava standardno numerisanje Odooa. Modul dakle ne radi ništa dok ga ne podesite.
Kako se brojevi ponašaju
- Svake godine iznova. Brojač sa promenom godine ponovo počinje od 1.
- Nastavak posle uvezenih brojeva. Modul traži najviši postojeći broj istog prefiksa i godine, bez obzira na to koliko je dug. Ako se iz starog sistema u bazi nalazi
AN26119, sledeća ponuda glasiAN26000120. To je razlog zašto je modul pogodan za prelaske: stari dokumenti se uvoze sa originalnim brojevima, a novi dokumenti se bez prekida nadovezuju. - Novi broj narudžbine pri potvrdi. Potvrđena ponuda po želji dobija broj iz niza narudžbina. Broj ponude ostaje sačuvan u polju Broj ponude na narudžbini i vidljiv je u obrascu, listi i pretrazi.
- Fakture pri knjiženju. Fakture klijentima i knjižna odobrenja dobijaju svoj broj tek pri knjiženju, a ne pri kreiranju. Obrisani nacrti zato ne ostavljaju prazninu. Godina potiče iz datuma fakture: faktura od 30.12.2025. koja se knjiži 2.1.2026. nosi broj
RE25…. - Sve ostalo ostaje. Fakture dobavljača, uplate, knjiženja i proizvodni nalozi zadržavaju standardne nizove Odooa. Postojeći nazivi se nikada ne prepisuju, čak ni ako modul ponovo isključite.
Osetljivi deo: dva korisnika istovremeno
Sopstvena dodela brojeva izgleda jednostavno: naći najviši broj, dodati jedan. Nije tako čim dva korisnika u istom trenutku kreiraju ponudu. Oba čitaju „najviši broj = 0“, oba dodeljuju AN26000001. Odoo za to kod svojih nizova ima sekvence baze podataka. Kod sopstveno izgrađenog broja to nedostaje, a za ponude i nabavne narudžbine u Odoou pritom ne postoji provera jedinstvenosti naziva: dva dokumenta sa istim brojem se jednostavno sačuvaju.
Očigledna zaštita je blokada. Modul po firmi, prefiksu i godini uzima blokadu baze podataka (PostgreSQL Advisory Lock) koja traje do kraja transakcije. Drugi korisnik čeka dok prvi ne završi. Ali to nije dovoljno, što smo otkrili pokusom na kopiji produktivne baze podataka:
Odoo radi sa nivoom izolacije REPEATABLE READ. Stanje baze podataka koje transakcija vidi zamrzava se pri njenom prvom upitu. Korisnik B to stanje već ima, pre nego što A završi. Ako B zatim čeka na blokadu i dobije je, sa svojim starim stanjem čita „najviši broj = 0“ i dodeljuje broj po drugi put. Blokada je uredila redosled, ali nije osvežila znanje.
Rešenje je drugo čitanje preko sopstvenog, kratkotrajnog pristupa bazi podataka, koji vidi sve već potvrđene redove. Veća od dve vrednosti pobeđuje. Prvo čitanje ostaje potrebno, jer samo ono poznaje brojeve koje ista transakcija već dodelila, ali još nije potvrdila, na primer pri uvozu više dokumenata odjednom.
Ovo smo proverili sa dve transakcije kod kojih je druga dokazano povukla svoje stanje pre commita prve, a zatim čekala na blokadu. Bez drugog čitanja oba naloga su dobila isti broj, sa njim brojeve 1 i 2.
Važno za procenu: Ovaj pokus je ručna provera. On nije deo automatskih testova, jer su za to potrebne dve prave veze sa bazom podataka koje Odoo testno okruženje (jedna jedina transakcija po testu) ne obezbeđuje.
Tehnička realizacija
| Dokument | Tačka priključenja |
|---|---|
| Ponuda | sale.order.create, kada je naziv prazan, / ili New |
| Narudžbina klijenta | sale.order.action_confirm, pre standardne potvrde |
| Faktura, knjižno odobrenje | account.move._set_next_sequence, poziva se pri knjiženju |
| Otpremnica, prijem robe | stock.picking.create prema vrsti operacije |
| Nabavna narudžbina | purchase.order.create |
- Brojač. Najviši broj pronalazi regularni izraz (
^<Stamm>([0-9]{1,15})$, koren se maskira) po firmi, uključujući nazive bez firme. - Fakture.
_set_next_sequenceupisuje naziv i poziva_compute_split_sequence, kako bi logika sekvenci Odooa (prefiks, broj, prepoznavanje godine za sledeću fakturu dnevnika) ostala usklađena. - Podešavanja. Polja firme
document_number_*odražavaju se ures.config.settings. Podešavanja odbijaju prefikse sa razmakom ili cifrom na kraju. - Prevod. Nemački prevod je uključen.
Instalacija i podešavanje
- Folder
document_number_prefix_yearstaviti u putanju dodataka. - Osvežiti listu aplikacija, instalirati modul. Preduslovi su Prodaja, Nabavka, Magacin i Računovodstvo.
- Pod Podešavanja → Numerisanje dokumenata uneti prefikse, format godine i broj cifara.
- Prvo isprobati na kopiji. Broj dokumenta se kasnije ne može automatski vratiti unazad, a kod faktura za broj je vezana obaveza čuvanja i provere.
ograničenjima
- Ponude se numerišu pri kreiranju. Obrisane ili stornirane ponude ostavljaju praznine. Isto važi za svaku narudžbinu klijenta koju kreira neki drugi modul: korpe veb prodavnice (
website_sale) su narudžbine u statusu Ponuda i troše po jedan broj. Bez praznina su samo fakture i knjižna odobrenja, jer se numerišu pri knjiženju. - Format godine ne menjati u toku rada. Sa korenom
AN26modul postojećiAN2026000001čita kao brojač26000001. Format odredite pre prvog dokumenta. - Brojač najviše 15 cifara. Duži nizovi cifara posle korena ignorišu se pri traženju najvišeg broja.
- Nema odvojenih serija po dnevniku ili magacinu. Brojač važi po firmi, prefiksu i godini. Više prodajnih dnevnika deli brojač faktura.
- Prefiksi ne smeju sadržati razmak niti se završavati cifrom, inače se prefiks, godina i brojač više ne mogu razdvojiti.
- Obrađuju se samo navedene vrste dokumenata.
Testovi
Modul dolazi sa deset automatskih testova. Oni proveravaju:
- Ponuda i potvrda: broj ponude i narudžbine, očuvanje broja ponude
- Nastavak brojanja posle uvezenog broja (
AN26119→AN26000120) - nema naknadnog preimenovanja postojećih dokumenata
- Faktura, knjižno odobrenje i promena godine prema datumu fakture
- Nabavna narudžbina i otpremnice
- prazan prefiks: standardni broj Odooa ostaje
- četvorocifrena godina
- Prefiks sa posebnim znakovima
- više brojeva u jednoj transakciji
- veoma dugi nizovi cifara se ignorišu
Poziv:
odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init
Testovi se izvršavaju sa običnim transakcijama. Ponašanje pri istovremenom kreiranju od strane dva korisnika ne spada tu, ono je, kako je gore opisano, ručno provereno na kopiji baze podataka. Ko koristi modul u sistemu sa mnogo istovremenih korisnika, trebalo bi da ponovi taj pokus na sopstvenoj bazi podataka.
Pravna napomena o broju fakture
Fakture moraju prema § 11 UStG da nose uzastopni broj koji se dodeljuje jednokratno radi identifikacije fakture. Modul numeriše fakture pri knjiženju i sa sopstvenim brojačem po prefiksu i godini, što se uklapa. Da li vaše konkretno podešavanje (više dnevnika, knjižna odobrenja sa sopstvenim prefiksom, promena godine) ispunjava zahteve vašeg poreskog savetnika, morate razjasniti sa njim. Ovaj članak nije pravni savet.
Česta pitanja
Zašto jednostavno ne prilagoditi Odoo nizove?
Za fakture to ide preko prefiksa dnevnika. Ali kod ponuda, narudžbina, otpremnica i nabavnih narudžbina ne postoji zajednička šema iz prefiksa, godine i brojača sa promenom godine, a brojač ne poznaje uvezene stare brojeve. Tu modul počinje.
Da li se postojeće numerisanje prepisuje?
Ne. Modul dodeljuje samo nove brojeve. Već sačuvani nazivi ostaju nepromenjeni, i pri isključivanju.
Kako da ga ponovo isključim?
Ispraznite prefiks vrste dokumenta. Tada ga Odoo ponovo numeriše sam. Ni deinstaliranje ne menja već dodeljene brojeve.
Da li ga sami koristite?
Ne. Kod nas rade standardni brojevi Odooa. Modul smo proverili automatskim testovima i opisanim ručnim pokusom, ali ne u tekućem radu sa mnogo korisnika.
Da li radi sa Odoo 17 ili 18?
Testirali smo ga samo sa Odoo 19.0 Community. Za druge verzije može odgovarati ili ne, nismo ga proveravali.
Pod kojom licencom je?
Pod LGPL-3. Greške i poboljšanja možete prijaviti kao Issue u GitHub repozitorijumu .
Podrška kompanije Biricon IT Services
Brinemo o Odoo instalacijama za mala i srednja preduzeća: od uvođenja, preko prilagođavanja i migracija, do tekućeg rada. Ako pri prelasku želite da sačuvate brojeve dokumenata, da proverite dodelu brojeva pod opterećenjem ili da modul poput ovog bezbedno unesete u svoju produktivnu instancu, rado ćemo pomoći. Druge sopstvene razvoje: Firmenbuch i provera adresa za austrijske klijente, Setovi proizvoda u ponudi kao odeljak i Web RBL, lista blokiranja za napadački saobraćaj.
Stanje na dan: 3. novembar 2026. Verzija modula 19.0.1.0.0. Svi brojevi u primerima i na slikama su slobodno odabrani.