„AN26000001“ říká víc než „S00001“: Je to nabídka, pochází z roku 2026 a je první. Mnoho firem, zejména těch, které přecházejí ze staršího systému na Odoo, chce svá čísla dokladů zachovat právě takto. Odoo samo čísluje nabídky, objednávky a dodací listy vlastními řadami (S00001, WH/OUT/00001, P00001) a faktury předponou deníku a rokem (INV/2026/00001).
Napsali jsme proto modul Document Numbering by Prefix and Year (document_number_prefix_year) pro Odoo 19. Je k dispozici jako svobodný software pod licencí LGPL-3 na GitHubu:
github.com/Alex0176/odoo-document-number-prefix-year
Předem upřímné zařazení: Modul ve společnosti Biricon IT Services nepoužíváme. Zveřejňujeme jej, protože je hotový, zdokumentovaný a opatřený testy a může druhým ušetřit práci. Kdo jej nasazuje, měl by si přečíst části o omezeních a Testy .
Schéma číslování
Každé číslo se skládá ze tří částí: z předpony pro každý druh dokladu, z roku a z čítače s pevným počtem míst. Předponu, formát roku (26 nebo 2026) a počet míst nastavíte pro každou firmu v Nastavení → Číslování dokladů.
Zpracovávají se nabídky, zákaznické objednávky, zákaznické faktury a dobropisy, dodací listy, příjemky zboží a nákupní objednávky. Předpony na obrázku jsou pouze příklady: AN, AU, RE, GU, LI, WE, BE. Kdo předponu nechá prázdnou, ponechá pro tento druh dokladu standardní číslování Odoo. Modul tedy nedělá nic, dokud jej nenastavíte.
Jak se čísla chovají
- Každý rok znovu. Čítač začíná při přelomu roku opět od 1.
- Navázání na importovaná čísla. Modul vyhledá nejvyšší existující číslo téže předpony a roku, bez ohledu na jeho délku. Pokud je v databázi ze starého systému
AN26119, bude další nabídkaAN26000120. To je důvod, proč se modul hodí pro přechody: Staré doklady se importují s původními čísly a nové doklady na ně plynule navazují. - Nové číslo objednávky při potvrzení. Potvrzená nabídka na přání dostane číslo z řady objednávek. Číslo nabídky zůstane zachováno v poli Číslo nabídky u objednávky a je viditelné ve formuláři, seznamu i ve 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á. Dodavatelské faktury, platby, účetní zápisy a výrobní zakázky si ponechávají standardní řady Odoo. Stávající názvy se nikdy nepřepisují, ani když modul opět vypnete.
Citlivá část: Dva uživatelé současně
Vlastní přidělování čísel vypadá jednoduše: najít nejvyšší číslo a přičíst jedničku. Jednoduché to ale není, jakmile dva uživatelé vytvoří nabídku ve stejnou chvíli. Oba přečtou „nejvyšší číslo = 0“, oba přidělí AN26000001. Odoo má pro své vlastní řady databázové sekvence. U vlastnoručně sestaveného čísla to chybí a pro nabídky a nákupní objednávky navíc v Odoo neexistuje kontrola jedinečnosti názvu: Dva doklady se stejným číslem se prostě uloží.
Nejzřejmější ochranou je zámek. Modul používá pro každou firmu, předponu a rok zámek databáze (PostgreSQL Advisory Lock), který platí do konce transakce. Druhý uživatel čeká, dokud první neskončí. To ale nestačí, a zjistili jsme to pokusem na kopii produkční databáze:
Odoo pracuje s úrovní izolace REPEATABLE READ. Stav databáze, který transakce vidí, se zafixuje při jejím prvním dotazu. Uživatel B tento stav má již předtím, než A skončí. Pokud B poté čeká na zámek a získá jej, přečte se svým starým stavem „nejvyšší číslo = 0“ a přidělí totéž číslo podruhé. Zámek upravil pořadí, ale neaktualizoval znalosti.
Řešením je druhé čtení prostřednictvím vlastního, krátkodobého databázového spojení, které vidí všechny již potvrzené řádky. Větší z obou hodnot vyhrává. První čtení zůstává nezbytné, protože pouze to zná čísla, která tatáž transakce již přidělila, ale ještě nepotvrdila, například při importu několika dokladů najednou.
Ověřili jsme to pomocí dvou transakcí, u nichž druhá prokazatelně získala svůj stav před commitem první a poté č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 zařazení: Tento pokus je ruční kontrola. Není součástí automatických testů, protože k tomu jsou zapotřebí dvě skutečná databázová spojení, která testovací prostředí Odoo (jediná transakce na test) neposkytuje.
Technické provedení
| Doklad | Místo napojení |
|---|---|
| Nabídka | sale.order.create, pokud je název prázdný, / nebo New |
| Zákaznická 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říjem zboží | stock.picking.create podle typu operace |
| Nákupní objednávka | purchase.order.create |
- Čítač. Nejvyšší číslo najde regulární výraz (
^<základ>([0-9]{1,15})$, základ se maskuje) pro každou firmu, včetně názvů bez firmy. - Faktury.
_set_next_sequencezapíše název a volá_compute_split_sequence, aby logika sekvencí Odoo (předpona, číslo, rozpoznání roku pro další fakturu deníku) zůstala konzistentní. - Nastavení. Pole firmy
document_number_*se zrcadlí vres.config.settings. Nastavení odmítá předpony s mezerou nebo s číslicí na konci. - Překlad. Německý překlad je součástí.
Instalace a nastavení
- Složku
document_number_prefix_yearvložit do cesty addonů. - Aktualizovat seznam aplikací, nainstalovat modul. Předpokladem jsou Prodej, Nákup, Sklad a Účetnictví.
- V Nastavení → Číslování dokladů zadat předpony, formát roku a počet míst.
- Nejprve vyzkoušet na kopii. Číslo dokladu nelze později automaticky vrátit zpět a u faktur je s číslem spojena povinnost uchovávání a kontroly.
omezeních
- Nabídky se číslují při vytvoření. Smazané nebo stornované nabídky zanechávají mezery. Totéž platí pro každou zákaznickou objednávku, kterou vytvoří jiný modul: Nákupní košíky e-shopu (
website_sale) jsou objednávky ve stavu Nabídka a spotřebují vždy jedno číslo. Bez mezer jsou pouze faktury a dobropisy, protože se číslují při zaúčtování. - Formát roku neměnit za provozu. Se základem
AN26modul přečte existujícíAN2026000001jako čítač26000001. Formát určete před prvním dokladem. - Čítač nejvýše 15 míst. Delší posloupnosti číslic za základem se při hledání nejvyššího čísla ignorují.
- Žádné oddělené řady pro každý deník nebo sklad. Čítač platí pro každou firmu, předponu a rok. Více prodejních deníků sdílí čítač faktur.
- Předpony nesmějí obsahovat mezeru a nesmějí končit číslicí, jinak již nelze předponu, rok a čítač oddělit.
- Zpracovávají se pouze uvedené druhy dokladů.
Testy
Modul obsahuje deset automatických testů. Ověřují:
- Nabídka a potvrzení: číslo nabídky a objednávky, zachování čísla nabídky
- Pokračování v číslování po importovaném čísle (
AN26119→AN26000120) - žádné dodatečné přečíslování existujících dokladů
- Faktura, dobropis a přelom roku podle data faktury
- Nákupní objednávka a dodací listy
- prázdná předpona: standardní číslo Odoo zůstává
- čtyřmístný rok
- Předpona se zvláštními znaky
- více čísel v jedné transakci
- velmi dlouhé posloupnosti čí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 běží s běžnými transakcemi. Chování při současném vytváření dvěma uživateli k nim nepatří, bylo ověřeno ručně na kopii databáze, jak je popsáno výše. Kdo modul nasazuje v systému s mnoha současnými uživateli, měl by tento pokus zopakovat na vlastní databázi.
Právní upozornění k číslu faktury
Faktury musí podle § 11 UStG nést průběžné číslo, které se přiděluje jednou k identifikaci faktury. Modul čísluje faktury při zaúčtování a s vlastním čítačem pro každou předponu a rok, což s tím souhlasí. Zda vaše konkrétní nastavení (více deníků, dobropisy s vlastní předponou, přelom roku) splňuje požadavky vašeho daňového poradce, musíte s ním vyjasnit. Tento článek není právním poradenstvím.
Časté dotazy
Proč prostě neupravit řady Odoo?
U faktur to jde prostřednictvím předpony deníku. U nabídek, objednávek, dodacích listů a objednávek však neexistuje společné schéma z předpony, roku a čítače s přelomem roku a čítač nezná importovaná stará čísla. Právě zde modul zasahuje.
Přepisuje se stávající číslování?
Ne. Modul přiděluje pouze nová čísla. Již uložené názvy zůstávají beze změny, i při vypnutí.
Jak jej opět vypnu?
Vyprázdněte předponu druhu dokladu. Pak jej Odoo opět čísluje samo. Ani odinstalace nemění již přidělená čísla.
Používáte jej sami?
Ne. U nás běží standardní čísla Odoo. Modul jsme ověřili automatickými testy a popsaným ručním pokusem, ale nikoli v běžném provozu s mnoha uživateli.
Funguje s Odoo 17 nebo 18?
Testovali jsme jej pouze s Odoo 19.0 Community. Pro jiné verze může, ale nemusí vyhovovat, neověřovali jsme to.
Pod jakou licencí je vydán?
Pod LGPL-3. Chyby a vylepšení jsou vítány formou issue v repozitáři GitHub .
Podpora od Biricon IT Services
Spravujeme instalace Odoo pro malé a střední podniky: od zavedení přes úpravy a migrace až po průběžný provoz. Pokud chcete při přechodu zachovat svá čísla dokladů, nechat si prověřit přidělování čísel pod zátěží nebo bezpečně nasadit modul, jako je tento, do své produkční instance, rádi vám pomůžeme. Další vlastní vývoj: Obchodní rejstřík a ověření adres pro rakouské zákazníky, Produktové sady v nabídce jako sekce a Web RBL, blokovací seznam pro útočný provoz.
Stav k 3. listopadu 2026. Verze modulu 19.0.1.0.0. Všechna čísla v příkladech a na obrázcích jsou zvolena libovolně.