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.
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
AN26119van az adatbázisban, a következő ajánlatAN26000120lesz. 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:
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
| Bizonylat | Beépülési pont |
|---|---|
| Ajánlat | sale.order.create, ha a név üres, / vagy New |
| Ügyfélmegrendelés | sale.order.action_confirm, a szabványos megerősítés előtt |
| Számla, jóváírás | account.move._set_next_sequence, könyveléskor hívódik meg |
| Szállítólevél, áruátvétel | stock.picking.create művelettípus szerint |
| Beszerzési megrendelés | purchase.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_sequencebeírja a nevet, és meghívja a_compute_split_sequencemetó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 ares.config.settingsmodellben 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
- A
document_number_prefix_yearmappát tegye az addons-útvonalba. - 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.
- A Beállítások → Bizonylatszámozás alatt adja meg az előtagokat, az évformátumot és a számjegyek számát.
- 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
- 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
AN26tővel a modul egy meglévőAN2026000001számot a26000001szá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.
Állapot: 2026. november 3. Modulverzió: 19.0.1.0.0. A példákban és ábrákon szereplő összes szám szabadon választott.