Zum Hauptinhalt springen

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

- Berechtigung `create:ProductGroup`. - Für Shop-Felder: `view:Shop`.

Berechtigungen (CASL)

Frontend-Page-Guard:

ActionSubjectKeycloak-Rolle
viewFE_ProductGroup, ProductGroup
create/update/deleteProductGroupAPP_SPEAMCORE_CREATE/UPDATE/DELETE_PRODUCT_GROUP

Tab-Subjects:

TabSub-PfadSubject
Lieferanten/product-groups/:id/suppliersProductGroupSupplier:view
Produkte/product-groups/:id/productsProduct:view

Schritt-für-Schritt-Anleitung

  1. Warengruppen (/product-groups) → + Neu.
  2. Name vergeben (z. B. „Brandmelder").
  3. Optional Eltern-Warengruppe wählen (parentProductGroupId) für Hierarchie.
  4. Wenn der Shop genutzt wird: shopName und shopStatus setzen.
  5. Tab Lieferanten ergaenzen — Hersteller koennen pro Warengruppe vergeben werden.
  6. Tab Produkte zeigt alle Produkte dieser Warengruppe.

Listenansicht — product-groups

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)

Felder und Eingaben

FeldnamePflichtDatentypWirkung beim AusfuellenVoraussetzung
namejaStringAnzeige in Auswahllisten und in der Hierarchie.
shopNameneinStringAnzeige im Shop, falls abweichend vom internen Namen.view:Shop.
shopStatusneinactive/inactive (default inactive)active: Warengruppe wird im Shop angezeigt. Default inactive.view:Shop.
parentProductGroupIdneinUUID (Self-Ref)Eltern-Warengruppe für Hierarchie. Achtung: keine Zyklus-Validierung im FE.view:ProductGroup.
typeneininternal/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

Verknuepfungen zu anderen Modulen

  • Produkte (/products) — Product.productGroupId referenziert eine Warengruppe.
  • Warengruppen-Profile — wer-sieht-was-Filter pro Mandant.
  • Lieferanten (/suppliers) — ProductGroupSupplier-Junction-Einträge.
  • Shop (/shop) — shopStatus = active macht die Warengruppe öffentlich sichtbar.

Häufige Fehler und Lösungen

FehlerLösung
Warengruppe nicht in Produkt-AuswahlclientScope über ProductGroupProfile blockiert — Mandanten-Profil prüfen.
Hierarchie-SchleifeFE prueft das nicht — bei zirkulaerer Beziehung manuell auf null zuruecksetzen.
Shop zeigt Warengruppe nicht anshopStatus = inactive oder Product.shopProduct = false.

API/Schnittstellen

MethodeEndpointZweckCASL
GET/api/product-groupsListeview ProductGroup
POST/api/product-groupsAnlegencreate ProductGroup
PATCH/api/product-groups/:idÄndernupdate ProductGroup
DELETE/api/product-groups/:idSoft-Deletedelete ProductGroup

Versionshinweise

  • 2026-06-22: Feld type (internal/external) dokumentiert — interne Ordnung vs. übernommener Lieferantenkatalog. Verifiziert an productGroup.model.ts.
  • 2026-04-29: Initiale Veroeffentlichung.