Sari la conținut

Odoo 19: numere de documente din prefix, an și contor – modulul document_number_prefix_year și capcana creării simultane

3 noiembrie 2026 | Odoo 19 Community | Dezvoltare proprie
3 noiembrie 2026 de
Odoo 19: numere de documente din prefix, an și contor – modulul document_number_prefix_year și capcana creării simultane

Modulul Odoo 19 document_number_prefix_year: numere de documente din prefix, an și contor

„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.

Structura numărului de document AN26000001 din prefix, an și contor, cu tabel al tipurilor de documente

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 fi AN26000120. 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:

Desfășurarea în timp a doi utilizatori: fără a doua citire, amândoi atribuie același număr; cu a doua citire, al doilea primește numărul următor

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ă

DocumentPunct de integrare
Ofertăsale.order.create, dacă numele este gol, / sau New
Comandă clientsale.order.action_confirm, înainte de confirmarea standard
Factură, notă de creditaccount.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țiepurchase.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_sequence scrie 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 în res.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

  1. Puneți directorul document_number_prefix_year în calea addons.
  2. Actualizați lista de aplicații, instalați modulul. Condiții prealabile sunt Vânzări, Achiziții, Stocuri și Contabilitate.
  3. La Setări → Numerotarea documentelor introduceți prefixele, formatul anului și numărul de cifre.
  4. Î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

Șase limite ale modulului: coșuri de cumpărături, formatul anului, o serie pe companie, reguli de prefix, puține teste, doar documentele menționate

  • 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 un AN2026000001 existent ca pe contorul 26000001. 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.

Contactați-ne acum

Situație la: 3 noiembrie 2026. Versiunea modulului 19.0.1.0.0. Toate numerele din exemple și figuri sunt alese liber.