23-01-2026
This commit is contained in:
parent
07959c0ba2
commit
854ce02bf6
166 changed files with 32909 additions and 1262 deletions
250
dev/COMPONENT-STRUCTURE.md
Normal file
250
dev/COMPONENT-STRUCTURE.md
Normal file
|
|
@ -0,0 +1,250 @@
|
|||
# Komponenten-Struktur Optimierung
|
||||
|
||||
## 📁 Neue Ordnerstruktur
|
||||
|
||||
Die Livewire-Komponenten wurden in logische Unterordner organisiert für bessere Wartbarkeit und Übersichtlichkeit:
|
||||
|
||||
```
|
||||
resources/views/livewire/web/components/
|
||||
├── ui/ # UI-Komponenten (Header, Footer, Forms)
|
||||
│ ├── header.blade.php
|
||||
│ ├── footer.blade.php
|
||||
│ └── contact-form.blade.php
|
||||
├── sections/ # Inhalts-Sektionen
|
||||
│ ├── hero.blade.php
|
||||
│ ├── ecosystem-core.blade.php
|
||||
│ ├── vision-section.blade.php
|
||||
│ ├── brand-worlds.blade.php
|
||||
│ ├── final-cta.blade.php
|
||||
│ ├── partner-hero.blade.php
|
||||
│ ├── partner-benefits.blade.php
|
||||
│ ├── partner-process.blade.php
|
||||
│ ├── commitment-section.blade.php
|
||||
│ ├── dark-stats-section.blade.php
|
||||
│ ├── spotlights-section.blade.php
|
||||
│ ├── final-commitment.blade.php
|
||||
│ ├── about-hero.blade.php
|
||||
│ ├── our-story.blade.php
|
||||
│ ├── leadership-team.blade.php
|
||||
│ ├── our-values.blade.php
|
||||
│ ├── ecosystem-hero.blade.php
|
||||
│ ├── ecosystem-stats.blade.php
|
||||
│ ├── end-customer-section.blade.php
|
||||
│ ├── broker-section.blade.php
|
||||
│ ├── supplier-section.blade.php
|
||||
│ ├── digital-core.blade.php
|
||||
│ ├── magazin-list.blade.php
|
||||
│ └── magazin-detail.blade.php
|
||||
└── demo/ # Demo-Komponenten
|
||||
├── theme-info.blade.php
|
||||
├── logo-demo.blade.php
|
||||
├── color-demo.blade.php
|
||||
├── button-demo.blade.php
|
||||
├── theme-switcher.blade.php
|
||||
└── demo-section.blade.php
|
||||
```
|
||||
|
||||
## 🎯 Komponenten-Kategorien
|
||||
|
||||
### **UI-Komponenten** (`ui/`)
|
||||
- **Zweck:** Wiederverwendbare UI-Elemente
|
||||
- **Verwendung:** Header, Footer, Formulare
|
||||
- **Beispiele:**
|
||||
- `header.blade.php` - Navigation und Logo
|
||||
- `footer.blade.php` - Footer mit Links und Logo
|
||||
- `contact-form.blade.php` - Kontaktformular
|
||||
|
||||
### **Sektions-Komponenten** (`sections/`)
|
||||
- **Zweck:** Inhalts-Sektionen für verschiedene Seiten
|
||||
- **Verwendung:** Hero-Bereiche, Inhalts-Sektionen, CTAs
|
||||
- **Beispiele:**
|
||||
- `hero.blade.php` - Haupt-Hero-Bereich
|
||||
- `ecosystem-core.blade.php` - Ecosystem-Darstellung
|
||||
- `partner-hero.blade.php` - Partner-Hero-Bereich
|
||||
|
||||
### **Demo-Komponenten** (`demo/`)
|
||||
- **Zweck:** Theme-Demo und Testing-Komponenten
|
||||
- **Verwendung:** Theme-Demo-Seite, Entwicklungstools
|
||||
- **Beispiele:**
|
||||
- `theme-info.blade.php` - Theme-Informationen
|
||||
- `color-demo.blade.php` - Farb-Demo
|
||||
- `button-demo.blade.php` - Button-Demo
|
||||
|
||||
## 🔄 Aktualisierte View-Referenzen
|
||||
|
||||
### **Vorher:**
|
||||
```blade
|
||||
<livewire:web.components.header />
|
||||
<livewire:web.components.hero />
|
||||
<livewire:web.components.footer />
|
||||
```
|
||||
|
||||
### **Nachher:**
|
||||
```blade
|
||||
<livewire:web.components.ui.header />
|
||||
<livewire:web.components.sections.hero />
|
||||
<livewire:web.components.ui.footer />
|
||||
```
|
||||
|
||||
## 📋 Aktualisierte Views
|
||||
|
||||
### **Home-View** (`web/home.blade.php`)
|
||||
```blade
|
||||
<livewire:web.components.ui.header />
|
||||
<main>
|
||||
<livewire:web.components.sections.hero />
|
||||
<livewire:web.components.sections.ecosystem-core />
|
||||
<livewire:web.components.sections.vision-section />
|
||||
<livewire:web.components.sections.brand-worlds />
|
||||
<livewire:web.components.sections.final-cta />
|
||||
</main>
|
||||
<livewire:web.components.ui.footer />
|
||||
```
|
||||
|
||||
### **Partner-View** (`web/partner.blade.php`)
|
||||
```blade
|
||||
<livewire:web.components.ui.header />
|
||||
<main>
|
||||
<livewire:web.components.sections.partner-hero />
|
||||
<livewire:web.components.sections.partner-benefits />
|
||||
<livewire:web.components.sections.partner-process />
|
||||
<livewire:web.components.sections.commitment-section />
|
||||
<livewire:web.components.sections.dark-stats-section />
|
||||
<livewire:web.components.sections.spotlights-section />
|
||||
<livewire:web.components.sections.final-commitment />
|
||||
</main>
|
||||
<livewire:web.components.ui.footer />
|
||||
```
|
||||
|
||||
### **About-View** (`web/about.blade.php`)
|
||||
```blade
|
||||
<livewire:web.components.ui.header />
|
||||
<main>
|
||||
<livewire:web.components.sections.about-hero />
|
||||
<livewire:web.components.sections.our-story />
|
||||
<livewire:web.components.sections.leadership-team />
|
||||
<livewire:web.components.sections.our-values />
|
||||
<livewire:web.components.sections.partner-cta />
|
||||
</main>
|
||||
<livewire:web.components.ui.footer />
|
||||
```
|
||||
|
||||
### **Contact-View** (`web/contact.blade.php`)
|
||||
```blade
|
||||
<livewire:web.components.ui.header />
|
||||
<main>
|
||||
<livewire:web.components.ui.contact-form />
|
||||
</main>
|
||||
<livewire:web.components.ui.footer />
|
||||
```
|
||||
|
||||
### **Ecosystem-View** (`web/ecosystem.blade.php`)
|
||||
```blade
|
||||
<livewire:web.components.ui.header />
|
||||
<main>
|
||||
<livewire:web.components.sections.ecosystem-hero />
|
||||
<livewire:web.components.sections.ecosystem-stats />
|
||||
<livewire:web.components.sections.end-customer-section />
|
||||
<livewire:web.components.sections.broker-section />
|
||||
<livewire:web.components.sections.supplier-section />
|
||||
<livewire:web.components.sections.digital-core />
|
||||
</main>
|
||||
<livewire:web.components.ui.footer />
|
||||
```
|
||||
|
||||
### **Magazin-Views** (`web/magazin.blade.php`, `web/magazin-detail.blade.php`)
|
||||
```blade
|
||||
<livewire:web.components.ui.header />
|
||||
<main>
|
||||
<livewire:web.components.sections.magazin-list />
|
||||
<!-- oder -->
|
||||
<livewire:web.components.sections.magazin-detail :id="$id ?? 1" />
|
||||
</main>
|
||||
<livewire:web.components.ui.footer />
|
||||
```
|
||||
|
||||
### **Theme-Demo-View** (`web/theme-demo.blade.php`)
|
||||
```blade
|
||||
<livewire:web.components.ui.header />
|
||||
<main>
|
||||
<livewire:web.components.demo.theme-info />
|
||||
<livewire:web.components.demo.logo-demo />
|
||||
<livewire:web.components.demo.color-demo />
|
||||
<livewire:web.components.demo.button-demo />
|
||||
<livewire:web.components.demo.theme-switcher />
|
||||
</main>
|
||||
<livewire:web.components.ui.footer />
|
||||
```
|
||||
|
||||
## 🚀 Vorteile der neuen Struktur
|
||||
|
||||
### **1. Bessere Organisation**
|
||||
- ✅ Logische Gruppierung nach Funktionalität
|
||||
- ✅ Klare Trennung zwischen UI, Inhalt und Demo
|
||||
- ✅ Einfache Navigation durch die Komponenten
|
||||
|
||||
### **2. Verbesserte Wartbarkeit**
|
||||
- ✅ Änderungen an UI-Komponenten betreffen alle Seiten
|
||||
- ✅ Sektions-Komponenten sind wiederverwendbar
|
||||
- ✅ Demo-Komponenten sind isoliert
|
||||
|
||||
### **3. Skalierbarkeit**
|
||||
- ✅ Einfache Erweiterung um neue Komponenten
|
||||
- ✅ Klare Namenskonventionen
|
||||
- ✅ Modulare Architektur
|
||||
|
||||
### **4. Entwicklerfreundlichkeit**
|
||||
- ✅ Intuitive Pfad-Struktur
|
||||
- ✅ Vorhersagbare Komponenten-Namen
|
||||
- ✅ Einfache Suche und Navigation
|
||||
|
||||
## 🔧 Wartung und Erweiterung
|
||||
|
||||
### **Neue UI-Komponente hinzufügen:**
|
||||
```bash
|
||||
# Komponente erstellen
|
||||
php artisan livewire:make Web/Components/UI/NewComponent
|
||||
|
||||
# View in ui/ Ordner erstellen
|
||||
touch resources/views/livewire/web/components/ui/new-component.blade.php
|
||||
```
|
||||
|
||||
### **Neue Sektions-Komponente hinzufügen:**
|
||||
```bash
|
||||
# Komponente erstellen
|
||||
php artisan livewire:make Web/Components/Sections/NewSection
|
||||
|
||||
# View in sections/ Ordner erstellen
|
||||
touch resources/views/livewire/web/components/sections/new-section.blade.php
|
||||
```
|
||||
|
||||
### **Neue Demo-Komponente hinzufügen:**
|
||||
```bash
|
||||
# Komponente erstellen
|
||||
php artisan livewire:make Web/Components/Demo/NewDemo
|
||||
|
||||
# View in demo/ Ordner erstellen
|
||||
touch resources/views/livewire/web/components/demo/new-demo.blade.php
|
||||
```
|
||||
|
||||
## 📝 Best Practices
|
||||
|
||||
1. **Namenskonventionen:** Verwende kebab-case für Dateinamen
|
||||
2. **Ordnerstruktur:** Halte die logische Gruppierung bei
|
||||
3. **Wiederverwendbarkeit:** UI-Komponenten sollten generisch sein
|
||||
4. **Spezifität:** Sektions-Komponenten können spezifisch sein
|
||||
5. **Isolation:** Demo-Komponenten sollten isoliert bleiben
|
||||
|
||||
## 🔍 Migration abgeschlossen
|
||||
|
||||
Alle Views wurden erfolgreich aktualisiert:
|
||||
- ✅ `web/home.blade.php`
|
||||
- ✅ `web/partner.blade.php`
|
||||
- ✅ `web/about.blade.php`
|
||||
- ✅ `web/contact.blade.php`
|
||||
- ✅ `web/ecosystem.blade.php`
|
||||
- ✅ `web/magazin.blade.php`
|
||||
- ✅ `web/magazin-detail.blade.php`
|
||||
- ✅ `web/theme-demo.blade.php`
|
||||
|
||||
Die neue Struktur ist jetzt vollständig implementiert und alle Views verwenden die optimierten Komponenten-Pfade! 🎉
|
||||
319
dev/DISPLAY_CMS_README.md
Normal file
319
dev/DISPLAY_CMS_README.md
Normal file
|
|
@ -0,0 +1,319 @@
|
|||
# Cabinet Display CMS - Dokumentation
|
||||
|
||||
## Übersicht
|
||||
|
||||
Das Display CMS ermöglicht die zentrale Verwaltung der Inhalte für die Digital Signage Display-Seite im Cabinet Showroom Bielefeld.
|
||||
|
||||
**Einheitlicher Pfad:** Das System nutzt `public/_cabinet/` für Testserver und Live-Server.
|
||||
|
||||
## Zugriff
|
||||
|
||||
### Testserver
|
||||
- **Display:** `http://portal.b2in.test/_cabinet/`
|
||||
- **CMS:** `http://portal.b2in.test/admin/cms/cabinet`
|
||||
- **API:** `http://portal.b2in.test/api/display/config`
|
||||
|
||||
### Live-Server
|
||||
- **Display:** `https://cabinet.b2in.eu/` (Subdomain zeigt auf `/_cabinet/`)
|
||||
- **CMS:** `https://b2in.eu/admin/cms/cabinet`
|
||||
- **API:** `https://b2in.eu/api/display/config`
|
||||
|
||||
## Funktionen
|
||||
|
||||
### 1. Video-Verwaltung
|
||||
- ✅ Videos aus dem `public/_cabinet/assets/` Ordner verwalten
|
||||
- ✅ Reihenfolge per Pfeiltasten ändern
|
||||
- ✅ Video-Position (0-100%) für optimalen Bildausschnitt einstellen
|
||||
- ✅ Videos aktivieren/deaktivieren
|
||||
- ✅ Titel für bessere Übersicht vergeben
|
||||
|
||||
### 2. Footer-Content-Verwaltung mit Tracking
|
||||
- ✅ Überschrift, Unterzeile und **optional** Ziel-URL eingeben
|
||||
- ✅ **Automatische Short-Link-Generierung** (nur wenn URL angegeben)
|
||||
- ✅ **Echtzeit-Klick-Tracking** über Short-Links
|
||||
- ✅ **Klick-Statistiken** direkt im CMS
|
||||
- ✅ **Ohne URL:** Nur Text wird angezeigt, kein QR-Code
|
||||
- ✅ **Mit URL:** QR-Code mit Short-Link wird automatisch generiert
|
||||
- ✅ Reihenfolge ändern (werden alle 30 Sekunden rotiert)
|
||||
- ✅ Inhalte aktivieren/deaktivieren
|
||||
- ✅ Short-Code neu generieren
|
||||
- ✅ Klick-Zähler zurücksetzen
|
||||
|
||||
### 3. Short-Link-System
|
||||
|
||||
#### Wie funktioniert es?
|
||||
|
||||
**Mit URL (QR-Code wird angezeigt):**
|
||||
1. **Beim Erstellen** mit URL wird automatisch ein 6-stelliger Short-Code generiert (z.B. `c59kjb`)
|
||||
2. **Short-URL** wird automatisch erstellt:
|
||||
- Testserver: `http://portal.b2in.test/_cabinet/go.php?z=c59kjb`
|
||||
- Live-Server: `https://cabinet.b2in.eu/go.php?z=c59kjb`
|
||||
3. **QR-Code** auf dem Display zeigt die Short-URL
|
||||
4. **Bei Klick** wird der User zur Original-URL weitergeleitet
|
||||
5. **Klicks werden gezählt** und im CMS angezeigt
|
||||
|
||||
**Ohne URL (nur Text):**
|
||||
1. **Beim Erstellen** ohne URL wird kein Short-Code generiert
|
||||
2. **Nur Text** wird im Footer angezeigt (Überschrift + Unterzeile)
|
||||
3. **Kein QR-Code** wird angezeigt
|
||||
4. **Text-Bereich** nutzt die volle Breite des Footers
|
||||
|
||||
#### Vorteile
|
||||
|
||||
- ✅ Kürzere URLs für bessere QR-Codes
|
||||
- ✅ Automatisches Tracking aller Scans
|
||||
- ✅ Zentrale Verwaltung aller Links
|
||||
- ✅ Statistiken direkt im CMS
|
||||
- ✅ Links können geändert werden ohne QR-Code neu zu generieren
|
||||
- ✅ Funktioniert identisch auf Test- und Live-Server
|
||||
|
||||
## CMS-Interface
|
||||
|
||||
### Video-Playlist
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ Video-Playlist [+] │
|
||||
├─────────────────────────────────────────────┤
|
||||
│ ↑↓ [Aktiv] Herbst 2025 │
|
||||
│ 📁 herbst_2025.mp4 📍 Position: 25% │
|
||||
│ [👁] [✏] [🗑] │
|
||||
├─────────────────────────────────────────────┤
|
||||
│ ↑↓ [Aktiv] Frühjahr 2025 │
|
||||
│ 📁 fruehjahr_2025.mp4 📍 Position: 10% │
|
||||
│ [👁] [✏] [🗑] │
|
||||
└─────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Footer-Inhalte
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ Footer-Inhalte [+] │
|
||||
│ 📊 Gesamt-Klicks: 47 │
|
||||
├─────────────────────────────────────────────┤
|
||||
│ ↑↓ [Aktiv] Beratung & Termin [🔵 23 Klicks]│
|
||||
│ Jetzt Termin vereinbaren. │
|
||||
│ 🔗 c59kjb [📋 Short-Link] │
|
||||
│ 🔗 https://www.cabinet.de/bielefeld... │
|
||||
│ [👁] [⋮] │
|
||||
│ ├─ Bearbeiten │
|
||||
│ ├─ Short-Code neu generieren │
|
||||
│ ├─ Klicks zurücksetzen │
|
||||
│ └─ Löschen │
|
||||
└─────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Technische Details
|
||||
|
||||
### Ordnerstruktur
|
||||
|
||||
```
|
||||
public/_cabinet/
|
||||
├── index.html # Display-Seite (lädt dynamisch via API)
|
||||
├── go.php # Short-Link-Handler mit Tracking
|
||||
├── assets/ # Video-Dateien
|
||||
│ ├── herbst_2025.mp4
|
||||
│ ├── fruehjahr_2025.mp4
|
||||
│ └── ...
|
||||
└── clicks.log # Tracking-Log (wird automatisch erstellt)
|
||||
```
|
||||
|
||||
### Datenbank-Tabellen
|
||||
|
||||
#### `display_videos`
|
||||
```sql
|
||||
- id (PK)
|
||||
- filename -- Dateiname des Videos
|
||||
- title -- Optionaler Titel
|
||||
- position -- Vertikale Position (0-100%)
|
||||
- sort_order -- Reihenfolge der Wiedergabe
|
||||
- is_active -- Aktiv/Inaktiv
|
||||
- created_at, updated_at
|
||||
```
|
||||
|
||||
#### `display_footer_contents`
|
||||
```sql
|
||||
- id (PK)
|
||||
- headline -- Überschrift
|
||||
- subline -- Unterzeile
|
||||
- url -- Original-Ziel-URL
|
||||
- short_code -- 6-stelliger eindeutiger Code
|
||||
- clicks -- Anzahl der Klicks
|
||||
- sort_order -- Reihenfolge der Anzeige
|
||||
- is_active -- Aktiv/Inaktiv
|
||||
- created_at, updated_at
|
||||
```
|
||||
|
||||
### Konfiguration
|
||||
|
||||
**Datei:** `config/display.php`
|
||||
|
||||
```php
|
||||
'base_path' => env('DISPLAY_BASE_PATH', '_cabinet'),
|
||||
'subdomain' => env('DISPLAY_SUBDOMAIN', null),
|
||||
'domain' => env('DISPLAY_DOMAIN', 'b2in.eu'),
|
||||
```
|
||||
|
||||
**Umgebungsvariablen (.env):**
|
||||
|
||||
```env
|
||||
# Testserver
|
||||
DISPLAY_BASE_PATH=_cabinet
|
||||
DISPLAY_SUBDOMAIN=
|
||||
DISPLAY_DOMAIN=b2in.test
|
||||
|
||||
# Live-Server
|
||||
DISPLAY_BASE_PATH=_cabinet
|
||||
DISPLAY_SUBDOMAIN=cabinet
|
||||
DISPLAY_DOMAIN=b2in.eu
|
||||
APP_ENV=production
|
||||
```
|
||||
|
||||
### API-Response-Format
|
||||
|
||||
**Endpunkt:** `/api/display/config`
|
||||
|
||||
```json
|
||||
{
|
||||
"videoPlaylist": [
|
||||
{
|
||||
"src": "assets/herbst_2025.mp4",
|
||||
"position": 25
|
||||
}
|
||||
],
|
||||
"footerContent": [
|
||||
{
|
||||
"headline": "Beratung & Termin",
|
||||
"subline": "Jetzt Termin vereinbaren.",
|
||||
"url": "https://cabinet.b2in.eu/go.php?z=c59kjb"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Workflow-Beispiele
|
||||
|
||||
### Neuen Footer-Inhalt hinzufügen
|
||||
|
||||
1. Im CMS auf **"Inhalt hinzufügen"** klicken
|
||||
2. Formular ausfüllen:
|
||||
- Überschrift: "Beratung & Termin"
|
||||
- Unterzeile: "Jetzt Termin vereinbaren."
|
||||
- URL: `https://www.cabinet.de/bielefeld?utm_source=...`
|
||||
3. **Speichern**
|
||||
4. ✅ Short-Code wird automatisch generiert (z.B. `c59kjb`)
|
||||
5. ✅ Short-URL wird erstellt: `https://cabinet.b2in.eu/go.php?z=c59kjb`
|
||||
6. ✅ Display lädt neue Konfiguration (max. 5 Minuten)
|
||||
7. ✅ QR-Code zeigt automatisch den Short-Link
|
||||
8. ✅ Klicks werden gezählt und angezeigt
|
||||
|
||||
### Video hinzufügen
|
||||
|
||||
1. Video-Datei in `public/_cabinet/assets/` hochladen
|
||||
2. Im CMS auf **"Video hinzufügen"** klicken
|
||||
3. Video aus Dropdown auswählen
|
||||
4. Titel vergeben (optional)
|
||||
5. Position einstellen (0-100%)
|
||||
6. **Speichern**
|
||||
7. ✅ Video wird zur Playlist hinzugefügt
|
||||
8. ✅ Display spielt Video ab
|
||||
|
||||
### Klick-Statistiken ansehen
|
||||
|
||||
1. Im CMS unter **"Footer-Inhalte"** öffnen
|
||||
2. Bei jedem Inhalt wird die Anzahl der Klicks angezeigt
|
||||
3. **Gesamt-Klicks** werden oben summiert angezeigt
|
||||
4. Zum Zurücksetzen: **⋮ → Klicks zurücksetzen**
|
||||
|
||||
### Short-Code neu generieren
|
||||
|
||||
1. Bei gewünschtem Footer-Inhalt auf **⋮** klicken
|
||||
2. **"Short-Code neu generieren"** wählen
|
||||
3. ✅ Neuer Code wird erstellt
|
||||
4. ⚠️ Alter Code funktioniert nicht mehr
|
||||
5. ✅ QR-Code aktualisiert sich automatisch beim nächsten Reload
|
||||
|
||||
## Logging
|
||||
|
||||
### Datenbank-Tracking (Primär)
|
||||
- Alle Klicks werden in der Datenbank gezählt
|
||||
- Echtzeit-Statistiken im CMS
|
||||
- Auswertungen nach Inhalt möglich
|
||||
|
||||
### Datei-Logging (Backup)
|
||||
- Zusätzliches Log: `public/_cabinet/clicks.log`
|
||||
- Format: `YYYY-MM-DD HH:MM:SS - Code: c59kjb - Headline: ... - URL: ...`
|
||||
- Nützlich für detaillierte Analysen
|
||||
|
||||
**Log ansehen:**
|
||||
```bash
|
||||
tail -f public/_cabinet/clicks.log
|
||||
```
|
||||
|
||||
## Wartung & Backup
|
||||
|
||||
### Wichtige Daten für Backup
|
||||
- **Datenbank:** `display_videos`, `display_footer_contents`
|
||||
- **Video-Dateien:** `public/_cabinet/assets/`
|
||||
- **Tracking-Log:** `public/_cabinet/clicks.log`
|
||||
|
||||
### Videos hinzufügen
|
||||
```bash
|
||||
# Upload via SCP
|
||||
scp video.mp4 user@server:/var/www/html/public/_cabinet/assets/
|
||||
|
||||
# Oder via FTP/SFTP
|
||||
# Dann im CMS hinzufügen
|
||||
```
|
||||
|
||||
### Cache leeren
|
||||
```bash
|
||||
php artisan config:clear
|
||||
php artisan cache:clear
|
||||
php artisan route:clear
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Display zeigt "LADEN..."
|
||||
**Problem:** API nicht erreichbar
|
||||
**Lösung:** Browser-Console (F12) prüfen, API-URL testen
|
||||
|
||||
### Short-Links funktionieren nicht
|
||||
**Problem:** Datenbankverbindung oder Berechtigungen
|
||||
**Lösung:** `go.php` Berechtigungen prüfen, Logs prüfen
|
||||
|
||||
### Klicks werden nicht gezählt
|
||||
**Problem:** Datenbankupdate fehlgeschlagen
|
||||
**Lösung:** `clicks.log` prüfen, Datenbank-Logs prüfen
|
||||
|
||||
### Videos werden nicht abgespielt
|
||||
**Problem:** Falsches Format oder Pfad
|
||||
**Lösung:** Browser-Console prüfen, `.mp4` mit H.264 verwenden
|
||||
|
||||
## Performance-Tipps
|
||||
|
||||
### Video-Optimierung
|
||||
```bash
|
||||
# FFmpeg für kleinere Dateien
|
||||
ffmpeg -i input.mp4 -c:v libx264 -crf 23 \
|
||||
-preset medium -c:a aac -b:a 128k output.mp4
|
||||
```
|
||||
|
||||
### Auto-Reload
|
||||
- Display lädt alle 5 Minuten neue Konfiguration
|
||||
- Für sofortiges Update: Display-Seite neu laden
|
||||
|
||||
## Support & Dokumentation
|
||||
|
||||
- **Setup-Guide:** `DISPLAY_SETUP_LIVE.md`
|
||||
- **ENV-Variablen:** `ENV_VARIABLES_DISPLAY.md`
|
||||
- **Laravel-Logs:** `storage/logs/laravel.log`
|
||||
- **Tracking-Log:** `public/_cabinet/clicks.log`
|
||||
|
||||
Bei Problemen:
|
||||
1. Logs prüfen
|
||||
2. Browser-Console prüfen
|
||||
3. API manuell testen
|
||||
4. Cache leeren
|
||||
295
dev/DISPLAY_SETUP_LIVE.md
Normal file
295
dev/DISPLAY_SETUP_LIVE.md
Normal file
|
|
@ -0,0 +1,295 @@
|
|||
# Display Setup für Live-Server (cabinet.b2in.eu)
|
||||
|
||||
## Übersicht
|
||||
|
||||
Das Display-System nutzt den Ordner `public/_cabinet/` für beide Umgebungen:
|
||||
|
||||
- **Testserver:** `portal.b2in.test/_cabinet/`
|
||||
- **Live-Server:** `cabinet.b2in.eu/` (Subdomain zeigt direkt auf `public/_cabinet/`)
|
||||
|
||||
## Setup-Schritte für Live-Server
|
||||
|
||||
### 1. Dateien vorbereiten
|
||||
|
||||
Die Dateien sind bereits im Ordner `public/_cabinet/` vorhanden:
|
||||
|
||||
```bash
|
||||
public/_cabinet/
|
||||
├── index.html # Display-Seite
|
||||
├── go.php # Short-Link-Handler
|
||||
├── assets/ # Video-Dateien
|
||||
│ ├── herbst_2025.mp4
|
||||
│ ├── fruehjahr_2025.mp4
|
||||
│ └── ...
|
||||
└── clicks.log # Tracking-Log (wird automatisch erstellt)
|
||||
```
|
||||
|
||||
### 2. Subdomain konfigurieren
|
||||
|
||||
Auf dem Live-Server die Subdomain `cabinet.b2in.eu` so einrichten, dass sie direkt auf `/public/_cabinet/` zeigt.
|
||||
|
||||
**Apache VirtualHost Beispiel:**
|
||||
|
||||
```apache
|
||||
<VirtualHost *:443>
|
||||
ServerName cabinet.b2in.eu
|
||||
DocumentRoot /var/www/html/public/_cabinet
|
||||
|
||||
<Directory /var/www/html/public/_cabinet>
|
||||
Options Indexes FollowSymLinks
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
# SSL Konfiguration
|
||||
SSLEngine on
|
||||
SSLCertificateFile /etc/ssl/certs/certificate.crt
|
||||
SSLCertificateKeyFile /etc/ssl/private/private.key
|
||||
|
||||
# Optionale Sicherheits-Header
|
||||
Header always set X-Frame-Options "SAMEORIGIN"
|
||||
Header always set X-Content-Type-Options "nosniff"
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
**Nginx Beispiel:**
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name cabinet.b2in.eu;
|
||||
root /var/www/html/public/_cabinet;
|
||||
|
||||
index index.html index.php;
|
||||
|
||||
# SSL Konfiguration
|
||||
ssl_certificate /etc/ssl/certs/certificate.crt;
|
||||
ssl_certificate_key /etc/ssl/private/private.key;
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
|
||||
fastcgi_index index.php;
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
}
|
||||
|
||||
# Logs
|
||||
access_log /var/log/nginx/cabinet.b2in.eu-access.log;
|
||||
error_log /var/log/nginx/cabinet.b2in.eu-error.log;
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Umgebungsvariablen setzen
|
||||
|
||||
In der `.env` Datei auf dem Live-Server folgende Variablen hinzufügen/ändern:
|
||||
|
||||
```env
|
||||
# Display Configuration für Live-Server
|
||||
DISPLAY_BASE_PATH=_cabinet
|
||||
DISPLAY_SUBDOMAIN=cabinet
|
||||
DISPLAY_DOMAIN=b2in.eu
|
||||
APP_ENV=production
|
||||
```
|
||||
|
||||
**Wichtig:** Nach dem Ändern der `.env`:
|
||||
|
||||
```bash
|
||||
php artisan config:clear
|
||||
php artisan cache:clear
|
||||
```
|
||||
|
||||
### 4. API-Zugriff sicherstellen
|
||||
|
||||
Die API kann über zwei Wege erreichbar sein:
|
||||
|
||||
**Option A: API über Hauptdomain (empfohlen)**
|
||||
- API-URL: `https://b2in.eu/api/display/config`
|
||||
- Display-Seite lädt von Hauptdomain
|
||||
|
||||
**Option B: API auch auf Subdomain**
|
||||
```bash
|
||||
cd /var/www/html/public/_cabinet
|
||||
ln -s ../api api
|
||||
```
|
||||
- API-URL: `https://cabinet.b2in.eu/api/display/config`
|
||||
|
||||
### 5. Videos hochladen
|
||||
|
||||
Videos in den Cabinet-Ordner kopieren:
|
||||
|
||||
```bash
|
||||
# Lokal zum Server
|
||||
scp -r videos/*.mp4 user@liveserver:/var/www/html/public/_cabinet/assets/
|
||||
|
||||
# Im CMS hinzufügen
|
||||
# Admin → CMS → Cabinet → Video hinzufügen
|
||||
```
|
||||
|
||||
### 6. Testen
|
||||
|
||||
1. **Display-Seite:** `https://cabinet.b2in.eu/`
|
||||
2. **API-Test:** `https://b2in.eu/api/display/config`
|
||||
3. **Short-Link-Test:** `https://cabinet.b2in.eu/go.php?z=c59kjb`
|
||||
4. **CMS:** Admin-Login → CMS → Cabinet
|
||||
5. **QR-Code scannen** und Tracking prüfen
|
||||
|
||||
## Zugriffswege
|
||||
|
||||
### Testserver
|
||||
- Display: `http://portal.b2in.test/_cabinet/`
|
||||
- Short-Link: `http://portal.b2in.test/_cabinet/go.php?z=abc123`
|
||||
- API: `http://portal.b2in.test/api/display/config`
|
||||
|
||||
### Live-Server
|
||||
- Display: `https://cabinet.b2in.eu/`
|
||||
- Short-Link: `https://cabinet.b2in.eu/go.php?z=abc123`
|
||||
- API: `https://b2in.eu/api/display/config`
|
||||
|
||||
## Wartung
|
||||
|
||||
### Videos aktualisieren
|
||||
|
||||
1. Neue Videos in `public/_cabinet/assets/` hochladen
|
||||
2. Im CMS unter "Video-Playlist" hinzufügen
|
||||
3. Display lädt automatisch neue Konfiguration (max. 5 Min.)
|
||||
|
||||
### Footer-Inhalte ändern
|
||||
|
||||
1. Im CMS unter "Footer-Inhalte" bearbeiten
|
||||
2. Short-Links bleiben gleich (nur Ziel-URL ändert sich)
|
||||
3. Klick-Statistiken bleiben erhalten
|
||||
|
||||
### Logs prüfen
|
||||
|
||||
```bash
|
||||
# Klick-Tracking
|
||||
tail -f /var/www/html/public/_cabinet/clicks.log
|
||||
|
||||
# Laravel-Logs
|
||||
tail -f /var/www/html/storage/logs/laravel.log
|
||||
|
||||
# Nginx-Logs
|
||||
tail -f /var/log/nginx/cabinet.b2in.eu-access.log
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Display zeigt "LADEN..." und lädt nicht
|
||||
|
||||
**Ursache:** API nicht erreichbar
|
||||
|
||||
**Lösung:**
|
||||
1. Browser-Console öffnen (F12)
|
||||
2. Netzwerk-Tab prüfen
|
||||
3. API-URL testen: `curl https://b2in.eu/api/display/config`
|
||||
4. CORS-Fehler? → API auch auf Subdomain verfügbar machen (siehe oben)
|
||||
|
||||
### Short-Links funktionieren nicht
|
||||
|
||||
**Ursache:** `go.php` nicht ausführbar oder Datenbankverbindung fehlerhaft
|
||||
|
||||
**Lösung:**
|
||||
```bash
|
||||
# Dateiberechtigungen prüfen
|
||||
ls -la /var/www/html/public/_cabinet/go.php
|
||||
|
||||
# Manuell testen
|
||||
curl -I https://cabinet.b2in.eu/go.php?z=c59kjb
|
||||
|
||||
# Logs prüfen
|
||||
tail -f /var/www/html/public/_cabinet/clicks.log
|
||||
```
|
||||
|
||||
### Videos werden nicht abgespielt
|
||||
|
||||
**Ursache:** Dateipfad falsch oder Video-Format nicht unterstützt
|
||||
|
||||
**Lösung:**
|
||||
1. Pfad prüfen: Videos müssen in `assets/` liegen
|
||||
2. Format prüfen: `.mp4` mit H.264-Codec empfohlen
|
||||
3. Browser-Console prüfen auf Fehler
|
||||
4. Im CMS prüfen: Sind Videos aktiv?
|
||||
|
||||
### API gibt leere Arrays zurück
|
||||
|
||||
**Ursache:** Keine aktiven Inhalte in der Datenbank
|
||||
|
||||
**Lösung:**
|
||||
```bash
|
||||
# Prüfen
|
||||
php artisan tinker
|
||||
>>> App\Models\DisplayVideo::count()
|
||||
>>> App\Models\DisplayFooterContent::count()
|
||||
|
||||
# Falls leer: Seeder ausführen
|
||||
php artisan db:seed --class=DisplayContentSeeder
|
||||
```
|
||||
|
||||
## Performance-Optimierung
|
||||
|
||||
### Video-Komprimierung
|
||||
|
||||
```bash
|
||||
# FFmpeg für optimale Dateigröße
|
||||
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium \
|
||||
-c:a aac -b:a 128k output.mp4
|
||||
```
|
||||
|
||||
### Caching
|
||||
|
||||
Nginx-Caching für statische Assets:
|
||||
|
||||
```nginx
|
||||
location ~* \.(mp4|jpg|jpeg|png|gif|ico|css|js)$ {
|
||||
expires 7d;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
```
|
||||
|
||||
## Sicherheit
|
||||
|
||||
### SSL/TLS
|
||||
- SSL-Zertifikat für `cabinet.b2in.eu` installieren
|
||||
- Automatische Erneuerung einrichten (z.B. Certbot)
|
||||
|
||||
### Zugriffsbeschränkung
|
||||
Falls gewünscht, Display-Seite per IP einschränken:
|
||||
|
||||
```nginx
|
||||
location / {
|
||||
allow 1.2.3.4; # Ihre IP
|
||||
deny all;
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
```
|
||||
|
||||
## Deployment-Checkliste
|
||||
|
||||
- [ ] `public/_cabinet/` Ordner vorhanden
|
||||
- [ ] Videos in `public/_cabinet/assets/` hochgeladen
|
||||
- [ ] Subdomain `cabinet.b2in.eu` konfiguriert
|
||||
- [ ] Subdomain zeigt auf `public/_cabinet/`
|
||||
- [ ] `.env` aktualisiert mit korrekten Werten
|
||||
- [ ] `php artisan config:clear` ausgeführt
|
||||
- [ ] SSL-Zertifikat installiert
|
||||
- [ ] Display-Seite getestet: `https://cabinet.b2in.eu/`
|
||||
- [ ] API getestet: `https://b2in.eu/api/display/config`
|
||||
- [ ] Short-Link getestet
|
||||
- [ ] QR-Code gescannt und Tracking geprüft
|
||||
- [ ] Logs eingerichtet und überwacht
|
||||
|
||||
## Support
|
||||
|
||||
Bei Problemen:
|
||||
|
||||
1. **Logs prüfen:** clicks.log, laravel.log, nginx/apache logs
|
||||
2. **Browser-Console:** F12 → Console & Network Tabs
|
||||
3. **API manuell testen:** `curl https://b2in.eu/api/display/config`
|
||||
4. **Datenbankverbindung testen:** `php artisan tinker`
|
||||
5. **Cache leeren:** `php artisan config:clear && php artisan cache:clear`
|
||||
90
dev/PARTNER-SETUP-WIZARD.md
Normal file
90
dev/PARTNER-SETUP-WIZARD.md
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
# Partner-Einladung & Setup-Wizard
|
||||
|
||||
Kurze Notizen zur aktuellen Einladungskette und dem Setup-Wizard, plus offene To-dos.
|
||||
|
||||
## Ablauf Einladung
|
||||
- Admin lädt Partner über `resources/views/livewire/admin/partners/invite.blade.php` ein.
|
||||
- Gültigkeit wird im Formular gewählt (1–4 Wochen) und als `expires_at` in `PartnerInvitation` gespeichert.
|
||||
- Einladungslink: `route('partner.invitation.accept', ['token' => $token])`.
|
||||
- Zusätzliche Statusseiten: `/partner/invitation/expired/{token}` und `/partner/invitation/used/{token}`.
|
||||
|
||||
## Routen
|
||||
- `/partner/invitation/{token}` → Volt-Komponente `partner.invitation-accept`.
|
||||
- `/partner/invitation/expired/{token}` und `/partner/invitation/used/{token}` → statische Blade-Views.
|
||||
- `/partner/setup` → Volt-Komponente `partner.setup-wizard`, geschützt mit `auth`-Middleware.
|
||||
|
||||
## Setup-Wizard (partner.setup-wizard)
|
||||
- Basisdaten: Partner wird über eingeloggten User geladen (`Auth::user()->partner_id`); Rolle bestimmt Icon/Label.
|
||||
- Schritte je Partner-Typ:
|
||||
- Retailer: `Stammdaten` → `Liefergebiete` → `Fertig`.
|
||||
- Manufacturer: `Stammdaten` → `Marke anlegen` → `Fertig`.
|
||||
- Estate-Agent (und Default): `Profil`/`Stammdaten` → `Fertig`.
|
||||
- Schritt 1 (alle):
|
||||
- Felder: Firmenname (pflicht), Logo-Upload (optional, 2 MB, jpg/png/webp), Kurzbeschreibung, Straße/PLZ/Stadt (pflicht), Website (optional, URL).
|
||||
- Logo wird bei Upload in `public/partner-logos` gespeichert; Partner wird mit Name/Beschreibung/Logo aktualisiert.
|
||||
- TODO im Code: Adresse noch separat speichern (Adresse aktuell nicht persistiert).
|
||||
- Schritt 2 Retailer:
|
||||
- Felder: Lieferradius km, Montageradius km (1–500, pflicht).
|
||||
- Speichert `delivery_radius_km` und `assembly_radius_km` im Partner; danach Abschluss.
|
||||
- Schritt 2 Manufacturer:
|
||||
- Felder: Markenname (pflicht), Markenlogo (optional, 2 MB), Markenbeschreibung.
|
||||
- Speichert neue `Brand` mit Slug aus Namen; Logo in `public/brand-logos`.
|
||||
- Abschluss:
|
||||
- Partner wird `is_active=true`, `setup_completed=true`, `setup_completed_at=now()`.
|
||||
- Dashboard-Button; für Nicht-Makler CTA „Erstes Produkt anlegen“ (derzeit ohne Aktion).
|
||||
|
||||
## Offene To-dos / Beobachtungen
|
||||
- Adresse persistieren (separates Modell/JSON), wird aktuell nur validiert.
|
||||
- Website-Feld wird vorausgefüllt? momentan leer trotz vorhandener Partner-Daten.
|
||||
- CTA „Erstes Produkt anlegen“ ohne Link/Action; Zielseite definieren.
|
||||
- Hersteller: Slug-Kollision/Mehrmarken-Handling prüfen (derzeit einfacher `Str::slug` mit create).
|
||||
- Estate-Agent: Gibt es spezifische Felder? Wizard zeigt nur Schritt 1 → Fertig; klären ob ausreichend.
|
||||
|
||||
## QR-/Registrierungscode-Flow (neu)
|
||||
- Öffentliche Landing unter `/reg/{role}` auf `b2in.test`, Rollen-Codes:
|
||||
- `c` = Kunde, `e` = Makler, `m` = Hersteller, `r` = Händler.
|
||||
- Gleiches Blade-Template, Inhalte/CTA dynamisch nach Role.
|
||||
- QR-Codes enthalten nur den Link (`/reg/{role}`), kein Code-Query. Der Code steht z.B. auf der Visitenkarte und wird manuell eingegeben.
|
||||
- Registrierungscode ist zwingend, wird einmalig eingelöst und danach als „verbraucht“ markiert.
|
||||
- Validierter Code schaltet erst das passende Registrierungsformular frei (bestehender Flow wiederverwenden, kein zweites System).
|
||||
- Rollen-spezifische Registrierung:
|
||||
- Makler (`/reg/e`): braucht gültige Makler-Nummer (einzigartig, vorab im System hinterlegt).
|
||||
- Kunde (`/reg/c`): braucht gültige Kundennummer, die einem Makler zugeordnet ist; jeder Kunde muss einem Makler zugeordnet werden (Provisions-Tracking).
|
||||
- Händler (`/reg/r`) und Hersteller (`/reg/m`): eigener Flow, ebenfalls mit einmaligem Code; Hersteller haben keine Kunden, Händler pflegen Sortiment und können Kundenzugänge verschaffen.
|
||||
|
||||
### Vorschlag Datenmodell Codes (anzulegen)
|
||||
- Tabelle `registration_codes` (oder separate `broker_codes` + `customer_codes`):
|
||||
- `code` (unique), `role` (`broker|customer|retailer|manufacturer`), `status` (`available|used|expired`), `partner_id` (optional, z.B. für Händler/Hersteller), `broker_id` (für Kundennummern-Block), `used_by_user_id` (nullable), `used_at`, `expires_at` (optional), `metadata` (json für Notizen/Quelle).
|
||||
- Für Maklernummern: `role=broker`, `status=available`, keine `broker_id`.
|
||||
- Für Kundennummern: `role=customer`, `broker_id` Pflicht, damit Zuordnung bei Registrierung klar ist.
|
||||
- Einlösung:
|
||||
- Lookup `code` + `role` passend zur Route.
|
||||
- Wenn `status != available` → Fehlermeldung.
|
||||
- Bei Erfolg: markiere `used`, setze `used_at`, `used_by_user_id` (nach erfolgreichem User-Create), ggf. `partner_id` koppeln.
|
||||
|
||||
### Nummernformat / Vergabe
|
||||
- Format: 8-stellige Nummern mit optional vorangestelltem Buchstaben (Alias). Beispiele: `00100001`, `M00100001`, `K01102513`.
|
||||
- Buchstabenpräfixe nur Alias (Marketing), intern immer über IDs verknüpfen; Code bleibt als Alias gespeichert.
|
||||
- Nummern sind fortlaufend; Kundennummern werden blockweise einem Makler zugewiesen (z.B. `K01102510`–`K01102560` = 50 Stück).
|
||||
- Ein Code kann nur einmal eingelöst werden und wird danach als „used“ markiert.
|
||||
|
||||
### Umsetzung QR-/Reg-Landing (Stand)
|
||||
- Neue Route `/reg/{role}` (Volt) mit Rollen-Slugs: `c` Kunde, `e` Makler, `m` Hersteller, `r` Händler.
|
||||
- Gemeinsames Template `resources/views/livewire/reg/landing.blade.php`, Inhalte dynamisch nach Rolle.
|
||||
- Eingabe und Prüfung des Registrierungscodes; Normalisierung (Leerzeichen/Bindestriche entfernt, uppercase).
|
||||
- Valider Code (Status `available`, Rolle passend) wird in Session abgelegt (`registration_code_id`, `registration_role`) und leitet zu `reg/create-account` weiter. Verbrauch/Markierung erfolgt beim Account-Create bzw. Wizard-Abschluss.
|
||||
- Neues Modell `App\Models\RegistrationCode` + Migration `registration_codes` mit Feldern für Status, Rolle, Broker-/Partner-Referenzen, Used-Infos.
|
||||
|
||||
### Account-Create nach Code (neu)
|
||||
- Route `/reg/create-account` (Volt) nutzt `reg.create-account`-Komponente.
|
||||
- Felder: Vorname, Nachname, E-Mail, Passwort + Bestätigung, AGB-Checkbox.
|
||||
- Prüft Session-Code; mappt Rollen auf Partner-Typ (`broker→Estate-Agent`, `retailer→Retailer`, `manufacturer→Manufacturer`; Customer aktuell nicht unterstützt).
|
||||
- Erstellt Partner (minimal), User, weist Rolle zu, markiert Code als verwendet, loggt ein, leitet in den Setup-Wizard.
|
||||
|
||||
### Landing-/Flow-Idee
|
||||
- Route/Controller/Volt für `/reg/{role}`:
|
||||
- Zeigt Rolle-spezifischen Text und Eingabefeld „Registrierungscode“.
|
||||
- Nach erfolgreicher Code-Validierung: Formular mit bestehenden Feldern je Rolle anzeigen (Reuse: bestehende Registrierung/Setup-Logik).
|
||||
- Kopplung mit bestehendem Einladungssystem:
|
||||
- Kein zweites System; nach Code-Check wird derselbe Registrierungspfad genutzt (User/Partner anlegen, Setup-Wizard etc.).
|
||||
- To-do: Admin-Oberfläche bereitstellen, um Maklernummern und Kundennummern-Blöcke zu erzeugen und einem Makler zuzuweisen.
|
||||
186
dev/THEME-DEMO-COMPONENTS.md
Normal file
186
dev/THEME-DEMO-COMPONENTS.md
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
# Theme Demo Komponenten
|
||||
|
||||
## 📋 Übersicht
|
||||
|
||||
Die Theme-Demo-Seite wurde in wiederverwendbare Livewire-Komponenten unterteilt, um bessere Wartbarkeit und Übersichtlichkeit zu gewährleisten.
|
||||
|
||||
## 🧩 Komponenten-Struktur
|
||||
|
||||
### 1. **ThemeInfo** (`app/Livewire/Web/Components/ThemeInfo.php`)
|
||||
- **Zweck:** Zeigt aktuelle Domain-Konfiguration und Theme-Details
|
||||
- **Features:**
|
||||
- Domain-Name und Theme-Informationen
|
||||
- Primär- und Sekundärfarben mit Farbvorschau
|
||||
- Schriftarten-Informationen
|
||||
- URL-Konfiguration
|
||||
|
||||
### 2. **LogoDemo** (`app/Livewire/Web/Components/LogoDemo.php`)
|
||||
- **Zweck:** Demonstriert Logo-Varianten für das aktuelle Theme
|
||||
- **Features:**
|
||||
- Positives Logo auf hellem Hintergrund
|
||||
- Negatives Logo auf dunklem Hintergrund
|
||||
- Automatische Logo-Auswahl basierend auf Theme
|
||||
|
||||
### 3. **ColorDemo** (`app/Livewire/Web/Components/ColorDemo.php`)
|
||||
- **Zweck:** Zeigt die Hauptfarben des aktuellen Themes
|
||||
- **Features:**
|
||||
- Primary-Farbe mit Hex-Code
|
||||
- Secondary-Farbe mit Hex-Code
|
||||
- Accent-Farbe (immer Neutral)
|
||||
- Farbvorschau-Karten
|
||||
|
||||
### 4. **ButtonDemo** (`app/Livewire/Web/Components/ButtonDemo.php`)
|
||||
- **Zweck:** Demonstriert Button-Styles und Hover-Effekte
|
||||
- **Features:**
|
||||
- Primary, Secondary und Accent Buttons
|
||||
- Hover-Effekte mit Übergängen
|
||||
- Theme-spezifische Farbwechsel
|
||||
|
||||
### 5. **ThemeSwitcher** (`app/Livewire/Web/Components/ThemeSwitcher.php`)
|
||||
- **Zweck:** Bietet verschiedene Wege zum Theme-Switching
|
||||
- **Features:**
|
||||
- Domain-basierte Links
|
||||
- URL-Parameter-Links
|
||||
- Pfad-basierte Links für lokale Entwicklung
|
||||
|
||||
### 6. **DemoSection** (`app/Livewire/Web/Components/DemoSection.php`)
|
||||
- **Zweck:** Wiederverwendbarer Container für Demo-Bereiche
|
||||
- **Features:**
|
||||
- Einheitliches Layout
|
||||
- Titel und Beschreibung
|
||||
- Flexible Inhalte
|
||||
|
||||
## 🎯 Verwendung
|
||||
|
||||
### Haupt-Theme-Demo-View
|
||||
```blade
|
||||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('content')
|
||||
<div class="min-h-screen bg-background">
|
||||
<livewire:web.components.header />
|
||||
|
||||
<main class="section-padding">
|
||||
<div class="container-padding">
|
||||
<livewire:web.components.theme-info />
|
||||
<livewire:web.components.logo-demo />
|
||||
<livewire:web.components.color-demo />
|
||||
<livewire:web.components.button-demo />
|
||||
<livewire:web.components.theme-switcher />
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<livewire:web.components.footer />
|
||||
</div>
|
||||
@endsection
|
||||
```
|
||||
|
||||
### Einzelne Komponenten verwenden
|
||||
```blade
|
||||
<!-- Nur Logo-Demo -->
|
||||
<livewire:web.components.logo-demo />
|
||||
|
||||
<!-- Nur Farb-Demo -->
|
||||
<livewire:web.components.color-demo />
|
||||
|
||||
<!-- Nur Button-Demo -->
|
||||
<livewire:web.components.button-demo />
|
||||
```
|
||||
|
||||
## 🔧 Wartbarkeit
|
||||
|
||||
### Vorteile der Komponenten-Struktur:
|
||||
|
||||
1. **Modularität:** Jede Komponente hat einen spezifischen Zweck
|
||||
2. **Wiederverwendbarkeit:** Komponenten können in anderen Views verwendet werden
|
||||
3. **Wartbarkeit:** Änderungen an einer Komponente betreffen nur diese
|
||||
4. **Testbarkeit:** Jede Komponente kann einzeln getestet werden
|
||||
5. **Übersichtlichkeit:** Haupt-View ist sehr sauber und lesbar
|
||||
|
||||
### Datei-Struktur:
|
||||
```
|
||||
app/Livewire/Web/Components/
|
||||
├── ThemeInfo.php
|
||||
├── LogoDemo.php
|
||||
├── ColorDemo.php
|
||||
├── ButtonDemo.php
|
||||
├── ThemeSwitcher.php
|
||||
└── DemoSection.php
|
||||
|
||||
resources/views/livewire/web/components/
|
||||
├── theme-info.blade.php
|
||||
├── logo-demo.blade.php
|
||||
├── color-demo.blade.php
|
||||
├── button-demo.blade.php
|
||||
├── theme-switcher.blade.php
|
||||
└── demo-section.blade.php
|
||||
```
|
||||
|
||||
## 🚀 Erweiterungen
|
||||
|
||||
### Neue Demo-Komponenten hinzufügen:
|
||||
|
||||
1. **Komponente erstellen:**
|
||||
```php
|
||||
// app/Livewire/Web/Components/NewDemo.php
|
||||
<?php
|
||||
namespace App\Livewire\Web\Components;
|
||||
use Livewire\Component;
|
||||
|
||||
class NewDemo extends Component
|
||||
{
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.web.components.new-demo');
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
2. **View erstellen:**
|
||||
```blade
|
||||
<!-- resources/views/livewire/web/components/new-demo.blade.php -->
|
||||
<div class="text-center mb-16">
|
||||
<h2 class="text-section-title mb-8">Neue Demo</h2>
|
||||
<!-- Demo-Inhalt -->
|
||||
</div>
|
||||
```
|
||||
|
||||
3. **In Haupt-View einbinden:**
|
||||
```blade
|
||||
<livewire:web.components.new-demo />
|
||||
```
|
||||
|
||||
### DemoSection verwenden:
|
||||
```blade
|
||||
<livewire:web.components.demo-section
|
||||
title="Meine Demo"
|
||||
description="Beschreibung der Demo"
|
||||
component="my-demo" />
|
||||
```
|
||||
|
||||
## 📝 Best Practices
|
||||
|
||||
1. **Einheitliche Struktur:** Alle Demo-Komponenten folgen dem gleichen Layout-Pattern
|
||||
2. **Responsive Design:** Alle Komponenten sind mobile-optimiert
|
||||
3. **Accessibility:** Semantische HTML-Struktur und ARIA-Labels
|
||||
4. **Performance:** Minimale JavaScript-Dependencies
|
||||
5. **Theme-Konsistenz:** Verwendung der Theme-Helper für dynamische Inhalte
|
||||
|
||||
## 🔍 Debugging
|
||||
|
||||
### Komponenten einzeln testen:
|
||||
```bash
|
||||
# Spezifische Komponente testen
|
||||
php artisan livewire:make ComponentName
|
||||
|
||||
# Komponenten-Status prüfen
|
||||
php artisan livewire:list
|
||||
```
|
||||
|
||||
### Theme-Helper testen:
|
||||
```php
|
||||
// In tinker
|
||||
php artisan tinker
|
||||
>>> \App\Helpers\ThemeHelper::getPrimaryColor()
|
||||
>>> \App\Helpers\ThemeHelper::getLogoPath('positive')
|
||||
```
|
||||
188
dev/THEME-SWITCHING.md
Normal file
188
dev/THEME-SWITCHING.md
Normal file
|
|
@ -0,0 +1,188 @@
|
|||
# Theme-Switching System
|
||||
|
||||
Das Laravel-Projekt unterstützt automatisches Theme-Switching basierend auf der URL/Domain. Jede Domain lädt automatisch das entsprechende CSS-Theme und die passenden Logos.
|
||||
|
||||
## 🎨 Verfügbare Themes
|
||||
|
||||
### 1. B2IN Theme (`b2in`)
|
||||
- **Domain:** `b2in.test`
|
||||
- **Farben:** Anthracite (#2b3f51) & Dynamic Blue (#20a0da)
|
||||
- **Schriften:** Inter & IBM Plex Sans
|
||||
- **CSS:** `theme-b2in.css`
|
||||
|
||||
### 2. B2A Theme (`b2a`)
|
||||
- **Domain:** `b2a.test`
|
||||
- **Farben:** Azur Blue (#123f6d) & Liberty Red (#ce1d2e)
|
||||
- **Schriften:** Inter & Merriweather
|
||||
- **CSS:** `theme-b2a.css`
|
||||
|
||||
### 3. Stileigentum Theme (`stileigentum`)
|
||||
- **Domain:** `stileigentum.test`
|
||||
- **Farben:** Style Blue (#007aab) & Style Sun (#fbaf22)
|
||||
- **Schriften:** Inter & Ephesis
|
||||
- **CSS:** `theme-stileigentum.css`
|
||||
|
||||
### 4. Style2own Theme (`style2own`)
|
||||
- **Domain:** `style2own.test`
|
||||
- **Farben:** Imperial Blue (#123453) & Sand Gold (#c9ac84)
|
||||
- **Schriften:** Inter & EB Garamond
|
||||
- **CSS:** `theme-style2own.css`
|
||||
|
||||
## 🔧 Funktionsweise
|
||||
|
||||
### 1. ThemeServiceProvider
|
||||
Der `ThemeServiceProvider` erkennt automatisch die aktuelle Domain und lädt die entsprechende Konfiguration:
|
||||
|
||||
```php
|
||||
// app/Providers/ThemeServiceProvider.php
|
||||
$host = Request::getHost(); // z.B. "b2in.test"
|
||||
$themeOverride = Request::get('theme'); // Optional: URL-Parameter für Testing
|
||||
```
|
||||
|
||||
### 2. ThemeHelper
|
||||
Die `ThemeHelper`-Klasse stellt Hilfsfunktionen für Theme-spezifische Assets bereit:
|
||||
|
||||
```php
|
||||
// Logo-Pfade
|
||||
ThemeHelper::getLogoPath('positive'); // Positives Logo
|
||||
ThemeHelper::getLogoPath('negative'); // Negatives Logo
|
||||
|
||||
// Farben
|
||||
ThemeHelper::getPrimaryColor(); // Primärfarbe
|
||||
ThemeHelper::getSecondaryColor(); // Sekundärfarbe
|
||||
|
||||
// Schriften
|
||||
ThemeHelper::getPrimaryFont(); // Primärschrift
|
||||
ThemeHelper::getSecondaryFont(); // Sekundärschrift
|
||||
```
|
||||
|
||||
### 3. Automatisches Laden
|
||||
Das System lädt automatisch:
|
||||
- ✅ **CSS-Theme** basierend auf der Domain
|
||||
- ✅ **Logos** (positiv/negativ) für Header und Footer
|
||||
- ✅ **Favicons** für die entsprechende Domain
|
||||
- ✅ **Schriftarten** entsprechend der Theme-Konfiguration
|
||||
|
||||
## 🚀 Verwendung
|
||||
|
||||
### Domain-basiertes Switching
|
||||
```
|
||||
https://b2in.test/ → B2IN Theme
|
||||
https://b2a.test/ → B2A Theme
|
||||
https://stileigentum.test/ → Stileigentum Theme
|
||||
https://style2own.test/ → Style2own Theme
|
||||
```
|
||||
|
||||
### URL-Parameter für Testing
|
||||
```
|
||||
/theme-demo?theme=b2in → B2IN Theme
|
||||
/theme-demo?theme=b2a → B2A Theme
|
||||
/theme-demo?theme=stileigentum → Stileigentum Theme
|
||||
/theme-demo?theme=style2own → Style2own Theme
|
||||
```
|
||||
|
||||
## 📁 Dateistruktur
|
||||
|
||||
```
|
||||
app/
|
||||
├── Helpers/
|
||||
│ └── ThemeHelper.php # Theme-Hilfsfunktionen
|
||||
├── Providers/
|
||||
│ └── ThemeServiceProvider.php # Theme-Provider
|
||||
└── Livewire/Web/Components/ # Komponenten verwenden ThemeHelper
|
||||
|
||||
resources/
|
||||
├── css/web/
|
||||
│ ├── shared-styles.css # Gemeinsame Styles
|
||||
│ ├── theme-b2in.css # B2IN Theme
|
||||
│ ├── theme-b2a.css # B2A Theme
|
||||
│ ├── theme-stileigentum.css # Stileigentum Theme
|
||||
│ └── theme-style2own.css # Style2own Theme
|
||||
└── views/
|
||||
├── web/layouts/
|
||||
│ └── web-master.blade.php # Hauptlayout mit Theme-Switching
|
||||
└── web/
|
||||
└── theme-demo.blade.php # Demo-Seite für Theme-Testing
|
||||
|
||||
public/img/
|
||||
├── logos/ # Domain-spezifische Logos
|
||||
│ ├── b2in-logo-positive.svg
|
||||
│ ├── b2in-logo-negative.svg
|
||||
│ ├── B2A-Logo-positiv-2025-07-28_RGB.svg
|
||||
│ ├── B2A-Logo-negativ-2025-07-28_RGB.svg
|
||||
│ ├── stileigentum-logo-positiv.svg
|
||||
│ ├── stileigentum-logo-negativ.svg
|
||||
│ ├── style2own-logo-positiv.svg
|
||||
│ └── style2own-logo-negativ.svg
|
||||
└── favicons/ # Domain-spezifische Favicons
|
||||
├── b2in-favicon.ico
|
||||
├── b2a-favicon.ico
|
||||
├── stileigentum-favicon.ico
|
||||
└── style2own-favicon.ico
|
||||
|
||||
config/
|
||||
└── domains.php # Domain-Konfigurationen
|
||||
```
|
||||
|
||||
## 🎯 Demo-Seite
|
||||
|
||||
Besuchen Sie `/theme-demo` um das Theme-Switching zu testen:
|
||||
|
||||
- **Domain-Info:** Zeigt aktuelle Domain-Konfiguration
|
||||
- **Logo-Demo:** Positive und negative Logos
|
||||
- **Farb-Demo:** Theme-spezifische Farben
|
||||
- **Button-Demo:** Theme-spezifische Button-Styles
|
||||
- **Switching-Links:** Direkte Links zu verschiedenen Themes
|
||||
|
||||
## ⚙️ Konfiguration
|
||||
|
||||
### Neue Domain hinzufügen
|
||||
|
||||
1. **Domain-Konfiguration** in `config/domains.php`:
|
||||
```php
|
||||
'neue-domain' => [
|
||||
'domain_name' => env('DOMAIN_NEUE', 'neue-domain.test'),
|
||||
'url' => env('DOMAIN_NEUE_URL', 'https://neue-domain.test'),
|
||||
'theme' => 'neue-domain',
|
||||
'view_prefix' => 'neue-domain',
|
||||
'assets_dir' => 'build/neue-domain',
|
||||
'color_scheme' => [
|
||||
'primary' => '#123456',
|
||||
'secondary' => '#789abc',
|
||||
],
|
||||
'font_family' => [
|
||||
'primary' => 'Inter',
|
||||
'secondary' => 'Roboto',
|
||||
],
|
||||
],
|
||||
```
|
||||
|
||||
2. **CSS-Theme** erstellen: `resources/css/web/theme-neue-domain.css`
|
||||
|
||||
3. **Logos** hinzufügen: `public/img/logos/neue-domain-logo-*.svg`
|
||||
|
||||
4. **ThemeHelper** erweitern: Logo-Mapping in `ThemeHelper.php`
|
||||
|
||||
## 🔍 Troubleshooting
|
||||
|
||||
### Theme wird nicht geladen
|
||||
- Prüfen Sie die Domain-Konfiguration in `config/domains.php`
|
||||
- Stellen Sie sicher, dass die CSS-Datei existiert
|
||||
- Überprüfen Sie die Vite-Konfiguration
|
||||
|
||||
### Logos werden nicht angezeigt
|
||||
- Prüfen Sie die Logo-Pfade in `ThemeHelper.php`
|
||||
- Stellen Sie sicher, dass die Logo-Dateien existieren
|
||||
- Überprüfen Sie die Dateiberechtigungen
|
||||
|
||||
### Farben stimmen nicht überein
|
||||
- Prüfen Sie die CSS-Variablen in der Theme-Datei
|
||||
- Stellen Sie sicher, dass `shared-styles.css` importiert wird
|
||||
- Überprüfen Sie die HSL-Farbwerte
|
||||
|
||||
## 📝 Notizen
|
||||
|
||||
- Das System funktioniert sowohl mit echten Domains als auch mit URL-Parametern
|
||||
- Alle Komponenten verwenden automatisch die Theme-spezifischen Assets
|
||||
- Die Konfiguration ist vollständig über Umgebungsvariablen steuerbar
|
||||
- Das System ist erweiterbar für neue Domains/Themes
|
||||
60
dev/b2in-layout-v10/ENV_VARIABLES_DISPLAY.md
Normal file
60
dev/b2in-layout-v10/ENV_VARIABLES_DISPLAY.md
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
# Display Umgebungsvariablen
|
||||
|
||||
Fügen Sie diese Variablen zu Ihrer `.env` Datei hinzu:
|
||||
|
||||
## Testserver (portal.b2in)
|
||||
|
||||
```env
|
||||
# Display Configuration - Testserver
|
||||
DISPLAY_BASE_PATH=_cabinet
|
||||
DISPLAY_SUBDOMAIN=
|
||||
DISPLAY_DOMAIN=b2in.test
|
||||
```
|
||||
|
||||
**Resultierende URLs:**
|
||||
- Display-Seite: `http://portal.b2in.test/_cabinet/`
|
||||
- Short-URLs: `http://portal.b2in.test/_cabinet/go.php?z=abc123`
|
||||
- API: `http://portal.b2in.test/api/display/config`
|
||||
|
||||
## Live-Server (cabinet.b2in.eu)
|
||||
|
||||
```env
|
||||
# Display Configuration - Live-Server
|
||||
DISPLAY_BASE_PATH=_cabinet
|
||||
DISPLAY_SUBDOMAIN=cabinet
|
||||
DISPLAY_DOMAIN=b2in.eu
|
||||
APP_ENV=production
|
||||
```
|
||||
|
||||
**Resultierende URLs:**
|
||||
- Display-Seite: `https://cabinet.b2in.eu/`
|
||||
- Short-URLs: `https://cabinet.b2in.eu/go.php?z=abc123`
|
||||
- API: `https://cabinet.b2in.eu/api/display/config` oder `https://b2in.eu/api/display/config`
|
||||
|
||||
## Vereinfachtes System
|
||||
|
||||
Das System nutzt jetzt nur noch den Ordner `public/_cabinet/` für beide Umgebungen:
|
||||
|
||||
- **Testserver:** Zugriff über `/_cabinet/` Pfad
|
||||
- **Live-Server:** Subdomain zeigt direkt auf `/_cabinet/`
|
||||
|
||||
Beide Umgebungen teilen sich denselben Code-Pfad, nur die URLs unterscheiden sich.
|
||||
|
||||
## Wie es funktioniert
|
||||
|
||||
1. **Mit DISPLAY_SUBDOMAIN gesetzt (Live):**
|
||||
- Generiert absolute URLs: `https://cabinet.b2in.eu/go.php?z=...`
|
||||
- Subdomain zeigt auf `public/_cabinet/`
|
||||
|
||||
2. **Ohne DISPLAY_SUBDOMAIN (Test):**
|
||||
- Generiert URLs mit Pfad: `http://portal.b2in.test/_cabinet/go.php?z=...`
|
||||
- Zugriff über Hauptdomain mit Unterordner
|
||||
|
||||
## Nach Änderungen
|
||||
|
||||
Cache immer leeren:
|
||||
|
||||
```bash
|
||||
php artisan config:clear
|
||||
php artisan cache:clear
|
||||
```
|
||||
676
dev/entwicklung.md
Normal file
676
dev/entwicklung.md
Normal file
|
|
@ -0,0 +1,676 @@
|
|||
# B2IN - Projekt-Entwicklungsstand
|
||||
|
||||
## Projektübersicht
|
||||
|
||||
Das B2IN-Projekt ist eine umfassende Multi-Domain-Laravel-Anwendung, die als zentrale Plattform für Partner-Management, Produkt-Verwaltung und Digital Signage dient. Die Anwendung basiert auf Laravel 12, Livewire 3 und Flux UI und bietet ein modernes, rollenbasiertes System für verschiedene Geschäftspartner.
|
||||
---
|
||||
|
||||
## 🎯 Wichtige ToDos
|
||||
|
||||
- **System Mails**: Kommen teilweise nicht an (google etc) Probleme mit united domains ...
|
||||
In der Zukunft benötigen wir einen response bounce etc.
|
||||
" host gmail-smtp-in.l.google.com[64.233.184.27]
|
||||
said: 550-5.7.26 Your email has been blocked because the sender is
|
||||
unauthenticated. "
|
||||
---
|
||||
|
||||
## 🎯 Kern-Technologien
|
||||
|
||||
- **Framework**: Laravel 12 mit PHP 8.2+
|
||||
- **Frontend**: Livewire 3 mit Volt (Single-File Components)
|
||||
- **UI-Framework**: Flux UI (Pro-Version) mit Tailwind CSS
|
||||
- **Authentifizierung**: Laravel Fortify mit Sanctum
|
||||
- **Berechtigungen**: Spatie Laravel-Permission
|
||||
- **Icons**: Heroicons (Blade-Integration)
|
||||
- **Entwicklungsumgebung**: Laravel Sail (Docker)
|
||||
|
||||
---
|
||||
|
||||
## ✅ Entwickelte Module & Funktionen
|
||||
|
||||
### 1. Multi-Domain-System
|
||||
|
||||
**Status**: ✅ Vollständig implementiert
|
||||
|
||||
Das System unterstützt mehrere Domains mit individuellen Themes und Konfigurationen:
|
||||
|
||||
- **Admin-Portal** (`portal.b2in.test`) - Verwaltungsbereich für alle Partner-Typen
|
||||
- **Haupt-Website** (`b2in.test`) - Unternehmenswebsite
|
||||
- **Landing-Pages** - Individuelle Landing-Pages mit eigenem Branding
|
||||
- **Domain-spezifische Assets** - Separate CSS/JS-Builds pro Domain
|
||||
- **Theme-Switching** - Dynamisches Theme-System basierend auf Domain oder GET-Parameter
|
||||
- **Entwicklungsmodus** - Domain-Simulation für lokale Entwicklung ohne Hosts-Änderung
|
||||
|
||||
**Technische Details**:
|
||||
- Domain-Erkennung über `ThemeServiceProvider`
|
||||
- Separate Vite-Konfigurationen für Admin und Web
|
||||
- Dynamische Favicon-Generierung
|
||||
- Theme-basiertes Routing
|
||||
|
||||
---
|
||||
|
||||
### 2. Benutzer- & Rollen-Management
|
||||
|
||||
**Status**: ✅ Vollständig implementiert
|
||||
|
||||
Umfassendes Rollen- und Berechtigungssystem mit folgenden Rollen:
|
||||
|
||||
#### Definierte Rollen:
|
||||
- **Super Admin** - Vollzugriff auf alle Funktionen
|
||||
- **Admin** - Verwaltung von Partnern und System
|
||||
- **Retailer (Händler)** - Produktverwaltung, Kundenbetreuung, Liefergebiete
|
||||
- **Manufacturer (Hersteller)** - Marken- und Produktverwaltung
|
||||
- **Broker (Makler)** - Lead-Generierung, Provisionen, Kundenanbindung
|
||||
- **Customer (Endkunde)** - Produktbestellung, Dashboard-Zugriff
|
||||
|
||||
#### Berechtigungen:
|
||||
- Hub-Management (Anzeigen, Erstellen, Bearbeiten, Löschen)
|
||||
- Partner-Management (Anzeigen, Erstellen, Bearbeiten, Löschen, Provisionen)
|
||||
- Produkt-Management (Anzeigen, Erstellen, Bearbeiten, Löschen, Miet-Optionen)
|
||||
- Bestellungs-Management (Anzeigen, Verwalten)
|
||||
- User-Management (Anzeigen, Verwalten, Rollen zuweisen)
|
||||
- Dashboard-Zugriff
|
||||
- Bestellungen aufgeben
|
||||
|
||||
#### Spezielle Features:
|
||||
- **Impersonation** - Admins können sich als andere Benutzer einloggen
|
||||
- **Soft-Delete** - Benutzer werden anonymisiert statt gelöscht (bei Abhängigkeiten)
|
||||
- **Rollenbasierte Navigation** - Dynamische Sidebar basierend auf Berechtigungen
|
||||
- **Display-Namen** - Separate Anzeigenamen für Benutzer
|
||||
|
||||
---
|
||||
|
||||
### 3. Partner-Management-System
|
||||
|
||||
**Status**: ✅ Vollständig implementiert
|
||||
|
||||
Komplettes System zur Verwaltung von Geschäftspartnern:
|
||||
|
||||
#### Partner-Typen:
|
||||
- **Retailer** - Händler mit Liefer- und Montageradius
|
||||
- **Manufacturer** - Hersteller mit Markenverwaltung
|
||||
- **Broker** - Makler mit Provisionsmodell
|
||||
- **Customer** - Endkunden
|
||||
|
||||
#### Funktionen:
|
||||
- **Partner-Einladungssystem**:
|
||||
- E-Mail-Einladungen mit Token-basiertem Zugang
|
||||
- Konfigurierbare Gültigkeit (1-4 Wochen)
|
||||
- Status-Tracking (Offen, Verwendet, Abgelaufen)
|
||||
- Rollenbasierte Einladungen
|
||||
- Spezielle Status-Seiten für abgelaufene/verwendete Einladungen
|
||||
|
||||
- **Partner-Setup-Wizard**:
|
||||
- Mehrstufiger Onboarding-Prozess
|
||||
- Rollenspezifische Schritte und Felder
|
||||
- Logo-Upload (Partner & Marke)
|
||||
- Adressverwaltung (Straße, PLZ, Stadt, Land)
|
||||
- Retailer: Liefer- und Montageradius (1-500 km)
|
||||
- Manufacturer: Markenerstellung mit Logo
|
||||
- Setup-Status-Tracking (`setup_completed`, `setup_completed_at`)
|
||||
- Middleware-Schutz für unvollständige Setups
|
||||
|
||||
- **Partner-Hierarchie **:
|
||||
- Parent-Child-Beziehungen (Broker → Kunden)
|
||||
- Hub-Zuordnung für regionale Partner 🔄 Grundarchitektur vorhanden
|
||||
- Provisionsmodelle (Festbetrag oder Prozentsatz) 🔄 Grundarchitektur vorhanden
|
||||
|
||||
- **Registrierungs-Codes**:
|
||||
- QR-Code-basierte Registrierung
|
||||
- Rollenspezifische Landing-Pages (`/reg/{role}`)
|
||||
- Code-Tracking (Verwendet von, Verwendungsdatum)
|
||||
- Code-Namen für bessere Organisation
|
||||
- Zuordnung zu übergeordnetem Partner
|
||||
|
||||
---
|
||||
|
||||
### 4. Hub-Management
|
||||
|
||||
**Status**: 🔄 Grundarchitektur vorhanden
|
||||
|
||||
Regionale Hub-Verwaltung:
|
||||
|
||||
#### Funktionen:
|
||||
- Hub-Erstellung und -Verwaltung
|
||||
- Standortverwaltung (HubLocations)
|
||||
- Partner-Zuordnung zu Hubs
|
||||
- Hub-spezifische Dashboard-Ansichten
|
||||
- Indexseite mit Hub-Übersicht
|
||||
- Erstellen/Bearbeiten von Hubs
|
||||
|
||||
#### Datenstruktur:
|
||||
- Hub-Stammdaten
|
||||
- Mehrere Standorte pro Hub
|
||||
- Partner-Beziehungen
|
||||
|
||||
---
|
||||
|
||||
### 5. Produkt-Management-System
|
||||
|
||||
**Status**: 🔄 Grundarchitektur vorhanden
|
||||
|
||||
Umfassendes Produktverwaltungssystem:
|
||||
|
||||
#### Features:
|
||||
- **Produktliste** (`/products`):
|
||||
- Suchfunktion (Name, Artikelnummer)
|
||||
- Filter nach Status (Aktiv, Entwurf, Inaktiv)
|
||||
- Filter nach Kategorie
|
||||
- Aktive Filter-Anzeige
|
||||
- Responsive Tabellen-Ansicht
|
||||
|
||||
- **Produkt-Erstellung** (`/products/create`):
|
||||
- Umfangreiches Formular für Produktdaten
|
||||
- Mehrstufige Eingabe
|
||||
- Bild-Upload
|
||||
- Varianten-Verwaltung
|
||||
|
||||
#### Datenmodelle:
|
||||
- **Products** - Hauptprodukte
|
||||
- **ProductVariants** - Produktvarianten mit Attributen
|
||||
- **Attributes** - Produkt-Attribute (z.B. Farbe, Größe)
|
||||
- **AttributeValues** - Attribut-Werte
|
||||
- **Categories** - Produktkategorien (mehrfach zuweisbar)
|
||||
- **Tags** - Produkt-Tags
|
||||
- **Brands** - Marken (Partner-zuweisbar)
|
||||
- **Collections** - Produkt-Kollektionen
|
||||
- **TaxRates** - Steuersätze
|
||||
- **ShippingClasses** - Versandklassen
|
||||
- **ProductLogistics** - Logistik-Informationen
|
||||
|
||||
#### Beziehungen:
|
||||
- Produkte → Kategorien (N:N)
|
||||
- Produkte → Tags (N:N)
|
||||
- Produkte → Verwandte Produkte (N:N)
|
||||
- Produkte → Marken
|
||||
- Varianten → Attribute & Werte
|
||||
|
||||
---
|
||||
|
||||
### 6. Dashboard-System
|
||||
|
||||
**Status**: 🔄 Grundarchitektur vorhanden
|
||||
|
||||
Rollenbasiertes Dashboard mit individuellen KPIs:
|
||||
|
||||
#### Admin-Dashboard:
|
||||
- Aktive & geplante Hubs
|
||||
- Partner-Wachstum (Gesamt, Dieser Monat)
|
||||
- Plattform-Umsatz (Platzhalter)
|
||||
- System-Status
|
||||
- Ausstehende Einladungen
|
||||
- Gesamt-Kunden
|
||||
|
||||
#### Retailer-Dashboard:
|
||||
- Offene Bestellungen
|
||||
- Monatlicher Umsatz
|
||||
- Produkt-Aufrufe
|
||||
- Lagerbestands-Warnungen
|
||||
- Meine Kunden
|
||||
|
||||
#### Manufacturer-Dashboard:
|
||||
- Marken-Reichweite
|
||||
- Aktive Produkte
|
||||
- Entwurfs-Produkte
|
||||
- Gesamt-Aufrufe
|
||||
|
||||
#### Broker-Dashboard:
|
||||
- Gesamt-Provision
|
||||
- Ausstehende Auszahlung
|
||||
- Generierte Leads
|
||||
- Empfehlungs-Link
|
||||
- Broker-Kunden
|
||||
|
||||
#### Customer-Dashboard:
|
||||
- Marken-spezifisches Branding
|
||||
- Top-Angebote
|
||||
- Broker-Information
|
||||
- Individuelles Design basierend auf zugewiesenem Broker
|
||||
|
||||
---
|
||||
|
||||
### 7. Digital Signage / Display-CMS
|
||||
|
||||
**Status**: ✅ Vollständig implementiert
|
||||
|
||||
Professionelles CMS-System für Digital Signage im Cabinet Showroom Bielefeld:
|
||||
|
||||
#### Video-Verwaltung:
|
||||
- Verwaltung von Video-Playlists
|
||||
- Reihenfolge-Verwaltung
|
||||
- Video-Position einstellen (0-100% für optimalen Ausschnitt)
|
||||
- Videos aktivieren/deaktivieren
|
||||
- Titel für bessere Organisation
|
||||
|
||||
#### Footer-Content mit Tracking:
|
||||
- Überschrift und Unterzeile
|
||||
- Optionale Ziel-URL
|
||||
- **Automatische Short-Link-Generierung** (6-stellige Codes)
|
||||
- **QR-Code-Generierung** für Short-Links
|
||||
- **Echtzeit-Klick-Tracking**
|
||||
- Klick-Statistiken im CMS
|
||||
- Reihenfolge-Verwaltung (30-Sekunden-Rotation)
|
||||
- Short-Code neu generieren
|
||||
- Klick-Zähler zurücksetzen
|
||||
- Flexibles Layout (mit/ohne URL)
|
||||
|
||||
#### Short-Link-System:
|
||||
- Automatische Code-Generierung (z.B. `c59kjb`)
|
||||
- Short-URLs: `https://cabinet.b2in.eu/go.php?z=CODE`
|
||||
- Tracking in Datenbank + Log-Datei
|
||||
- Weiterleitung zur Original-URL
|
||||
- Statistik-Dashboard
|
||||
|
||||
#### Technische Details:
|
||||
- API-basierte Konfiguration (`/api/display/config`)
|
||||
- Standalone Display-Seite (`/_cabinet/`)
|
||||
- Auto-Reload alle 5 Minuten
|
||||
- Subdomain-Support (Live: `cabinet.b2in.eu`)
|
||||
- Test- und Live-Umgebung
|
||||
- Einheitlicher Pfad für beide Umgebungen
|
||||
|
||||
---
|
||||
|
||||
### 8. Authentifizierungs-System
|
||||
|
||||
**Status**: ✅ Vollständig implementiert
|
||||
|
||||
Modernes Auth-System basierend auf Laravel Fortify & Sanctum:
|
||||
|
||||
#### Features:
|
||||
- Login/Logout
|
||||
- Registrierung
|
||||
- E-Mail-Verifizierung
|
||||
- Passwort-Reset
|
||||
- Passwort-Bestätigung (für sensible Aktionen)
|
||||
- Two-Factor-Authentication (2FA)
|
||||
- API-Token-Authentifizierung (Sanctum)
|
||||
- "Remember Me" Funktionalität
|
||||
|
||||
#### Views:
|
||||
- Login-Seite (Standard & Vereinfacht)
|
||||
- Registrierungs-Seite
|
||||
- Passwort-vergessen
|
||||
- Passwort-zurücksetzen
|
||||
- E-Mail-Verifizierung
|
||||
|
||||
#### Einstellungen:
|
||||
- Profil-Verwaltung
|
||||
- Passwort-Änderung
|
||||
- Erscheinungsbild (Theme-Einstellungen)
|
||||
- Benutzer löschen/anonymisieren
|
||||
|
||||
---
|
||||
|
||||
### 9. Website-Frontend
|
||||
|
||||
**Status**: ✅ Grundstruktur und Inhalte implementiert
|
||||
|
||||
Moderne, responsive Website mit zahlreichen Sections:
|
||||
|
||||
#### Implementierte Seiten:
|
||||
- **Home** - Hauptseite mit Hero-Slider
|
||||
- **About** - Über uns
|
||||
- **Ecosystem** - Ökosystem-Darstellung
|
||||
- **Partner** - Partner-Informationen
|
||||
- **Portfolio** - Produkt-Portfolio
|
||||
- **Magazin** - Blog/Magazin mit Detail-Ansichten
|
||||
- **Contact** - Kontaktformular
|
||||
- **Service** - Service-Seite
|
||||
- **FAQ** - Häufig gestellte Fragen
|
||||
- **Theme-Demo** - Theme-Vorschau
|
||||
|
||||
#### Wiederverwendbare Sections:
|
||||
- Hero (Standard, mit Bild, Slider, Tiles)
|
||||
- About-Hero
|
||||
- Benefits-Section
|
||||
- Brand-Worlds
|
||||
- Broker-Section
|
||||
- Card-Section
|
||||
- Commitment-Section
|
||||
- Content-Section
|
||||
- CTA-Section
|
||||
- Dark-Stats-Section
|
||||
- Digital-Core
|
||||
- Ecosystem (Core, Hero, Stats)
|
||||
- End-Customer-Section
|
||||
- FAQ
|
||||
- Final-Commitment
|
||||
- Leadership-Team
|
||||
- Magazin (List, Detail)
|
||||
- Our-Story
|
||||
- Our-Values
|
||||
- Partner (Benefits, CTA, Hero, Process)
|
||||
- Portfolio
|
||||
- Spotlights-Section
|
||||
- Supplier-Section
|
||||
- Vision-Section
|
||||
|
||||
#### UI-Komponenten:
|
||||
- Header mit Navigation
|
||||
- Footer
|
||||
- Top-Bar
|
||||
- Kontaktformular
|
||||
- Theme-Switcher (für Demos)
|
||||
|
||||
---
|
||||
|
||||
### 10. E-Mail-System
|
||||
|
||||
**Status**: 🔄 Grundarchitektur vorhanden
|
||||
|
||||
#### E-Mail-Templates:
|
||||
- Partner-Einladung (`PartnerInvitationMail`)
|
||||
- Weitere System-E-Mails über Laravel-Fortify
|
||||
|
||||
---
|
||||
|
||||
### 11. Media-Verwaltung
|
||||
|
||||
**Status**: 🔄 Grundarchitektur vorhanden
|
||||
|
||||
- Media-Tabelle für Datei-Uploads
|
||||
- Unterstützung für verschiedene Medientypen
|
||||
- Partner-Logos
|
||||
- Marken-Logos
|
||||
- Produkt-Bilder (vorbereitet)
|
||||
|
||||
---
|
||||
|
||||
### 12. Flux CMS Package (In Entwicklung)
|
||||
|
||||
**Status**: 🔄 Grundarchitektur vorhanden
|
||||
|
||||
Eigenes CMS-Package in `packages/flux-cms/`:
|
||||
|
||||
#### Geplante Features:
|
||||
- Component-First-Architecture
|
||||
- Code-as-Schema (Felder in PHP definiert)
|
||||
- Multi-Domain-Support
|
||||
- Vollständige Mehrsprachigkeit
|
||||
- Content-Versionierung
|
||||
- Media-Management
|
||||
- Performance-Optimierung
|
||||
|
||||
#### Package-Struktur:
|
||||
- `core/` - Kern-Funktionalität, Models, Services
|
||||
- `components/` - Livewire Backend & Frontend Components
|
||||
- `starter-components/` - Vorgefertigte Starter-Components
|
||||
|
||||
---
|
||||
|
||||
## 🗄️ Datenbank-Struktur
|
||||
|
||||
### Implementierte Tabellen:
|
||||
|
||||
#### Benutzer & Authentifizierung:
|
||||
- `users` - Benutzer-Accounts
|
||||
- `roles` - Rollen (Super Admin, Admin, Retailer, etc.)
|
||||
- `permissions` - Berechtigungen
|
||||
- `role_has_permissions` - Rollen-Berechtigungen-Zuordnung
|
||||
- `model_has_roles` - User-Rollen-Zuordnung
|
||||
- `personal_access_tokens` - API-Tokens (Sanctum)
|
||||
|
||||
#### Partner & Geschäftsbeziehungen:
|
||||
- `partners` - Partner-Stammdaten
|
||||
- `partner_invitations` - Einladungen mit Token & Status
|
||||
- `registration_codes` - QR-Code-basierte Registrierung
|
||||
- `hubs` - Regionale Hubs
|
||||
- `hub_locations` - Hub-Standorte
|
||||
|
||||
#### Produkte & Katalog:
|
||||
- `products` - Produkte
|
||||
- `product_variants` - Produkt-Varianten
|
||||
- `product_variant_attributes` - Varianten-Attribute
|
||||
- `product_logistics` - Logistik-Informationen
|
||||
- `brands` - Marken
|
||||
- `categories` - Kategorien
|
||||
- `category_product` - Produkt-Kategorie-Zuordnung
|
||||
- `collections` - Kollektionen
|
||||
- `attributes` - Attribute (Farbe, Größe, etc.)
|
||||
- `attribute_values` - Attribut-Werte
|
||||
- `tags` - Tags
|
||||
- `product_tag` - Produkt-Tag-Zuordnung
|
||||
- `related_products` - Verwandte Produkte
|
||||
- `tax_rates` - Steuersätze
|
||||
- `shipping_classes` - Versandklassen
|
||||
|
||||
#### Display/CMS:
|
||||
- `display_videos` - Video-Playlist für Digital Signage
|
||||
- `display_footer_contents` - Footer-Inhalte mit Short-Links & Tracking
|
||||
|
||||
#### System:
|
||||
- `media` - Media-Verwaltung
|
||||
- `cache` - Cache-Tabellen
|
||||
- `jobs` - Queue-Jobs
|
||||
- `failed_jobs` - Fehlgeschlagene Jobs
|
||||
|
||||
---
|
||||
|
||||
## 🎨 UI/UX Features
|
||||
|
||||
### Design-System:
|
||||
- **Flux UI Pro** - Professionelle Komponenten-Bibliothek
|
||||
- **Tailwind CSS** - Utility-First CSS Framework
|
||||
- **Heroicons** - Konsistente Icon-Bibliothek
|
||||
- **Dark Mode** - Vollständige Dark-Mode-Unterstützung
|
||||
- **Responsive Design** - Mobile-First-Ansatz
|
||||
|
||||
### Theme-System:
|
||||
- Domain-basiertes Theme-Switching
|
||||
- Individuelle Farbschemata pro Domain
|
||||
- Dynamische Asset-Verwaltung
|
||||
- Theme-Demo-Seite für Vorschau
|
||||
|
||||
### Komponenten:
|
||||
- Flux Cards, Buttons, Inputs, Selects
|
||||
- Data Tables mit Pagination
|
||||
- Modals & Dialogs
|
||||
- Toast-Notifications
|
||||
- Form-Validierung
|
||||
- Loading States
|
||||
|
||||
---
|
||||
|
||||
## 📝 Dokumentation
|
||||
|
||||
Umfangreiche Entwicklungs-Dokumentation:
|
||||
|
||||
- `README.md` - Projekt-Übersicht & Installation
|
||||
- `CLAUDE.md` - AI-Kontext-Dokumentation
|
||||
- `dev/COMPONENT-STRUCTURE.md` - Komponenten-Architektur
|
||||
- `dev/DOMAINS-CONFIG.md` - Domain-Konfiguration
|
||||
- `dev/FORTIFY-SANCTUM-SETUP.md` - Auth-Setup
|
||||
- `dev/HERO-ICONS-USAGE.md` - Icon-Verwendung
|
||||
- `dev/LOCAL-DEVELOPMENT.md` - Lokale Entwicklung
|
||||
- `dev/PARTNER-SETUP-WIZARD.md` - Partner-Onboarding
|
||||
- `dev/DISPLAY_CMS_README.md` - Display-CMS-Dokumentation
|
||||
- `dev/DISPLAY_SETUP_LIVE.md` - Display Live-Setup
|
||||
- `dev/ENV_VARIABLES_DISPLAY.md` - Display-Umgebungsvariablen
|
||||
- `dev/THEME-SWITCHING.md` - Theme-System
|
||||
- `dev/THEME-DEMO-COMPONENTS.md` - Theme-Demo
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Entwicklungstools
|
||||
|
||||
### Integrierte Tools:
|
||||
- **Laravel Sail** - Docker-Entwicklungsumgebung
|
||||
- **Laravel Pail** - Real-time Log-Viewer
|
||||
- **Laravel Debugbar** - Debug-Informationen
|
||||
- **Laravel Pint** - Code-Formatter
|
||||
- **Pest PHP** - Testing Framework
|
||||
- **Laravel Dusk** - Browser-Testing
|
||||
- **NPM Concurrently** - Parallel-Prozess-Management
|
||||
|
||||
### Development-Scripts:
|
||||
```bash
|
||||
composer dev # Startet Server, Queue, Logs & Vite parallel
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Deployment-Bereitschaft
|
||||
|
||||
### Produktions-Features:
|
||||
- ✅ Umgebungsspezifische Konfigurationen
|
||||
- ✅ Asset-Kompilierung (Vite)
|
||||
- ✅ Cache-System
|
||||
- ✅ Queue-System
|
||||
- ✅ Log-Management
|
||||
- ✅ Error-Handling
|
||||
- ✅ HTTPS-Ready
|
||||
|
||||
### Optimierungen:
|
||||
- Autoloader-Optimierung
|
||||
- Route-Caching
|
||||
- Config-Caching
|
||||
- View-Caching
|
||||
|
||||
---
|
||||
|
||||
## 📊 Test-Abdeckung
|
||||
|
||||
### Testing-Setup:
|
||||
- Pest PHP Framework installiert
|
||||
- TestCase-Struktur vorhanden
|
||||
- Browser-Testing mit Laravel Dusk
|
||||
- Feature & Unit Tests vorbereitet
|
||||
|
||||
**Hinweis**: Test-Implementierung kann bei Bedarf erweitert werden.
|
||||
|
||||
---
|
||||
|
||||
## 🔐 Sicherheit
|
||||
|
||||
### Implementierte Sicherheitsfeatures:
|
||||
- ✅ CSRF-Protection (Laravel Standard)
|
||||
- ✅ SQL-Injection-Prevention (Eloquent ORM)
|
||||
- ✅ XSS-Protection (Blade Escaping)
|
||||
- ✅ Password-Hashing (Bcrypt)
|
||||
- ✅ E-Mail-Verifizierung
|
||||
- ✅ Two-Factor-Authentication
|
||||
- ✅ Rate-Limiting (vorbereitet)
|
||||
- ✅ Soft-Delete für DSGVO-Compliance
|
||||
- ✅ Benutzer-Anonymisierung
|
||||
|
||||
---
|
||||
|
||||
## 📦 Abhängigkeiten & Packages
|
||||
|
||||
### Haupt-Abhängigkeiten:
|
||||
- `laravel/framework` ^12.0
|
||||
- `laravel/fortify` ^1.27
|
||||
- `laravel/sanctum` ^4.1
|
||||
- `livewire/flux` ^2.1.1
|
||||
- `livewire/flux-pro` ^2.6
|
||||
- `livewire/volt` ^1.7.0
|
||||
- `spatie/laravel-permission` ^6.17
|
||||
- `blade-ui-kit/blade-heroicons` ^2.6
|
||||
|
||||
### Dev-Abhängigkeiten:
|
||||
- `laravel/sail` ^1.41
|
||||
- `laravel/dusk` ^8.2
|
||||
- `pestphp/pest` ^3.8
|
||||
- `barryvdh/laravel-debugbar` ^3.16
|
||||
- `reliese/laravel` ^1.4 (Model-Generator)
|
||||
|
||||
---
|
||||
|
||||
## 📈 Nächste Schritte & Empfehlungen
|
||||
|
||||
### Kurzfristig (bereit für Implementierung):
|
||||
1. **Bestellsystem** - Order-Management für Kunden
|
||||
2. **Produktbilder** - Media-Upload für Produkte
|
||||
3. **E-Mail-Templates** - Erweiterte E-Mail-Kommunikation
|
||||
4. **Benachrichtigungen** - In-App-Notifications
|
||||
|
||||
### Mittelfristig:
|
||||
1. **Provisionsabrechnung** - Automatisierte Provisionsberechnung
|
||||
2. **Reporting & Analytics** - Dashboard-Erweiterungen
|
||||
3. **API-Erweiterung** - REST-API für Externe
|
||||
4. **Suchfunktion** - Globale Suche über alle Inhalte
|
||||
|
||||
### Langfristig:
|
||||
1. **Mobile-App** - Native Apps (via Sanctum-API)
|
||||
2. **Mehrsprachigkeit** - Internationalisierung
|
||||
3. **Erweiterte CMS-Features** - Flux-CMS-Package fertigstellen
|
||||
4. **Payment-Integration** - Zahlungsabwicklung
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Projektstatus Zusammenfassung
|
||||
|
||||
### ✅ Vollständig implementiert:
|
||||
- Multi-Domain-System mit Theme-Switching
|
||||
- Komplettes Benutzer- & Rollen-Management
|
||||
- Partner-Management mit Onboarding
|
||||
- Hub-Verwaltung
|
||||
- Produkt-Management (Grundfunktionen)
|
||||
- Rollenbasierte Dashboards
|
||||
- Digital Signage CMS mit Tracking
|
||||
- Authentifizierung & Sicherheit
|
||||
- Website-Frontend (Grundstruktur)
|
||||
- Dokumentation
|
||||
|
||||
### 🔄 In Arbeit:
|
||||
- Flux-CMS-Package (Architektur steht)
|
||||
- Erweiterte Produkt-Features
|
||||
- Test-Abdeckung
|
||||
|
||||
### 📋 Bereit für Umsetzung:
|
||||
- Bestellsystem
|
||||
- Provisionsabrechnung
|
||||
- Erweiterte Reporting-Funktionen
|
||||
- Payment-Integration
|
||||
|
||||
---
|
||||
|
||||
## 💡 Besonderheiten & Highlights
|
||||
|
||||
### Technische Exzellenz:
|
||||
- **Modern Stack** - Neueste Laravel/Livewire-Versionen
|
||||
- **Component-Architecture** - Wiederverwendbare Livewire-Komponenten
|
||||
- **Type-Safety** - PHP 8.2+ Features
|
||||
- **Performance** - Optimierte Queries, Caching
|
||||
- **Skalierbarkeit** - Modularer Aufbau für Wachstum
|
||||
|
||||
### Business-Features:
|
||||
- **Multi-Tenant-Ready** - Verschiedene Partner-Typen
|
||||
- **Hierarchische Strukturen** - Broker-Kunden-Beziehungen
|
||||
- **Flexibles Provisionsmodell** - Prozentsatz oder Festbetrag
|
||||
- **Umfangreiches Tracking** - Display-Klicks, User-Aktivitäten
|
||||
- **White-Label-Fähigkeit** - Domain-spezifisches Branding
|
||||
|
||||
### User-Experience:
|
||||
- **Intuitives Onboarding** - Setup-Wizard für neue Partner
|
||||
- **Rollenbasierte Ansichten** - Jede Rolle sieht nur relevante Inhalte
|
||||
- **Real-time Updates** - Livewire für nahtlose Interaktion
|
||||
- **Responsive Design** - Funktioniert auf allen Geräten
|
||||
- **Dark Mode** - Moderne UI-Präferenzen
|
||||
|
||||
---
|
||||
|
||||
## 📞 Support & Wartung
|
||||
|
||||
Das System ist produktionsbereit und kann bei Bedarf mit folgenden Services erweitert werden:
|
||||
|
||||
- Code-Reviews & Optimierungen
|
||||
- Feature-Erweiterungen
|
||||
- Bug-Fixes & Updates
|
||||
- Performance-Tuning
|
||||
- Sicherheits-Audits
|
||||
- Schulungen für Administratoren
|
||||
|
||||
---
|
||||
|
||||
**Entwicklungsstand**: Dezember 2025
|
||||
**Version**: 1.0 (Production-Ready)
|
||||
**Framework**: Laravel 12
|
||||
**PHP**: 8.2+
|
||||
**Lizenz**: MIT
|
||||
|
||||
---
|
||||
|
||||
*Diese Dokumentation wurde automatisch generiert und gibt den aktuellen Stand der Entwicklung wieder.*
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue