„AN26000001“ govori više od „S00001“: to je ponuda, potječe iz 2026. i prva je. Mnoga poduzeća, osobito ona koja prelaze sa starijeg sustava na Odoo, žele zadržati svoje brojeve dokumenata upravo tako. Sam Odoo numerira ponude, narudžbe i otpremnice vlastitim nizovima (S00001, WH/OUT/00001, P00001), a račune 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 licencijom LGPL-3 na GitHubu:
github.com/Alex0176/odoo-document-number-prefix-year
Najprije iskrena napomena: modul u Biricon IT Services ne koristimo. Objavljujemo ga jer je gotov, dokumentiran i opremljen testovima te drugima može uštedjeti posao. Tko ga koristi, trebao bi pročitati odjeljak Ograničenja i Testovi .
Shema numeriranja
Svaki broj sastoji se od tri dijela: prefiksa po vrsti dokumenta, godine i brojača s fiksnim brojem znamenki. Prefiks, format godine (26 ili 2026) i broj znamenki postavljate po tvrtki u Postavke → Numeriranje dokumenata.
Obrađuju se ponude, narudžbe kupaca, računi kupcima i odobrenja, otpremnice, primke robe i narudžbenice. Prefiksi na slici samo su primjeri: AN, AU, RE, GU, LI, WE, BE. Tko prefiks ostavi praznim, za tu vrstu dokumenta zadržava standardno numeriranje Odooa. Modul dakle ne radi ništa dok ga ne postavite.
Kako se brojevi ponašaju
- Svake godine iznova. Brojač s promjenom godine ponovno počinje od 1.
- Nastavak nakon uvezenih brojeva. Modul traži najviši postojeći broj istog prefiksa i godine, bez obzira na to koliko je dug. Ako je iz starog sustava u bazi podataka
AN26119, sljedeća ponuda glasiAN26000120. To je razlog zbog kojeg je modul prikladan za prijelaze: stari dokumenti uvoze se s izvornim brojevima, a novi dokumenti se bešavno 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, popisu i pretrazi.
- Računi pri knjiženju. Računi kupcima i odobrenja dobivaju broj tek pri knjiženju, a ne pri izradi. Izbrisani nacrti stoga ne ostavljaju prazninu. Godina potječ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 Odooa. Postojeći nazivi nikad se ne prepisuju, čak ni ako modul ponovno isključite.
Osjetljivi dio: dva korisnika istodobno
Vlastito dodjeljivanje brojeva izgleda jednostavno: pronaći najviši broj, dodati jedan. Nije tako čim dva korisnika u istom trenutku izrade ponudu. Oboje čitaju „najviši broj = 0“, oboje 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 povrh toga ne postoji provjera jedinstvenosti naziva: dva dokumenta s istim brojem jednostavno se spremaju.
Očita zaštita je zaključavanje. Modul po tvrtki, prefiksu i godini uzima zaključavanje baze podataka (PostgreSQL Advisory Lock) koje traje do kraja transakcije. Drugi korisnik čeka dok prvi ne završi. No to nije dovoljno, a do toga smo došli pokusom na kopiji produkcijske baze podataka:
Odoo radi s razinom izolacije REPEATABLE READ. Stanje baze podataka koje transakcija vidi zamrzava se pri njezinu prvom upitu. Korisnik B već ima to stanje prije nego što A završi. Ako B nakon toga čeka zaključavanje i dobije ga, sa svojim starim stanjem čita „najviši broj = 0“ i dodjeljuje broj drugi put. Zaključavanje je uredilo redoslijed, ali nije osvježilo znanje.
Rješenje je drugo čitanje putem vlastite, kratkotrajne veze s bazom podataka koja vidi sve već potvrđene retke. Pobjeđuje veća od dviju 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 kod kojih je druga dokazano povukla svoje stanje prije commita prve, a zatim čekala zaključavanje. Bez drugog čitanja obje narudžbe dobile su isti broj, s njim brojeve 1 i 2.
Važno za procjenu: ovaj pokus je ručna provjera. On nije dio automatskih testova jer su za to potrebne dvije prave veze s bazom podataka koje Odoova testna okolina (jedna jedina transakcija po testu) ne pruža.
Tehnička izvedba
| Dokument | Točka uklapanja |
|---|---|
| Ponuda | sale.order.create, ako je naziv prazan, / ili New |
| Narudžba kupca | sale.order.action_confirm, prije standardne potvrde |
| Račun, odobrenje | account.move._set_next_sequence, poziva se pri knjiženju |
| Otpremnica, primka robe | stock.picking.create prema vrsti operacije |
| Narudžbenica dobavljaču | purchase.order.create |
- Brojač. Najviši broj pronalazi regularni izraz (
^<Stamm>([0-9]{1,15})$, korijen se maskira) po tvrtki, uključujući nazive bez tvrtke. - Računi.
_set_next_sequenceupisuje naziv i poziva_compute_split_sequencekako bi logika sekvenci Odooa (prefiks, broj, prepoznavanje godine za sljedeći račun dnevnika) ostala dosljedna. - Postavke. Polja tvrtke
document_number_*preslikavaju se ures.config.settings. Postavke odbijaju prefikse s razmakom ili znamenkom na kraju. - Prijevod. Njemački prijevod je uključen.
Instalacija i postavljanje
- Direktorij
document_number_prefix_yearstaviti u putanju dodataka. - Osvježiti popis aplikacija, instalirati modul. Preduvjeti su Prodaja, Nabava, Skladište i Računovodstvo.
- U Postavke → Numeriranje dokumenata unijeti prefikse, format godine i broj znamenki.
- Najprije isprobajte na kopiji. Broj dokumenta kasnije se ne može automatski vratiti, a kod računa uz broj vežu se obveze čuvanja i revizije.
Ograničenja
- Ponude se numeriraju pri izradi. Izbrisane ili stornirane ponude ostavljaju praznine. Isto vrijedi za svaku narudžbu kupca koju izradi drugi modul: košarice web trgovine (
website_sale) narudžbe su u statusu Ponuda i troše po jedan broj. Bez praznina su samo računi i odobrenja jer se numeriraju pri knjiženju. - Format godine ne mijenjajte u tijeku rada. S korijenom
AN26modul postojećiAN2026000001čita kao brojač26000001. Format odredite prije prvog dokumenta. - Brojač najviše 15 znamenki. Dulji nizovi znamenki iza korijena ignoriraju se pri traženju najvišeg broja.
- Nema odvojenih nizova po dnevniku ili skladištu. Brojač vrijedi po tvrtki, prefiksu i godini. Više prodajnih dnevnika dijeli brojač računa.
- Prefiksi ne smiju sadržavati razmak niti završavati znamenkom, inače se prefiks, godina i brojač više ne mogu razdvojiti.
- Obrađuju se samo navedene vrste dokumenata.
Testovi
Modul donosi deset automatskih testova. Oni provjeravaju:
- Ponuda i potvrda: broj ponude i narudžbe, očuvanje broja ponude
- Nastavak brojanja nakon uvezenog broja (
AN26119→AN26000120) - nema naknadnog prenumeriranja postojećih dokumenata
- Račun, odobrenje i promjena godine prema datumu računa
- Narudžbenica i otpremnice
- prazan prefiks: standardni broj Odooa ostaje
- četveroznamenkasta godina
- Prefiks s posebnim znakovima
- više brojeva u jednoj transakciji
- vrlo dugi nizovi znamenki se ignoriraju
Poziv:
odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init
Testovi se izvode s običnim transakcijama. Ponašanje pri istodobnoj izradi od strane dvaju korisnika nije obuhvaćeno, provjereno je ručno na kopiji baze podataka, kako je gore opisano. Tko modul koristi u sustavu s mnogo istodobnih korisnika, trebao bi taj pokus ponoviti na vlastitoj bazi podataka.
Pravna napomena o broju računa
Prema § 11 UStG računi moraju nositi uzastopni broj koji se dodjeljuje jednom radi identifikacije računa. Modul numerira 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, 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 Odoove nizove?
Za račune to ide putem prefiksa dnevnika. No za ponude, narudžbe, otpremnice i narudžbenice ne postoji zajednička shema iz prefiksa, godine i brojača s promjenom godine, a brojač ne poznaje uvezene stare brojeve. Tu modul preuzima.
Prepisuje li se postojeće numeriranje?
Ne. Modul dodjeljuje samo nove brojeve. Već spremljeni nazivi ostaju nepromijenjeni, i pri isključivanju.
Kako ga ponovno isključiti?
Ispraznite prefiks vrste dokumenta. Tada je Odoo ponovno numerira sam. Ni deinstalacija ne mijenja dodijeljene brojeve.
Koristite li ga sami?
Ne. Kod nas rade standardni brojevi Odooa. Modul smo provjerili automatskim testovima i opisanim ručnim pokusom, ali ne u tekućem poslovanju s mnogo korisnika.
Radi li s Odoom 17 ili 18?
Testirali smo ga samo s Odoom 19.0 Community. Za druge verzije može odgovarati ili ne, nismo ga provjeravali.
Pod kojom je licencijom?
Pod LGPL-3. Greške i poboljšanja dobrodošli su kao issue u GitHub repozitoriju .
Podrška tvrtke Biricon IT Services
Brinemo se za Odoo instalacije malih i srednjih poduzeća: od uvođenja, preko prilagodbi i migracija, do tekućeg rada. Ako pri prelasku želite sačuvati svoje brojeve dokumenata, dati provjeriti dodjeljivanje brojeva pod opterećenjem ili sigurno uvesti modul poput ovog u svoju produkcijsku instancu, rado ćemo pomoći. Dodatni vlastiti razvoji: Firmenbuch i provjera adresa za austrijske klijente, Skupovi proizvoda u ponudi kao odjeljak i Web RBL, crna lista za napadački promet.
Stanje: 3. studenoga 2026. Verzija modula 19.0.1.0.0. Svi brojevi u primjerima i slikama proizvoljno su odabrani.