„AN26000001“ řekne více než „S00001“: jde o nabídku, pochází z roku 2026 a je první v pořadí. Mnoho firem, zejména těch, které přecházejí ze staršího systému na Odoo, si chce zachovat právě takové číslování dokladů. Samotné Odoo čísluje nabídky, prodejní objednávky a dodací listy vlastními řadami (S00001, WH/OUT/00001, P00001) a faktury pomocí prefixu účetního deníku a roku (INV/2026/00001).
Proto jsme pro Odoo 19 vytvořili modul Document Numbering by Prefix and Year (document_number_prefix_year). Je dostupný na GitHubu jako svobodný software pod licencí LGPL-3:
github.com/Alex0176/odoo-document-number-prefix-year
Na úvod otevřeně: V Biricon IT Services tento modul nepoužíváme. Zveřejňujeme jej, protože je hotový, zdokumentovaný a opatřený testy a může ostatním ušetřit práci. Pokud jej chcete používat, doporučujeme přečíst si části Omezení a Testy .
Schéma číslování
Každé číslo se skládá ze tří částí: prefixu pro daný typ dokladu, roku a pořadového čísla s pevným počtem číslic. Prefix, formát roku (26 nebo 2026) a počet číslic nastavíte pro každou společnost v nabídce Nastavení → Číslování dokladů.
Modul zpracovává nabídky, prodejní objednávky, vydané faktury a dobropisy, dodací listy, příjemky a nákupní objednávky. Prefixy na obrázku jsou pouze příklady: AN, AU, RE, GU, LI, WE, BE. Pokud necháte prefix prázdný, zůstane pro daný typ dokladu standardní číslování Odoo. Dokud tedy modul nenastavíte, nic nemění.
Jak se čísla chovají
- Každý rok od začátku. S příchodem nového roku začíná počítadlo opět od 1.
- Navázání na importovaná čísla. Modul vyhledá nejvyšší existující číslo se stejným prefixem a rokem bez ohledu na jeho délku. Pokud je v databázi ze starého systému číslo
AN26119, další nabídka dostane čísloAN26000120. Právě proto se modul hodí při přechodu na Odoo: staré doklady se importují s původními čísly a nové na ně plynule navážou. - Nové číslo objednávky při potvrzení. Potvrzená nabídka může podle nastavení získat číslo z řady prodejních objednávek. Číslo nabídky zůstane u objednávky zachováno v poli Číslo nabídky a je viditelné ve formuláři, seznamu i vyhledávání.
- Faktury při zaúčtování. Zákaznické faktury a dobropisy dostanou své číslo až při zaúčtování, nikoli při vytvoření. Smazané koncepty proto nezanechají mezeru. Rok se přebírá z data faktury: Faktura z 30. 12. 2025, která se zaúčtuje 2. 1. 2026, se jmenuje
RE25…. - Vše ostatní zůstává. Přijaté faktury, platby, účetní zápisy a výrobní příkazy si zachovávají standardní číselné řady Odoo. Existující označení se nikdy nepřepisují, ani když modul znovu vypnete.
Ošemetná situace: dva uživatelé současně
Vlastní přidělování čísel vypadá jednoduše: najít nejvyšší číslo a přičíst jedničku. Jakmile ale dva uživatelé vytvoří nabídku ve stejný okamžik, jednoduché už to není. Oba načtou „nejvyšší číslo = 0“ a oba přidělí AN26000001. Odoo k tomu u svých vlastních řad používá databázové sekvence. U vlastního číslování tento mechanismus chybí a navíc Odoo u nabídek a nákupních objednávek nekontroluje jedinečnost označení: dva doklady se stejným číslem se jednoduše uloží.
Jako ochrana se nabízí zámek. Modul pro každou kombinaci společnosti, prefixu a roku získá databázový zámek (PostgreSQL Advisory Lock), který drží až do konce transakce. Druhý uživatel čeká, dokud první neskončí. To ale nestačí, jak jsme zjistili pokusem na kopii produkční databáze:
Odoo pracuje s úrovní izolace REPEATABLE READ. Stav databáze, který transakce vidí, se při jejím prvním dotazu zafixuje. Uživatel B má tento stav už předtím, než A skončí. Pokud B následně čeká na zámek a získá jej, čte stále ze svého starého stavu „nejvyšší číslo = 0“ a přidělí stejné číslo podruhé. Zámek zajistil pořadí, ale neaktualizoval dostupné informace.
Řešením je druhé čtení přes samostatné krátkodobé databázové připojení, které vidí všechny již potvrzené řádky. Použije se vyšší z obou hodnot. První čtení je stále nutné, protože jen ono zná čísla, která tatáž transakce už přidělila, ale dosud nepotvrdila, například při hromadném importu více dokladů.
Ověřili jsme to dvěma transakcemi, z nichž si druhá prokazatelně načetla svůj stav před potvrzením první a pak čekala na zámek. Bez druhého čtení dostaly obě objednávky stejné číslo, s ním čísla 1 a 2.
Důležité pro posouzení: Tento pokus představuje ruční ověření. Není součástí automatických testů, protože vyžaduje dvě skutečná databázová připojení, která testovací prostředí Odoo (jedna transakce na test) neposkytuje.
Technické řešení
| Doklad | Místo napojení |
|---|---|
| Nabídka | sale.order.create, pokud je označení prázdné, / nebo New |
| Prodejní objednávka | sale.order.action_confirm, před standardním potvrzením |
| Faktura, dobropis | account.move._set_next_sequence, volá se při zaúčtování |
| Dodací list, příjemka | stock.picking.create podle typu operace |
| Nákupní objednávka | purchase.order.create |
- Pořadové číslo. Nejvyšší číslo se vyhledává regulárním výrazem (
^<Stamm>([0-9]{1,15})$, speciální znaky v základu se escapují) pro každou společnost zvlášť, včetně označení bez přiřazené společnosti. - Faktury. Metoda
_set_next_sequencezapíše označení a zavolá_compute_split_sequence, aby logika číselných řad v Odoo zůstala konzistentní (prefix, číslo a rozpoznání roku pro další fakturu v účetním deníku). - Nastavení. Pole společnosti
document_number_*se promítají dores.config.settings. Nastavení nepovoluje prefixy obsahující mezery nebo končící číslicí. - Překlad. Součástí je německý překlad.
Instalace a nastavení
- Umístěte složku
document_number_prefix_yeardo cesty pro doplňky. - Aktualizujte seznam aplikací a nainstalujte modul. Podmínkou jsou aplikace Prodej, Nákup, Sklad a Účetnictví.
- V nabídce Nastavení → Číslování dokladů zadejte prefixy, formát roku a počet číslic.
- Nejprve vyzkoušejte na kopii. Číslo dokladu později nelze automaticky vrátit do původního stavu a u faktur se k číslu váže povinnost uchovávání a kontroly.
Omezení
- Nabídky se číslují při vytvoření. Smazané nebo zrušené nabídky zanechávají v číselné řadě mezery. Totéž platí pro každou prodejní objednávku vytvořenou jiným modulem: nákupní košíky e-shopu (
website_sale) jsou objednávky ve stavu Nabídka a každý z nich spotřebuje jedno číslo. Souvislou číselnou řadu mají pouze faktury a dobropisy, protože se číslují při zaúčtování. - Neměňte formát roku za provozu. Se základem
AN26přečte modul existující čísloAN2026000001jako pořadové číslo26000001. Formát nastavte před vytvořením prvního dokladu. - Pořadové číslo smí mít nejvýše 15 číslic. Delší řetězce číslic za základem se při hledání nejvyššího čísla ignorují.
- Žádné samostatné řady pro jednotlivé účetní deníky nebo sklady. Počítadlo platí pro každou kombinaci společnosti, prefixu a roku. Více prodejních deníků sdílí stejné počítadlo faktur.
- Prefixy nesmějí obsahovat mezery ani končit číslicí, jinak od sebe nelze oddělit prefix, rok a pořadové číslo.
- Zpracovávají se pouze uvedené typy dokladů.
Testy
Modul obsahuje deset automatických testů. Ověřují:
- nabídku a její potvrzení: číslo nabídky a objednávky, zachování čísla nabídky
- pokračování číslování po importovaném čísle (
AN26119→AN26000120) - žádné dodatečné přečíslování stávajících dokladů
- faktura, dobropis a přechod na nový rok podle data faktury
- nákupní objednávka a dodací listy
- prázdný prefix: zůstává standardní číslo Odoo
- čtyřmístný rok
- prefix se speciálními znaky
- více čísel v jedné transakci
- velmi dlouhé řetězce číslic se ignorují
Spuštění:
odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init
Testy probíhají v běžných transakcích. Chování při souběžném vytváření dvěma uživateli do nich zahrnuto není; ověřili jsme je ručně na kopii databáze, jak je popsáno výše. Pokud modul nasadíte v systému s mnoha současně pracujícími uživateli, měli byste tento pokus zopakovat na vlastní databázi.
Právní upozornění k číslu faktury
Podle § 11 UStG musí mít faktury pořadové číslo, které je pro identifikaci faktury přiděleno pouze jednou. Modul čísluje faktury při zaúčtování a používá samostatné počítadlo pro každý prefix a rok, což tomuto požadavku odpovídá. Zda vaše konkrétní nastavení (více účetních deníků, dobropisy s vlastním prefixem, přechod na nový rok) splňuje požadavky vašeho daňového poradce, musíte projednat přímo s ním. Tento článek nepředstavuje právní poradenství.
Časté dotazy
Proč jednoduše neupravit číselné řady Odoo?
U faktur to lze provést pomocí prefixu účetního deníku. Pro nabídky, prodejní objednávky, dodací listy a nákupní objednávky ale neexistuje společné schéma z prefixu, roku a pořadového čísla s přechodem na nový rok a počítadlo nezohledňuje importovaná stará čísla. Právě to modul řeší.
Přepíše se stávající číslování?
Ne. Modul přiděluje pouze nová čísla. Již uložená označení zůstávají beze změny, a to i po vypnutí modulu.
Jak modul zase vypnu?
Vymažte prefix u daného typu dokladu. Odoo pak opět použije vlastní číslování. Již přidělená čísla nezmění ani odinstalace.
Používáte modul sami?
Ne. U nás používáme standardní číslování Odoo. Modul jsme ověřili automatickými testy a popsaným ručním pokusem, ale ne v běžném provozu s mnoha uživateli.
Funguje s Odoo 17 nebo 18?
Testovali jsme jej pouze s Odoo 19.0 Community. S jinými verzemi může, ale nemusí fungovat; neověřovali jsme to.
Pod jakou licencí je dostupný?
Pod licencí LGPL-3. Hlášení chyb a návrhy na vylepšení formou issue v repozitáři na GitHubu vítáme.
Podpora od Biricon IT Services
Staráme se o instalace Odoo pro malé a střední podniky: od zavedení přes úpravy a migrace až po běžný provoz. Pokud si chcete při přechodu zachovat čísla dokladů, nechat ověřit přidělování čísel při zátěži nebo bezpečně nasadit podobný modul do produkčního prostředí, rádi vám pomůžeme. Další vlastní řešení: Obchodní rejstřík a ověřování adres rakouských zákazníků, Produktové sady jako sekce v nabídce a Web RBL, seznam pro blokování útočného provozu.
Stav k 3. listopadu 2026. Verze modulu 19.0.1.0.0. Všechna čísla v příkladech a na obrázcích jsou smyšlená.