Warengruppen
Zweck
Warengruppen (ProductGroup) gruppieren Produkte hierarchisch — z. B. „Brandmelder" → „Optische Rauchmelder" → „IR-Optisch". Pro Warengruppe pflegen Sie Name, Shop-Sichtbarkeit (shopName, shopStatus) und einen optionalen Eltern-Knoten. Drei Sub-Tabs zeigen Lieferanten, Produkte und Mandanten-Filter.
Die hierarchische Struktur wird in der Mandanten-Sichtbarkeit über /product-group-profiles gefiltert.
Voraussetzungen
Berechtigungen (CASL)
Frontend-Page-Guard:
| Action | Subject | Keycloak-Rolle |
|---|---|---|
view | FE_ProductGroup, ProductGroup | — |
create/update/delete | ProductGroup | APP_SPEAMCORE_CREATE/UPDATE/DELETE_PRODUCT_GROUP |
Tab-Subjects:
| Tab | Sub-Pfad | Subject |
|---|---|---|
| Lieferanten | /product-groups/:id/suppliers | ProductGroupSupplier:view |
| Produkte | /product-groups/:id/products | Product:view |
Schritt-für-Schritt-Anleitung
- Warengruppen (
/product-groups) → + Neu. - Name vergeben (z. B. „Brandmelder").
- Optional Eltern-Warengruppe wählen (
parentProductGroupId) für Hierarchie. - Wenn der Shop genutzt wird:
shopNameundshopStatussetzen. - Tab Lieferanten ergaenzen — Hersteller koennen pro Warengruppe vergeben werden.
- Tab Produkte zeigt alle Produkte dieser Warengruppe.

Toolbar (Detail-Seite)
Schlanke Toolbar oben rechts:
| Icon | Aktion (aria-label) | CASL | Wirkung |
|---|---|---|---|
| ← | Zurückgehen | — | Zurück zur Liste. |
| 🏠 | Zur Startseite gehen | — | Springt auf das Dashboard / /. |
| ⏮/◀/▶/⏭ | Pagination | — | Navigation durch die gefilterte Liste — Massen-Bearbeitung ohne Liste-Sprung. |
Globale Floating-Drawer (links)
Wie auf jeder Detail-Seite verfuegbar — siehe Floating-Quickbar:
- KAL. (Mini-Kalender)
- ZEIT (Persoenliche Wochen-Arbeitszeit)
- ARBEIT (Eigene bevorstehende Aufträge)
Felder und Eingaben
| Feldname | Pflicht | Datentyp | Wirkung beim Ausfuellen | Voraussetzung |
|---|---|---|---|---|
name | ja | String | Anzeige in Auswahllisten und in der Hierarchie. | — |
shopName | nein | String | Anzeige im Shop, falls abweichend vom internen Namen. | view:Shop. |
shopStatus | nein | active/inactive (default inactive) | active: Warengruppe wird im Shop angezeigt. Default inactive. | view:Shop. |
parentProductGroupId | nein | UUID (Self-Ref) | Eltern-Warengruppe für Hierarchie. Achtung: keine Zyklus-Validierung im FE. | view:ProductGroup. |
type | nein | internal/external (Default internal) | internal = eigene Ordnung (am Produkt gepflegt), external = aus einem Lieferantenkatalog übernommen. Steuert Filter/Tree-Sicht. Beim Import neu angelegte Gruppen erhalten den im Wizard gewählten Typ. | — |
Workflows und Zustaende
Anlege-Pattern
ProductGroup und ProductGroupProfile strukturieren Produkte hierarchisch für Filter, Reports und Sonderkonditions-Regeln.
ProductGroup— flache oder hierarchische Klassifikation (z. B. „Brandmelder", „Sirenen", „Ventile").ProductGroupProfile— kunden-/branchen-spezifische Sicht auf eine Gruppe (z. B. „Bestseller für Industriekunden").
Zuweisung Produkt → Gruppe(n) erfolgt am Produkt-Stamm (/products) über productGroupIds (Multi-Select).
Wiederverwendbare Konzepte
- Warengruppen-Profile — Mandanten-spezifische Sichtbarkeit.
- Berechtigungen verstehen (CASL)
Verknuepfungen zu anderen Modulen
- Produkte (
/products) —Product.productGroupIdreferenziert eine Warengruppe. - Warengruppen-Profile — wer-sieht-was-Filter pro Mandant.
- Lieferanten (
/suppliers) —ProductGroupSupplier-Junction-Einträge. - Shop (
/shop) —shopStatus = activemacht die Warengruppe öffentlich sichtbar.
Häufige Fehler und Lösungen
| Fehler | Lösung |
|---|---|
| Warengruppe nicht in Produkt-Auswahl | clientScope über ProductGroupProfile blockiert — Mandanten-Profil prüfen. |
| Hierarchie-Schleife | FE prueft das nicht — bei zirkulaerer Beziehung manuell auf null zuruecksetzen. |
| Shop zeigt Warengruppe nicht an | shopStatus = inactive oder Product.shopProduct = false. |
API/Schnittstellen
| Methode | Endpoint | Zweck | CASL |
|---|---|---|---|
GET | /api/product-groups | Liste | view ProductGroup |
POST | /api/product-groups | Anlegen | create ProductGroup |
PATCH | /api/product-groups/:id | Ändern | update ProductGroup |
DELETE | /api/product-groups/:id | Soft-Delete | delete ProductGroup |
Versionshinweise
- 2026-06-22: Feld
type(internal/external) dokumentiert — interne Ordnung vs. übernommener Lieferantenkatalog. Verifiziert anproductGroup.model.ts. - 2026-04-29: Initiale Veroeffentlichung.