Továbbugrás a tartalomhoz

Odoo 19 bizonylatszámok előtagból, évből és számlálóból – a document_number_prefix_year modul és a csapda egyidejű létrehozásnál

2026. november 3. | Odoo 19 Community | Saját fejlesztés
2026. november 3. által
Odoo 19 bizonylatszámok előtagból, évből és számlálóból – a document_number_prefix_year modul és a csapda egyidejű létrehozásnál

Odoo 19 document_number_prefix_year modul: bizonylatszámok előtagból, évből és számlálóból

Az „AN26000001” többet mond, mint az „S00001”: ez egy ajánlat, 2026-ból származik, és az első. Sok vállalkozás, különösen azok, amelyek egy régebbi rendszerről térnek át az Odoóra, pontosan így szeretné megtartani a bizonylatszámait. Az Odoo maga a saját sorozataival számozza az ajánlatokat, megrendeléseket és szállítólevelet (S00001, WH/OUT/00001, P00001), a számlákat pedig a naplóelőtaggal és az évvel (INV/2026/00001).

Ehhez írtuk meg a Document Numbering by Prefix and Year modult (document_number_prefix_year) az Odoo 19-hez. Szabad szoftverként az LGPL-3 licenc alatt elérhető a GitHubon:

github.com/Alex0176/odoo-document-number-prefix-year

Előzetes őszinte besorolás: A modult a Biricon IT Services-nél nem használjuk. Azért tesszük közzé, mert kész, dokumentált és teszteléssel ellátott, és másoknak munkát takaríthat meg. Aki használja, annak érdemes elolvasnia a Korlátok és Tesztek című szakaszt.

A számozási séma

Minden szám három részből áll: bizonylattípusonként egy előtagból, az évből és egy rögzített számjegyszámú számlálóból. Az előtagot, az évformátumot (26 vagy 2026) és a számjegyek számát cégenként a Beállítások → Bizonylatszámozás alatt adja meg.

Az AN26000001 bizonylatszám felépítése előtagból, évből és számlálóból, a bizonylattípusok táblázatával

Kezeli az ajánlatokat, az ügyfélmegrendeléseket, az ügyfélszámlákat és a jóváírásokat, a szállítóleveleket, az áruátvételeket és a beszerzési megrendeléseket. Az ábrán szereplő előtagok csak példák: AN, AU, RE, GU, LI, WE, BE. Aki egy előtagot üresen hagy, annál a bizonylattípusnál az Odoo szabványos számozása marad. A modul tehát addig nem csinál semmit, amíg be nem állítja.

Hogyan viselkednek a számok

  • Minden évben újra. A számláló az évváltással ismét 1-nél kezdődik.
  • Folytatás az importált számok után. A modul megkeresi az azonos előtagú és évű legmagasabb meglévő számot, függetlenül attól, milyen hosszú. Ha a régi rendszerből az AN26119 van az adatbázisban, a következő ajánlat AN26000120 lesz. Ezért alkalmas a modul átállásokhoz: a régi bizonylatok eredeti számaikkal kerülnek importálásra, az újak pedig zökkenőmentesen csatlakoznak.
  • Új megrendelésszám megerősítéskor. A megerősített ajánlat kívánságra a megrendelési sorozatból kap számot. Az ajánlatszám a megrendelés Ajánlatszám mezőjében megmarad, és látható az űrlapon, a listában és a keresésben.
  • Számlák könyveléskor. Az ügyfélszámlák és a jóváírások csak könyveléskor kapják meg a számukat, nem létrehozáskor. A törölt piszkozatok ezért nem hagynak hézagot. Az év a számla dátumából származik: egy 2025.12.30-i számla, amelyet 2026.1.2-án könyvelnek, RE25… lesz.
  • Minden más marad. A szállítói számlák, a kifizetések, a könyvelési tételek és a gyártási megrendelések megtartják az Odoo szabványos sorozatait. A meglévő neveket soha nem írja át, akkor sem, ha a modult újra kikapcsolja.

A kényes rész: két felhasználó egyszerre

A saját számkiosztás egyszerűnek tűnik: megkeresni a legmagasabb számot, hozzáadni egyet. De nem az, amint két felhasználó ugyanabban a pillanatban hoz létre ajánlatot. Mindketten azt olvassák, hogy „legmagasabb szám = 0”, mindketten az AN26000001 számot adják ki. Az Odoo a saját sorozataihoz adatbázis-szekvenciákat használ. Egy saját építésű számnál ez hiányzik, az ajánlatoknál és a beszerzési megrendeléseknél pedig az Odoóban ráadásul nincs egyediségellenőrzés a néven: két azonos számú bizonylatot egyszerűen elment.

A kézenfekvő védelem egy zár. A modul cégenként, előtagonként és évenként az adatbázis egy zárját (PostgreSQL Advisory Lock) veszi igénybe, amely a tranzakció végéig tart. A második felhasználó megvárja, amíg az első végez. Ez azonban nem elég, és ezt egy kísérlettel találtuk meg az éles adatbázis egy másolatán:

Két felhasználó időbeli lefolyása: második olvasás nélkül mindketten ugyanazt a számot adják ki, második olvasással a második a következő számot kapja

Az Odoo a REPEATABLE READ izolációs szinttel dolgozik. Az adatbázis állapota, amelyet egy tranzakció lát, az első lekérdezésénél befagy. A B felhasználónak ez az állapota már megvan, mielőtt az A végezne. Ha B ezután megvárja a zárat, és megkapja, a régi állapotával azt olvassa, hogy „legmagasabb szám = 0”, és a számot másodszor is kiadja. A zár a sorrendet szabályozta, de a tudást nem frissítette.

A megoldás egy második olvasás saját, rövid életű adatbázis-kapcsolaton keresztül, amely az összes már megerősített sort látja. A két érték közül a nagyobbik nyer. Az első olvasásra továbbra is szükség van, mert csak ő ismeri azokat a számokat, amelyeket ugyanez a tranzakció már kiadott, de még nem erősített meg, például több bizonylat egyszerre történő importálásakor.

Ezt két tranzakcióval ellenőriztük, amelyek közül a második igazolhatóan az első commitja előtt húzta le az állapotát, majd a zárra várt. A második olvasás nélkül mindkét megrendelés ugyanazt a számot kapta, vele az 1-es és a 2-es számot.

Fontos a besoroláshoz: Ez a kísérlet kézi ellenőrzés. Nem része az automatikus teszteknek, mert ehhez két valódi adatbázis-kapcsolat szükséges, amelyet az Odoo tesztkörnyezete (tesztenként egyetlen tranzakció) nem biztosít.

Technikai megvalósítás

BizonylatBeépülési pont
Ajánlatsale.order.create, ha a név üres, / vagy New
Ügyfélmegrendeléssale.order.action_confirm, a szabványos megerősítés előtt
Számla, jóváírásaccount.move._set_next_sequence, könyveléskor hívódik meg
Szállítólevél, áruátvételstock.picking.create művelettípus szerint
Beszerzési megrendeléspurchase.order.create
  • Számláló. A legmagasabb számot egy reguláris kifejezés találja meg (^<Stamm>([0-9]{1,15})$, a tő maszkolva van) cégenként, a cég nélküli neveket is beleértve.
  • Számlák. A _set_next_sequence beírja a nevet, és meghívja a _compute_split_sequence metódust, hogy az Odoo sorozatlogikája (előtag, szám, évfelismerés a napló következő számlájához) következetes maradjon.
  • Beállítások. A document_number_* cégmezők a res.config.settings modellben tükröződnek. A beállítások elutasítják a szóközt tartalmazó vagy számjegyre végződő előtagokat.
  • Fordítás. A német fordítás mellékelve van.

Telepítés és beállítás

  1. A document_number_prefix_year mappát tegye az addons-útvonalba.
  2. Frissítse az alkalmazáslistát, telepítse a modult. Előfeltétel az Értékesítés, a Beszerzés, a Raktár és a Könyvelés.
  3. A Beállítások → Bizonylatszámozás alatt adja meg az előtagokat, az évformátumot és a számjegyek számát.
  4. Először egy másolaton próbálja ki. Egy bizonylat száma utólag nem forgatható vissza automatikusan, a számláknál pedig a számhoz megőrzési és ellenőrzési kötelezettség kapcsolódik.

Korlátok

A modul hat korlátja: webshop-kosarak, évformátum, cégenként egy sorozat, előtagszabályok, kevés teszt, csak a megnevezett bizonylatok

  • Az ajánlatok létrehozáskor kapnak számot. A törölt vagy sztornózott ajánlatok hézagokat hagynak. Ugyanez érvényes minden ügyfélmegrendelésre, amelyet egy másik modul hoz létre: a webshop kosarai (website_sale) Ajánlat állapotú megrendelések, és egyenként elhasználnak egy számot. Hézagmentesek csak a számlák és a jóváírások, mert ezek könyveléskor kapnak számot.
  • Az évformátumot ne módosítsa üzem közben. Az AN26 tővel a modul egy meglévő AN2026000001 számot a 26000001 számlálóként olvas. Az első bizonylat előtt rögzítse a formátumot.
  • A számláló legfeljebb 15 számjegyű. A tő után álló hosszabb számjegysorokat a legmagasabb szám keresésekor figyelmen kívül hagyja.
  • Nincsenek külön sorozatok naplónként vagy raktáranként. A számláló cégenként, előtagonként és évenként érvényes. Több értékesítési napló osztozik a számlaszámlálón.
  • Az előtagok nem tartalmazhatnak szóközt, és nem végződhetnek számjegyre, különben az előtag, az év és a számláló már nem választható szét.
  • Csak a megnevezett bizonylattípusokat kezeli.

Tesztek

A modul tíz automatikus tesztet tartalmaz. Ezek a következőket ellenőrzik:

  • Ajánlat és megerősítés: ajánlat- és megrendelésszám, az ajánlatszám megőrzése
  • Számolás tovább egy importált szám után (AN26119 → AN26000120)
  • a meglévő bizonylatok utólagos átszámozásának hiánya
  • Számla, jóváírás és évváltás a számla dátuma szerint
  • Beszerzési megrendelés és szállítólevelek
  • üres előtag: az Odoo szabványos száma marad
  • négyjegyű év
  • Előtag speciális karakterekkel
  • több szám egy tranzakcióban
  • a nagyon hosszú számjegysorokat figyelmen kívül hagyja

Hívás:

odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init

A tesztek szokásos tranzakciókkal futnak. A két felhasználó egyidejű létrehozásakor tapasztalható viselkedés nem tartozik ide, azt a fent leírtak szerint kézzel ellenőriztük egy adatbázismásolaton. Aki a modult sok egyidejű felhasználóval rendelkező rendszerben használja, ismételje meg ezt a kísérletet a saját adatbázisán.

Jogi megjegyzés a számlaszámhoz

A számláknak az UStG 11. §-a szerint folyamatos számot kell viselniük, amelyet a számla azonosítására egyedileg adnak ki. A modul a számlákat könyveléskor és előtagonként és évenként saját számlálóval számozza, ami ehhez illeszkedik. Hogy az Ön konkrét beállítása (több napló, saját előtagú jóváírások, évváltás) megfelel-e adótanácsadója követelményeinek, azt vele kell tisztáznia. Ez a cikk nem jogi tanácsadás.

Gyakori kérdések

Miért nem egyszerűen az Odoo-sorozatokat igazítjuk?

A számláknál ez a naplóelőtagon keresztül megoldható. Az ajánlatoknál, megrendeléseknél, szállítóleveleknél és rendeléseknél viszont nincs közös előtag–év–számláló séma évváltással, és a számláló nem ismeri az importált régi számokat. Itt kezd a modul.

Felülírja-e a meglévő számozást?

Nem. A modul csak új számokat ad ki. A már elmentett nevek változatlanok maradnak, kikapcsoláskor is.

Hogyan kapcsolom ki újra?

Ürítse ki a bizonylattípus előtagját. Ekkor az Odoo újra maga számozza. Az eltávolítás sem módosít kiadott számokat.

Önök használják?

Nem. Nálunk az Odoo szabványos számai futnak. A modult az automatikus tesztekkel és a leírt kézi kísérlettel ellenőriztük, de nem sok felhasználóval működő éles üzemben.

Fut Odoo 17-tel vagy 18-cal?

Csak az Odoo 19.0 Communityvel teszteltük. Más verziókhoz megfelelhet vagy sem, nem ellenőriztük.

Milyen licenc alatt áll?

Az LGPL-3 alatt. A hibákat és a fejlesztéseket issue-ként szívesen fogadjuk a következő helyen: GitHub-tároló .

A Biricon IT Services támogatása

Kis- és középvállalkozások Odoo-telepítéseit gondozzuk: a bevezetéstől a testreszabásokon és migrációkon át a folyamatos üzemeltetésig. Ha az átálláskor meg szeretné őrizni bizonylatszámait, terhelés alatt szeretné ellenőriztetni a számkiosztást, vagy egy ilyen modult szeretne biztonságosan élesbe vinni, szívesen segítünk. További saját fejlesztések: Cégjegyzék és címellenőrzés osztrák ügyfelekhez, Termékkészletek az ajánlatban szakaszként és Web RBL, a támadási forgalom tiltólistája.

Lépjen velünk kapcsolatba

Állapot: 2026. november 3. Modulverzió: 19.0.1.0.0. A példákban és ábrákon szereplő összes szám szabadon választott.