„AN26000001“ govori više od „S00001“: to je ponuda, potiče iz 2026. i prva je. Mnoga preduzeća, posebno ona koja prelaze sa starijeg sistema na Odoo, žele zadržati svoje brojeve dokumenata upravo tako. Odoo sam numeriše ponude, narudžbe i otpremnice vlastitim nizovima (S00001, WH/OUT/00001, P00001), a račune prefiksom dnevnika i godinom (INV/2026/00001).
Za to smo napisali modul Document Numbering by Prefix and Year (document_number_prefix_year) za Odoo 19. Dostupan je kao slobodan softver pod licencom LGPL-3 na GitHubu:
github.com/Alex0176/odoo-document-number-prefix-year
Unaprijed iskrena napomena: Modul kod Biricon IT Services ne koristimo. Objavljujemo ga jer je gotov, dokumentovan i opremljen testovima te drugima može uštedjeti rad. Ko ga koristi, trebao bi pročitati odjeljke o ograničenjima i Testovi .
Shema numeracije
Svaki broj sastoji se od tri dijela: prefiksa po vrsti dokumenta, godine i brojača s fiksnim brojem mjesta. Prefiks, format godine (26 ili 2026) i broj mjesta podešavate po firmi pod Postavke → Numeracija dokumenata.
Obrađuju se ponude, narudžbe kupaca, računi kupaca i knjižna odobrenja, otpremnice, prijemi robe i narudžbenice. Prefiksi na slici su samo primjeri: AN, AU, RE, GU, LI, WE, BE. Ko prefiks ostavi praznim, za tu vrstu dokumenta zadržava standardnu numeraciju Odoa. Modul dakle ne radi ništa dok ga ne podesite.
Kako se brojevi ponašaju
- Svake godine iznova. Brojač počinje s promjenom godine ponovo od 1.
- Nastavak nakon uvezenih brojeva. Modul traži najviši postojeći broj istog prefiksa i godine, bez obzira koliko je dug. Ako se iz starog sistema u bazi nalazi
AN26119, sljedeća ponuda glasiAN26000120. To je razlog zašto je modul pogodan za prelaske: stari dokumenti uvoze se s originalnim brojevima, a novi dokumenti se bez prekida nadovezuju. - Novi broj narudžbe pri potvrdi. Potvrđena ponuda po želji dobiva broj iz niza narudžbi. Broj ponude ostaje sačuvan u polju Broj ponude na narudžbi i vidljiv je u obrascu, listi i pretrazi.
- Računi pri knjiženju. Računi kupaca i knjižna odobrenja dobivaju svoj broj tek pri knjiženju, a ne pri kreiranju. Izbrisani nacrti stoga ne ostavljaju prazninu. Godina potiče iz datuma računa: Račun od 30.12.2025. koji se knjiži 2.1.2026. glasi
RE25…. - Sve ostalo ostaje. Računi dobavljača, plaćanja, knjiženja i proizvodni nalozi zadržavaju standardne nizove Odoa. Postojeći nazivi se nikada ne prepisuju, čak ni ako modul ponovo isključite.
Delikatan dio: Dva korisnika istovremeno
Vlastita dodjela brojeva izgleda jednostavno: pronaći najviši broj, dodati jedan. Nije tako čim dva korisnika u istom trenutku kreiraju ponudu. Oba čitaju „najviši broj = 0“, oba dodjeljuju AN26000001. Odoo za to kod vlastitih nizova ima sekvence baze podataka. Kod samostalno izgrađenog broja to nedostaje, a za ponude i narudžbenice u Odoou uz to ne postoji provjera jedinstvenosti naziva: dva dokumenta s istim brojem jednostavno se pohrane.
Očigledna zaštita je zaključavanje. Modul po firmi, prefiksu i godini uzima zaključavanje baze podataka (PostgreSQL Advisory Lock) koje traje do kraja transakcije. Drugi korisnik čeka dok prvi ne završi. To ipak nije dovoljno, a otkrili smo to pokusom na kopiji produktivne baze podataka:
Odoo radi s nivoom izolacije REPEATABLE READ. Stanje baze podataka koje transakcija vidi zamrzava se pri njenom prvom upitu. Korisnik B to stanje već ima prije nego što A završi. Ako B nakon toga čeka na zaključavanje i dobije ga, čita sa svojim starim stanjem „najviši broj = 0“ i dodjeljuje broj po drugi put. Zaključavanje je uredilo redoslijed, ali nije ažuriralo znanje.
Rješenje je drugo čitanje putem vlastitog, kratkotrajnog pristupa bazi podataka, koje vidi sve već potvrđene redove. Pobjeđuje veća od dvije vrijednosti. Prvo čitanje ostaje potrebno, jer samo ono poznaje brojeve koje ista transakcija već dodijelila, ali još nije potvrdila, na primjer pri uvozu više dokumenata odjednom.
Provjerili smo to s dvije transakcije u kojima je druga dokazano povukla svoje stanje prije commita prve, a zatim čekala na zaključavanje. Bez drugog čitanja obje narudžbe dobile su isti broj, s njim brojeve 1 i 2.
Važno za razumijevanje: Ovaj pokus je ručna provjera. On nije dio automatskih testova, jer su za to potrebne dvije prave veze s bazom podataka koje Odoo testno okruženje (jedna jedina transakcija po testu) ne pruža.
Tehnička realizacija
| Dokument | Tačka zahvata |
|---|---|
| Ponuda | sale.order.create, kada je naziv prazan, / ili New |
| Narudžba kupca | 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č. Najviši broj pronalazi regularni izraz (
^<Stamm>([0-9]{1,15})$, korijen se maskira) po firmi, uključujući nazive bez firme. - Računi.
_set_next_sequenceupisuje naziv i poziva_compute_split_sequence, kako bi logika sekvenci Odoa (prefiks, broj, prepoznavanje godine za sljedeći račun dnevnika) ostala usklađena. - Postavke. Polja firme
document_number_*preslikavaju se ures.config.settings. Postavke odbijaju prefikse s razmakom ili cifrom na kraju. - Prevod. Njemački prevod je uključen.
Instalacija i podešavanje
- Direktorij
document_number_prefix_yearstaviti u putanju addona. - Osvježiti listu aplikacija, instalirati modul. Preduvjeti su Prodaja, Nabavka, Skladište i Računovodstvo.
- Pod Postavke → Numeracija dokumenata unijeti prefikse, format godine i broj mjesta.
- Prvo isprobati na kopiji. Broj dokumenta se kasnije ne može automatski vratiti unazad, a kod računa za broj su vezane obaveze čuvanja i provjere.
ograničenjima
- Ponude se numerišu pri kreiranju. Izbrisane ili stornirane ponude ostavljaju praznine. Isto važi za svaku narudžbu kupca koju kreira neki drugi modul: korpe za kupovinu web šopa (
website_sale) su narudžbe u statusu Ponuda i troše po jedan broj. Bez praznina su samo računi i knjižna odobrenja, jer se numerišu pri knjiženju. - Format godine ne mijenjati u toku rada. S korijenom
AN26modul postojećiAN2026000001čita kao brojač26000001. Format odredite prije prvog dokumenta. - Brojač najviše 15 mjesta. Duži nizovi cifara iza korijena ignorišu se pri traženju najvišeg broja.
- Nema odvojenih serija po dnevniku ili skladištu. Brojač važi po firmi, prefiksu i godini. Više prodajnih dnevnika dijeli brojač računa.
- Prefiksi ne smiju sadržavati razmak niti završavati cifrom, inače se prefiks, godina i brojač više ne mogu razdvojiti.
- Samo navedene vrste dokumenata se obrađuju.
Testovi
Modul sadrži deset automatskih testova. Oni provjeravaju:
- Ponuda i potvrda: broj ponude i narudžbe, očuvanje broja ponude
- Nastavak brojanja nakon uvezenog broja (
AN26119→AN26000120) - nikakvo naknadno preimenovanje postojećih dokumenata
- Račun, knjižno odobrenje i promjena godine prema datumu računa
- Narudžbenica i otpremnice
- prazan prefiks: standardni broj Odoa ostaje
- četverocifrena godina
- prefiks s posebnim znakovima
- više brojeva u jednoj transakciji
- vrlo 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 s običnim transakcijama. Ponašanje pri istovremenom kreiranju od strane dva korisnika ne spada u to, provjereno je ručno na kopiji baze podataka kako je gore opisano. Ko modul koristi u sistemu s mnogo istovremenih korisnika, trebao bi ovaj pokus ponoviti na vlastitoj bazi podataka.
Pravna napomena o broju računa
Računi moraju prema § 11 UStG nositi uzastopni broj koji se dodjeljuje jednom radi identifikacije računa. Modul numeriše račune pri knjiženju i s vlastitim brojačem po prefiksu i godini, što tome odgovara. Ispunjava li vaša konkretna postavka (više dnevnika, knjižna odobrenja s vlastitim prefiksom, promjena godine) zahtjeve vašeg poreznog savjetnika, morate razjasniti s njim. Ovaj članak nije pravni savjet.
Česta pitanja
Zašto jednostavno ne prilagoditi Odoo nizove?
Za račune to ide putem prefiksa dnevnika. Kod ponuda, narudžbi, otpremnica i narudžbenica ipak ne postoji zajednička shema iz prefiksa, godine i brojača s promjenom godine, a brojač ne poznaje uvezene stare brojeve. Tu modul počinje.
Prepisuje li se postojeća numeracija?
Ne. Modul dodjeljuje samo nove brojeve. Već pohranjeni nazivi ostaju nepromijenjeni, i pri isključivanju.
Kako ga ponovo isključiti?
Ispraznite prefiks vrste dokumenta. Tada Odoo ponovo sam numeriše. Ni deinstalacija ne mijenja dodijeljene brojeve.
Koristite li ga sami?
Ne. Kod nas rade standardni brojevi Odoa. Modul smo provjerili automatskim testovima i opisanim ručnim pokusom, ali ne u radu uživo s mnogo korisnika.
Radi li s Odoo 17 ili 18?
Testirali smo ga samo s Odoo 19.0 Community. Za druge verzije može odgovarati ili ne, nismo provjeravali.
Pod kojom licencom je?
Pod LGPL-3. Greške i poboljšanja dobrodošli su kao issue u GitHub repozitoriju .
Podrška Biricon IT Services
Brinemo o Odoo instalacijama za mala i srednja preduzeća: od uvođenja, preko prilagodbi i migracija, do tekućeg rada. Ako pri prelasku želite sačuvati svoje brojeve dokumenata, dati provjeriti dodjelu brojeva pod opterećenjem ili sigurno postaviti modul poput ovog u svoju produktivnu instancu, rado ćemo pomoći. Daljnji vlastiti razvojni projekti: Firmenbuch i provjera adresa za austrijske kupce, Setovi proizvoda u ponudi kao odjeljak i Web RBL, crna lista za napadački saobraćaj.
Stanje na dan: 3. novembra 2026. Verzija modula 19.0.1.0.0. Svi brojevi u primjerima i na slikama proizvoljno su odabrani.