Přejít na obsah

Čísla dokladů v Odoo 19 z předpony, roku a čítače – modul document_number_prefix_year a past při současném vytváření

3. listopadu 2026 | Odoo 19 Community | Vlastní vývoj
3. listopadu 2026 od
Čísla dokladů v Odoo 19 z předpony, roku a čítače – modul document_number_prefix_year a past při současném vytváření

Modul document_number_prefix_year pro Odoo 19: čísla dokladů z předpony, roku a čítače

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

Struktura čísla dokladu AN26000001 z předpony, roku a čítače, s tabulkou druhů 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ídka AN26000120. 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:

Časový průběh dvou uživatelů: bez druhého čtení přidělí oba totéž číslo, s druhým čtením dostane druhý další číslo

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í

DokladMísto napojení
Nabídkasale.order.create, pokud je název prázdný, / nebo New
Zákaznická objednávkasale.order.action_confirm, před standardním potvrzením
Faktura, dobropisaccount.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ávkapurchase.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_sequence zapíš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í v res.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í

  1. Složku document_number_prefix_year vložit do cesty addonů.
  2. Aktualizovat seznam aplikací, nainstalovat modul. Předpokladem jsou Prodej, Nákup, Sklad a Účetnictví.
  3. V Nastavení → Číslování dokladů zadat předpony, formát roku a počet míst.
  4. 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

Šest omezení modulu: nákupní košíky, formát roku, jedna řada pro každou firmu, pravidla předpon, málo testů, pouze uvedené doklady

  • 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 AN26 modul přečte existující AN2026000001 jako čí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.

Kontaktujte nás nyní

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