»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.
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
AN26119fra det gamle system ligger i databasen, får det næste tilbud nummeretAN26000120. 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:
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
| Bilag | Integrationspunkt |
|---|---|
| Tilbud | sale.order.create, når navnet er tomt, / eller New |
| Salgsordre | sale.order.action_confirm, før standardbekræftelsen |
| Faktura, kreditnota | account.move._set_next_sequence, kaldes ved bogføring |
| Følgeseddel, varemodtagelse | stock.picking.create efter operationstype |
| Indkøbsordre | purchase.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_sequenceskriver 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 ires.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
- Placér mappen
document_number_prefix_yeari stien til tilføjelsesmoduler. - Opdatér applisten, og installér modulet. Det kræver Salg, Indkøb, Lager og Regnskab.
- Angiv præfikser, årsformat og antal cifre under Indstillinger → Bilagsnummerering.
- 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
- 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
AN26læser modulet et eksisterendeAN2026000001som tællerværdien26000001. 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.
Opdateret: 3. november 2026. Modulversion 19.0.1.0.0. Alle numre i eksempler og illustrationer er frit valgte.