Produkt — Lieferanten (Sub-Route)
Zweck
Sub-Route /products/:id/suppliers listet alle Lieferanten, die das Produkt liefern. Pro Eintrag (ProductSupplier) wird gepflegt:
- Lieferanten-eigene Artikelnummer (
supplierProductNo). - Einkaufspreis (
purchasePrice). - Mindestabnahme-Menge.
- Lieferzeit.
- Primary-Flag (Default-Lieferant für dieses Produkt).
Bei Bestellungen über Bestellbelege wird der Primary-Lieferant vorgeschlagen.
Voraussetzungen
Berechtigungen (CASL)
| Action | Subject | Wirkung | Keycloak-Rolle |
|---|---|---|---|
view | FE_Product, Product | Detail aufrufbar | — |
view/create/update/delete | ProductSupplier | Bezugsquellen pflegen | APP_SPEAMCORE_VIEW/CREATE/UPDATE/DELETE_PRODUCT_SUPPLIER |
view | Supplier | Lieferanten-Auswahl | APP_SPEAMCORE_VIEW_SUPPLIER |
Schritt-für-Schritt-Anleitung
- Produkt (
/products/:id) → Tab Lieferanten. - + Lieferant wählt einen Lieferanten und legt einen ProductSupplier-Datensatz an.
- Lieferanten-Artikelnummer, Einkaufspreis, Lieferzeit pflegen.
- Optional
isPrimary = truesetzen — wirkt auf Bestellbeleg-Vorbefuellung.

Preise, Rabatt und Deckungsbeitrag (Juni 2026)
Das Lieferanten-Grid pflegt pro ProductSupplier Verkaufspreis (VK), Einkaufspreis (EK), Rabatt und zeigt den Deckungsbeitrag (DB) farblich an. Die genaue Berechnung — Rabatt-Kette, EK-Ableitung, Marge — beschreibt das Konzept Produkt-Lieferanten-Preise & Deckungsbeitrag.
| Feldname | Pflicht | Datentyp | Wirkung beim Ausfuellen | Voraussetzung |
|---|---|---|---|---|
salePrice | nein | Decimal(10,2) | Verkaufspreis (VK) des Lieferanten — Basis für den Rabatt. | — |
purchasePrice | nein | Decimal(10,2) | Einkaufspreis (EK). Leer = wird aus VK − Rabatt abgeleitet. | — |
discount | nein | Zahl | Rabattbetrag (in % oder absolut, je discountType). Ein gesetzter Wert (auch 0) überschreibt Warengruppen-/Lieferanten-Rabatt. | — |
discountType | nein | percentage/fixed/none | Rabatt-Art. none = nicht rabattierfähig → keine Vererbung, EK = VK. | — |
tieredPrices | nein | JSON | Mengengestaffelte EK/Rabatte [{fromQuantity, purchasePrice, discount, discountType}]. Unterste Staffel spiegelt in den Basis-EK; VK bleibt ungestaffelt. | Produkt mit hasTieredPrices. |
packagingUnit | nein | Decimal(12,3) | Verpackungseinheit dieses Lieferanten. | — |
deliveryTimeDays | nein | Integer | Lieferzeit in Tagen. | — |
stock | nein | Decimal | Lagerbestand beim Lieferanten. | — |
minimumOrderQuantity | nein | Decimal | Mindestbestellmenge. | — |
mainSupplier | nein | Boolean | Kennzeichen Hauptlieferant (Default-Bezugsquelle, Vorschlag im Bestellbeleg). | — |
Das Grid zeigt zusätzlich eine Deckungsbeitrags-Spalte (DB% = (VK − EK) / VK × 100), eingefärbt nach den Marge-Schwellwerten. Eine Auswertung über alle Lieferanten je Produkt bietet die Deckungsbeitrags-Übersicht.
Wiederverwendbare Konzepte
Verknuepfungen zu anderen Modulen
- Produkte — Eltern-Modul.
- Lieferanten — Stamm und Sub-Route
/suppliers/:id/products(umgekehrte Sicht). - Bestellbelege — verbrauchen Primary-Lieferant.
- Produkt-Gruppen — pro Gruppe ein eigener Lieferanten-Spiegel via
ProductGroupSupplier.
API/Schnittstellen
| Methode | Endpoint | Zweck | CASL |
|---|---|---|---|
GET | /api/product-suppliers?filter[productId] | Liste | view ProductSupplier |
POST | /api/product-suppliers | Anlegen | create ProductSupplier |
PATCH | /api/product-suppliers/:id | Ändern | update ProductSupplier |
DELETE | /api/product-suppliers/:id | Soft-Delete | delete ProductSupplier |
Versionshinweise
- 2026-06-22: Lieferanten-Preise dokumentiert — VK/EK/Rabatt (
salePrice,purchasePrice,discount,discountTypeinkl.none), Staffelpreise (tieredPrices), Logistikfelder undmainSuppliersowie die Deckungsbeitrags-Spalte. Verweis auf Konzept und Übersicht. Verifiziert anproductSupplier.model.ts,productSupplierPricing.ts,ProductSupplierDataGrid.tsx. - 2026-04-30: Initiale Veroeffentlichung.