»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.
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
AN26119fra det gamle system i databasen, lyder det næste tilbudAN26000120. 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:
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
| Bilag | Tilkoblingspunkt |
|---|---|
| Tilbud | sale.order.create, hvis navnet er tomt, / eller New |
| Kundeordre | 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 af et regulært udtryk (
^<Stamm>([0-9]{1,15})$, stammen maskeres) pr. virksomhed, navne uden virksomhed inklusive. - Fakturaer.
_set_next_sequenceskriver 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 ires.config.settings. Indstillingerne afviser præfikser med mellemrum eller et ciffer til sidst. - Oversættelse. Tysk oversættelse er inkluderet.
Installation og opsætning
- Læg mappen
document_number_prefix_yeari addons-stien. - Opdater app-listen, installér modulet. Forudsætninger er Salg, Indkøb, Lager og Bogholderi.
- Indtast præfikser, årsformat og antal cifre under Indstillinger → Bilagsnummerering.
- 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
- 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
AN26læser modulet en eksisterendeAN2026000001som tælleren26000001. 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.
Status: 3. november 2026. Modulversion 19.0.1.0.0. Alle numre i eksemplerne og illustrationerne er frit valgt.