- products.whitelabel_variant_id, product_images.position/size_cm mit Backfill aus Produktnamen - WhiteLabelResolver: Farbe vom Produkt, Kundenlogo je Position, Fehler statt stillem Rückfall; Altlogik für Produkte ohne Variante - Attribute: Variantenwert-Parsing und Farbname ohne Größe - Produkt- und Kundenformular um Variante, Position und Größe ergänzt - Lieferschein noch nicht umgestellt (WL-03, wartet auf K6/K7) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
317 lines
31 KiB
Markdown
317 lines
31 KiB
Markdown
# White Label: Befunde, Verwaltungsbereich und Zuordnungslogik
|
||
|
||
Stand: 17.09.2026 (ergänzt nach Gegenprüfung gegen Code und Datenbank am selben Tag). Grundlage: Prüfung des vorhandenen Codes, der angeschlossenen Datenbank und des gespeicherten Lieferscheins zur Bestellung 2050.
|
||
|
||
**Status:** Analyse und Entwicklungsplan. WL-00, WL-01 und WL-02 sind umgesetzt (siehe Abschnitt 5 und 8). WL-03 bis WL-05 sind noch nicht implementiert; WL-03 hängt an den Klärungen K6 und K7 (Abschnitt 9).
|
||
|
||
## 1. Ergebnis der Untersuchung
|
||
|
||
Das Kundenlogo geht bei Bestellung 2050 nicht durch einen fehlgeschlagenen Dateitransfer verloren. Es ist vorhanden, aber anderen Produkten zugeordnet. Beim Anlegen der neuen Farbprodukte wurde keine passende Kundenzuordnung hergestellt. Zusätzlich unterdrückt die aktuelle Lieferscheinlogik die bekannte Tiegelfarbe, sobald ein Standardetikett verwendet wird.
|
||
|
||
### Konkreter Fall: Bestellung 2050
|
||
|
||
- Kundin: Sintia Assmann, Kunden-ID 207.
|
||
- Bestelldatum: 16.09.2026.
|
||
- Bestellreferenz auf dem Lieferschein: 2026092050.
|
||
- Vorhandenes Dokument: `Lieferschein-2026091604.pdf`.
|
||
|
||
| Bestelltes Produkt | Produkt-ID | Artikelnummer | Menge | Kundeneigenes Logo zugeordnet |
|
||
| --- | --- | --- | --- | --- |
|
||
| Bio Tattoocreme 40 ml, Tiegel SCHWARZ | 180 | 100122 | 10 + 1 | Nein |
|
||
| Bio Tattoocreme 15 ml, Tiegel SCHWARZ | 183 | 100110 | 30 | Nein |
|
||
|
||
Im gespeicherten PDF sind die Standardetiketten eingebettet. Alle drei Positionen tragen die Angabe **„Tiegel: Standard“**. Die White-Label-Produktbezeichnungen enthalten keine Farbe.
|
||
|
||
Die Kundenlogos einschließlich ihrer Bilddateien existieren weiterhin:
|
||
|
||
| Bisheriges Produkt | Produkt-ID | Kunden-Produkt-Zuordnung | Variante am Kundenlogo |
|
||
| --- | --- | --- | --- |
|
||
| Tattoocreme 40 ml, heute als Tiegel GOLD bezeichnet | 37 | 186 | Schwarz 40 ml, Attribut 6 |
|
||
| Tattoocreme 15 ml, heute als Tiegel GOLD bezeichnet | 84 | 188 | Schwarz 15 ml, Attribut 3 |
|
||
|
||
Weitere Kundenzuordnungen bestehen für die Produkte 38, 85 und 86. Für 180 und 183 fehlen sie vollständig. Die vorherige Bestellung 1729 vom 17.02.2026 verwendete noch die Produkte 37 und 84 und ist als Bestellung mit Kundenlogo gekennzeichnet. Die neuen schwarzen Produkte wurden am 27.07.2026 angelegt.
|
||
|
||
**Einordnung:** Der Wechsel der Produkt-IDs erklärt den Ausfall. Die Kopierfunktion übernimmt Standardetiketten und mögliche Varianten, aber keine Kundenzuordnungen. Aus den geprüften Daten allein lässt sich der damalige Bedienablauf nicht vollständig rekonstruieren.
|
||
|
||
### 2050 ist kein Einzelfall
|
||
|
||
Am 27.07.2026 wurden 15 Farbprodukte (IDs 180–194) als Kopien der bisherigen Tattoocreme-Artikel angelegt. Seitdem gibt es weitere Bestellungen von Partnern, die eigene Logos besitzen, aber eines der neuen Farbprodukte **ohne Kundenzuordnung** bestellt haben:
|
||
|
||
| Bestellung | Partner-ID | Produkt |
|
||
| --- | --- | --- |
|
||
| 1880, 1991 | 66 | 180 (40 ml Schwarz) |
|
||
| 1929 | 358 | 180 (40 ml Schwarz) |
|
||
| 2021 | 324 | 180 (40 ml Schwarz) |
|
||
| 2003 | 324 | 183 (15 ml Schwarz), 186 (15 ml · 2 Stück Schwarz) |
|
||
| 1930 | 154 | 185 (15 ml Weiß) |
|
||
| 2050 | 207 | 180, 183 |
|
||
|
||
Ob diese Partner ein Standardetikett wollten, ist fachlich je Fall zu klären. Die Liste wird von der Bestandsprüfung (`whitelabel:report`, Abschnitt 8) fortlaufend erzeugt.
|
||
|
||
### Der eigentliche Befund: alle Partner-Logos liegen noch auf den alten Artikeln
|
||
|
||
Die Bestandsprüfung zeigt **223 Kundenbilder von rund 43 Partnern**, deren Variante Schwarz, Weiß oder Silber ist, die aber auf den fünf alten Artikeln 37, 38, 84, 85 und 86 liegen – also auf den Produkten, die seit dem 27.07.2026 „Tiegel GOLD“ heißen. Vor der Umbenennung waren diese Artikel die Mehrfarb-Produkte; die Farbe kam aus der Variante am Kundenbild. Für die neuen Farbprodukte 180–194 existiert praktisch keine Kundenzuordnung.
|
||
|
||
Folge: **Jeder dieser Partner verliert sein Logo, sobald er das zu seiner Farbe passende neue Produkt bestellt.** Bestellung 2050 ist der erste bemerkte Fall, nicht der einzige. Die Zuordnung ist mechanisch eindeutig (alter Artikel + Bildfarbe → gleichfarbige Kopie) und wird vom Befehl `whitelabel:migrate-colors` (Abschnitt 6) automatisch aufgelöst; kein Fall blieb dabei unauflösbar.
|
||
|
||
## 2. Schwachstellen der bestehenden Verwaltung
|
||
|
||
1. **Verteilte Pflege:** Produkte, mögliche Varianten, Standardetiketten und Kundenlogos werden an unterschiedlichen Stellen verwaltet. Eine gemeinsame Übersicht fehlt.
|
||
2. **Strikte Produktbindung ohne Übertragungshilfe:** Die Logoauswahl verlangt dieselbe Produkt-ID in Bestellung und Kundenzuordnung. Ein ähnlich benanntes oder kopiertes Produkt erbt kein Kundenlogo.
|
||
3. **Zwei parallele Farbmodelle:** Es gibt eigene Artikel für Schwarz, Gold, Weiß und Silber. Gleichzeitig führen selbst die schwarzen Produkte 180 und 183 weiterhin alle vier Farben als mögliche White-Label-Varianten.
|
||
4. **Unklare Beschriftung:** Die Kundenverwaltung zeigt zugeordnete Produkte mit ihrer White-Label-Bezeichnung. Da diese keine Farbe enthält, können verschiedene Farbprodukte gleich aussehen.
|
||
5. **Versteckte Voraussetzung für Kundenlogos:** Ein Kundenlogo ersetzt nur ein bestehendes Standardetikett mit überlappender Attribut-ID. Ohne Standardetikett oder passende Attribute wird es nicht berücksichtigt.
|
||
6. **Farbe wird aus dem Etikett abgeleitet:** Standardetiketten erhalten pauschal die Bezeichnung „Standard“. Die tatsächlich bestellte Tiegelfarbe bleibt dabei unberücksichtigt.
|
||
7. **Mehrdeutige Auswahl:** Bei mehreren Varianten an einem Etikett wird die Anzeige wiederholt überschrieben. Die zuletzt verarbeitete Variante bleibt übrig; eine fachlich eindeutige Auswahl fehlt. Konkrete Ursache: Das Hilfsarray `$varinats` in `prepairForDelivery()` wird nie befüllt, die Prüfung `isset($varinats[...])` ist deshalb immer falsch.
|
||
8. **Keine historische Absicherung in der Bestellposition:** Farbe und ausgewähltes Logo werden derzeit bei der Dokumenterstellung aus aktuellen Stammdaten ermittelt. Eine spätere Neuerstellung kann dadurch andere Angaben liefern.
|
||
9. **Gespeicherte PDFs aktualisieren sich nicht automatisch:** Eine korrigierte Kundenzuordnung allein repariert einen bestehenden Lieferschein nicht.
|
||
10. **Etikettgröße wurde falsch geparst (behoben in WL-00):** Die Attributwerte tragen die Abmessung mit deutschem Komma (`40#3,5`). `(float) "3,5"` ergibt in PHP `3.0`; 40-ml-Etiketten wurden im Lieferschein mit 3 cm statt 3,5 cm gerendert. Das Format `Volumen#Größe` im Attributwert ist ein weiterer Grund, Abmessungen künftig als echte Zahlenfelder zu speichern.
|
||
|
||
Die Daten zeigen außerdem einen wichtigen Migrationskonflikt: Die alten Produkte 37 und 84 heißen heute „GOLD“, ihre Kundenlogos sind aber „Schwarz“ zugeordnet. Alte Bestellungen dürfen deshalb nicht nachträglich allein aus aktuellen Produktnamen interpretiert werden.
|
||
|
||
## 3. Zielbild: eigener Navigationspunkt „White Label“
|
||
|
||
Bestehende Produkte und Kunden weiterverwenden. Der neue Bereich wird die zentrale Oberfläche für White-Label-Konfigurationen; keine zweite, unabhängig gepflegte Produktverwaltung aufbauen.
|
||
|
||
### Ansicht „Kundenzuordnungen“
|
||
|
||
- Suche und Filter nach Kunde, Produkt, Artikelnummer, Farbe und Prüfstatus.
|
||
- Pro Zuordnung: Kunde, vollständiger Produktname, Artikelnummer, Farbe, Logo-Vorschau, Etikettposition und Status.
|
||
- Aktionen: anlegen, bearbeiten, deaktivieren und gezielt auf andere Farbprodukte übertragen.
|
||
- Auch unvollständige Zuordnungen und relevante Bestellpositionen ohne Kundenzuordnung sichtbar machen.
|
||
|
||
Beispiel für die gewünschte Darstellung:
|
||
|
||
| Kunde | Produkt | Farbe | Etikett | Status |
|
||
| --- | --- | --- | --- | --- |
|
||
| Sintia Assmann | Tattoocreme 40 ml · 100122 | Schwarz | Vorschau des Kundenlogos | Vollständig |
|
||
|
||
### Ansicht „Produkte“
|
||
|
||
- Alle White-Label-Produkte mit eindeutiger Farbe und Größe.
|
||
- Standardetiketten, benötigte Etikettpositionen und Anzahl der Kundenzuordnungen anzeigen.
|
||
- Fehlende Farbe, fehlende Bilddateien und widersprüchliche Altdaten hervorheben.
|
||
- Beim Kopieren eines Produkts eine ausdrückliche Auswahl zur Übernahme von Kundenzuordnungen anbieten. Zielprodukt und Etikettpositionen vor der Übernahme prüfen; vorhandene Zuordnungen nicht still überschreiben.
|
||
|
||
### Ablauf beim Anlegen einer Zuordnung
|
||
|
||
1. Kunde und konkretes Produkt auswählen.
|
||
2. Farbe und Größe aus der Produktkonfiguration anzeigen. Keine zweite, widersprüchliche Farbauswahl am Logo anbieten.
|
||
3. Vorhandenes Kundenlogo auswählen oder neues Bild hochladen und einer Etikettposition zuweisen.
|
||
4. Vorschau der späteren Lieferscheinangabe anzeigen, beispielsweise „Tiegel: Schwarz · Etikett: Kundenlogo“.
|
||
5. Validieren und speichern. Fehler müssen die betroffene Zuordnung und den notwendigen nächsten Schritt nennen.
|
||
|
||
## 4. Lösung zur Bereinigung der Zuordnungslogik
|
||
|
||
### 4.1 Farbe, Etikettposition und Logo getrennt modellieren
|
||
|
||
**Grundregel:** Das bestellte Produkt bestimmt die Tiegelfarbe. Die Kombination aus Kunde und Produkt bestimmt die kundenspezifischen Etiketten. Die Position bestimmt, welches Etikett ersetzt wird. Diese Entscheidungen dürfen nicht mehr durch die Schnittmenge beliebiger Farbattribute entstehen.
|
||
|
||
Vorgeschlagene Struktur:
|
||
|
||
| Ebene | Verbindliche Information | Umsetzungsvorschlag |
|
||
| --- | --- | --- |
|
||
| Produkt | Genau eine freigegebene Farbe/Größe je Farbprodukt | Explizite Variantenreferenz `products.whitelabel_variant_id` auf ein bestehendes Attribut. Für Nicht-White-Label-Produkte optional. Die Attributnamen enthalten heute die Größe („Schwarz 40 ml"); für die Ausgabe „Tiegel: Schwarz" braucht das Attribut ein eigenes Farbfeld oder eine saubere Trennung von Farbe und Größe. |
|
||
| Etikettposition | Welche Etiketten das Produkt benötigt | Spalten `position` (deckel/seite/boden) und `size_cm` direkt an `product_images`. Im Bestand hat keines der 28 White-Label-Produkte mehr als ein Standardetikett und es gibt keine Dubletten; ein eigenes Positions-Table ist dafür nicht nötig und kann später ergänzt werden, falls Produkte mit mehreren Etiketten kommen. |
|
||
| Kundenzuordnung | Ein Datensatz je Kunde und Produkt | `user_whitelabel_products` weiterverwenden; nach Bereinigung bestehender Dubletten Eindeutigkeit auf `(user_id, product_id)` absichern. |
|
||
| Kundenetikett | Welches Bild an welcher Position verwendet wird | Bestehende Bilddatensätze über eine eindeutige Positionsreferenz zuordnen. Pro Kundenzuordnung und Position höchstens ein aktives Kundenetikett. |
|
||
| Bestellposition | Tatsächlich aufgelöste Farbe und Etiketten | Unveränderlichen Datenstand für Dokumente speichern, siehe Abschnitt 4.4. |
|
||
|
||
Ein Kundenetikett darf eine definierte Position auch dann belegen, wenn dort kein Standardbild vorhanden ist.
|
||
|
||
Die bisherigen Attributlisten an Bildern bleiben während der Migration lesbar, werden nach der Umstellung aber nicht mehr zur produktiven Farbauswahl oder Ersetzung verwendet. Produktnamen und kopierte Slugs dienen höchstens als Prüfhilfe, nicht als verbindliche Farbquelle.
|
||
|
||
**`attribute_variants` stilllegen:** Hat das Produkt genau eine Farbe, sind die vier „möglichen Varianten" je Produkt nur noch Altlast und die Quelle des Doppelmodells (Schwachstelle 3). Nach WL-02 bietet das Produktformular das Feld nicht mehr an, sonst wird dort weiter gepflegt.
|
||
|
||
### 4.2 Eine gemeinsame Auflösungsfunktion
|
||
|
||
Einen Service, beispielsweise `WhiteLabelResolver`, für Verwaltungsvorschau, Bestellprüfung und Dokumentvorbereitung einführen. Der Service liest Daten und liefert das Ergebnis einschließlich Fehlern und Herkunft der Etiketten zurück. Er speichert keine Bestellung und erzeugt keine PDF-Dateien.
|
||
|
||
Regeln pro Bestellposition:
|
||
|
||
1. White-Label-Eigenschaft und eindeutige Produktvariante prüfen.
|
||
2. Aktive Kundenzuordnung für **genau diesen Kunden und dieses Produkt** suchen.
|
||
3. Für jede benötigte Etikettposition das eindeutig zugeordnete Kundenbild verwenden.
|
||
4. Ist für diese Position kein Kundenbild vorgesehen, das gültige Standardbild verwenden.
|
||
5. Ist ein Kundenbild ausdrücklich zugeordnet, aber fehlt die Datei oder ist die Zuordnung widersprüchlich, einen Fehler melden. Kein stiller Rückfall auf ein Standardbild.
|
||
6. Fehlen für eine benötigte Position sowohl Kunden- als auch Standardbild, die Position als unvollständig melden.
|
||
7. Die Tiegelfarbe immer aus der Produktvariante ausgeben, unabhängig von der Bildquelle.
|
||
|
||
| Situation | Ergebnis |
|
||
| --- | --- |
|
||
| Eindeutiges Kundenlogo mit vorhandener Datei | Kundenlogo + Produktfarbe |
|
||
| Keine Kundenzuordnung, gültiges Standardetikett | Standardetikett + Produktfarbe |
|
||
| Kundenlogo vorgesehen, aber ungültig oder Datei fehlt | Fehler; kein automatischer Austausch durch Standardetikett |
|
||
| Mehrere aktive Kundenlogos für dieselbe Position | Konflikt; keine Auswahl nach Reihenfolge |
|
||
| Kundenlogo vorhanden, Standardbild fehlt | Kundenlogo zulässig, wenn Position und Abmessungen vollständig definiert sind |
|
||
| Farbe oder erforderliches Etikett fehlt | Unvollständig; Freigabe des Lieferscheins verhindern |
|
||
|
||
**Fehlende Zuordnung erkennen:** Ein Standardetikett kann fachlich korrekt sein. Das System darf daher nicht jedes Produkt ohne Kundenlogo als Fehler behandeln. Hat der Kunde bei anderen Produkten eigene Logos, zeigt die Bestellprüfung einen Hinweis „Für dieses Produkt keine Kundenzuordnung vorhanden“. **Ort der Bestellprüfung:** Es gibt keine shopseitige White-Label-Logik. Der Hinweis gehört auf die Admin-Bestelldetailseite (`admin/sales/_detail`) und in die WaWi-Auftragsansicht, jeweils **vor** dem Klick auf „Rechnung erstellen“, da beide Wege Lieferscheine erzeugen. Bei Produktkopien wird dieser Hinweis durch die Übernahmefunktion ergänzt. Eine automatische Vererbung anhand ähnlicher Namen oder einer Rezepturbeziehung ist nicht vorgesehen.
|
||
|
||
`user_white_label` soll künftig aus den tatsächlich ausgewählten Kundenetiketten abgeleitet werden. Das Kennzeichen darf nicht nur dauerhaft auf `true` gesetzt werden und nicht mit der allgemeinen White-Label-Eigenschaft des Produkts verwechselt werden. Die Speicherung erfolgt im Bestellablauf, nicht im Renderer.
|
||
|
||
### 4.3 Darstellung im Lieferschein
|
||
|
||
- Produktbezeichnung und Artikelnummer eindeutig anzeigen.
|
||
- Farbe ausdrücklich ausgeben, auch beim Standardetikett: **„Tiegel: Schwarz“**.
|
||
- Etikettquelle getrennt benennen: **„Kundenlogo“** oder **„Standardetikett“**.
|
||
- Alle benötigten Etiketten an ihren Positionen mit korrekten Abmessungen abbilden.
|
||
- Derselbe aufgelöste Datenstand muss in Verwaltungsvorschau und PDF verwendet werden.
|
||
|
||
### 4.4 Historische Bestellungen schützen
|
||
|
||
Für neue Bestellungen bei verbindlicher Bestellanlage einen Datenstand je Position speichern: eine JSON-Spalte `whitelabel_snapshot` an `shopping_order_items` mit Produkt-ID, Bezeichnung, Artikelnummer, Farbe/Größe, Etikettposition, Abmessung, Bildquelle, Bild-ID, Dateiname und Datei-Hash. Bei ungeklärten Zuordnungen einen offenen Prüfstatus speichern und vor Dokumentfreigabe auflösen.
|
||
|
||
Die referenzierten Bilddateien müssen erhalten bleiben. Das wird am einfachsten erreicht, indem Kundenlogo-Dateien (`uwllogo`) beim Löschen oder Ersetzen nicht physisch entfernt, sondern nur deaktiviert werden. Ein vollständiges Versionierungssystem für Bilder ist für diesen Umfang unverhältnismäßig. Spätere Stammdatenänderungen verändern bestehende freigegebene Bestellpositionen nicht. Eine bewusste Korrektur wird mit altem und neuem Stand protokolliert.
|
||
|
||
Alte Bestellungen nicht pauschal mit heutigen Stammdaten überschreiben. Bestehende PDFs erhalten. Für eine ausdrücklich angestoßene Neuerstellung ohne historischen Datenstand zunächst eine Vorschau und Prüfung verlangen. Das ist insbesondere für den Konflikt „alter Artikel heute GOLD, damals Kundenvariante Schwarz“ erforderlich.
|
||
|
||
## 5. Kleiner Entwicklungsplan
|
||
|
||
| Arbeitspaket | Inhalt | Abnahmekriterium | Stand |
|
||
| --- | --- | --- | --- |
|
||
| WL-00: Sofortpaket | Etikettgröße korrekt parsen (Schwachstelle 10). Produktkopie mit ausdrücklicher Option „Kundenzuordnungen übernehmen“. Befehl `whitelabel:transfer-assignments` zur wiederholbaren Übertragung von Kundenzuordnungen zwischen Produkten (Abschnitt 6). | Kopie und Übertragung erzeugen keine Dubletten; 40-ml-Etiketten sind 3,5 cm groß. | umgesetzt 17.09.2026 |
|
||
| WL-01: Bestandsprüfung | Befehl `whitelabel:report`: Bestellungen ohne Kundenzuordnung bei Partnern mit Logos, Farbwidersprüche zwischen Kundenbild und Produkt, fehlende Dateien, Dubletten, Mehrfachetiketten, Bilder ohne Variantenzuordnung. Rein lesend. | Jeder Konflikt ist mit betroffenen IDs nachvollziehbar; keine automatische Bereinigung. | umgesetzt 17.09.2026 |
|
||
| WL-02: Datenmodell und Auflösung | Eindeutige Produktvariante, Etikettposition/Größe am Bild, Zuordnungsregeln und gemeinsamen Resolver ergänzen. Eindeutige Altdaten übernehmen, Konflikte zur Prüfung vorlegen. `attribute_variants` stilllegen. | Gleiche Eingaben ergeben dieselbe Farbe und dieselben Etiketten; keine Auswahl nach Reihenfolge. | umgesetzt 17.09.2026 (Stilllegung `attribute_variants` wartet auf K6) |
|
||
| WL-03: Bestellung und Lieferschein | Datenstand je Position speichern, Resolver anbinden, Farbe und Etikettquelle getrennt ausgeben, Kennzeichen im Bestellablauf ableiten, Hinweis „keine Kundenzuordnung“ in Bestelldetail und WaWi-Auftrag. | Vorschau und PDF stimmen überein; bestehende Dokumente ändern sich nicht unbemerkt. | offen |
|
||
| WL-04: Verwaltungsbereich | Navigation „White Label“, beide Ansichten, Anlage/Bearbeitung, Vorschau und Übertragung in der Oberfläche. Bestehende Admin-Berechtigungen und `user`-Guard verwenden. | Kundenlogos und Farbprodukte sind eindeutig erkennbar und zentral pflegbar. Alte Bearbeitungswege verwenden dieselben Regeln oder verweisen auf den neuen Bereich. | offen |
|
||
| WL-05: Migration und Abnahme | Bestandskonflikte fachlich auflösen, Regressionstests und manuelle PDF-Prüfung. | Standardfälle bleiben korrekt; alle Befunde aus `whitelabel:report` sind entweder behoben oder bewusst akzeptiert. | offen |
|
||
|
||
Die Reihenfolge ist bewusst: Das Sofortpaket stoppt den laufenden Schaden, die Bestandsprüfung liefert die Fälle. Danach zuerst Regeln und Lieferschein (fachlicher Nutzen), erst dann die Oberfläche als größtes Paket. Eine reine Verschiebung der bisherigen Formulare in einen neuen Menüpunkt würde die Fehlerursache erhalten.
|
||
|
||
### Erforderliche Prüfungen für die Umsetzung
|
||
|
||
- Fall 2050: Produkte 180 und 183, schwarzer Tiegel und Kundenlogo; alle drei Positionen und Mengen erhalten.
|
||
- Standardetikett auf schwarzem Produkt: Farbe bleibt Schwarz.
|
||
- Kundenlogo ohne Standardbild an einer vollständig definierten Position funktioniert.
|
||
- Fehlende Bilddateien, Dubletten und widersprüchliche Farben ergeben verständliche Fehler.
|
||
- Mehrere Etikettpositionen bleiben getrennt; eine Kundenüberschreibung verändert keine andere Position.
|
||
- Produktkopie: Kundenzuordnungen nur nach gezielter Auswahl übernehmen; Übernahme ist wiederholbar ohne Dubletten.
|
||
- Logoänderung nach Bestellung: bestehender Datenstand und vorhandene PDF bleiben unverändert.
|
||
- Vorschau und lesende Auflösung schreiben weder Bestellungen noch Kennzeichen.
|
||
- Bestehende Bestell- und Logistikabläufe einschließlich PDF-Anhängen bleiben funktionsfähig.
|
||
|
||
Automatisierte Regressionstests für den Resolver und die Integration ergänzen; PDF zusätzlich visuell prüfen. Laravel-Tests ausschließlich in der vorgesehenen Testumgebung ausführen.
|
||
|
||
## 6. Konkrete Korrektur für Bestellung 2050 und gleichartige Fälle
|
||
|
||
Als separat ausführbare Datenkorrektur über den Befehl aus WL-00:
|
||
|
||
```bash
|
||
php artisan whitelabel:transfer-assignments 37 180 --user=207 --dry-run # Vorschau
|
||
php artisan whitelabel:transfer-assignments 37 180 --user=207 # 40 ml
|
||
php artisan whitelabel:transfer-assignments 84 183 --user=207 # 15 ml
|
||
```
|
||
|
||
1. Der Befehl kopiert die Kundenzuordnung samt Logo-Dateien und Variantenzuordnung (Attribut 6 für 40 ml, Attribut 3 für 15 ml) auf das Zielprodukt. Vorhandene Zuordnungen auf dem Zielprodukt werden übersprungen, der Befehl ist wiederholbar.
|
||
2. Ohne `--user` werden alle Kundenzuordnungen des Quellprodukts übertragen; das ist der Weg, wenn eine ganze Produktkopie nachträglich versorgt werden soll.
|
||
3. Neu erzeugten Lieferschein auf Logo, schwarze Tiegelfarbe und alle Mengen prüfen. Die Neuerstellung über „Rechnung erstellen“ (Bestelldetail) versendet keine Mail, solange „Rechnung per Mail senden“ nicht angehakt ist.
|
||
4. Das vorhandene Dokument vor der Neuerstellung sichern.
|
||
|
||
**Migration für alle Partner (GOLD/Farb-Konflikt):**
|
||
|
||
```bash
|
||
php artisan whitelabel:migrate-colors # Vorschau: 223 geplante Übertragungen, 0 unauflösbar
|
||
php artisan whitelabel:migrate-colors --user=207 # Vorschau für einen Partner
|
||
php artisan whitelabel:migrate-colors --execute # ausführen
|
||
```
|
||
|
||
Der Befehl leitet für jede Kundenzuordnung die Bildfarbe aus der Variante ab, sucht das Produkt mit gleichem Basisnamen und dieser Farbe („Bio Tattoocreme 40 ml (Tiegel SCHWARZ)“) und kopiert die Zuordnung dorthin. Die Quellzuordnung bleibt erhalten (der alte Artikel ist weiterhin bestellbar und Bestellungen vor dem 27.07. referenzieren ihn). Zuordnungen mit mehreren Bildfarben oder ohne passendes Zielprodukt werden nur gemeldet. Vor `--execute` auf Live: Datenbank-Backup, danach `whitelabel:report` erneut ausführen; Abschnitt B muss dann leer sein bis auf bewusst akzeptierte Fälle.
|
||
|
||
Für die weiteren Partner mit Bestellungen ohne Zuordnung (Abschnitt 1) ist im Einzelfall zu klären, ob das Standardetikett gewollt war; bei den Tattoobalm/Tattooseife-Fällen (Produkte 118, 130, 154) gibt es keine Farbkopien, dort greift die Migration nicht.
|
||
|
||
Diese Korrektur löst die konkreten Fälle, ersetzt aber nicht die Bereinigung der Verwaltung und Zuordnungslogik.
|
||
|
||
## 7. Relevante Stellen im bestehenden Code
|
||
|
||
- [InvoiceRepository](../../app/Repositories/InvoiceRepository.php): `prepairForDelivery()` wählt Etiketten und Varianten; `update()` erzeugt vorhandene Dokumente neu; `ensureFilesOnDisk()` regeneriert fehlende Dateien.
|
||
- [ProductRepository](../../app/Repositories/ProductRepository.php): `copy()`, `copyImages()`, `updateWLVariants()` und `updateWLImageAttributs()`.
|
||
- [Produktmodell](../../app/Models/Product.php): Variantenbeziehungen und `getWhiteLableName()`.
|
||
- [Kundenzuordnung](../../app/Models/UserWhitelabelProduct.php) und [Bildmodell](../../app/Models/ProductImage.php): bestehende Beziehungen und Bildpfade.
|
||
- [Produktformular](../../resources/views/admin/product/form.blade.php): mögliche Varianten und Standardetiketten.
|
||
- [Kundenformular](../../resources/views/admin/lead/m_white_label.blade.php) und [LeadController](../../app/Http/Controllers/LeadController.php): Anlage und Pflege der Kundenlogos.
|
||
- [Lieferscheinvorlage](../../resources/views/pdf/delivery.blade.php): Bild-, Produkt- und Tiegelanzeige.
|
||
- [Bestellposition](../../app/Models/ShoppingOrderItem.php): Ansatzpunkt für den historischen Datenstand.
|
||
- [OrderFulfillmentController](../../app/Http/Controllers/Admin/Inventory/OrderFulfillmentController.php): zweiter Auslösepfad für Rechnung und Lieferschein aus der WaWi (`create()` und `ensureFilesOnDisk()`).
|
||
- [MailLogistic](../../app/Mail/MailLogistic.php): wertet `user_white_label` für den Lieferschein-Anhang aus; bei geänderter Ableitung mitprüfen.
|
||
- [Bestelldetail](../../resources/views/admin/sales/_detail.blade.php): zeigt `user_white_label`; Ort für den Hinweis „keine Kundenzuordnung“.
|
||
|
||
## 8. Umsetzung WL-00 und WL-01 (17.09.2026)
|
||
|
||
- `InvoiceRepository::prepairForDelivery()`: Abmessung und Volumen über `reFormatNumber()` geparst; `40#3,5` ergibt jetzt 3,5 cm.
|
||
- `ProductRepository::copyWhitelabelAssignments($source, $target)`: kopiert `user_whitelabel_products` samt `uwllogo`-Bildern (Datei und Variantenzuordnung) auf das Zielprodukt, überspringt vorhandene Kombinationen `(user_id, product_id)`, liefert Anzahl übernommen/übersprungen.
|
||
- Produktliste: bei White-Label-Produkten mit Kundenzuordnungen ein zweiter Kopier-Link „Kopieren inkl. Kundenlogos (n)“; der normale Kopier-Link übernimmt weiterhin keine Zuordnungen.
|
||
- `php artisan whitelabel:transfer-assignments {quelle} {ziel} [--user=] [--dry-run]`: gezielte Übertragung.
|
||
- `php artisan whitelabel:migrate-colors [--user=] [--execute]`: automatische Übertragung anhand der Bildfarbe (Dry-Run ohne `--execute`).
|
||
- `php artisan whitelabel:report [--since=2026-07-27]`: rein lesende Bestandsprüfung (WL-01), Abschnitte A–F.
|
||
- Migration `2026_09_17_100000_add_value_to_attributes_table`: legt `attributes.value` nur an, wenn die Spalte fehlt (Schema-Drift; auf Live vorhanden, in den Migrationen bisher nicht).
|
||
- Tests: `tests/Feature/WhitelabelAssignmentTest.php` (Übertragung, Kopie, Dublettenschutz, Befehle, Etikettgröße).
|
||
|
||
**Lokal durchgeführt (Dev-Datenbank):** Übertragung 37→180 und 84→183 für Partner 207, Lieferschein 2050 neu erzeugt (Backup vorher). Ergebnis: alle drei Positionen mit Kundenlogo, „Tiegel: Schwarz 40 ml“ bzw. „Schwarz 15 ml“, Etikett 3,5 cm bzw. 2 cm, `user_white_label` = true.
|
||
|
||
**Auf Live noch auszuführen:** `php artisan migrate`, `whitelabel:migrate-colors --execute` nach Backup und Freigabe, danach Lieferschein 2050 über „Rechnung erstellen“ neu erzeugen (ohne Mailversand).
|
||
|
||
## 8a. Umsetzung WL-02 (17.09.2026)
|
||
|
||
- Migration `2026_09_17_110000_add_whitelabel_variant_and_label_position`: `products.whitelabel_variant_id` (FK auf `attributes`, nullOnDelete), `product_images.position` (deckel/seite/boden) und `product_images.size_cm`. Backfill: Variante aus „(Tiegel X)“ im Produktnamen + gleichfarbige Produktvariante (alle 23 Tattoocreme-Produkte belegt, 7 Produkte ohne Farbe bleiben leer → K5); alle Etikettbilder auf Position `deckel`; Standardetiketten mit Größe aus dem Variantenwert.
|
||
- `Attribute::parseVariantValue()`, `variantVolume()`, `variantSize()`, `colorName()` („Schwarz 40 ml“ → „Schwarz“); `InvoiceRepository::parseVariantValue()` delegiert dorthin.
|
||
- `App\Services\WhiteLabel\WhiteLabelResolver` mit `ResolvedItem`/`ResolvedLabel`: liest nur, liefert je Bestellposition Farbe, Etikett je Position, Quelle (Kundenlogo/Standard), Fehler und Hinweise; Regeln aus Abschnitt 4.2. Produkte ohne `whitelabel_variant_id` laufen über die Altlogik (Attributüberschneidung), damit K5-Produkte weiter funktionieren.
|
||
- Ergebnis gegen Live-Daten: 2050 vollständig (Kundenlogo, Schwarz, 3,5 cm / 2 cm); 1880 Standard mit Hinweis „keine Kundenzuordnung“; 1729 (alte Bestellung auf 37/84) meldet den GOLD/Schwarz-Konflikt als Fehler → genau die Entscheidung K6.
|
||
- Produktformular: Feld „Tiegelfarbe / Größe (verbindlich)“, je Standardetikett Position und Größe (cm). Kundenformular: Position je Kundenlogo, Anzeige der Produktfarbe. `attribute_variants` bleibt bis K6 sichtbar.
|
||
- Noch **nicht** angebunden: Der Lieferschein nutzt weiterhin `prepairForDelivery()`. Die Umstellung ist WL-03 und braucht K6 (Umgang mit Konflikten auf den alten Artikeln: blockieren oder nur warnen) und K7 (Textformat).
|
||
- Tests: `tests/Feature/WhiteLabelResolverTest.php` (12 Tests: alle Fälle aus „Erforderliche Prüfungen“ außer PDF-Sichtprüfung).
|
||
|
||
## 9. Offene Klärungen mit dem Kunden
|
||
|
||
Stand 17.09.2026, abgeleitet aus `whitelabel:report` und `whitelabel:migrate-colors` (Dry-Run). Ohne diese Antworten werden keine Daten auf Live geändert.
|
||
|
||
### K1 – Freigabe der Farbmigration
|
||
|
||
`whitelabel:migrate-colors --execute` kopiert 223 Kundenzuordnungen von den alten Artikeln 37/38/84/85/86 (heute „Tiegel GOLD“) auf das gleichfarbige Farbprodukt. Die Quellzuordnungen bleiben erhalten. Zu bestätigen: Ist die Regel „Bildfarbe bestimmt das Zielprodukt“ fachlich richtig, und darf sie für alle Partner ohne Einzelprüfung laufen?
|
||
|
||
### K2 – Bereits ausgelieferte Bestellungen mit Standardetikett statt Kundenlogo
|
||
|
||
Diese Bestellungen wurden mit Rechnung/Lieferschein erzeugt, ohne dass ein Kundenlogo gegriffen hat. Die Migration (K1) löst die Zuordnung **für künftige Bestellungen**; ob für diese Aufträge nachgeliefert oder der Lieferschein neu erzeugt werden soll, muss der Kunde entscheiden.
|
||
|
||
| Bestellung | Partner | Produkte | Logo-Farbe des Partners | Durch K1 gelöst? |
|
||
| --- | --- | --- | --- | --- |
|
||
| 1880, 1991 | 66 | 180, 192 | Schwarz | ja |
|
||
| 1929 | 358 | 180, 189 | Schwarz | ja |
|
||
| 1930 | 154 | 185, 188 | Weiß | ja |
|
||
| 2003, 2021 | 324 | 180, 183, 186 | Schwarz (nur 37/38 zugeordnet) | teilweise: 180 ja; 183 und 186 brauchen eine Zuordnung, da der Partner nie ein 15-ml-Logo hatte → Rückfrage, ob das 40-ml-Logo auch für 15 ml gilt |
|
||
| 2050 | 207 | 180, 183 | Schwarz | ja (lokal bereits übertragen) |
|
||
|
||
### K3 – Produkte ohne Farbkopien (Tattoobalm, Tattooseife)
|
||
|
||
| Bestellung | Partner | Produkt | Zuordnungen des Partners |
|
||
| --- | --- | --- | --- |
|
||
| 1869, 2025 | 282, 359 | 130 Tattoobalm 30 ml, 154 Tattoobalm 5 ml | nur Tattoocreme (Gold) |
|
||
| 1929 | 358 | 130 Tattoobalm 30 ml | nur Tattoocreme (Schwarz) |
|
||
| 1961 | 246 | 118 Tattooseife 30 ml | nur Tattoocreme (Schwarz) |
|
||
|
||
Für diese Produkte gibt es keine Farbvarianten und keine Zuordnung des Partners. Zu klären: War hier das Standardetikett gewollt, oder sollen diese Partner auch für Tattoobalm/Tattooseife ein Logo hinterlegen? Falls ja, ist das ein Pflegevorgang in der Kundenverwaltung, keine Migration.
|
||
|
||
### K4 – Einzelfälle aus der Bestandsprüfung (Abschnitt C)
|
||
|
||
- Zuordnung 293, Partner 302, Produkt 37: Kundenbild 690 ohne Variante – greift nie. Welche Farbe soll das Logo haben?
|
||
- Zuordnung 370, Partner 412, Produkt 102 (Tattoocreme 140 ml): Zuordnung ohne Kundenbild. Bild nachreichen oder Zuordnung entfernen?
|
||
|
||
### K5 – Produkte ohne Standardetikett oder ohne erkennbare Farbe (Abschnitt F)
|
||
|
||
- 104 „Individuelles Bodenetikett 4,7 cm – 500 Stück“ und 126 „Bio Pfötchenbalm 40 ml – Marketing Unterstützung“ haben kein Standardetikett. Sind das überhaupt White-Label-Produkte im Sinne des Lieferscheins, oder ist das Kennzeichen dort falsch gesetzt?
|
||
- 102, 118, 120, 130, 154, 172 haben keine Farbe im Namen. Für WL-02 (`whitelabel_variant_id`) muss je Produkt genau eine Variante festgelegt werden – der Kunde muss benennen, welche.
|
||
|
||
### K6 – Zukunft der alten Artikel 37/38/84/85/86 („Tiegel GOLD“)
|
||
|
||
Nach der Migration liegen dort weiterhin schwarze/weiße/silberne Kundenlogos. Zu klären:
|
||
|
||
- Bleiben die Artikel bestellbar, und sollen Partner mit Nicht-Gold-Logo dort weiter bestellen können (dann bleibt die Logo-Farbe die Quelle der Tiegelfarbe, wie vor Juli)?
|
||
- Oder werden die Artikel auf reines Gold festgelegt (WL-02)? Dann sind die nicht-goldenen Zuordnungen dort nach der Migration zu entfernen, und Bestellungen vor dem 27.07.2026 dürfen nur mit historischem Datenstand neu erzeugt werden (Abschnitt 4.4).
|
||
|
||
### K7 – Darstellung auf dem Lieferschein
|
||
|
||
Aktuell beim Kundenlogo „Tiegel: Schwarz 40 ml“, beim Standardetikett „Tiegel: Standard“. Vorschlag (Abschnitt 4.3): immer „Tiegel: Schwarz“ plus getrennt „Etikett: Kundenlogo“ oder „Etikett: Standardetikett“. Freigabe des Formats, da die Logistik damit arbeitet.
|
||
|
||
### K8 – Sichtprüfung Lieferschein 2050
|
||
|
||
Der lokal neu erzeugte Lieferschein 2050 (Kundenlogo, schwarz, 3,5 cm / 2 cm) konnte hier nicht als Bild gerendert werden. Vor dem Live-Lauf ist das PDF einmal manuell zu öffnen und mit der Logistik abzustimmen, ob die 3,5-cm-Darstellung (vorher fälschlich 3 cm) so gedruckt werden soll.
|