Zum Inhalt springen

Das stock.move-Modell: So funktioniert Odoo Inventarbewegung

Alles, was Entwickler und Functional Consultants über Odoos zentrales Warenbewegungs‑Modell wissen müssen — kompakt, praxisorientiert und ohne Theoriewolken. Diese Übersicht erklärt auf den Punkt, wie Bestandsbewegungen in Odoo abgebildet, gesteuert und erweitert werden: von den grundlegenden Datenstrukturen über Lagerorte und Operationen bis hin zu Anpassungen per Customization oder Modul. Nach dem Lesen verstehen Sie, welche Modelle für Reservierung, Umlagerung, Lieferung und Rücknahme zuständig sind, wie Workflow‑Zustände zusammenwirken und welche Stellen Sie verändern müssen, wenn Geschäftsprozesse abweichen. Außerdem finden Sie Hinweise zu Performance, Testbarkeit und Upgrade‑Sicherheit, damit Ihre Erweiterungen robust und updatefest bleiben.
10. März 2026 durch
Das stock.move-Modell: So funktioniert Odoo Inventarbewegung
Dasolo
| Noch keine Kommentare

Einleitung


In Odoo legen Modelle die Form und Speicherung von Geschäftsdaten fest. Alles, was mit Bestellungen, Rechnungen oder Lagerbewegungen zu tun hat, wird in Modellen erfasst und bildet so die Grundlage für Verarbeitung, Reporting und Automatisierung.


Ein sicheres Verständnis der Odoo‑Modelle ist sowohl für Entwickler als auch für Berater unverzichtbar. Modelle bestimmen Felder, Beziehungen und die Geschäftsregeln — kurz: sie formen die Datenstruktur, auf der das gesamte System läuft.


Dieser Beitrag konzentriert sich auf ein zentrales Modell im Lagerbereich: stock.move. Ob Sie Lagerprozesse konfigurieren, Schnittstellen bauen oder eigene Module entwickeln — an diesem Modell kommen Sie häufig nicht vorbei.

Was das stock.move-Modell ist


Das stock.move‑Modell beschreibt eine einzelne Warenbewegung in Odoo: welches Produkt, wie viel davon und von welcher Position zu welcher Position. Jedes Ein- oder Auslagern, jede Umlagerung oder Auslieferung wird durch einen solchen Datensatz abgebildet.


Das Modell wird vom Inventory-/Stock‑Modul verwendet; Verkaufs-, Einkaufs-, Produktions‑ oder E‑Commerce‑Prozesse erzeugen stock.move‑Einträge, sobald Inventar bewegt oder umgebucht wird. Bestätigen Sie eine Lieferung oder verbuchen Sie eine Wareneingangsbuchung, so werden stock.move‑Datensätze erstellt oder angepasst.


stock.move wird zentral im stock‑Modul definiert und von anderen Modulen ergänzt — ohne die Kernstruktur zu duplizieren. So fügt der Verkauf eine Verknüpfung zur Auftragsposition hinzu, der Einkauf verweist auf die Bestellzeile, und die Fertigung verknüpft Moves zur Produktionsauftragsnummer.

Wichtige Felder des Modells


Die folgenden Felder sind die wichtigsten Eigenschaften eines stock.move. Wer sie kennt, kann Bewegungen korrekt auswerten, erweitern und in Workflows einbinden.


1. name

Typ: Char. Kurzbezeichnung oder Beschreibung der Bewegung. In Listen und Druckdokumenten sichtbar; dient als primäre, lesbare Kennung für den Move.


2. product_id

Typ: Many2one (product.product). Referenz auf das bewegte Produkt. Pflichtfeld: ohne Produkt keine Lagerbewegung. Grundlage für Bestandsberechnung und Regeln wie Nachschub oder Reservierung.


3. product_uom

Typ: Many2one (uom.uom). Einheit, in der die Menge angegeben ist. Muss passen zur Artikelkonfiguration; Odoo prüft und rechnet bei Bedarf Einheiten um.


4. product_uom_qty

Typ: Float. Geplante Menge in der angegebenen UoM — die Soll‑Menge, die verschoben werden soll. Nach Durchführung wird quantity_done die tatsächlich verarbeitete Menge zeigen.


5. quantity

Typ: Float. Oft ein berechnetes oder darstellendes Feld für die Menge. Dient primär der benutzerfreundlichen Anzeige und kann Umrechnungen widerspiegeln.


6. location_id

Typ: Many2one (stock.location). Quellort der Bewegung. Pflichtfeld: definiert, woher die Ware kommt (z. B. Lager, Lieferant, Produktion).


7. location_dest_id

Typ: Many2one (stock.location). Zielort der Bewegung. Pflichtfeld: wohin die Ware geht (z. B. Kunde, Lager, Verschrottung).


8. picking_id

Typ: Many2one (stock.picking). Das Transfer‑Dokument, das mehrere Moves zusammenfasst (z. B. Lieferauftrag, Wareneingang, interne Umlagerung). Ergibt die Benutzergruppe für Verarbeitung und Druck.


9. picking_type_id

Typ: Many2one (stock.picking.type). Bestimmt Art der Operation (Ausgang, Eingang, intern). Setzt Standards wie Standardorte und steuert den Workflow.


10. state

Typ: Selection. Status der Bewegung — z. B. draft, waiting, confirmed, assigned, done, cancelled. "assigned" bedeutet reservierte Bestände; "done" heißt abgeschlossen.


11. date

Typ: Datetime. Geplanter Zeitpunkt der Bewegung. Wichtig für Planung, Priorisierung und Terminierung von Transporten oder Kommissionierungen.


12. date_deadline

Typ: Datetime. Frist oder versprochenes Lieferdatum. Wird bei Priorisierung und Abweichungsanalysen verwendet.


13. origin

Typ: Char. Quellreferenz — z. B. Bestellnummer, Verkaufsauftrag oder Produktionsauftrag. Erleichtert Rückverfolgung und Dokumentation.


14. move_dest_id

Typ: Many2one (stock.move). Verweis auf die nachfolgende Bewegung in einer Kette. Nützlich, wenn ein Move automatisch einen weiteren auslöst (z. B. Produktion → Lieferung).


15. move_orig_ids

Typ: One2many (stock.move). Ursprungsmoves, die in diese Bewegung fließen. Das Gegenstück zu move_dest_id für Nachvollziehbarkeit.


16. move_line_ids

Typ: One2many (stock.move.line). Detailzeilen mit Serien‑/Chargenangabe, genauen Lagerplätzen und Mengen pro Zeile — entstehen bei Reservierung oder Verarbeitung.


17. partner_id

Typ: Many2one (res.partner). Geschäftspartner zur Bewegung — Kunde bei Auslieferungen, Lieferant bei Wareneingang. Relevant für Adressen, Buchung und Reporting.


18. company_id

Typ: Many2one (res.company). Zugehörige Firma in Multi‑Company‑Setups. Beeinflusst Sichtbarkeit, Rechte und Intercompany‑Regeln.


19. quantity_done

Typ: Float. Tatsächlich verarbeitete Menge. Wird beim Kommissionieren oder Wareneingang aktualisiert; ein Move gilt als erledigt, wenn quantity_done == product_uom_qty.


20. reserved_availability

Typ: Float. Für den Move reservierte Menge. Zeigt an, wie viel Bestand tatsächlich für diese Position geblockt wurde.


21. create_date

Typ: Datetime. Erstellungszeitpunkt des Datensatzes. Automatisch geführt; wichtig für Audit und Verlauf.


22. write_date

Typ: Datetime. Zeitpunkt der letzten Änderung. Ebenfalls automatisch, nützlich zur Nachverfolgung von Updates.


23. sequence

Typ: Integer. Reihenfolge innerhalb einer Picking‑Gruppe. Steuerung der Anzeige- und Bearbeitungsreihenfolge für Kommissionierer.


24. priority

Typ: Selection. Dringlichkeitsstufe. Dient zur Planung; höhere Priorität hebt Moves in der Terminplanung hervor.


25. description_picking

Typ: Char. Freitext‑Hinweis auf dem Picking‑Beleg — z. B. spezielle Handhabungsanweisungen oder Verpackungshinweise.


26. reference

Typ: Char. Interne Kennung oder Fremdsystem‑Referenz, die beim Mapping oder Reporting verwendet werden kann.


27. group_id

Typ: Many2one (procurement.group). Gruppiert Moves, die zu derselben Beschaffungsaktion gehören (z. B. alle Bewegungen zu einer Verkaufsbestellung).


28. procure_method

Typ: Selection. Beschaffungsstrategie: make_to_stock oder make_to_order. Bestimmt, ob Bestand entnommen oder Nachschub ausgelöst wird.


29. sale_line_id

Typ: Many2one (sale.order.line). Verkaufsspezifisches Feld — Verknüpft Move mit der auslösenden Verkaufsposition.


30. purchase_line_id

Typ: Many2one (purchase.order.line). Einkaufsspezifisches Feld — Verknüpft Move mit der Bestellzeile des Lieferanten.


31. production_id

Typ: Many2one (mrp.production). Verknüpfung zur Fertigungsauftragsnummer; wichtig für Verbrauchserfassung und Verknüpfung von Ein‑ und Auslagerungen.


32. active

Typ: Boolean. Archivierungsflag. Auf False gesetzt bedeutet der Datensatz ist ausgeblendet, aber nicht gelöscht — praktisch für Historie und Soft‑Delete.

Wie dieses Modell in Geschäftsprozessen eingesetzt wird


1. Kundenauslieferung

Beim Bestätigen einer Verkaufsbestellung erzeugt Odoo für jede Position einen stock.move: vom Lagerort (location_id) zum Kundenort (location_dest_id). Alle Moves werden in einem Picking zusammengefasst; beim Kommissionieren wird quantity_done gefüllt und der Move als erledigt markiert.


2. Wareneingang vom Lieferanten

Bestellungen erzeugen beim Empfang eingehende Moves: Lieferant als Quelle, Lager als Ziel. Die Moves erscheinen im Wareneingangspicking; nach Prüfung und Verbuchung wird die tatsächliche Menge erfasst.


3. Interne Umlagerung

Umlagerungen zwischen Lagerplätzen oder Lagerhäusern werden ebenfalls durch stock.move abgebildet. Quelle und Ziel sind unterschiedliche Lagerorte — gängig bei Bestandsausgleich, Umlagerung oder Standortwechsel.


4. Fertigung

Fertigungsaufträge erzeugen Zu‑ und Abgänge: Rohmaterial wird aus dem Lager zur Produktion entnommen, fertige Erzeugnisse zurück ins Lager gebucht. production_id verbindet diese Bewegungen mit dem Fertigungsauftrag; move chaining sorgt dafür, dass Ausgangs‑ und Folgebewegungen verknüpft sind.


5. Retouren und Verschrottung

Retouren legen Gegenbuchungen an, Verschrottung bewegt Ware in einen speziellen Scrap‑Ort. Das gleiche stock.move‑Modell deckt alle Abläufe ab; picking_type_id bestimmt hier den genauen Prozess und die Workflowschritte.

Wie Entwickler das Modell erweitern


Entwickler erweitern stock.move mit bewährten Odoo‑Mustern — vor allem durch Modellvererbung und gezielte Ergänzungen.


Modellvererbung

Mit _inherit = 'stock.move' erweitern Sie das bestehende Modell. So lassen sich Felder hinzufügen, Methoden überschreiben oder Validierungen ergänzen, ohne die Kernstruktur zu verändern — sauber, updatefest und modular.


Neue Felder hinzufügen

Ergänzen Sie in Ihrer Erweiterung Felder mit passenden Feldtypen (Char, Many2one, Boolean, Integer, Text, Selection). Denken Sie an Unternehmensabhängigkeit bei Multi‑Company. Typische Erweiterungen sind Tracking‑Nummern, Versandreferenzen oder Chargenattribute.


Python‑Erweiterungen

Für Prozesslogik überschreiben Sie Methoden wie _action_done, _action_assign oder _action_cancel — rufen Sie super() auf, um Standardverhalten zu erhalten. Achten Sie auf Inventarberechnungen und die Kettenlogik von Moves, damit andere Module nicht durchbrochen werden.


Odoo Studio

Odoo Studio ist praktisch, um schnell Felder oder Ansichten anzupassen ohne Code. Für einfache Zusatzinformationen ideal; bei komplexen Workflows oder Integrationen sind maßgeschneiderte Module jedoch robuster und wartungsfreundlicher.

Empfohlene Vorgehensweisen


  • Achten Sie stets auf korrekte source- und destination‑Orte (location_id, location_dest_id). Falsche Orte führen schnell zu fehlerhaften Beständen.
  • Nutzen Sie picking_id, um Moves logisch zu bündeln. Moves, die zu einem Transfer gehören, sollten einem Picking zugewiesen werden — das erleichtert Verarbeitung und Tracking.
  • Für API‑Integrationen verwenden Sie XML‑RPC oder JSON‑RPC. stock.move ist über die API zugänglich — ordnen Sie externe IDs sorgfältig zu, um Duplikate und Inkonsistenzen zu vermeiden.
  • Benennen Sie benutzerdefinierte Felder mit x_ oder einem Modulpräfix, damit künftige Odoo‑Updates keine Namenskonflikte verursachen.
  • Setzen Sie move_dest_id und move_orig_ids korrekt, wenn Sie Ketten von Bewegungen programmatisch erzeugen — das ist wichtig für Rückverfolgbarkeit und automatische Weiterverarbeitung.
  • Beachten Sie die Unterscheidung zwischen product_uom_qty (Soll) und quantity_done (Ist). Teillieferungen sind möglich und sollten im Workflow berücksichtigt werden.

Häufige Fehler


  • Erstellen von Moves mit unpassenden Ortstypen. Quelle und Ziel müssen logisch zusammenpassen (z. B. kein Move, der von Kundenort zu Kundenort führt).
  • Anpassen von product_uom_qty, nachdem Move Lines existieren. Änderungen an der Sollmenge bei bereits erstellten Move Lines können zu Bestandsfehlern führen — besser: stornieren und neu anlegen.
  • Origin nicht setzen. Fehlt die Quellreferenz, wird das Tracking zurück zur auslösenden Bestellung oder Produktion erheblich erschwert.
  • Überschreiben von _action_done ohne super() aufzurufen. Das kann Bestandsbuchungen und Integrationen zerstören — immer das Basisverhalten berücksichtigen.
  • Moves direkt und außerhalb des Pickings anlegen. Das Umgehen des vorgesehenen Workflows kann Reservierungen und Zuteilungen unterbrechen und inkonsistente Zustände erzeugen.
  • move_dest_id beim Teilen oder Zusammenführen von Moves ignorieren. Ohne korrekte Verknüpfungen entstehen verwaiste Ketten und Nachverfolgbarkeit geht verloren.

Fazit


Das stock.move‑Modell ist das Herzstück der Lagerlogik in Odoo: jede physische Bewegung im System wird hier abgebildet. Wer die Felder, Beziehungen und Erweiterungsmöglichkeiten kennt, kann Prozesse richtig konfigurieren, anpassen und sauber integrieren.


Ob Sie Lagerprozesse modellieren oder Erweiterungen programmieren — fundiertes Wissen zum stock.move spart Zeit, reduziert Fehler und erleichtert Wartung und Skalierung Ihrer Odoo‑Lösung.

Brauchen Sie Unterstützung bei Ihrer Odoo‑Einführung?


Dasolo unterstützt Unternehmen bei Implementierung, Anpassung und Optimierung von Odoo. Unser Fokus liegt auf API‑Integrationen und individueller Entwicklung — inklusive tiefer Erfahrung mit Odoo‑Datenmodellen wie stock.move.


Wenn Sie Unterstützung bei Implementierung, maßgeschneiderten Modulen oder Integration benötigen, helfen wir Ihnen gerne weiter. Demo buchen um Ihr Projekt zu besprechen.

Das stock.move-Modell: So funktioniert Odoo Inventarbewegung
Dasolo 10. März 2026
Diesen Beitrag teilen
Anmelden , um einen Kommentar zu hinterlassen