Gå til indhold

Odoo 19: Bilagsnumre med præfiks, år og tæller – modulet document_number_prefix_year og faldgruben ved samtidig oprettelse

3. november 2026 | Odoo 19 Community | Egenudvikling
3. november 2026 af
Odoo 19: Bilagsnumre med præfiks, år og tæller – modulet document_number_prefix_year og faldgruben ved samtidig oprettelse

Odoo 19-modulet document_number_prefix_year: Bilagsnumre med præfiks, årstal og løbenummer

»AN26000001« fortæller mere end »S00001«: Det er et tilbud, det er fra 2026, og det er det første. Mange virksomheder, især dem, der skifter fra et ældre system til Odoo, ønsker at bevare netop denne opbygning af deres bilagsnumre. Odoo nummererer som standard tilbud, ordrer og følgesedler med hver deres nummerserie (S00001, WH/OUT/00001, P00001) og fakturaer med journalens præfiks og året (INV/2026/00001).

Til det formål har vi udviklet 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

Først en ærlig vurdering: Vi bruger ikke modulet hos Biricon IT Services. Vi udgiver det, fordi det er færdigt, dokumenteret og forsynet med tests og kan spare andre for arbejde. Hvis du vil bruge det, bør du læse afsnittene om begrænsninger og tests igennem.

Nummerformatet

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

Bilagsnummeret AN26000001 opbygget af præfiks, år og tæller, med en tabel over bilagstyperne

Modulet håndterer tilbud, salgsordrer, kundefakturaer og kreditnotaer, følgesedler, varemodtagelser og indkøbsordrer. Præfikserne i illustrationen er kun eksempler: AN, AU, RE, GU, LI, WE, BE. Hvis et præfiks er tomt, bevares Odoos standardnummerering for den pågældende bilagstype. Modulet gør altså ikke noget, før det er sat op.

Sådan fungerer nummereringen

  • Forfra hvert år. Tælleren starter igen ved 1 ved årsskiftet.
  • Fortsætter efter importerede numre. Modulet finder det højeste eksisterende nummer med samme præfiks og år, uanset hvor langt det er. Hvis AN26119 fra det gamle system ligger i databasen, får det næste tilbud nummeret AN26000120. Derfor egner modulet sig til systemskift: Gamle bilag importeres med deres oprindelige numre, og nye bilag fortsætter nummereringen uden afbrydelser.
  • Nyt ordrenummer ved bekræftelse. Et bekræftet tilbud kan efter ønske få et nummer fra ordrenummerserien. Tilbudsnummeret bevares i feltet Tilbudsnummer på ordren og er synligt i formularen, listen og søgningen.
  • Fakturaer nummereres ved bogføring. Kundefakturaer og kreditnotaer får først deres nummer ved bogføring, ikke ved oprettelse. Slettede kladder efterlader derfor ingen huller. Året hentes fra fakturadatoen: En faktura dateret 30.12.2025, som bogføres den 2.1.2026, får nummeret RE25….
  • Alt andet bevares. Leverandørfakturaer, betalinger, posteringer og produktionsordrer beholder Odoos standardnummerserier. Eksisterende navne ændres aldrig, heller ikke hvis du deaktiverer modulet igen.

Det vanskelige: To brugere på samme tid

Det virker enkelt at lave sin egen nummerering: Find det højeste nummer, og læg én til. Men det er ikke så enkelt, når to brugere opretter et tilbud på samme tid. Begge læser »højeste nummer = 0«, og begge tildeler AN26000001. Odoo bruger databasesekvenser til sine egne nummerserier. Det har en hjemmelavet nummerering ikke, og for tilbud og indkøbsordrer har Odoo desuden ingen kontrol af, om navnet er entydigt: To bilag med samme nummer bliver ganske enkelt gemt.

Den oplagte beskyttelse er en lås. Modulet tager en databaselås (PostgreSQL Advisory Lock) for hver kombination af virksomhed, præfiks og år, som holdes indtil transaktionens afslutning. Den anden bruger venter, til den første er færdig. Men det er ikke nok, og det opdagede vi ved et forsøg på en kopi af produktionsdatabasen:

Tidsforløb for to brugere: Uden en ekstra læsning tildeler begge det samme nummer; med en ekstra læsning får den anden det næste nummer

Odoo arbejder med isolationsniveauet REPEATABLE READ. Den databasetilstand, som en transaktion ser, fastlåses ved dens første forespørgsel. Bruger B har allerede fået dette øjebliksbillede, før A er færdig. Hvis B derefter venter på låsen og får den, læser B stadig »højeste nummer = 0« i sit gamle øjebliksbillede og tildeler nummeret igen. Låsen har styret rækkefølgen, men ikke opdateret de tilgængelige oplysninger.

Løsningen er en ekstra læsning via en separat, kortvarig databaseforbindelse, som kan se alle allerede committede rækker. Den højeste af de to værdier bruges. Den første læsning er stadig nødvendig, for kun den kender de numre, som den samme transaktion allerede har tildelt, men endnu ikke committet, for eksempel ved import af flere bilag på én gang.

Vi har kontrolleret det med to transaktioner, hvor den anden beviseligt havde hentet sit øjebliksbillede, før den første blev committet, og derefter ventede på låsen. Uden den ekstra læsning fik begge ordrer det 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 reelle databaseforbindelser, som Odoos testmiljø med én enkelt transaktion pr. test ikke stiller til rådighed.

Teknisk implementering

BilagIntegrationspunkt
Tilbudsale.order.create, når navnet er tomt, / eller New
Salgsordresale.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 med et regulært udtryk (^<Stamm>([0-9]{1,15})$, hvor specialtegn i den faste del escapes) for hver virksomhed, inklusive navne uden tilknyttet virksomhed.
  • Fakturaer. _set_next_sequence skriver navnet og kalder _compute_split_sequence, så Odoos sekvenslogik fortsat er konsistent med hensyn til præfiks, nummer og genkendelse af året for journalens næste faktura.
  • Indstillinger. Virksomhedsfelterne document_number_* afspejles i res.config.settings. Indstillingerne afviser præfikser, der indeholder mellemrum eller slutter med et ciffer.
  • Oversættelse. En tysk oversættelse er inkluderet.

Installation og opsætning

  1. Placér mappen document_number_prefix_year i stien til tilføjelsesmoduler.
  2. Opdatér applisten, og installér modulet. Det kræver Salg, Indkøb, Lager og Regnskab.
  3. Angiv præfikser, årsformat og antal cifre under Indstillinger → Bilagsnummerering.
  4. Prøv det først på en kopi. Et bilagsnummer kan ikke automatisk føres tilbage senere, og for fakturaer er nummeret knyttet til opbevarings- og kontrolpligten.

begrænsninger

Seks begrænsninger i modulet: indkøbskurve, årsformat, én serie pr. virksomhed, regler for præfikser, få tests og kun de nævnte bilag

  • Tilbud nummereres ved oprettelse. Slettede eller annullerede tilbud efterlader huller. Det samme gælder enhver salgsordre, som oprettes af et andet modul: Webshoppens indkøbskurve (website_sale) er ordrer med status Tilbud og bruger hver et nummer. Kun fakturaer og kreditnotaer har nummerering uden huller, fordi de nummereres ved bogføring.
  • Skift ikke årsformat under drift. Med den faste del AN26 læser modulet et eksisterende AN2026000001 som tællerværdien 26000001. Fastlæg formatet, før det første bilag oprettes.
  • Tælleren må højst have 15 cifre. Længere ciffersekvenser efter den faste del ignoreres ved søgning efter det højeste nummer.
  • Ingen separate 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 eller slutte med et ciffer, da præfiks, år og tæller ellers ikke længere kan adskilles.
  • Kun de nævnte bilagstyper håndteres.

tests

Modulet indeholder ti automatiske tests. De kontrollerer:

  • Tilbud og bekræftelse: tilbuds- og ordrenummer samt bevarelse af tilbudsnummeret
  • Fortsat nummerering efter et importeret nummer (AN26119 → AN26000120)
  • ingen efterfølgende omnummerering af eksisterende bilag
  • faktura, kreditnota og årsskifte ud fra fakturadatoen
  • indkøbsordre og følgesedler
  • tomt præfiks: Odoos standardnummer bevares
  • årstal med fire cifre
  • præfiks med specialtegn
  • flere numre i samme transaktion
  • meget lange ciffersekvenser ignoreres

Kommando:

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, når to brugere opretter bilag samtidig, er ikke omfattet; den er som beskrevet ovenfor blevet kontrolleret manuelt på en databasekopi. Hvis modulet bruges i et system med mange samtidige brugere, bør dette forsøg gentages på egen database.

Juridisk bemærkning om fakturanumre

Fakturaer skal i henhold til § 11 UStG have et fortløbende nummer, som tildeles én gang for at identificere fakturaen. Modulet nummererer fakturaer ved bogføring med en særskilt tæller pr. præfiks og år, hvilket stemmer overens med dette. Om din konkrete opsætning med flere journaler, kreditnotaer med eget præfiks og å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 bare tilpasse Odoos nummerserier?

For fakturaer kan det gøres via journalens præfiks. Men for tilbud, salgsordrer, følgesedler og indkøbsordrer findes der ikke et fælles format med præfiks, år og tæller, som nulstilles ved årsskiftet, og tælleren tager ikke højde for importerede numre fra det gamle system. Det er her, modulet kommer ind i billedet.

Overskrives den eksisterende nummerering?

Nej. Modulet tildeler kun nye numre. Allerede gemte navne forbliver uændrede, også når modulet deaktiveres.

Hvordan deaktiverer jeg det igen?

Tøm bilagstypens præfiks. Så står Odoo igen selv for nummereringen. En afinstallation ændrer heller ikke allerede tildelte numre.

Bruger I det selv?

Nej. Vi bruger Odoos standardnummerering. Vi har kontrolleret modulet med de automatiske tests og det beskrevne manuelle forsøg, men ikke i løbende drift med mange brugere.

Virker det med Odoo 17 eller 18?

Vi har kun testet det med Odoo 19.0 Community. Det kan muligvis fungere med andre versioner, men det har vi ikke undersøgt.

Hvilken licens har det?

LGPL-3. Fejl og forbedringsforslag modtages gerne som issues i GitHub-repositoriet .

Hjælp fra Biricon IT Services

Vi hjælper små og mellemstore virksomheder med deres Odoo-installationer: fra implementering over tilpasninger og migreringer til den løbende drift. Hvis du vil bevare dine bilagsnumre ved et systemskift, have nummereringen testet under belastning eller sætte et modul som dette sikkert i drift i dit produktionsmiljø, hjælper vi gerne. Flere af vores egenudviklede løsninger: Virksomhedsregister og adressekontrol for østrigske kunder, Produktsæt som sektion i tilbuddet og Web RBL, blokeringslisten til angrebstrafik.

Kontakt os nu

Opdateret: 3. november 2026. Modulversion 19.0.1.0.0. Alle numre i eksempler og illustrationer er frit valgte.