Zum Inhalt springen

Odoo 19 Belegnummern aus Präfix, Jahr und Zähler – Modul document_number_prefix_year und die Falle bei gleichzeitigem Anlegen

3. November 2026 | Odoo 19 Community | Eigenentwicklung
3. November 2026 durch
Odoo 19 Belegnummern aus Präfix, Jahr und Zähler – Modul document_number_prefix_year und die Falle bei gleichzeitigem Anlegen

Odoo 19 Modul document_number_prefix_year: Belegnummern aus Präfix, Jahr und Zähler

„AN26000001“ sagt mehr als „S00001“: Es ist ein Angebot, es stammt aus 2026, und es ist das erste. Viele Unternehmen, vor allem solche, die von einem älteren System auf Odoo umsteigen, wollen ihre Belegnummern genau so behalten. Odoo selbst nummeriert Angebote, Aufträge und Lieferscheine mit eigenen Folgen (S00001, WH/OUT/00001, P00001) und Rechnungen mit dem Journalpräfix und dem Jahr (INV/2026/00001).

Wir haben dafür das Modul Document Numbering by Prefix and Year (document_number_prefix_year) für Odoo 19 geschrieben. Es steht als freie Software unter der LGPL-3-Lizenz auf GitHub:

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

Vorab eine ehrliche Einordnung: Wir setzen das Modul bei Biricon IT Services nicht ein. Wir veröffentlichen es, weil es fertig, dokumentiert und mit Tests versehen ist und anderen Arbeit sparen kann. Wer es einsetzt, sollte die Abschnitte zu Grenzen und Tests lesen.

Das Nummernschema

Jede Nummer besteht aus drei Teilen: einem Präfix je Belegart, dem Jahr und einem Zähler mit fester Stellenzahl. Das Präfix, das Jahresformat (26 oder 2026) und die Stellenzahl stellen Sie je Firma unter Einstellungen → Belegnummerierung ein.

Aufbau der Belegnummer AN26000001 aus Präfix, Jahr und Zähler, mit Tabelle der Belegarten

Behandelt werden Angebote, Kundenaufträge, Kundenrechnungen und Gutschriften, Lieferscheine, Wareneingänge und Einkaufsbestellungen. Die Präfixe in der Abbildung sind nur Beispiele: AN, AU, RE, GU, LI, WE, BE. Wer ein Präfix leer lässt, behält für diese Belegart die Standardnummerierung von Odoo. Das Modul tut also nichts, bis Sie es einstellen.

Wie sich die Nummern verhalten

  • Jedes Jahr neu. Der Zähler beginnt mit dem Jahreswechsel wieder bei 1.
  • Weiter nach importierten Nummern. Das Modul sucht die höchste vorhandene Nummer desselben Präfixes und Jahres, egal wie lang sie ist. Liegt aus dem Altsystem AN26119 in der Datenbank, lautet das nächste Angebot AN26000120. Das ist der Grund, warum das Modul für Umstiege taugt: Altbelege werden mit ihren Originalnummern importiert, und neue Belege knüpfen nahtlos an.
  • Neue Auftragsnummer bei Bestätigung. Ein bestätigtes Angebot bekommt auf Wunsch eine Nummer aus der Auftragsfolge. Die Angebotsnummer bleibt im Feld Angebotsnummer am Auftrag erhalten und ist in Formular, Liste und Suche sichtbar.
  • Rechnungen beim Buchen. Kundenrechnungen und Gutschriften erhalten ihre Nummer erst beim Buchen, nicht beim Anlegen. Gelöschte Entwürfe hinterlassen daher keine Lücke. Das Jahr stammt aus dem Rechnungsdatum: Eine Rechnung vom 30.12.2025, die am 2.1.2026 gebucht wird, heißt RE25….
  • Alles andere bleibt. Lieferantenrechnungen, Zahlungen, Buchungssätze und Fertigungsaufträge behalten die Standardfolgen von Odoo. Bestehende Namen werden nie umgeschrieben, auch nicht, wenn Sie das Modul wieder abschalten.

Der heikle Teil: Zwei Anwender zugleich

Eine eigene Nummernvergabe sieht einfach aus: höchste Nummer suchen, eins dazuzählen. Sie ist es nicht, sobald zwei Anwender im selben Moment ein Angebot anlegen. Beide lesen „höchste Nummer = 0“, beide vergeben AN26000001. Odoo hat dafür bei seinen eigenen Folgen Datenbank-Sequenzen. Bei einer selbst gebauten Nummer fehlt das, und für Angebote und Einkaufsbestellungen gibt es in Odoo zudem keine Eindeutigkeitsprüfung auf dem Namen: Zwei Belege mit gleicher Nummer werden einfach gespeichert.

Der naheliegende Schutz ist eine Sperre. Das Modul nimmt je Firma, Präfix und Jahr eine Sperre der Datenbank (PostgreSQL Advisory Lock), die bis zum Ende der Transaktion hält. Der zweite Anwender wartet, bis der erste fertig ist. Das reicht aber nicht, und wir haben es durch einen Versuch an einer Kopie der Produktivdatenbank gefunden:

Zeitablauf zweier Anwender: ohne zweiten Lesezugriff vergeben beide dieselbe Nummer, mit zweitem Lesezugriff erhält der zweite die nächste Nummer

Odoo arbeitet mit der Isolationsstufe REPEATABLE READ. Der Datenbankstand, den eine Transaktion sieht, wird bei ihrer ersten Abfrage eingefroren. Anwender B hat diesen Stand schon, bevor A fertig ist. Wartet B danach auf die Sperre und bekommt sie, liest er mit seinem alten Stand „höchste Nummer = 0“ und vergibt die Nummer ein zweites Mal. Die Sperre hat die Reihenfolge geregelt, aber nicht das Wissen aktualisiert.

Die Lösung ist ein zweiter Lesezugriff über einen eigenen, kurzlebigen Datenbankzugang, der alle bereits bestätigten Zeilen sieht. Der größere der beiden Werte gewinnt. Der erste Lesezugriff bleibt nötig, denn nur er kennt Nummern, die dieselbe Transaktion bereits vergeben, aber noch nicht bestätigt hat, zum Beispiel beim Import mehrerer Belege in einem Rutsch.

Wir haben das mit zwei Transaktionen geprüft, bei denen die zweite nachweislich vor dem Commit der ersten ihren Stand gezogen hat und dann auf die Sperre gewartet hat. Ohne den zweiten Lesezugriff erhielten beide Aufträge dieselbe Nummer, mit ihm die Nummern 1 und 2.

Wichtig für die Einordnung: Dieser Versuch ist eine Handprüfung. Er ist nicht Teil der automatischen Tests, weil dafür zwei echte Datenbankverbindungen nötig sind, die Odoos Testumgebung (eine einzige Transaktion pro Test) nicht bereitstellt.

Technische Umsetzung

BelegEinhängepunkt
Angebotsale.order.create, wenn der Name leer, / oder New ist
Kundenauftragsale.order.action_confirm, vor der Standardbestätigung
Rechnung, Gutschriftaccount.move._set_next_sequence, wird beim Buchen aufgerufen
Lieferschein, Wareneingangstock.picking.create nach Vorgangsart
Einkaufsbestellungpurchase.order.create
  • Zähler. Die höchste Nummer findet ein regulärer Ausdruck (^<Stamm>([0-9]{1,15})$, der Stamm wird maskiert) je Firma, Namen ohne Firma eingeschlossen.
  • Rechnungen. _set_next_sequence schreibt den Namen und ruft _compute_split_sequence auf, damit die Sequenzlogik von Odoo (Präfix, Nummer, Jahreserkennung für die nächste Rechnung des Journals) stimmig bleibt.
  • Einstellungen. Die Firmenfelder document_number_* werden in res.config.settings gespiegelt. Die Einstellungen lehnen Präfixe mit Leerzeichen oder einer Ziffer am Ende ab.
  • Übersetzung. Deutsche Übersetzung ist enthalten.

Installation und Einrichtung

  1. Ordner document_number_prefix_year in den Addons-Pfad legen.
  2. Apps-Liste aktualisieren, Modul installieren. Voraussetzung sind Verkauf, Einkauf, Lager und Buchhaltung.
  3. Unter Einstellungen → Belegnummerierung Präfixe, Jahresformat und Stellenzahl eintragen.
  4. Erst auf einer Kopie ausprobieren. Die Nummer eines Belegs lässt sich später nicht automatisch zurückdrehen, und bei Rechnungen hängt an der Nummer die Aufbewahrungs- und Prüfpflicht.

Grenzen

Sechs Grenzen des Moduls: Warenkörbe, Jahresformat, eine Serie je Firma, Präfix-Regeln, wenige Tests, nur genannte Belege

  • Angebote werden beim Anlegen nummeriert. Gelöschte oder stornierte Angebote hinterlassen Lücken. Dasselbe gilt für jeden Kundenauftrag, den ein anderes Modul anlegt: Warenkörbe des Webshops (website_sale) sind Aufträge im Status Angebot und verbrauchen je eine Nummer. Lückenlos sind nur Rechnungen und Gutschriften, weil sie beim Buchen nummeriert werden.
  • Jahresformat nicht im laufenden Betrieb ändern. Mit dem Stamm AN26 liest das Modul eine vorhandene AN2026000001 als Zähler 26000001. Legen Sie das Format vor dem ersten Beleg fest.
  • Zähler höchstens 15 Stellen. Längere Ziffernfolgen nach dem Stamm werden bei der Suche nach der höchsten Nummer ignoriert.
  • Keine getrennten Serien je Journal oder Lager. Der Zähler gilt je Firma, Präfix und Jahr. Mehrere Verkaufsjournale teilen sich den Rechnungszähler.
  • Präfixe dürfen kein Leerzeichen enthalten und nicht auf eine Ziffer enden, sonst lassen sich Präfix, Jahr und Zähler nicht mehr trennen.
  • Nur die genannten Belegarten werden behandelt.

Tests

Das Modul bringt zehn automatische Tests mit. Sie prüfen:

  • Angebot und Bestätigung: Angebots- und Auftragsnummer, Erhalt der Angebotsnummer
  • Weiterzählen nach einer importierten Nummer (AN26119 → AN26000120)
  • keine nachträgliche Umnummerierung bestehender Belege
  • Rechnung, Gutschrift und Jahreswechsel nach Rechnungsdatum
  • Einkaufsbestellung und Lieferscheine
  • leeres Präfix: Standardnummer von Odoo bleibt
  • vierstelliges Jahr
  • Präfix mit Sonderzeichen
  • mehrere Nummern in einer Transaktion
  • sehr lange Ziffernfolgen werden ignoriert

Aufruf:

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

Die Tests laufen mit gewöhnlichen Transaktionen. Das Verhalten bei gleichzeitigem Anlegen durch zwei Anwender gehört nicht dazu, es wurde wie oben beschrieben von Hand an einer Datenbankkopie geprüft. Wer das Modul in einem System mit vielen gleichzeitigen Anwendern einsetzt, sollte diesen Versuch auf der eigenen Datenbank wiederholen.

Rechtlicher Hinweis zur Rechnungsnummer

Rechnungen müssen nach § 11 UStG eine fortlaufende Nummer tragen, die zur Identifizierung der Rechnung einmalig vergeben wird. Das Modul nummeriert Rechnungen beim Buchen und mit eigenem Zähler je Präfix und Jahr, was dazu passt. Ob Ihre konkrete Einstellung (mehrere Journale, Gutschriften mit eigenem Präfix, Jahreswechsel) die Anforderungen Ihres Steuerberaters erfüllt, müssen Sie mit diesem klären. Dieser Beitrag ist keine Rechtsberatung.

Häufige Fragen

Warum nicht einfach die Odoo-Folgen anpassen?

Für Rechnungen geht das über das Journalpräfix. Bei Angeboten, Aufträgen, Lieferscheinen und Bestellungen gibt es aber kein gemeinsames Schema aus Präfix, Jahr und Zähler mit Jahreswechsel, und der Zähler kennt keine importierten Altnummern. Dort setzt das Modul an.

Wird bestehende Nummerierung überschrieben?

Nein. Das Modul vergibt nur neue Nummern. Bereits gespeicherte Namen bleiben unverändert, auch beim Abschalten.

Wie schalte ich es wieder ab?

Leeren Sie das Präfix der Belegart. Dann nummeriert Odoo sie wieder selbst. Auch das Deinstallieren ändert keine vergebenen Nummern.

Setzen Sie es selbst ein?

Nein. Bei uns laufen die Standardnummern von Odoo. Wir haben das Modul mit den automatischen Tests und dem beschriebenen Handversuch geprüft, aber nicht in einem laufenden Betrieb mit vielen Anwendern.

Läuft es mit Odoo 17 oder 18?

Wir haben es nur mit Odoo 19.0 Community getestet. Für andere Versionen kann es passen oder nicht, wir haben es nicht geprüft.

Unter welcher Lizenz steht es?

Unter der LGPL-3. Fehler und Verbesserungen sind als Issue im GitHub-Repository willkommen.

Unterstützung durch Biricon IT Services

Wir betreuen Odoo-Installationen für kleine und mittlere Unternehmen: von der Einführung über Anpassungen und Migrationen bis zum laufenden Betrieb. Wenn Sie beim Umstieg Ihre Belegnummern erhalten wollen, die Nummernvergabe unter Last prüfen lassen oder ein Modul wie dieses sicher in Ihre Produktivinstanz bringen möchten, helfen wir gerne. Weitere Eigenentwicklungen: Firmenbuch und Adressprüfung für österreichische Kunden, Produkt-Sets im Angebot als Abschnitt und Web RBL, die Sperrliste für Angriffsverkehr.

Jetzt Kontakt aufnehmen

Stand: 3. November 2026. Modulversion 19.0.1.0.0. Alle Nummern in den Beispielen und Abbildungen sind frei gewählt.