gruene-seele/dev/product management /konzept.md

239 lines
No EOL
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## Feedback zum Briefing
### A) INCI-Handling
* **Kopierfunktion:** Das ist ein klassischer Bug im `replicate()`-Prozess von Laravel. Wenn die INCIs über eine Pivot-Tabelle verknüpft sind, müssen die Relationen explizit mitkopiert werden.
* **Sortierung:** Die Idee, erst zu sortieren und dann "global" zu speichern, schont die Datenbank. Ich empfehle hier **SortableJS**. Es ist performant und erlaubt flüssiges Drag & Drop.
* **Dropdown-Logik:** Technisch muss hier sichergestellt werden, dass die Datenbank die `order`-Spalte nicht nach Alphabet, sondern nach der `timestamp` oder `index` des Klicks speichert. Das ist ein wichtiger Hinweis für die Backend-Logik!
### B) & D) Warenwirtschaft & Eingang
* **Datenmodell:** Wir brauchen eine klare Trennung zwischen **"Bestellung/Pending"** und **"Eingang/Gebucht"**.
* **Autosuggest:** Bei über 200 Rohstoffen ist eine Bibliothek wie *Select2* oder *TomSelect* sinnvoll, damit Ivonne nicht scrollen muss, sondern tippen kann.
* **Alarm-Funktion:** Das Feld für die Mindestmenge (z.B. 5.000g) sollte direkt am **Stammdaten-Objekt des Rohstoffs** hängen, nicht nur im Wareneingang, damit der Alarm global funktioniert.
### C) Rezepturen & Faktoren
* **Der "Verschleiß-Faktor":** Das ist ein extrem wichtiger Punkt für die Kalkulation.
* *Berechnungslogik:* Wenn die Rezeptur 100g vorsieht und der Faktor 1,1 ist, zieht das System bei der Produktion automatisch 110g aus dem Bestand ab. Das ist sauber gelöst.
* **Dichte-Thematik (Öl/Wasser):** Da du sagst, ihr rechnet konsequent in **Gramm**, ist die Dichte für die reine Bestandsführung im System egal solange ihr beim Wiegen an der Waage bleibt. Das System rechnet einfach: `Eingang (g) - Verbrauch (g) * Faktor`.
### E) Produktion & Chargen-Tracking
* **FIFO-Prinzip:** Da Ivonne die letzten 3 Chargen sieht, ist das System perfekt für die Rückverfolgbarkeit (wichtig für Kosmetik-Verordnungen!).
* **Mehrfachauswahl bei Chargen:** Das ist klug, falls eine Charge während der Produktion leer geht und die nächste angebrochen wird.
### F) Bestand & UI
* **Menü-Badges:** Die roten Zahlen im Menü (z.B. "Bestand Rohstoffe (2)") sind ein hervorragender Trigger. Technisch lösen wir das über einen `View Composer` in Laravel, damit die Zahl auf jeder Seite aktuell bleibt.
### G) Ausgang (Ausschuss)
* **Logging:** Da du "Wer" (User-ID) und "Warum" abfragst, ist das ein vollwertiges Korrekturjournal. Das ist für Audits Gold wert.
---
----------
### 1. Die "Stückliste" (BOM - Bill of Materials)
Du erweiterst das System von einer reinen Rezeptur (INCIs) zu einer vollständigen **Stückliste**. Das bedeutet, ein "Produkt" besteht in Laravel nun aus zwei Relationen:
* **Rezeptur:** (Rohstoffe in Gramm * Faktor)
* **Packaging:** (Tiegel, Deckel, Etikett, Umkarton in Stück)
**Wichtig für die Logik:** Im Gegensatz zu den Rohstoffen brauchen Verpackungen keinen "Schwund-Faktor" von 1,1, sondern werden meist als **Ganzzahlen** (Stück) abgezogen. Es sei denn, du hast auch hier nennenswerten Ausschuss (z.B. Etiketten, die beim Bekleben kaputtgehen) dann sollte der Faktor auch hier optional zuschaltbar sein.
### 2. Der Workflow: Erst Definition, dann Zuordnung
Dein Ansatz ist vollkommen richtig:
1. **Stammdaten:** Erst legst du unter "Warenwirtschaft > Bestand Verpackungen" den Artikel an (z.B. "Glastiegel 40ml").
2. **Produkt-Konfiguration:** Beim Produkt (z.B. Tattoocreme) sagst du nun: "Dieses Produkt verbraucht pro Einheit 1x Glastiegel 40ml".
3. **Produktions-Trigger:** Sobald Ivonne 500 Einheiten produziert, zieht das System im Hintergrund automatisch 500 Tiegel vom Bestand ab.
### 3. Visualisierung der Datenstruktur
Damit die Datenbank sauber bleibt, empfehle ich folgende Struktur für die Produktanlage:
| Ebene | Typ | Einheit | Besonderheit |
| --- | --- | --- | --- |
| **A (Rohstoffe)** | INCI / Rohstoff | Gramm | Inkl. Faktor (1,1) & Chargen-Tracking |
| **B (Primärpackung)** | Tiegel / Flasche | Stück | Zwingend für Produktion nötig |
| **C (Sekundärpackung)** | Karton / Beipackzettel | Stück | Optional, falls im System geführt |
### 4. Usability-Tipp für die Verpackungsliste
Da die Verpackungen oft für viele Produkte gleich sind (der gleiche Tiegel für 5 verschiedene Cremes), sollte die Auswahl im Backend über eine **Suche/Dropdown-Kombination** erfolgen, genau wie bei den INCIs.
### 5. Der "Bestand-Alarm" für Verpackungen
Da Verpackungen oft lange Lieferzeiten haben, solltest du hier die gleiche **Alarm-Logik** (Mail an Service) wie bei den Rohstoffen implementieren, sobald der "Meldebestand" unterschritten wird.
---
---
# neues erweitertes Briefing: Erweiterung Web-CRM „Warenwirtschaft & Produktion“
## 1. Überarbeitung INCI-Management (Produkte)
Ziel ist eine intuitivere Verwaltung der Inhaltsstoffe.
* **Kopierfunktion:** Beim Duplizieren eines Produkts müssen alle verknüpften INCIs (Pivot-Daten) mitkopiert werden.
* **Drag & Drop Sortierung:** INCIs innerhalb eines Produkts müssen manuell sortierbar sein (z. B. via SortableJS). Speicherung der Reihenfolge erfolgt erst beim Klick auf „Speichern“ (kein Live-DB-Ping pro Verschiebung).
* **Selektions-Logik:** Die Mehrfachauswahl im Dropdown muss alphabetisch sortiert sein, die Übernahme in die Produktliste erfolgt jedoch in der **Reihenfolge der Auswahl (Klicks)**.
## 2. Stammdaten & Menüstruktur „Warenwirtschaft“
Ein neuer Hauptmenüpunkt „Warenwirtschaft“ mit folgenden Unterpunkten wird erstellt:
1. **Eingang:** Verwaltung von Bestellungen und Lieferungen (Status: Pending/Grün).
2. **Ausgang:** Erfassung von Ausschuss (Schrottliste) mit Grund, User-Log und Datum.
3. **Produktion:** Protokollierung der Herstellungsprozesse.
4. **Lieferanten:** Verwaltung inkl. Kategorien (Rohstoffe, Tiegel, Verpackung etc.).
5. **Bestand (Getrennte Views):**
* Bestand Rohstoffe
* Bestand Packaging (Hardware: Tiegel, Deckel)
* Bestand Etiketten (Produktbezogen)
* Bestand Versand & Office
## 3. Rezeptur & Kalkulations-Logik (Backend-Specs)
Um Rundungsfehler zu vermeiden, wird intern mit erhöhter Präzision gerechnet:
* **Datentypen:** Preise in **Milli-Cent** (Integer), Gewichte in **Milli-Gramm** (Integer oder Decimal 12,4).
* **Verbrauchs-Faktor:** Jedes Produkt erhält pro INCI ein Feld für die Grammzahl und einen **Schwund-Faktor** (Default 1,1).
* *Berechnung:* `Soll-Menge (g) * Faktor = Tatsächlicher Bestandsabzug`.
* **Haltbarkeit:** Auswahl pro Produkt via Radio-Button:
* a) Symbol „12M-Tiegel“ (PAO - Period After Opening).
* b) Festes MHD (Auswahl: 6, 12, 18, 24, 30, 36 Monate).
## 4. Workflow: Wareneingang (Zwei-Stufen-System)
1. **Stufe 1 (Einkauf):** Erfassung von Lieferant, Inhaltsstoff (Autosuggest), Kaufdatum, Menge (g) und Netto-Preis/kg. Status steht auf **„Pending“ (Orange)**.
2. **Stufe 2 (Ivonne/Eingang):** Bei Erhalt der Ware Ergänzung von Eingangsdatum, tatsächlicher Menge (g), **Chargen-Nummer** und **MHD**. Status wechselt auf **„Eingebucht“ (Grün)**.
3. **Bestands-Alarm:** Pro Artikel (Rohstoff/Verpackung) wird ein Schwellenwert definiert. Bei Unterschreitung erscheint ein **roter Badge (Zahl)** am Menüpunkt und eine E-Mail geht an den Service.
## 5. Workflow: Produktion & Bestandsabzug
Bei einer neuen Produktion (z.B. 500 Einheiten Tattoocreme):
* **Rohstoff-Abzug:** Das System listet alle hinterlegten INCIs auf. Ivonne wählt pro INCI aus den **letzten 3 Chargen** (FIFO-Prinzip) die verwendeten aus.
* **Chargen-Splitting:** Es muss möglich sein, zwei Chargen für einen Rohstoff zu wählen, falls eine leer wird.
* **Packaging-Abzug:** Automatische Reduktion der verknüpften Hardware (Tiegel/Deckel) und des spezifischen Etiketts um die produzierte Stückzahl.
* **MHD-Check:** Warnmeldung, falls ein Rohstoff-MHD kürzer ist als das geplante Produkt-MHD.
## 6. Etiketten-Sonderlogik
Etiketten werden wie Packaging behandelt, aber:
* Sie sind fest an eine **Produkt-ID** gebunden.
* Wareneingang erfolgt meist manuell nach einem Druckauftrag (z.B. 500 Stück).
* Der Bestand zeigt den Restbestand nach Produktion an (wichtig für Nachbestellungen).
## 7. Rollen & Sicherheit
* **Berechtigung:** Einführung einer Rolle „Redakteur“ (Ivonne). Diese darf Bestände buchen und Produktionen eintragen, aber keine System-Stammdaten oder sensible Einkaufspreise löschen/ändern (falls konfiguriert).
* **Logging:** Jede Bestandsveränderung (Eingang, Produktion, Ausschuss) wird mit der `user_id` protokolliert.
---
Das sind hervorragende und extrem praxisnahe Ergänzungen! Besonders die **LUCID-Verpackungsregister-Thematik** (Abfallwirtschaft) und die **Multi-Lager-Logik** (Köln & Waldbröl) heben das System von einem einfachen CRM zu einem echten, professionellen ERP-System (Enterprise Resource Planning) auf.
Diese Punkte greifen tief in die Datenbankstruktur ein, lassen sich mit Laravel aber sehr sauber abbilden.
Hier ist das **aktualisierte, vollständige Briefing (Version 2.0)**, das du 1:1 an deinen Entwickler weitergeben kannst. Die neuen Punkte sind nahtlos in die Architektur integriert.
---
# Entwickler-Briefing V2.0: Web-CRM „Warenwirtschaft, Produktion & Bestände“
*(Empfohlener Tech-Stack für interaktive Module: Laravel + Livewire + Bootstrap)*
## 1. Überarbeitung INCI-Management (Produkte)
* **Kopierfunktion:** Beim Duplizieren (`replicate()`) eines Produkts müssen alle verknüpften INCIs (Pivot-Daten) zwingend mitkopiert werden.
* **Drag & Drop Sortierung:** INCIs innerhalb eines Produkts müssen manuell sortierbar sein (z. B. via *SortableJS* + Livewire). Speicherung der Reihenfolge erfolgt erst beim Klick auf „Speichern“.
* **Selektions-Logik:** Die Mehrfachauswahl im Dropdown ist alphabetisch sortiert. Die Übernahme in die Produktliste erfolgt jedoch exakt in der **Reihenfolge der Klicks**.
## 2. Stammdaten & Menüstruktur „Warenwirtschaft“
Das System wird um neue Stammdaten-Tabellen erweitert, die vorab verwaltbar sein müssen. Neues Menü:
1. **Stammdaten (Neu):**
* **Lagerorte:** Anlage von Standorten (z.B. Köln, Waldbröl).
* **Qualitäten/Sorten:** Anlage von Rohstoff-Klassifizierungen (z.B. *konventionell, bio kaltgepresst, bio raffiniert, konventionell kaltgepresst, konventionell raffiniert*).
* **Verpackungs-Materialien:** Anlage von Wertstoffen für die Abfallwirtschaft (z.B. *Glas, Holz/Bambus, Pappe/Papier, Kunststoff*).
* **Lieferanten Kategorien:** (z.B. *Rohstoffe, Tiegel, Verpackung*).
* **Lieferanten:** (inkl. Zuweisung einer Kategorie).
2. **Eingang:** Verwaltung von Bestellungen und Lieferungen.
3. **Ausgang:** Erfassung von Ausschuss (Schrottliste) mit Grund, User-Log und Datum.
4. **Produktion:** Protokollierung der Herstellungsprozesse.
5. **Bestand (Getrennte Views & Multi-Lager fähig):**
* Bestand Rohstoffe
* Bestand Packaging (Hardware: Tiegel, Deckel)
* Bestand Etiketten
* Bestand Versand & Office
## 3. Architektur: Datenmodell & Kalkulations-Logik
Um Rundungsfehler und ungenaue Meldungen (LUCID/Verpackungsregister) zu vermeiden:
* **Präzision:** Preise in **Milli-Cent** (Integer), Gewichte in **Milli-Gramm** (Integer oder Decimal 12,4).
* **Rohstoff-Verbrauch (Rezeptur):** Jedes Produkt hat Pivot-Felder für Grammzahl und einen **Schwund-Faktor** (Default 1,1). Berechnung: `Soll-Menge (g) * Faktor`.
* **MHD-Logik (Produkt):** Auswahl via Radio-Button: a) „12M-Tiegel“ (PAO) oder b) Festes MHD (6, 12, 18, 24, 30, 36 Monate).
### NEU: Packaging & Abfallwirtschaft (BOM - Bill of Materials)
Wenn ein Produkt angelegt wird und Packaging zugewiesen bekommt (z.B. Glastiegel, Bambusdeckel, Umverpackung), zieht das System seine Daten aus der Packaging-Datenbank.
* **Stammdaten Packaging:** Jeder Artikel (z.B. "Glastiegel 50ml") bekommt zwei Pflichtfelder:
1. **Material:** (Dropdown aus den zuvor angelegten Verpackungs-Materialien, z.B. *Glas*).
2. **Gewicht:** (Eingabefeld in Gramm).
* **Nutzen:** Das System kann so auf Knopfdruck einen Report generieren: *"Für 500 produzierte Pechsalben wurden X kg Glas und Y kg Pappe in Verkehr gebracht."*
## 4. Workflow: Wareneingang & Multi-Lager
1. **Stufe 1 (Einkauf / Pending):** * Erfassung von: Lieferant, Inhaltsstoff (Autosuggest), Kaufdatum, Menge (g), Netto-Preis/kg, **Lagerort (Dropdown: Köln/Waldbröl)**. Status steht auf **„Pending“ (Orange)**.
2. **Stufe 2 (Eingangsbuchung / Grün):** * Bei Erhalt ergänzt der User (z.B. Ivonne): Eingangsdatum, tatsächliche Menge (g), Chargen-Nummer, MHD und **Qualität/Sorte** (Dropdown: *bio kaltgepresst, konventionell etc.*). Status wechselt auf **„Eingebucht“ (Grün)**.
3. **Bestands-Ansicht & Alarme:** * Bestände müssen nun **pro Lagerort** sowie als **Gesamtsumme** darstellbar sein.
* Unterschreitet der Gesamtbestand den Schwellenwert, erscheint ein roter Badge am Menüpunkt + E-Mail-Alarm.
## 5. Workflow: Produktion & Bestandsabzug
Bei einer neuen Produktion (z.B. Tattoocreme):
* **Rohstoff-Abzug & Chargen-Splitting:** Das System listet die INCIs. Der User wählt aus den **letzten 3 Chargen**. Es muss möglich sein, Mengen auf zwei Chargen aufzuteilen, wenn eine Charge leer wird.
* **Lager-Logik:** Bei der Produktion muss angegeben werden, **an welchem Standort** (Köln oder Waldbröl) produziert wird, damit das System die Rohstoffe vom richtigen Lager abzieht.
* **Packaging-Abzug:** Automatische Reduktion der verknüpften Hardware (Tiegel/Deckel) und Etiketten am jeweiligen Standort.
* **MHD-Check:** Warnmeldung, falls ein Rohstoff-MHD kürzer ist als das geplante Produkt-MHD.
## 6. Rollen & Sicherheit (Activity Logging)
* **Berechtigung („Redakteur“):** Darf Bestände buchen und Produktionen eintragen, aber keine System-Stammdaten (Materialien, Qualitäten, Lagerorte) oder Preise bearbeiten/löschen.
* **Audit Trail:** Jede Bestandsveränderung (Eingang, Produktion, Ausgang/Schrott) wird zwingend mit `user_id`, `timestamp` und Begründung protokolliert.
---