”AN26000001” säger mer än ”S00001”: Det är en offert, den kommer från 2026 och det är den första. Många företag, framför allt sådana som byter från ett äldre system till Odoo, vill behålla sina dokumentnummer precis så. Odoo självt numrerar offerter, order och följesedlar med egna serier (S00001, WH/OUT/00001, P00001) och fakturor med journalprefixet och året (INV/2026/00001).
Vi har skrivit modulen Document Numbering by Prefix and Year (document_number_prefix_year) för Odoo 19 för det. Den finns som fri programvara under LGPL-3-licensen på GitHub:
github.com/Alex0176/odoo-document-number-prefix-year
En ärlig inledande bedömning: Vi använder inte modulen hos Biricon IT Services. Vi publicerar den eftersom den är färdig, dokumenterad och försedd med tester och kan spara arbete åt andra. Den som använder den bör läsa avsnitten om Begränsningar och Tester .
Nummerschemat
Varje nummer består av tre delar: ett prefix per dokumenttyp, året och en räknare med fast antal siffror. Prefixet, årsformatet (26 eller 2026) och antalet siffror ställer du in per företag under Inställningar → Dokumentnumrering.
Hanteras gör offerter, kundorder, kundfakturor och kreditnotor, följesedlar, godsmottagningar och inköpsorder. Prefixen i bilden är bara exempel: AN, AU, RE, GU, LI, WE, BE. Den som lämnar ett prefix tomt behåller Odoos standardnumrering för den dokumenttypen. Modulen gör alltså ingenting förrän du ställer in den.
Hur numren beter sig
- Nytt varje år. Räknaren börjar vid årsskiftet om på 1.
- Fortsätter efter importerade nummer. Modulen söker det högsta befintliga numret med samma prefix och år, oavsett hur långt det är. Om
AN26119från det gamla systemet finns i databasen blir nästa offertAN26000120. Det är anledningen till att modulen lämpar sig för systembyten: Gamla dokument importeras med sina ursprungliga nummer, och nya dokument ansluter sömlöst. - Nytt ordernummer vid bekräftelse. En bekräftad offert får på begäran ett nummer ur orderserien. Offertnumret finns kvar i fältet Offertnummer på ordern och är synligt i formulär, lista och sökning.
- Fakturor vid bokföring. Kundfakturor och kreditnotor får sitt nummer först vid bokföringen, inte vid skapandet. Raderade utkast lämnar därför inget glapp. Året kommer från fakturadatumet: En faktura från 30.12.2025 som bokförs den 2.1.2026 heter
RE25…. - Allt annat består. Leverantörsfakturor, betalningar, bokföringsposter och tillverkningsorder behåller Odoos standardserier. Befintliga namn skrivs aldrig om, inte ens om du stänger av modulen igen.
Den känsliga delen: Två användare samtidigt
En egen nummertilldelning ser enkel ut: sök det högsta numret, lägg till ett. Det är den inte, så snart två användare skapar en offert i samma ögonblick. Båda läser ”högsta nummer = 0”, båda tilldelar AN26000001. Odoo har för det databassekvenser för sina egna serier. Vid ett självbyggt nummer saknas det, och för offerter och inköpsorder finns i Odoo dessutom ingen unikhetskontroll på namnet: Två dokument med samma nummer sparas helt enkelt.
Det närmast till hands liggande skyddet är en spärr. Modulen tar per företag, prefix och år en spärr i databasen (PostgreSQL Advisory Lock) som gäller till transaktionens slut. Den andra användaren väntar tills den första är klar. Men det räcker inte, och vi upptäckte det genom ett försök på en kopia av produktionsdatabasen:
Odoo arbetar med isoleringsnivån REPEATABLE READ. Det databastillstånd som en transaktion ser fryses vid dess första förfrågan. Användare B har redan det tillståndet innan A är klar. Väntar B därefter på spärren och får den, läser B med sitt gamla tillstånd ”högsta nummer = 0” och tilldelar numret en andra gång. Spärren har reglerat ordningen, men inte uppdaterat kunskapen.
Lösningen är en andra läsning via en egen, kortlivad databasanslutning som ser alla redan bekräftade rader. Det större av de två värdena vinner. Den första läsningen förblir nödvändig, eftersom bara den känner till nummer som samma transaktion redan har tilldelat men ännu inte bekräftat, till exempel vid import av flera dokument i ett svep.
Vi har prövat detta med två transaktioner där den andra bevisligen hade hämtat sitt tillstånd innan den första gjorde commit och därefter väntade på spärren. Utan den andra läsningen fick båda orderna samma nummer, med den fick de numren 1 och 2.
Viktigt för bedömningen: Det här försöket är en manuell kontroll. Det är inte en del av de automatiska testerna, eftersom det kräver två riktiga databasanslutningar, vilket Odoos testmiljö (en enda transaktion per test) inte tillhandahåller.
Teknisk implementering
| Dokument | Anslutningspunkt |
|---|---|
| Offert | sale.order.create, när namnet är tomt, / eller New |
| Kundorder | sale.order.action_confirm, före standardbekräftelsen |
| Faktura, kreditnota | account.move._set_next_sequence, anropas vid bokföring |
| Följesedel, godsmottagning | stock.picking.create per operationstyp |
| Inköpsorder | purchase.order.create |
- Räknare. Det högsta numret hittas med ett reguljärt uttryck (
^<Stamm>([0-9]{1,15})$, stammen maskeras) per företag, namn utan företag inkluderade. - Fakturor.
_set_next_sequenceskriver namnet och anropar_compute_split_sequence, så att Odoos sekvenslogik (prefix, nummer, årsidentifiering för journalens nästa faktura) förblir konsekvent. - Inställningar. Företagsfälten
document_number_*speglas ires.config.settings. Inställningarna avvisar prefix med blanksteg eller en siffra på slutet. - Översättning. En tysk översättning ingår.
Installation och konfiguration
- Lägg mappen
document_number_prefix_yeari addons-sökvägen. - Uppdatera applistan, installera modulen. Förutsättningar är Försäljning, Inköp, Lager och Bokföring.
- Ange under Inställningar → Dokumentnumrering prefix, årsformat och antal siffror.
- Pröva först på en kopia. Ett dokuments nummer går inte att automatiskt ändra tillbaka senare, och för fakturor hänger arkiverings- och granskningsplikt på numret.
Begränsningar
- Offerter numreras när de skapas. Raderade eller annullerade offerter lämnar glapp. Detsamma gäller varje kundorder som en annan modul skapar: Varukorgar i webbshopen (
website_sale) är order med status Offert och förbrukar var sitt nummer. Utan glapp är bara fakturor och kreditnotor, eftersom de numreras vid bokföringen. - Ändra inte årsformatet under pågående drift. Med stammen
AN26läser modulen ett befintligtAN2026000001som räknaren26000001. Bestäm formatet före det första dokumentet. - Räknare högst 15 siffror. Längre sifferföljder efter stammen ignoreras vid sökningen efter det högsta numret.
- Inga separata serier per journal eller lager. Räknaren gäller per företag, prefix och år. Flera försäljningsjournaler delar fakturaräknaren.
- Prefix får inte innehålla blanksteg och inte sluta på en siffra, annars går det inte längre att skilja prefix, år och räknare åt.
- Bara de nämnda dokumenttyperna hanteras.
Tester
Modulen levereras med tio automatiska tester. De kontrollerar:
- Offert och bekräftelse: offert- och ordernummer, bevarande av offertnumret
- Fortsatt räkning efter ett importerat nummer (
AN26119→AN26000120) - ingen efterhandsomnumrering av befintliga dokument
- Faktura, kreditnota och årsskifte enligt fakturadatum
- Inköpsorder och följesedlar
- tomt prefix: Odoos standardnummer består
- fyrsiffrigt år
- Prefix med specialtecken
- flera nummer i en transaktion
- mycket långa sifferföljder ignoreras
Anrop:
odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init
Testerna körs med vanliga transaktioner. Beteendet vid samtidigt skapande av två användare ingår inte, det kontrollerades som beskrivet ovan manuellt på en databaskopia. Den som använder modulen i ett system med många samtidiga användare bör upprepa det försöket på den egna databasen.
Juridisk anmärkning om fakturanumret
Fakturor måste enligt § 11 UStG bära ett löpande nummer som tilldelas en enda gång för att identifiera fakturan. Modulen numrerar fakturor vid bokföringen och med en egen räknare per prefix och år, vilket stämmer med det. Om din konkreta inställning (flera journaler, kreditnotor med eget prefix, årsskifte) uppfyller kraven från din skatterådgivare måste du klargöra med denne. Det här inlägget är ingen juridisk rådgivning.
Vanliga frågor
Varför inte bara anpassa Odoos serier?
För fakturor går det via journalprefixet. För offerter, order, följesedlar och beställningar finns det däremot inget gemensamt schema av prefix, år och räknare med årsskifte, och räknaren känner inte till importerade gamla nummer. Där sätter modulen in.
Skrivs befintlig numrering över?
Nej. Modulen tilldelar bara nya nummer. Redan sparade namn förblir oförändrade, även när den stängs av.
Hur stänger jag av den igen?
Töm dokumenttypens prefix. Då numrerar Odoo den själv igen. Inte heller avinstallation ändrar tilldelade nummer.
Använder ni den själva?
Nej. Hos oss körs Odoos standardnummer. Vi har kontrollerat modulen med de automatiska testerna och det beskrivna manuella försöket, men inte i en pågående drift med många användare.
Fungerar den med Odoo 17 eller 18?
Vi har bara testat den med Odoo 19.0 Community. För andra versioner kan den passa eller inte, vi har inte kontrollerat det.
Under vilken licens står den?
Under LGPL-3. Fel och förbättringar är välkomna som issue i GitHub-repositoryt .
Stöd från Biricon IT Services
Vi sköter Odoo-installationer för små och medelstora företag: från införande via anpassningar och migreringar till löpande drift. Om du vid byte av system vill bevara dina dokumentnummer, låta kontrollera nummertilldelningen under belastning eller på ett säkert sätt ta en modul som den här i produktion i din produktionsinstans hjälper vi gärna. Fler egenutvecklingar: Företagsregister och adresskontroll för österrikiska kunder, Produktset i offerten som avsnitt och Web RBL, spärrlistan för angreppstrafik.
Läget per den 3 november 2026. Modulversion 19.0.1.0.0. Alla nummer i exemplen och bilderna är fritt valda.