Gå til indhold

Odoo 19-bilagsnumre af præfiks, år og tæller – modulet document_number_prefix_year og fælden ved samtidig oprettelse

3. november 2026 | Odoo 19 Community | Egenudvikling
3. november 2026 af
Odoo 19-bilagsnumre af præfiks, år og tæller – modulet document_number_prefix_year og fælden ved samtidig oprettelse

Odoo 19-modulet document_number_prefix_year: bilagsnumre af præfiks, år og tæller

»AN26000001« siger mere end »S00001«: Det er et tilbud, det stammer fra 2026, og det er det første. Mange virksomheder, især dem, der skifter fra et ældre system til Odoo, vil bevare deres bilagsnumre netop sådan. Odoo selv nummererer tilbud, ordrer og følgesedler med egne rækker (S00001, WH/OUT/00001, P00001) og fakturaer med journalpræfikset og året (INV/2026/00001).

Vi har til det formål skrevet modulet Document Numbering by Prefix and Year (document_number_prefix_year) til Odoo 19. Det er tilgængeligt som fri software under LGPL-3-licensen på GitHub:

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

En ærlig indledende vurdering: Vi bruger ikke modulet hos Biricon IT Services. Vi offentliggør det, fordi det er færdigt, dokumenteret og forsynet med tests og kan spare andre for arbejde. Den, der bruger det, bør læse afsnittene om begrænsninger og Tests .

Nummerskemaet

Hvert nummer består af tre dele: et præfiks pr. bilagstype, året og en tæller med fast antal cifre. Præfikset, årsformatet (26 eller 2026) og antallet af cifre indstiller du pr. virksomhed under Indstillinger → Bilagsnummerering.

Opbygning af bilagsnummeret AN26000001 af præfiks, år og tæller, med tabel over bilagstyper

Der behandles tilbud, kundeordrer, kundefakturaer og kreditnotaer, følgesedler, varemodtagelser og indkøbsordrer. Præfiksene i illustrationen er kun eksempler: AN, AU, RE, GU, LI, WE, BE. Den, der lader et præfiks stå tomt, beholder Odoos standardnummerering for denne bilagstype. Modulet gør altså ingenting, før du indstiller det.

Hvordan numrene opfører sig

  • Hvert år påny. Tælleren begynder igen ved 1 ved årsskiftet.
  • Videre efter importerede numre. Modulet søger det højeste eksisterende nummer med samme præfiks og år, uanset hvor langt det er. Ligger AN26119 fra det gamle system i databasen, lyder det næste tilbud AN26000120. Det er grunden til, at modulet egner sig til systemskift: Gamle bilag importeres med deres originale numre, og nye bilag knytter sig sømløst an.
  • Nyt ordrenummer ved bekræftelse. Et bekræftet tilbud får efter ønske et nummer fra ordrerækken. Tilbudsnummeret bevares i feltet Tilbudsnummer på ordren og er synligt i formular, liste og søgning.
  • Fakturaer ved bogføring. Kundefakturaer og kreditnotaer får først deres nummer ved bogføringen, ikke ved oprettelsen. Slettede kladder efterlader derfor intet hul. Året stammer fra fakturadatoen: En faktura fra 30.12.2025, der bogføres den 2.1.2026, hedder RE25….
  • Alt andet forbliver. Leverandørfakturaer, betalinger, posteringer og produktionsordrer beholder Odoos standardrækker. Eksisterende navne omskrives aldrig, heller ikke hvis du slår modulet fra igen.

Den vanskelige del: to brugere på samme tid

En egen nummertildeling ser enkel ud: find det højeste nummer, læg én til. Det er den ikke, så snart to brugere opretter et tilbud i samme øjeblik. Begge læser »højeste nummer = 0«, begge tildeler AN26000001. Odoo har til sine egne rækker databasesekvenser. Ved et selvbygget nummer mangler det, og for tilbud og indkøbsordrer findes der i Odoo desuden ingen entydighedskontrol på navnet: To bilag med samme nummer bliver blot gemt.

Den nærliggende beskyttelse er en spærring. Modulet tager pr. virksomhed, præfiks og år en spærring i databasen (PostgreSQL Advisory Lock), som holder til transaktionens afslutning. Den anden bruger venter, til den første er færdig. Men det rækker ikke, og vi fandt det ved et forsøg på en kopi af produktionsdatabasen:

Tidsforløb for to brugere: uden anden læsning tildeler begge det samme nummer, med anden læsning får den anden det næste nummer

Odoo arbejder med isolationsniveauet REPEATABLE READ. Det databaseindhold, en transaktion ser, fryses ved dens første forespørgsel. Bruger B har dette indhold allerede, før A er færdig. Venter B derefter på spærringen og får den, læser han med sit gamle indhold »højeste nummer = 0« og tildeler nummeret en gang til. Spærringen har ordnet rækkefølgen, men ikke opdateret viden.

Løsningen er en anden læsning via en separat, kortlivet databaseforbindelse, som ser alle allerede bekræftede rækker. Den største af de to værdier vinder. Den første læsning er stadig nødvendig, for kun den kender numre, som samme transaktion allerede har tildelt, men endnu ikke bekræftet, f.eks. ved import af flere bilag i ét hug.

Vi har afprøvet det med to transaktioner, hvor den anden beviseligt hentede sit indhold før den førstes commit og derefter ventede på spærringen. Uden den anden læsning fik begge ordrer samme nummer, med den fik de numrene 1 og 2.

Vigtigt for vurderingen: Dette forsøg er en manuel kontrol. Det er ikke en del af de automatiske tests, fordi det kræver to rigtige databaseforbindelser, som Odoos testmiljø (én enkelt transaktion pr. test) ikke stiller til rådighed.

Teknisk implementering

BilagTilkoblingspunkt
Tilbudsale.order.create, hvis navnet er tomt, / eller New
Kundeordresale.order.action_confirm, før standardbekræftelsen
Faktura, kreditnotaaccount.move._set_next_sequence, kaldes ved bogføring
Følgeseddel, varemodtagelsestock.picking.create efter operationstype
Indkøbsordrepurchase.order.create
  • Tæller. Det højeste nummer findes af et regulært udtryk (^<Stamm>([0-9]{1,15})$, stammen maskeres) pr. virksomhed, navne uden virksomhed inklusive.
  • Fakturaer. _set_next_sequence skriver navnet og kalder _compute_split_sequence, så Odoos sekvenslogik (præfiks, nummer, årsgenkendelse til journalens næste faktura) forbliver konsistent.
  • Indstillinger. Virksomhedsfelterne document_number_* afspejles i res.config.settings. Indstillingerne afviser præfikser med mellemrum eller et ciffer til sidst.
  • Oversættelse. Tysk oversættelse er inkluderet.

Installation og opsætning

  1. Læg mappen document_number_prefix_year i addons-stien.
  2. Opdater app-listen, installér modulet. Forudsætninger er Salg, Indkøb, Lager og Bogholderi.
  3. Indtast præfikser, årsformat og antal cifre under Indstillinger → Bilagsnummerering.
  4. Afprøv først på en kopi. Et bilags nummer kan senere ikke automatisk rulles tilbage, og ved fakturaer er der knyttet opbevarings- og kontrolpligt til nummeret.

begrænsninger

Seks begrænsninger ved modulet: indkøbskurve, årsformat, én serie pr. virksomhed, præfiksregler, få tests, kun nævnte bilag

  • Tilbud nummereres ved oprettelsen. Slettede eller annullerede tilbud efterlader huller. Det samme gælder enhver kundeordre, som et andet modul opretter: Webshoppens indkøbskurve (website_sale) er ordrer i status Tilbud og bruger hver et nummer. Kun fakturaer og kreditnotaer er uden huller, fordi de nummereres ved bogføringen.
  • Skift ikke årsformatet under drift. Med stammen AN26 læser modulet en eksisterende AN2026000001 som tælleren 26000001. Fastlæg formatet før det første bilag.
  • Tæller højst 15 cifre. Længere ciffer-rækker efter stammen ignoreres ved søgningen efter det højeste nummer.
  • Ingen adskilte serier pr. journal eller lager. Tælleren gælder pr. virksomhed, præfiks og år. Flere salgsjournaler deler fakturatælleren.
  • Præfikser må ikke indeholde mellemrum og ikke ende på et ciffer, ellers kan præfiks, år og tæller ikke længere adskilles.
  • Kun de nævnte bilagstyper behandles.

Tests

Modulet leveres med ti automatiske tests. De kontrollerer:

  • Tilbud og bekræftelse: tilbuds- og ordrenummer, bevarelse af tilbudsnummeret
  • Videretælling efter et importeret nummer (AN26119 → AN26000120)
  • ingen efterfølgende omnummerering af eksisterende bilag
  • Faktura, kreditnota og årsskifte efter fakturadato
  • Indkøbsordre og følgesedler
  • tomt præfiks: Odoos standardnummer bevares
  • firecifret år
  • Præfiks med specialtegn
  • flere numre i én transaktion
  • meget lange ciffer-rækker ignoreres

Kald:

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

Testene kører med almindelige transaktioner. Adfærden ved samtidig oprettelse fra to brugere hører ikke med, den blev som beskrevet ovenfor afprøvet i hånden på en databasekopi. Den, der bruger modulet i et system med mange samtidige brugere, bør gentage dette forsøg på sin egen database.

Juridisk bemærkning om fakturanummeret

Fakturaer skal efter § 11 UStG bære et fortløbende nummer, som tildeles én gang til identifikation af fakturaen. Modulet nummererer fakturaer ved bogføringen og med egen tæller pr. præfiks og år, hvilket passer hertil. Om din konkrete opsætning (flere journaler, kreditnotaer med eget præfiks, årsskifte) opfylder din skatterådgivers krav, skal du afklare med vedkommende. Dette indlæg er ikke juridisk rådgivning.

Ofte stillede spørgsmål

Hvorfor ikke blot tilpasse Odoos rækker?

For fakturaer kan det lade sig gøre via journalpræfikset. For tilbud, ordrer, følgesedler og bestillinger findes der imidlertid intet fælles skema af præfiks, år og tæller med årsskifte, og tælleren kender ikke importerede gamle numre. Det er her, modulet sætter ind.

Bliver eksisterende nummerering overskrevet?

Nej. Modulet tildeler kun nye numre. Allerede gemte navne forbliver uændrede, også ved frakobling.

Hvordan slår jeg det fra igen?

Tøm præfikset for bilagstypen. Så nummererer Odoo den igen selv. Også afinstallation ændrer ingen tildelte numre.

Bruger I det selv?

Nej. Hos os kører Odoos standardnumre. Vi har afprøvet modulet med de automatiske tests og det beskrevne manuelle forsøg, men ikke i en kørende drift med mange brugere.

Kører det med Odoo 17 eller 18?

Vi har kun testet det med Odoo 19.0 Community. Til andre versioner kan det passe eller ej, det har vi ikke undersøgt.

Under hvilken licens udgives det?

Under LGPL-3. Fejl og forbedringer er velkomne som issue i GitHub-repositoryet .

Støtte fra Biricon IT Services

Vi passer Odoo-installationer for små og mellemstore virksomheder: fra implementering over tilpasninger og migreringer til den løbende drift. Hvis du ved skiftet vil bevare dine bilagsnumre, få nummertildelingen kontrolleret under belastning eller sikkert bringe et modul som dette ind i din produktionsinstans, hjælper vi gerne. Flere egenudviklinger: Firmenbuch og adressekontrol for østrigske kunder, Produktsæt i tilbuddet som sektion og Web RBL, spærrelisten for angrebstrafik.

Kontakt os nu

Status: 3. november 2026. Modulversion 19.0.1.0.0. Alle numre i eksemplerne og illustrationerne er frit valgt.