Zum Hauptinhalt springen

Verkaufsbeleg-Positionen (SalesDocumentItems)

Zweck

/sales-document-items ist eine globale Cross-Beleg-Sicht auf alle Positionen (SalesDocumentItem) aus allen Verkaufsbelegen. Diese Liste eignet sich für Auswertungen über Belege hinweg — etwa „welche Produkte wurden in den letzten 30 Tagen verkauft" oder „wo lag der Margen-Schnitt im Q1".

Die Liste ist read-only (kein POST/PATCH/DELETE auf der Cross-Liste); Pflege erfolgt im Beleg-Kontext über /sales-documents/:id/items.

Voraussetzungen

- Berechtigung `view:SalesDocumentItem`. - Für Drill-Down ins Belegdetail: `view:SalesDocument`.

Berechtigungen (CASL)

ActionSubjectWirkungKeycloak-Rolle
viewFE_SalesDocumentItem, SalesDocumentItemCross-Liste aufrufbar
viewSalesDocumentDrill-Down zum BelegAPP_SPEAMCORE_VIEW_SALES_DOCUMENT

Schritt-für-Schritt-Anleitung

  1. Verkaufsbeleg-Positionen (/sales-document-items) — DataGrid mit allen Positionen.
  2. Filter und Sortierung pro Spalte (Beleg-Nummer, Produkt, Datum, Preis, Marge, ...).
  3. Klick auf Position → Drill-Down zum jeweiligen Beleg /sales-documents/:salesDocumentId.

Cross-Beleg-Liste der Verkaufsbeleg-Positionen mit Spalten Verkaufsbeleg-Nr., Dokumenttyp, Position, Produkt-Nr., Titel, Menge, Rabatt, Verkaufspreis, Summe, Gewinn — belegübergreifend über Aufträge, Rechnungen und Angebote (Test-Daten).

Felder und Eingaben (lesend)

Auswahl der wichtigsten Felder aus dem Modell SalesDocumentItem:

FeldnameDatentypBedeutung
salesDocumentIdUUIDVerweis auf den Beleg.
positionStringPositionsnummer (z. B. 1, 1.1).
typeStringPositions-Typ: Product, Text oder Discount (Rabatt-Position, neu Mai 2026).
discountDecimalRabatt-Wert. Nur bei discountType/Rabatt relevant.
discountTypeStringpercentage (Prozent, Default) oder fixed (fester Betrag).
productIdUUIDVerweis auf Produkt (optional).
productNoStringProdukt-Nummer zum Zeitpunkt der Erfassung.
productTitle / productDescriptionString / TEXTAnzeige-Texte.
quantityDecimalMenge.
priceDecimalVerkaufspreis (netto).
purchasePriceDecimalEinkaufspreis (bereits rabattierter EK, für Marge).
productSupplierLookupProdukt-Lieferant — Quelle des Einkaufspreises, wenn kein expliziter purchasePrice gesetzt ist.
hsCode/hsCodeNameStringZolltarif.
optional / alternativeBooleanPosition als Optional bzw. Alternative gekennzeichnet.
productUnit / productUnitIdString / UUIDEinheit (Snapshot + Verweis).
productGroupIdUUIDProdukt-Gruppe.
accountIdUUIDBuchhaltungskonto.

Gewinn-Spalte (Marge)

Die Liste zeigt pro Position eine Gewinn-Spalte im Format Betrag (Prozent), z. B. 368,60 € (38,00 %). Berechnung:

  • Gewinn = (rabattierter Verkaufspreis − Einkaufspreis) × Menge.
  • Marge (%) = Gewinn ÷ Verkaufs-Summe × 100.

Sonderfälle:

AnzeigeBedeutung
„Produkt hat keinen Lieferanten"Es ist weder ein Produkt-Lieferant noch ein Einkaufspreis (purchasePrice) hinterlegt — ohne EK lässt sich keine Marge berechnen. Lösung: am Produkt einen Lieferanten/Einkaufspreis pflegen.
leer / keine AnzeigeBei Positions-Typ ≠ Product (z. B. Text- oder Rabatt-Zeilen) sowie bei Korrekturrechnung und Gutschrift wird kein Gewinn ausgewiesen.
Die Gewinn-/Margen-Spalte ist eine **interne** Auswertungshilfe in der Cross-Beleg-Liste. Sie erscheint **nicht** auf dem gedruckten Kundenbeleg.

Rabatt-Positionen (neu, Mai 2026)

SpeamCore kennt seit Mai 2026 einen eigenen Positions-Typ Discount — eine Rabatt-Zeile, die wie eine normale Position im Beleg steht, aber die Summe reduziert statt erhöht.

Zwei Ebenen, nicht verwechseln:

EbeneWoWirkung
Positions-RabattFelder discount + discountType direkt an einer Produkt-PositionReduziert nur diese eine Position. fixed = fester Betrag pro Stück (× Menge), percentage = Prozent vom Zeilen-Betrag. Netto wird nie negativ.
Beleg-Rabatteigene Position vom Typ DiscountReduziert das Gesamt-Netto des Belegs. Die Umsatzsteuer wird auf dem reduzierten Netto neu berechnet, anteilig pro Steuersatz.

So legen Sie eine Beleg-Rabatt-Position an (im Beleg-Detail /sales-documents/:id/items):

  1. + Position hinzufügenRabatt wählen.
  2. Rabatt-Art wählen: Prozent (percentage) oder fester Betrag (fixed).
  3. Wert eingeben (z. B. 10 für 10 % oder 50 für 50,00 €).

In der Liste erscheint die Rabatt-Zeile mit negativem Summen-Betrag; in der Summen-Box sehen Sie „Netto nach Rabatt" und die darauf neu berechnete USt.

Beleg-Rabatte werden in der E-Rechnung normkonform als **Allowance auf Dokument-Ebene** (EN 16931, Gruppe BG-20) ausgegeben — mit `ChargeIndicator=false`, optionalem Rabatt-Grund und je Steuerkategorie ausgewiesenem Betrag. Der steuerpflichtige Betrag (`TaxExclusiveAmount`) wird entsprechend gemindert. Sie müssen dafür nichts extra tun — die Rabatt-Position fließt automatisch korrekt in die E-Rechnung ein (siehe [Glossar: E-Rechnung / XRechnung](/grundlagen/glossar#e)).

Toolbar (Detail-Seite)

Schlanke Toolbar oben rechts:

IconAktion (aria-label)CASLWirkung
ZurückgehenZurück zur Liste.
🏠Zur Startseite gehenSpringt auf das Dashboard / /.
⏮/◀/▶/⏭PaginationNavigation durch die gefilterte Liste — Massen-Bearbeitung ohne Liste-Sprung.

Wie auf jeder Detail-Seite verfuegbar — siehe Floating-Quickbar:

  • KAL. (Mini-Kalender)
  • ZEIT (Persoenliche Wochen-Arbeitszeit)
  • ARBEIT (Eigene bevorstehende Aufträge)

Wiederverwendbare Konzepte

Verknuepfungen zu anderen Modulen

API/Schnittstellen

MethodeEndpointZweckCASL
GET/api/sales-document-itemsCross-Listeview SalesDocumentItem
GET/api/sales-document-items/:idDetailview SalesDocumentItem

Versionshinweise

  • 2026-05-29: Rabatt-Position (Discount-Typ) + Felder discount/discountType dokumentiert; EN-16931-Allowance in E-Rechnung erläutert.
  • 2026-04-30: Initiale Veroeffentlichung.