„AN26000001” spune mai mult decât „S00001”: este o ofertă, provine din 2026 și este prima. Multe companii, mai ales cele care trec de la un sistem mai vechi la Odoo, vor să-și păstreze numerele de documente exact așa. Odoo numerotează singur ofertele, comenzile și avizele de livrare cu serii proprii (S00001, WH/OUT/00001, P00001) și facturile cu prefixul jurnalului și anul (INV/2026/00001).
Pentru aceasta am scris modulul Document Numbering by Prefix and Year (document_number_prefix_year) pentru Odoo 19. Este disponibil pe GitHub ca software liber sub licența LGPL-3:
github.com/Alex0176/odoo-document-number-prefix-year
O încadrare sinceră, de la început: noi nu folosim modulul la Biricon IT Services. Îl publicăm pentru că este finalizat, documentat și prevăzut cu teste și poate economisi muncă altora. Cine îl folosește ar trebui să citească secțiunile despre Limite și Teste .
Schema de numerotare
Fiecare număr este format din trei părți: un prefix pe tip de document, anul și un contor cu număr fix de cifre. Prefixul, formatul anului (26 sau 2026) și numărul de cifre le setați pe companie la Setări → Numerotarea documentelor.
Sunt tratate ofertele, comenzile clienților, facturile și notele de credit către clienți, avizele de livrare, recepțiile de marfă și comenzile de achiziție. Prefixele din figură sunt doar exemple: AN, AU, RE, GU, LI, WE, BE. Cine lasă un prefix gol păstrează pentru acel tip de document numerotarea standard din Odoo. Modulul nu face deci nimic până când îl configurați.
Cum se comportă numerele
- În fiecare an de la capăt. Contorul reîncepe de la 1 odată cu schimbarea anului.
- Continuare după numerele importate. Modulul caută cel mai mare număr existent cu același prefix și an, indiferent cât este de lung. Dacă din sistemul vechi există în baza de date
AN26119, următoarea ofertă va fiAN26000120. Acesta este motivul pentru care modulul este potrivit pentru migrări: documentele vechi sunt importate cu numerele lor originale, iar documentele noi continuă fără întrerupere. - Număr nou de comandă la confirmare. O ofertă confirmată primește, la cerere, un număr din seria comenzilor. Numărul ofertei se păstrează în câmpul Număr ofertă al comenzii și este vizibil în formular, listă și căutare.
- Facturile la înregistrare. Facturile și notele de credit către clienți primesc numărul abia la înregistrare, nu la creare. Ciornele șterse nu lasă deci niciun gol. Anul provine din data facturii: o factură din 30.12.2025, înregistrată la 2.1.2026, se numește
RE25…. - Restul rămâne. Facturile furnizorilor, plățile, înregistrările contabile și comenzile de producție păstrează seriile standard din Odoo. Numele existente nu sunt niciodată rescrise, nici dacă dezactivați din nou modulul.
Partea delicată: doi utilizatori în același timp
O numerotare proprie pare simplă: cauți cel mai mare număr și adaugi unu. Nu mai este simplă de îndată ce doi utilizatori creează o ofertă în același moment. Amândoi citesc „cel mai mare număr = 0”, amândoi atribuie AN26000001. Pentru propriile serii, Odoo are secvențe de bază de date. La un număr construit de noi lipsește acest lucru, iar pentru oferte și comenzi de achiziție Odoo nu are nici vreo verificare de unicitate pe nume: două documente cu același număr sunt pur și simplu salvate.
Protecția evidentă este o blocare. Modulul preia, pe companie, prefix și an, o blocare a bazei de date (PostgreSQL Advisory Lock), care se menține până la sfârșitul tranzacției. Al doilea utilizator așteaptă până când primul termină. Dar aceasta nu este suficientă, și am descoperit acest lucru printr-o încercare pe o copie a bazei de date de producție:
Odoo lucrează cu nivelul de izolare REPEATABLE READ. Starea bazei de date pe care o vede o tranzacție este înghețată la prima ei interogare. Utilizatorul B are această stare deja înainte ca A să termine. Dacă B așteaptă apoi blocarea și o primește, citește cu vechea stare „cel mai mare număr = 0” și atribuie numărul a doua oară. Blocarea a reglat ordinea, dar nu a actualizat cunoștințele.
Soluția este o a doua citire printr-o conexiune proprie, de scurtă durată, la baza de date, care vede toate rândurile deja confirmate. Câștigă cea mai mare dintre cele două valori. Prima citire rămâne necesară, deoarece doar ea cunoaște numerele pe care aceeași tranzacție le-a atribuit deja, dar încă nu le-a confirmat, de exemplu la importul mai multor documente deodată.
Am verificat acest lucru cu două tranzacții, în care a doua și-a preluat în mod dovedit starea înainte de commit-ul primei, apoi a așteptat blocarea. Fără a doua citire, ambele comenzi au primit același număr, cu ea, numerele 1 și 2.
Important pentru încadrare: această încercare este o verificare manuală. Ea nu face parte din testele automate, deoarece necesită două conexiuni reale la baza de date, pe care mediul de testare Odoo (o singură tranzacție pe test) nu le oferă.
Implementare tehnică
| Document | Punct de integrare |
|---|---|
| Ofertă | sale.order.create, dacă numele este gol, / sau New |
| Comandă client | sale.order.action_confirm, înainte de confirmarea standard |
| Factură, notă de credit | account.move._set_next_sequence, apelat la înregistrare |
| Aviz de livrare, recepție de marfă | stock.picking.create după tipul de operațiune |
| Comandă de achiziție | purchase.order.create |
- Contor. Cel mai mare număr este găsit de o expresie regulată (
^<Stamm>([0-9]{1,15})$, rădăcina este mascată) pe companie, inclusiv numele fără companie. - Facturi.
_set_next_sequencescrie numele și apelează_compute_split_sequence, pentru ca logica secvențelor din Odoo (prefix, număr, recunoașterea anului pentru următoarea factură a jurnalului) să rămână consecventă. - Setări. Câmpurile companiei
document_number_*sunt oglindite înres.config.settings. Setările resping prefixele cu spațiu sau cu o cifră la sfârșit. - Traducere. Traducerea în germană este inclusă.
Instalare și configurare
- Puneți directorul
document_number_prefix_yearîn calea addons. - Actualizați lista de aplicații, instalați modulul. Condiții prealabile sunt Vânzări, Achiziții, Stocuri și Contabilitate.
- La Setări → Numerotarea documentelor introduceți prefixele, formatul anului și numărul de cifre.
- Încercați mai întâi pe o copie. Numărul unui document nu mai poate fi resetat automat ulterior, iar la facturi numărul este legat de obligația de păstrare și de verificare.
Limite
- Ofertele sunt numerotate la creare. Ofertele șterse sau anulate lasă goluri. Același lucru este valabil pentru orice comandă client creată de un alt modul: coșurile de cumpărături din magazinul web (
website_sale) sunt comenzi în starea Ofertă și consumă câte un număr. Fără goluri sunt doar facturile și notele de credit, deoarece sunt numerotate la înregistrare. - Nu schimbați formatul anului în timpul funcționării. Cu rădăcina
AN26, modulul citește unAN2026000001existent ca pe contorul26000001. Stabiliți formatul înainte de primul document. - Contor de cel mult 15 cifre. Șirurile mai lungi de cifre după rădăcină sunt ignorate la căutarea celui mai mare număr.
- Fără serii separate pe jurnal sau depozit. Contorul se aplică pe companie, prefix și an. Mai multe jurnale de vânzări își împart contorul de facturi.
- Prefixele nu au voie să conțină spațiu și nu pot să se termine cu o cifră, altfel prefixul, anul și contorul nu mai pot fi separate.
- Doar tipurile de documente menționate sunt tratate.
Teste
Modulul vine cu zece teste automate. Ele verifică:
- Oferta și confirmarea: numărul ofertei și al comenzii, păstrarea numărului ofertei
- Continuarea numărării după un număr importat (
AN26119→AN26000120) - nicio renumerotare ulterioară a documentelor existente
- Factură, notă de credit și schimbarea anului după data facturii
- Comandă de achiziție și avize de livrare
- prefix gol: numărul standard din Odoo rămâne
- an din patru cifre
- Prefix cu caractere speciale
- mai multe numere într-o singură tranzacție
- șirurile foarte lungi de cifre sunt ignorate
Apel:
odoo-bin -d <baza-de-date-de-test> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init
Testele rulează cu tranzacții obișnuite. Comportamentul la crearea simultană de către doi utilizatori nu face parte din ele, a fost verificat manual pe o copie a bazei de date, așa cum s-a descris mai sus. Cine folosește modulul într-un sistem cu mulți utilizatori simultani ar trebui să repete această încercare pe propria bază de date.
Notă juridică privind numărul facturii
Conform § 11 UStG, facturile trebuie să poarte un număr consecutiv, atribuit o singură dată pentru identificarea facturii. Modulul numerotează facturile la înregistrare și cu un contor propriu pe prefix și an, ceea ce se potrivește. Dacă setarea dumneavoastră concretă (mai multe jurnale, note de credit cu prefix propriu, schimbarea anului) îndeplinește cerințele consultantului dumneavoastră fiscal, trebuie să clarificați cu acesta. Acest articol nu reprezintă consultanță juridică.
Întrebări frecvente
De ce nu adaptez pur și simplu seriile Odoo?
Pentru facturi, acest lucru este posibil prin prefixul jurnalului. La oferte, comenzi, avize de livrare și comenzi de achiziție nu există însă o schemă comună din prefix, an și contor cu schimbarea anului, iar contorul nu cunoaște numerele vechi importate. Aici intervine modulul.
Se suprascrie numerotarea existentă?
Nu. Modulul atribuie doar numere noi. Numele deja salvate rămân neschimbate, chiar și la dezactivare.
Cum îl dezactivez din nou?
Goliți prefixul tipului de document. Atunci Odoo îl numerotează din nou singur. Nici dezinstalarea nu modifică numerele deja atribuite.
Îl folosiți chiar dumneavoastră?
Nu. La noi rulează numerele standard din Odoo. Am verificat modulul cu testele automate și cu încercarea manuală descrisă, dar nu într-o exploatare reală cu mulți utilizatori.
Rulează cu Odoo 17 sau 18?
L-am testat doar cu Odoo 19.0 Community. Pentru alte versiuni se poate potrivi sau nu, nu l-am verificat.
Sub ce licență este?
Sub LGPL-3. Erorile și îmbunătățirile sunt binevenite ca issue în repository-ul GitHub .
Asistență din partea Biricon IT Services
Administrăm instalări Odoo pentru întreprinderi mici și mijlocii: de la implementare, prin personalizări și migrări, până la funcționarea curentă. Dacă doriți să vă păstrați numerele de documente la migrare, să verificați atribuirea numerelor sub sarcină sau să puneți în siguranță un modul ca acesta în instanța dumneavoastră de producție, vă ajutăm cu plăcere. Alte dezvoltări proprii: Firmenbuch și verificarea adreselor pentru clienți austrieci, Seturi de produse în ofertă ca secțiune și Web RBL, lista de blocare pentru traficul de atac.
Situație la: 3 noiembrie 2026. Versiunea modulului 19.0.1.0.0. Toate numerele din exemple și figuri sunt alese liber.