Zum Inhalt springen

Das Modell sale.order.line: Odoos Architektur der Verkaufsbestellungen verstehen

Ein vollständiger Leitfaden zum Verkaufsauftragslinienmodell von Odoo für Entwickler und funktionale Berater
10. März 2026 durch
Das Modell sale.order.line: Odoos Architektur der Verkaufsbestellungen verstehen
Dasolo
| Noch keine Kommentare

Einführung


In Odoo definieren Modelle, wie Daten strukturiert und in der Datenbank gespeichert werden. Jedes Stück Geschäftsdaten, mit dem Sie arbeiten, von Verkaufsaufträgen über Rechnungen bis hin zu Kontakten, lebt in einem Modell.


Das Verständnis von Odoo-Modellen ist sowohl für Entwickler als auch für funktionale Berater unerlässlich. Modelle sind das Fundament der Odoo-Datenarchitektur. Sie definieren Felder, Beziehungen und Geschäftslogik.


Dieser Artikel konzentriert sich auf eines der wichtigsten Modelle im Verkaufsmodul: sale.order.line. Egal, ob Sie benutzerdefinierte Module erstellen, externe Systeme integrieren oder Preisgestaltungsabläufe konfigurieren, Sie werden mit diesem Modell arbeiten.

Was ist das Modell sale.order.line


Das sale.order.line-Modell repräsentiert einzelne Positionen in einem Angebot oder einer Verkaufsbestellung in Odoo. Jede Position entspricht typischerweise einem Produkt, mit Mengen-, Preis- und Steuerinformationen.


Dieses Modell in Odoo wird vom Verkaufsmodul (sale) verwendet. Es erbt von analytic.mixin für die Projektkostenverfolgung und die Integration von Stundenzetteln. Wenn Sie ein Produkt zu einem Angebot hinzufügen, erstellen Sie einen sale.order.line-Datensatz.


Das Modell ist im Verkaufsmodul definiert. Andere Module erweitern es durch die Odoo-Modellerbschaft. Zum Beispiel fügt sale_stock lieferbezogene Felder hinzu. sale_margin fügt Margenberechnungen hinzu. Jedes Modul fügt hinzu, was es benötigt, ohne die Kernstruktur zu duplizieren.

Schlüsselfelder im Modell


Hier sind die wichtigsten Odoo-Felder im sale.order.line-Modell. Das Verständnis dieser Felder wird Ihnen helfen, effektiv mit Angeboten und Verkaufsbestellungen zu arbeiten.


1. order_id

Typ: Many2one (sale.order). Erforderlich. Verweis auf die übergeordnete Verkaufsbestellung. Dieses Feld verknüpft jede Position mit ihrer übergeordneten Bestellung. Positionen werden gelöscht, wenn die Bestellung gelöscht wird (Kaskade).


2. sequence

Typ: Integer. Standard 10. Steuert die Anzeigeordnung der Positionen in der Bestellung. Wird zum Sortieren von Abschnitten, Notizen und Produktlinien verwendet.


3. company_id

Typ: Many2one (res.company). Verknüpft von order_id. Wird für Mehrgesellschaftsregeln und Zugriffssteuerung verwendet.


4. currency_id

Typ: Many2one (res.currency). Verknüpft von order_id. Wird für alle monetären Felder in der Zeile verwendet. Stellt die korrekte Währung für die Preisgestaltung sicher.


5. order_partner_id

Typ: Many2one (res.partner). Verknüpft von order_id. Der Kunde. Wird für Preislisten und Steuerregeln verwendet.


6. salesman_id

Typ: Many2one (res.users). Verknüpft von order_id. Der Verkäufer. Wird für Provisionen und Berichterstattung verwendet.


7. state

Typ: Auswahl. Verknüpft von order_id. Bestellstatus (Entwurf, gesendet, Verkauf, abgeschlossen, storniert). Bestimmt, welche Felder bearbeitbar sind.


8. display_type

Typ: Auswahl. Werte: line_section oder line_note. Wenn gesetzt, ist die Zeile ein Abschnittsheader oder eine Notiz, nicht eine Produktzeile. Produktfelder sind leer.


9. is_downpayment

Typ: Boolean. Gibt an, ob die Zeile eine Anzahlung ist. Anzahlungen werden separat in Rechnung gestellt.


10. is_expense

Typ: Boolean. Wahr, wenn die Zeile aus einer Ausgabe oder einer Lieferantenrechnung stammt. Wird zur Verfolgung der Projektkosten verwendet.


11. produkt_id

Typ: Many2one (product.product). Das verkaufte Produkt. Der Bereich beschränkt sich auf verkaufsfähige Produkte. Erforderlich für Produktlinien.


12. product_template_id

Typ: Many2one (product.template). Berechnet aus product_id. Wird vom Produktkonfigurator zur Auswahl von Varianten verwendet.


13. name

Typ: Text. Die Zeilenbeschreibung. Berechnet aus Produkt- und benutzerdefinierten Attributen. Enthält Variantendetails, wenn zutreffend.


14. product_uom_qty

Typ: Float. Erforderlich. Die bestellte Menge. Standard 1.0. Kann durch Verpackung bestimmt werden.


15. product_uom

Typ: Many2one (uom.uom). Maßeinheit. Standardmäßig vom Produkt. Wird für Menge und Preisgestaltung verwendet.


16. tax_id

Typ: Many2many (account.tax). Auf die Zeile angewandte Steuern. Berechnet aus Produkt und steuerlicher Position.


17. preis_einheit

Typ: Float. Erforderlich. Einheitspreis pro Produkt_uom. Berechnet aus der Preisliste oder dem Produkt. Kann manuell überschrieben werden.


18. rabatt

Typ: Float. Rabattprozentsatz. Wird auf den preis_einheit vor Steuern angewendet.


19. preis_zwischenbetrag

Typ: Monetär. Zwischensumme vor Steuern. Berechnet aus Menge, Einheitspreis und Rabatt.


20. preis_steuer

Typ: Float. Gesamter Steuerbetrag. Berechnet aus preis_zwischenbetrag und steuer_id.


21. preis_gesamt

Typ: Monetär. Gesamtbetrag einschließlich Steuern. Der Hauptbetrag für die Rechnungsstellung.


22. produkt_verpackungs_id

Typ: Many2one (product.packaging). Optionale Verpackung (z.B. Box mit 12). Wenn gesetzt, kann die Menge durch die Verpackung bestimmt werden.


23. customer_lead

Typ: Float. Vorlaufzeit in Tagen. Tage zwischen Auftragsbestätigung und Versand. Wird zur Berechnung des Lieferdatums verwendet.


24. qty_delivered

Typ: Float. Gelieferte Menge. Wird durch Lagerbewegungen oder manuell aktualisiert. Wird für Teilrechnungen verwendet.


25. qty_invoiced

Typ: Float. Bereits fakturierte Menge. Wird aus Rechnungszeilen berechnet.


26. qty_to_invoice

Typ: Float. Verbleibende Menge zur Fakturierung. Wird aus qty_delivered und qty_invoiced berechnet.


27. invoice_status

Typ: Auswahl. Werte: Upselling, fakturiert, zu fakturieren, nein. Gibt den Fakturierungsstatus für die Zeile an.


28. invoice_lines

Typ: Many2many (account.move.line). Verknüpfungen zu Rechnungszeilen, die aus dieser Verkaufszeile erstellt wurden. Wird zur Rückverfolgbarkeit verwendet.


29. create_date

Typ: Datum/Uhrzeit. Wann der Datensatz erstellt wurde. Wird automatisch von Odoo verwaltet.


30. write_date

Typ: Datum/Uhrzeit. Wann der Datensatz zuletzt geändert wurde. Wird für die Prüfung verwendet.

Wie dieses Modell in Geschäftsabläufen verwendet wird


1. Angebot und Verkaufsauftrag

Wenn ein Verkäufer ein Angebot erstellt, fügt er Produkte hinzu. Jedes Produkt wird zu einer sale.order.line. Die Zeilen zeigen Menge, Preis, Rabatt und Gesamtbetrag. Der Auftrag wird bestätigt, wenn der Kunde akzeptiert.


2. Preisliste und Rabatte

Preisliste werden pro Zeile angewendet. Die Felder price_unit und discount werden aus den Regeln der Preisliste berechnet. Mengenrabatte oder kundenspezifische Preise werden hier behandelt.


3. Lieferung und Rechnungsstellung

Wenn der Bestand geliefert wird, wird qty_delivered aktualisiert. Die Rechnungsstellung kann pro Lieferung oder auf einmal erfolgen. Das Feld invoice_status leitet den Benutzer, was noch zu fakturieren ist.


4. Projekt und Dienstleistungen

Für Dienstleistungsprodukte verlinken die Zeilen zu Projektaufgaben und Stundenzetteln. Die Vererbung analytic.mixin ermöglicht die Kostenverfolgung pro Projekt.


5. E-Commerce und Portal

Website-Besucher fügen Produkte zum Warenkorb hinzu. Jede Warenkorbzeile wird zu einer sale.order.line, wenn die Bestellung erstellt wird. Der Produktkonfigurator verwendet product_template_id und benutzerdefinierte Attribute.

Wie Entwickler dieses Modell erweitern


Entwickler erweitern sale.order.line mit verschiedenen Mustern. Die Vererbung von Odoo-Modellen ist der Hauptmechanismus.


Modellvererbung

Verwenden Sie _inherit = 'sale.order.line', um das Modell zu erweitern. Fügen Sie neue Felder hinzu, überschreiben Sie Methoden oder fügen Sie Einschränkungen hinzu. Das vererbte Modell in Odoo hält Ihre Änderungen in einem separaten Modul für einfache Upgrades.


Felder hinzufügen

Definieren Sie neue Odoo-Felder in Ihrem vererbten Modell. Verwenden Sie den richtigen Feldtyp: Char, Many2one, Boolean, Integer, Text, Auswahl. Berücksichtigen Sie unternehmensabhängige Felder für mehrere Unternehmen.


Python-Erweiterungen

Überschreiben Sie _compute_price_unit, _compute_price_subtotal oder erstellen/schreiben Sie, um Logik hinzuzufügen. Verwenden Sie super(), um das Original aufzurufen. Seien Sie vorsichtig mit berechneten Feldern und deren Abhängigkeiten.


Odoo Studio

Odoo Studio ermöglicht es Ihnen, Felder ohne Code hinzuzufügen. Gut für schnelle Anpassungen. Für komplexe Logik oder Upgrades sind benutzerdefinierte Module wartungsfreundlicher.

Best Practices


  • Verwenden Sie display_type für Abschnitte und Notizen anstelle von gefälschten Produktlinien. Dies hält die Berichterstattung sauber.
  • Beim Erstellen von API-Integrationen erstellen Sie Zeilen über die order_id. Verwenden Sie das Feld order_line_ids auf sale.order mit dem richtigen Befehlsformat.
  • Respektieren Sie die SQL-Beschränkungen. Eine Produktzeile muss product_id und product_uom haben. Ein Abschnitt oder eine Notiz muss display_type haben.
  • Für benutzerdefinierte Preisgestaltung verwenden Sie, wenn möglich, Preislistenregeln. Überschreiben Sie Berechnungsmethoden nur, wenn Sie Logik benötigen, die von Preislisten nicht unterstützt wird.
  • Für benutzerdefinierte Felder verwenden Sie das Präfix x_ oder ein Modulpräfix, um Konflikte mit zukünftigen Odoo-Versionen zu vermeiden.

Häufige Fehler


  • Erstellen von Zeilen ohne order_id. Das Feld ist erforderlich. Erstellen Sie immer Zeilen im Kontext einer Bestellung.
  • Verwechslung von product_id und product_template_id. Für Produktzeilen setzen Sie product_id. Für Konfigurator-Flows verwenden Sie product_template_id, um eine Variante auszuwählen.
  • Ändern von price_unit oder Rabatt nach der Rechnungsstellung. Sobald qty_invoiced größer als null ist, können Preisänderungen Inkonsistenzen verursachen.
  • Überschreiben von Kernmethoden, ohne super() aufzurufen. Dies kann andere Module oder zukünftige Updates beeinträchtigen.
  • Vergessen, display_type für Abschnitts- oder Notizzeilen festzulegen. Ohne dies wird die Zeile als Produktzeile behandelt und schlägt bei der Validierung fehl.

Fazit


Das Modell sale.order.line ist zentral für Odoo Sales. Es speichert jede Produktzeile auf Angeboten und Bestellungen. Das Verständnis seiner Felder und wie Module es erweitern, wird Ihnen helfen, Odoo effektiv zu konfigurieren, anzupassen und zu integrieren.


Egal, ob Sie ein funktionaler Berater sind, der Geschäftsprozesse abbildet, oder ein Entwickler, der benutzerdefinierte Module erstellt, ein solides Verständnis von sale.order.line wird Zeit sparen und Fehler verhindern.

Brauchen Sie Hilfe bei Ihrer Odoo-Implementierung?


Dasolo hilft Unternehmen bei der Implementierung, Anpassung und Optimierung von Odoo. Wir sind auf API-Integrationen und Odoo-Entwicklung spezialisiert. Unser Team hat umfassende Erfahrung mit der Odoo-Datenarchitektur und Modellen wie sale.order.line.


Wenn Sie Hilfe bei Ihrer Odoo-Implementierung, benutzerdefinierten Modulen oder Integrationen benötigen, sind wir hier, um zu helfen. Vereinbaren Sie eine Demo um Ihr Projekt zu besprechen.

Das Modell sale.order.line: Odoos Architektur der Verkaufsbestellungen verstehen
Dasolo 10. März 2026
Diesen Beitrag teilen
Anmelden , um einen Kommentar zu hinterlassen