23-01-2026

This commit is contained in:
Kevin Adametz 2026-01-23 17:33:10 +01:00
parent 07959c0ba2
commit 854ce02bf6
166 changed files with 32909 additions and 1262 deletions

View file

@ -1,57 +1,268 @@
<?php
use App\Models\Partner;
use App\Models\User;
use App\Models\RegistrationCode;
use App\Helpers\ThemeHelper;
use Illuminate\Support\Facades\Auth;
use Livewire\Volt\Component;
new class extends Component {
public $userRole = '';
public $roleIcon = 'shield-check';
public $roleName = '';
// Admin KPIs
public $activeHubs = 0;
public $plannedHubs = 0;
public $totalPartners = 0;
public $partnersThisMonth = 0;
public $platformRevenue = 0;
public $systemStatus = 'green';
public $pendingInvitations = 0;
public $totalCustomers = 0;
public array $data = [];
// Retailer KPIs
public $openOrders = 0;
public $monthlyRevenue = 0;
public $productViews = 0;
public $stockWarnings = 0;
public $myCustomers = 0;
// Manufacturer KPIs
public $brandReach = 0;
public $activeProducts = 0;
public $draftProducts = 0;
public $totalViews = 0;
// Broker KPIs
public $totalCommission = 0;
public $pendingPayout = 0;
public $generatedLeads = 0;
public $referralLink = '';
public $brokerCustomers = 0;
// Customer Brand Data
public $customerBrand = 'b2in';
public $customerBrandName = 'B2IN';
public $customerBrandLogo = '';
public $customerBrandColors = [];
public $customerBrokerName = '';
public $topOffers = [];
public function mount(): void
{
$user = Auth::user();
$role = $user->roles->first();
if ($role) {
$this->userRole = strtolower(str_replace('-', '', $role->name));
$this->roleIcon = $role->icon ?? 'shield-check';
$this->roleName = $role->display_name ?? $role->name;
}
// Lade rollenspezifische Daten
match ($this->userRole) {
'admin', 'superadmin' => $this->loadAdminData(),
'retailer' => $this->loadRetailerData($user),
'manufacturer' => $this->loadManufacturerData($user),
'broker', 'estateagent' => $this->loadBrokerData($user),
'customer' => $this->loadCustomerData($user),
default => null,
};
}
private function loadAdminData(): void
{
// Platzhalter: Aktive Hubs (später aus Hub-Tabelle)
$this->activeHubs = 3;
$this->plannedHubs = 2;
// Partner-Wachstum
$this->totalPartners = Partner::whereIn('type', ['Retailer', 'Manufacturer', 'Broker', 'Estate-Agent'])->count();
$this->partnersThisMonth = Partner::whereIn('type', ['Retailer', 'Manufacturer', 'Broker', 'Estate-Agent'])
->whereMonth('created_at', now()->month)
->count();
// Platzhalter: Plattform-Umsatz
$this->platformRevenue = 125000; // Später aus Order-Tabelle
// System-Status (Platzhalter)
$this->systemStatus = 'green';
// Onboarding-Pipeline: Codes ohne registrierte User
$this->pendingInvitations = RegistrationCode::whereNull('used_at')->count();
// Kunden gesamt
$this->totalCustomers = Partner::where('type', 'Customer')->count();
$this->data = [
['date' => '2025-12-11', 'visitors' => 50],
['date' => '2025-12-12', 'visitors' => 70],
['date' => '2025-12-13', 'visitors' => 100],
['date' => '2025-12-14', 'visitors' => 210],
['date' => '2025-12-15', 'visitors' => 198],
['date' => '2025-12-16', 'visitors' => 269],
['date' => '2025-12-17', 'visitors' => 259],
['date' => '2025-12-18', 'visitors' => 267],
];
}
private function loadRetailerData(User $user): void
{
// Platzhalter: Offene Bestellungen
$this->openOrders = 5; // Später aus Order-Tabelle
// Platzhalter: Umsatz diesen Monat
$this->monthlyRevenue = 15500; // Später aus Order-Tabelle
// Platzhalter: Produkt-Views
$this->productViews = 1250; // Später aus Analytics
// Platzhalter: Lager-Warnungen
$this->stockWarnings = 3; // Später aus Product-Tabelle (stock < min_stock)
// Meine Kunden (Kunden die diesem Händler zugeordnet sind)
if ($user->partner_id) {
$this->myCustomers = Partner::where('type', 'Customer')
->where('parent_partner_id', $user->partner_id)
->count();
}
}
private function loadManufacturerData(User $user): void
{
// Platzhalter: Marken-Reichweite (Händler die meine Produkte führen)
$this->brandReach = 12; // Später aus Produkt-Zuordnungen
// Platzhalter: Katalog-Status
$this->activeProducts = 45; // Später aus Product-Tabelle (is_active = true)
$this->draftProducts = 7; // Später aus Product-Tabelle (is_active = false)
// Platzhalter: Gesamt-Views
$this->totalViews = 8900; // Später aus Analytics
}
private function loadBrokerData(User $user): void
{
// Platzhalter: Verdiente Provision
$this->totalCommission = 4250.50; // Später aus Commission-Tabelle
// Platzhalter: Offene Auszahlung
$this->pendingPayout = 850.00; // Später aus Payout-Tabelle
// Generierte Leads (Kunden über diesen Makler)
if ($user->partner_id) {
$this->generatedLeads = Partner::where('type', 'Customer')
->where('parent_partner_id', $user->partner_id)
->count();
$this->brokerCustomers = $this->generatedLeads;
}
// Empfehlungs-Link (Platzhalter)
$partner = Partner::find($user->partner_id);
if ($partner) {
$this->referralLink = url('/register?ref=' . $partner->partner_number);
}
}
private function loadCustomerData(User $user): void
{
// Kunde: Lade Brand-Daten vom Partner
if ($user->partner_id) {
$partner = Partner::find($user->partner_id);
if ($partner) {
// Brand aus Partner-Datensatz
$this->customerBrand = $partner->brand ?? 'b2in';
$this->customerBrandName = ThemeHelper::getBrandName($this->customerBrand);
$this->customerBrandLogo = ThemeHelper::getLogoPathForBrand($this->customerBrand, 'positive');
$this->customerBrandColors = ThemeHelper::getBrandColors($this->customerBrand);
// Makler/Händler-Namen laden, falls vorhanden
if ($partner->parent_partner_id) {
$parentPartner = Partner::find($partner->parent_partner_id);
if ($parentPartner) {
$this->customerBrokerName = $parentPartner->display_name ?? $parentPartner->company_name ?? '';
}
}
// Top-Angebote laden (Platzhalter - später aus Product-Tabelle)
$this->topOffers = [
[
'id' => 1,
'name' => 'Designer Sofa "Luna"',
'description' => 'Modernes 3-Sitzer Sofa mit Samtbezug',
'price' => 1899.00,
'original_price' => 2499.00,
'discount' => 24,
'image' => 'https://images.unsplash.com/photo-1555041469-a586c61ea9bc?w=400&h=300&fit=crop',
'category' => 'Wohnzimmer',
],
[
'id' => 2,
'name' => 'Esstisch "Nordic"',
'description' => 'Massivholz Esstisch für 6-8 Personen',
'price' => 899.00,
'original_price' => 1299.00,
'discount' => 31,
'image' => 'https://images.unsplash.com/photo-1617806118233-18e1de247200?w=400&h=300&fit=crop',
'category' => 'Esszimmer',
],
[
'id' => 3,
'name' => 'Boxspringbett "Royal"',
'description' => 'Premium Boxspringbett 180x200 cm',
'price' => 1599.00,
'original_price' => 2199.00,
'discount' => 27,
'image' => 'https://images.unsplash.com/photo-1505693416388-ac5ce068fe85?w=400&h=300&fit=crop',
'category' => 'Schlafzimmer',
],
];
}
}
}
}; ?>
<x-layouts.app title="Dashboard">
<div class="flex h-full w-full flex-1 flex-col gap-4 rounded-xl">
<div class="grid auto-rows-min gap-4 md:grid-cols-3">
<div class="relative aspect-video overflow-hidden rounded-xl border border-neutral-200 dark:border-neutral-700 p-4">
<livewire:notifications />
@volt('dashboard')
<div class="space-y-6">
{{-- Header mit Rollenbadge --}}
<div class="flex items-center justify-between">
<div>
<flux:heading size="xl">{{ __('Dashboard') }} (Beispiel)</flux:heading>
<flux:subheading>{{ __('Willkommen zurück') }}, {{ Auth::user()->name }}!</flux:subheading>
</div>
<div class="relative aspect-video overflow-hidden rounded-xl border border-neutral-200 dark:border-neutral-700">
<flux:table>
<flux:table.columns>
<flux:table.column>Customer</flux:table.column>
<flux:table.column>Date</flux:table.column>
<flux:table.column>Status</flux:table.column>
<flux:table.column>Amount</flux:table.column>
</flux:table.columns>
<flux:table.rows>
<flux:table.row>
<flux:table.cell>Lindsey Aminoff</flux:table.cell>
<flux:table.cell>Jul 29, 10:45 AM</flux:table.cell>
<flux:table.cell><flux:badge color="green" size="sm" inset="top bottom">Paid</flux:badge></flux:table.cell>
<flux:table.cell variant="strong">$49.00</flux:table.cell>
</flux:table.row>
<flux:table.row>
<flux:table.cell>Hanna Lubin</flux:table.cell>
<flux:table.cell>Jul 28, 2:15 PM</flux:table.cell>
<flux:table.cell><flux:badge color="green" size="sm" inset="top bottom">Paid</flux:badge></flux:table.cell>
<flux:table.cell variant="strong">$312.00</flux:table.cell>
</flux:table.row>
<flux:table.row>
<flux:table.cell>Kianna Bushevi</flux:table.cell>
<flux:table.cell>Jul 30, 4:05 PM</flux:table.cell>
<flux:table.cell><flux:badge color="zinc" size="sm" inset="top bottom">Refunded</flux:badge></flux:table.cell>
<flux:table.cell variant="strong">$132.00</flux:table.cell>
</flux:table.row>
<flux:table.row>
<flux:table.cell>Gustavo Geidt</flux:table.cell>
<flux:table.cell>Jul 27, 9:30 AM</flux:table.cell>
<flux:table.cell><flux:badge color="green" size="sm" inset="top bottom">Paid</flux:badge></flux:table.cell>
<flux:table.cell variant="strong">$31.00</flux:table.cell>
</flux:table.row>
</flux:table.rows>
</flux:table>
</div>
<div class="relative aspect-video overflow-hidden rounded-xl border border-neutral-200 dark:border-neutral-700">
<x-placeholder-pattern class="absolute inset-0 size-full stroke-gray-900/20 dark:stroke-neutral-100/20" />
<div class="flex items-center gap-2 px-3 py-2 bg-accent-50 dark:bg-accent-900/20 rounded-lg">
@svg('heroicon-o-'.$roleIcon, 'w-5 h-5 text-accent-600 dark:text-accent-400')
<span class="text-sm font-medium text-accent-700 dark:text-accent-300">
{{ $roleName }}
</span>
</div>
</div>
<div class="relative h-full flex-1 overflow-hidden rounded-xl border border-neutral-200 dark:border-neutral-700">
<x-placeholder-pattern class="absolute inset-0 size-full stroke-gray-900/20 dark:stroke-neutral-100/20" />
</div>
{{-- Rollenspezifisches Dashboard laden --}}
@if(in_array($userRole, ['admin', 'superadmin']))
@include('admin.dashboards.admin')
@elseif($userRole === 'retailer')
@include('admin.dashboards.retailer')
@elseif($userRole === 'manufacturer')
@include('admin.dashboards.manufacturer')
@elseif(in_array($userRole, ['broker', 'estateagent']))
@include('admin.dashboards.broker')
@elseif($userRole === 'customer')
@include('admin.dashboards.customer')
@else
<flux:card>
<div class="text-center py-8">
<div class="text-zinc-500">{{ __('Dashboard für Ihre Rolle wird noch entwickelt.') }}</div>
</div>
</flux:card>
@endif
</div>
@endvolt
</x-layouts.app>

View file

@ -0,0 +1,148 @@
<div class="space-y-6">
{{-- KPI-Karten --}}
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
{{-- Aktive Hubs --}}
<flux:card>
<div class="flex items-start justify-between">
<div>
<div class="text-sm text-blue-700 dark:text-blue-300 font-medium">{{ __('Aktive Hubs') }}</div>
<div class="text-3xl font-bold text-blue-900 dark:text-blue-100 mt-2">{{ $activeHubs }}</div>
<div class="text-xs text-blue-600 dark:text-blue-400 mt-1">{{ $plannedHubs }} {{ __('geplant') }}</div>
</div>
@svg('heroicon-o-map-pin', 'w-10 h-10 text-blue-400 dark:text-blue-600')
</div>
</flux:card>
{{-- Partner-Wachstum --}}
<flux:card>
<div class="flex items-start justify-between">
<div>
<div class="text-sm text-green-700 dark:text-green-300 font-medium">{{ __('Partner gesamt') }}</div>
<div class="text-3xl font-bold text-green-900 dark:text-green-100 mt-2">{{ $totalPartners }}</div>
<div class="text-xs text-green-600 dark:text-green-400 mt-1">+{{ $partnersThisMonth }} {{ __('diesen Monat') }}</div>
</div>
@svg('heroicon-o-user-group', 'w-10 h-10 text-green-400 dark:text-green-600')
</div>
</flux:card>
{{-- Plattform-Umsatz --}}
<flux:card>
<div class="flex items-start justify-between">
<div>
<div class="text-sm text-purple-700 dark:text-purple-400 font-medium">{{ __('Plattform-Umsatz') }}</div>
<div class="text-3xl font-bold text-purple-900 dark:text-purple-100 mt-2">{{ number_format($platformRevenue, 0, ',', '.') }} </div>
<div class="text-xs text-purple-600 dark:text-purple-400 mt-1">{{ __('Platzhalter') }}</div>
</div>
@svg('heroicon-o-currency-euro', 'w-10 h-10 text-purple-400 dark:text-purple-600')
</div>
</flux:card>
{{-- System-Status --}}
<flux:card>
<div class="flex items-start justify-between">
<div>
<div class="text-sm text-emerald-700 dark:text-emerald-300 font-medium">{{ __('System-Status') }}</div>
<div class="text-3xl font-bold text-emerald-900 dark:text-emerald-100 mt-2">{{ __('Optimal') }}</div>
<div class="flex items-center gap-1 mt-1">
<div class="w-2 h-2 rounded-full bg-emerald-500 animate-pulse"></div>
<div class="text-xs text-emerald-600 dark:text-emerald-400">{{ __('Alle Systeme laufen') }}</div>
</div>
</div>
@svg('heroicon-o-server', 'w-10 h-10 text-emerald-400 dark:text-emerald-600')
</div>
</flux:card>
</div>
{{-- Widgets --}}
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
{{-- Onboarding-Pipeline --}}
<flux:card>
<flux:heading size="lg">{{ __('Onboarding-Pipeline') }}</flux:heading>
<flux:subheading>{{ __('Offene Einladungen') }}</flux:subheading>
<div class="mt-4 flex items-center justify-center py-8 bg-orange-50 dark:bg-zinc-800 rounded-lg">
<div class="text-center">
<div class="text-5xl font-bold text-sky-600 dark:text-sky-400">{{ $pendingInvitations }}</div>
<div class="text-sm text-sky-700 dark:text-sky-300 mt-2">{{ __('Einladungen ohne Registrierung') }}</div>
<flux:button href="{{ route('admin.partners.registration-codes') }}" variant="primary" size="sm" class="mt-4">
{{ __('Einladungen verwalten') }}
</flux:button>
</div>
</div>
</flux:card>
{{-- Partner-Übersicht --}}
<flux:card>
<flux:heading size="lg">{{ __('Partner & Kunden') }}</flux:heading>
<flux:subheading>{{ __('Übersicht der Plattform-Nutzer') }}</flux:subheading>
<div class="mt-4 space-y-3">
<div class="flex items-center justify-between p-3 bg-zinc-50 dark:bg-zinc-800/50 rounded-lg">
<div class="flex items-center gap-3">
@svg('heroicon-o-user', 'w-6 h-6 text-blue-500')
<span class="font-medium">{{ __('Kunden') }}</span>
</div>
<span class="text-2xl font-bold">{{ $totalCustomers }}</span>
</div>
<div class="flex items-center justify-between p-3 bg-zinc-50 dark:bg-zinc-800/50 rounded-lg">
<div class="flex items-center gap-3">
@svg('heroicon-o-building-storefront', 'w-6 h-6 text-green-500')
<span class="font-medium">{{ __('Händler') }}</span>
</div>
<span class="text-2xl font-bold">{{ \App\Models\Partner::where('type', 'Retailer')->count() }}</span>
</div>
<div class="flex items-center justify-between p-3 bg-zinc-50 dark:bg-zinc-800/50 rounded-lg">
<div class="flex items-center gap-3">
@svg('heroicon-o-building-office', 'w-6 h-6 text-purple-500')
<span class="font-medium">{{ __('Hersteller') }}</span>
</div>
<span class="text-2xl font-bold">{{ \App\Models\Partner::where('type', 'Manufacturer')->count() }}</span>
</div>
<div class="flex items-center justify-between p-3 bg-zinc-50 dark:bg-zinc-800/50 rounded-lg">
<div class="flex items-center gap-3">
@svg('heroicon-o-briefcase', 'w-6 h-6 text-orange-500')
<span class="font-medium">{{ __('Makler') }}</span>
</div>
<span class="text-2xl font-bold">{{ \App\Models\Partner::whereIn('type', ['Broker', 'Estate-Agent'])->count() }}</span>
</div>
</div>
</flux:card>
</div>
{{-- Besucher-Statistik Chart --}}
<flux:card>
<flux:heading size="lg">{{ __('Besucher-Statistik') }}</flux:heading>
<flux:subheading>{{ __('Tägliche Besucherzahlen der letzten Tage') }}</flux:subheading>
<div class="mt-6">
@if(!empty($data))
<flux:chart :value="$data" class="aspect-[3/1]">
<flux:chart.svg>
<flux:chart.line field="visitors" class="text-pink-500 dark:text-pink-400" />
<flux:chart.axis axis="x" field="date">
<flux:chart.axis.line />
<flux:chart.axis.tick />
</flux:chart.axis>
<flux:chart.axis axis="y">
<flux:chart.axis.grid />
<flux:chart.axis.tick />
</flux:chart.axis>
<flux:chart.cursor />
</flux:chart.svg>
<flux:chart.tooltip>
<flux:chart.tooltip.heading field="date" :format="['year' => 'numeric', 'month' => 'numeric', 'day' => 'numeric']" />
<flux:chart.tooltip.value field="visitors" label="Besucher" />
</flux:chart.tooltip>
</flux:chart>
@else
<div class="text-center py-8 text-zinc-500 dark:text-zinc-400">
{{ __('Keine Daten verfügbar') }}
</div>
@endif
</div>
</flux:card>
</div>

View file

@ -0,0 +1,104 @@
<div class="space-y-6">
{{-- KPI-Karten --}}
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
{{-- Verdiente Provision --}}
<flux:card>
<div class="flex items-start justify-between">
<div>
<div class="text-sm text-green-700 dark:text-green-300 font-medium">{{ __('Verdiente Provision') }}</div>
<div class="text-3xl font-bold text-green-900 dark:text-green-100 mt-2">{{ number_format($totalCommission, 2, ',', '.') }} </div>
<div class="text-xs text-green-600 dark:text-green-400 mt-1">{{ __('Lifetime Earnings (Platzhalter)') }}</div>
</div>
@svg('heroicon-o-currency-euro', 'w-10 h-10 text-green-400 dark:text-green-600')
</div>
</flux:card>
{{-- Offene Auszahlung --}}
<flux:card>
<div class="flex items-start justify-between">
<div>
<div class="text-sm text-blue-700 dark:text-blue-300 font-medium">{{ __('Offene Auszahlung') }}</div>
<div class="text-3xl font-bold text-blue-900 dark:text-blue-100 mt-2">{{ number_format($pendingPayout, 2, ',', '.') }} </div>
<div class="text-xs text-blue-600 dark:text-blue-400 mt-1">{{ __('Platzhalter') }}</div>
</div>
@svg('heroicon-o-banknotes', 'w-10 h-10 text-blue-400 dark:text-blue-600')
</div>
</flux:card>
{{-- Generierte Leads --}}
<flux:card>
<div class="flex items-start justify-between">
<div>
<div class="text-sm text-purple-700 dark:text-purple-300 font-medium">{{ __('Generierte Leads') }}</div>
<div class="text-3xl font-bold text-purple-900 dark:text-purple-100 mt-2">{{ $generatedLeads }}</div>
<div class="text-xs text-purple-600 dark:text-purple-400 mt-1">{{ __('Registrierte Kunden') }}</div>
</div>
@svg('heroicon-o-user-group', 'w-10 h-10 text-purple-400 dark:text-purple-600')
</div>
</flux:card>
</div>
{{-- Widgets --}}
<div class="grid grid-cols-1 gap-6">
{{-- Empfehlungs-Link --}}
<flux:card>
<flux:heading size="lg">{{ __('Mein Empfehlungs-Link') }}</flux:heading>
<flux:subheading>{{ __('Teilen Sie diesen Link mit Ihren Kunden') }}</flux:subheading>
<div class="mt-4 p-4 bg-blue-50 dark:bg-blue-900/20 rounded-lg border-2 border-dashed border-blue-300 dark:border-blue-700">
<div class="flex items-center gap-3">
<div class="flex-1 bg-white dark:bg-zinc-800 px-4 py-3 rounded font-mono text-sm break-all">
{{ $referralLink }}
</div>
<flux:button
variant="primary"
icon="clipboard"
x-data
@click="navigator.clipboard.writeText('{{ $referralLink }}'); $tooltip('{{ __('Link kopiert!') }}', { timeout: 2000 })"
>
{{ __('Kopieren') }}
</flux:button>
</div>
</div>
<div class="mt-4 flex gap-2">
<flux:button variant="ghost" size="sm" icon="chat-bubble-left">{{ __('Per WhatsApp teilen') }}</flux:button>
<flux:button variant="ghost" size="sm" icon="envelope">{{ __('Per E-Mail teilen') }}</flux:button>
</div>
</flux:card>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
{{-- Meine Kunden --}}
<flux:card>
<flux:heading size="lg">{{ __('Meine Kunden') }}</flux:heading>
<flux:subheading>{{ __('Über Sie registrierte Kunden') }}</flux:subheading>
<div class="mt-4 flex items-center justify-center py-8 bg-purple-50 dark:bg-purple-900/10 rounded-lg">
<div class="text-center">
<div class="text-5xl font-bold text-purple-600 dark:text-purple-400">{{ $brokerCustomers }}</div>
<div class="text-sm text-purple-700 dark:text-purple-300 mt-2">{{ __('Registrierte Kunden') }}</div>
</div>
</div>
</flux:card>
{{-- Letzte Aktivitäten --}}
<flux:card>
<flux:heading size="lg">{{ __('Letzte Aktivitäten') }}</flux:heading>
<flux:subheading>{{ __('Was ist neu?') }}</flux:subheading>
<div class="mt-4 space-y-2">
<div class="p-3 bg-zinc-50 dark:bg-zinc-800/50 rounded-lg text-sm">
<div class="font-medium">{{ __('Kunde Max M. hat sich registriert') }}</div>
<div class="text-xs text-zinc-500 dark:text-zinc-400 mt-1">{{ __('vor 2 Stunden (Platzhalter)') }}</div>
</div>
<div class="p-3 bg-zinc-50 dark:bg-zinc-800/50 rounded-lg text-sm">
<div class="font-medium">{{ __('Provision gutgeschrieben: 125,00 €') }}</div>
<div class="text-xs text-zinc-500 dark:text-zinc-400 mt-1">{{ __('gestern (Platzhalter)') }}</div>
</div>
</div>
</flux:card>
</div>
</div>
</div>

View file

@ -0,0 +1,184 @@
<div class="space-y-6">
{{-- Marken-Header mit Logo --}}
<flux:card>
<div class="flex flex-col md:flex-row items-center justify-between gap-6 p-6 rounded-lg"
style="background: linear-gradient(135deg, {{ $customerBrandColors['primary'] ?? '#2b3f51' }}15 0%, {{ $customerBrandColors['secondary'] ?? '#20a0da' }}15 100%);">
<div class="flex-1 text-center md:text-left">
<div class="mb-4">
<img src="{{ asset($customerBrandLogo) }}" alt="{{ $customerBrandName }}" class="h-12 mx-auto md:mx-0 dark:hidden">
<img src="{{ asset(\App\Helpers\ThemeHelper::getLogoPathForBrand($customerBrand, 'negative')) }}" alt="{{ $customerBrandName }}" class="h-12 mx-auto md:mx-0 hidden dark:block">
</div>
<flux:heading size="xl">{{ __('Willkommen bei') }} {{ $customerBrandName }}!</flux:heading>
<flux:subheading class="mt-2">{{ __('Ihr persönliches Kundenportal') }}</flux:subheading>
@if($customerBrokerName)
<div class="mt-3 flex items-center gap-2 justify-center md:justify-start">
@svg('heroicon-o-user-circle', 'w-5 h-5 text-zinc-500 dark:text-zinc-400')
<span class="text-sm text-zinc-600 dark:text-zinc-400">
{{ __('Ihr Ansprechpartner:') }} <strong>{{ $customerBrokerName }}</strong>
</span>
</div>
@endif
</div>
<div class="flex-shrink-0">
<div class="w-32 h-32 rounded-full flex items-center justify-center"
style="background-color: {{ $customerBrandColors['primary'] ?? '#2b3f51' }}20;">
@svg('heroicon-o-home', 'w-16 h-16', ['style' => 'color: ' . ($customerBrandColors['primary'] ?? '#2b3f51')])
</div>
</div>
</div>
</flux:card>
{{-- Info-Box --}}
<flux:card>
<div class="p-4 rounded-lg" style="background-color: {{ $customerBrandColors['secondary'] ?? '#20a0da' }}10;">
<div class="flex items-start gap-3">
@svg('heroicon-o-information-circle', 'w-6 h-6 flex-shrink-0', ['style' => 'color: ' . ($customerBrandColors['secondary'] ?? '#20a0da')])
<div>
<div class="font-medium" style="color: {{ $customerBrandColors['primary'] ?? '#2b3f51' }};">
{{ __('Ihr Dashboard wird bald erweitert') }}
</div>
<div class="text-sm text-zinc-700 dark:text-zinc-300 mt-1">
{{ __('Hier sehen Sie bald Ihre Bestellungen, Wunschliste und Empfehlungen.') }}
</div>
</div>
</div>
</div>
</flux:card>
{{-- Top-Angebote --}}
@if(!empty($topOffers))
<flux:card>
<div class="flex items-center justify-between mb-4">
<div>
<flux:heading size="lg">{{ __('Top-Angebote für Sie') }}</flux:heading>
<flux:subheading>{{ __('Exklusive Möbel zu besonderen Preisen') }}</flux:subheading>
</div>
<flux:button variant="ghost" size="sm" icon="arrow-right">
{{ __('Alle Angebote') }}
</flux:button>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mt-6">
@foreach($topOffers as $offer)
<div class="group relative overflow-hidden rounded-lg border border-zinc-200 dark:border-zinc-700 hover:shadow-lg transition-shadow duration-300">
{{-- Produktbild --}}
<div class="relative aspect-[4/3] overflow-hidden bg-zinc-100 dark:bg-zinc-800">
<img src="{{ $offer['image'] }}"
alt="{{ $offer['name'] }}"
class="w-full h-full object-cover group-hover:scale-105 transition-transform duration-300">
{{-- Rabatt-Badge --}}
@if($offer['discount'] > 0)
<div class="absolute top-3 right-3 px-2 py-1 rounded-full text-xs font-bold text-white"
style="background-color: {{ $customerBrandColors['secondary'] ?? '#20a0da' }};">
-{{ $offer['discount'] }}%
</div>
@endif
{{-- Kategorie-Badge --}}
<div class="absolute top-3 left-3 px-2 py-1 rounded-full text-xs font-medium bg-white/90 dark:bg-zinc-900/90 text-zinc-700 dark:text-zinc-300">
{{ $offer['category'] }}
</div>
</div>
{{-- Produktinfo --}}
<div class="p-4">
<h3 class="font-semibold text-lg mb-2 text-zinc-900 dark:text-zinc-100">
{{ $offer['name'] }}
</h3>
<p class="text-sm text-zinc-600 dark:text-zinc-400 mb-3">
{{ $offer['description'] }}
</p>
{{-- Preis --}}
<div class="flex items-center gap-2 mb-4">
<span class="text-2xl font-bold" style="color: {{ $customerBrandColors['primary'] ?? '#2b3f51' }};">
{{ number_format($offer['price'], 2, ',', '.') }}
</span>
@if($offer['original_price'] > $offer['price'])
<span class="text-sm text-zinc-500 dark:text-zinc-400 line-through">
{{ number_format($offer['original_price'], 2, ',', '.') }}
</span>
@endif
</div>
{{-- Aktions-Buttons --}}
<div class="flex gap-2">
<flux:button
variant="primary"
size="sm"
icon="eye"
class="flex-1"
style="background-color: {{ $customerBrandColors['primary'] ?? '#2b3f51' }}; border-color: {{ $customerBrandColors['primary'] ?? '#2b3f51' }};">
{{ __('Details') }}
</flux:button>
<flux:button
variant="ghost"
size="sm"
icon="heart"
style="color: {{ $customerBrandColors['secondary'] ?? '#20a0da' }};">
</flux:button>
</div>
</div>
</div>
@endforeach
</div>
</flux:card>
@endif
{{-- Feature-Vorschau --}}
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<flux:card>
<div class="p-4 text-center">
<div class="w-16 h-16 rounded-full mx-auto mb-3 flex items-center justify-center"
style="background-color: {{ $customerBrandColors['primary'] ?? '#2b3f51' }}20;">
@svg('heroicon-o-shopping-bag', 'w-8 h-8', ['style' => 'color: ' . ($customerBrandColors['primary'] ?? '#2b3f51')])
</div>
<div class="font-medium text-lg">{{ __('Meine Bestellungen') }}</div>
<div class="text-sm text-zinc-500 dark:text-zinc-400 mt-1">{{ __('Bald verfügbar') }}</div>
<div class="mt-3">
<flux:badge color="zinc" size="sm">{{ __('In Entwicklung') }}</flux:badge>
</div>
</div>
</flux:card>
<flux:card>
<div class="p-4 text-center">
<div class="w-16 h-16 rounded-full mx-auto mb-3 flex items-center justify-center"
style="background-color: {{ $customerBrandColors['secondary'] ?? '#20a0da' }}20;">
@svg('heroicon-o-heart', 'w-8 h-8', ['style' => 'color: ' . ($customerBrandColors['secondary'] ?? '#20a0da')])
</div>
<div class="font-medium text-lg">{{ __('Meine Wunschliste') }}</div>
<div class="text-sm text-zinc-500 dark:text-zinc-400 mt-1">{{ __('Bald verfügbar') }}</div>
<div class="mt-3">
<flux:badge color="zinc" size="sm">{{ __('In Entwicklung') }}</flux:badge>
</div>
</div>
</flux:card>
<flux:card>
<div class="p-4 text-center">
<div class="w-16 h-16 rounded-full mx-auto mb-3 flex items-center justify-center"
style="background-color: {{ $customerBrandColors['accent'] ?? ($customerBrandColors['secondary'] ?? '#20a0da') }}20;">
@svg('heroicon-o-star', 'w-8 h-8', ['style' => 'color: ' . ($customerBrandColors['accent'] ?? ($customerBrandColors['secondary'] ?? '#20a0da'))])
</div>
<div class="font-medium text-lg">{{ __('Empfehlungen') }}</div>
<div class="text-sm text-zinc-500 dark:text-zinc-400 mt-1">{{ __('Bald verfügbar') }}</div>
<div class="mt-3">
<flux:badge color="zinc" size="sm">{{ __('In Entwicklung') }}</flux:badge>
</div>
</div>
</flux:card>
</div>
{{-- Marken-Info Footer --}}
<flux:card>
<div class="text-center py-6">
<div class="text-sm text-zinc-600 dark:text-zinc-400">
{{ __('Powered by') }}
</div>
<img src="{{ asset($customerBrandLogo) }}" alt="{{ $customerBrandName }}" class="h-8 mx-auto mt-2 opacity-60 dark:hidden">
<img src="{{ asset(\App\Helpers\ThemeHelper::getLogoPathForBrand($customerBrand, 'negative')) }}" alt="{{ $customerBrandName }}" class="h-8 mx-auto mt-2 opacity-60 hidden dark:block">
</div>
</flux:card>
</div>

View file

@ -0,0 +1,95 @@
<div class="space-y-6">
{{-- KPI-Karten --}}
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
{{-- Marken-Reichweite --}}
<flux:card>
<div class="flex items-start justify-between">
<div>
<div class="text-sm text-purple-700 dark:text-purple-300 font-medium">{{ __('Marken-Reichweite') }}</div>
<div class="text-3xl font-bold text-purple-900 dark:text-purple-100 mt-2">{{ $brandReach }}</div>
<div class="text-xs text-purple-600 dark:text-purple-400 mt-1">{{ __('Händler führen meine Produkte') }}</div>
</div>
@svg('heroicon-o-globe-alt', 'w-10 h-10 text-purple-400 dark:text-purple-600')
</div>
</flux:card>
{{-- Katalog-Status --}}
<flux:card>
<div class="flex items-start justify-between">
<div>
<div class="text-sm text-blue-700 dark:text-blue-300 font-medium">{{ __('Katalog-Status') }}</div>
<div class="text-3xl font-bold text-blue-900 dark:text-blue-100 mt-2">{{ $activeProducts }}</div>
<div class="text-xs text-blue-600 dark:text-blue-400 mt-1">{{ $draftProducts }} {{ __('Entwürfe') }}</div>
</div>
@svg('heroicon-o-cube', 'w-10 h-10 text-blue-400 dark:text-blue-600')
</div>
</flux:card>
{{-- Gesamt-Views --}}
<flux:card>
<div class="flex items-start justify-between">
<div>
<div class="text-sm text-green-700 dark:text-green-300 font-medium">{{ __('Gesamt-Views') }}</div>
<div class="text-3xl font-bold text-green-900 dark:text-green-100 mt-2">{{ number_format($totalViews, 0, ',', '.') }}</div>
<div class="text-xs text-green-600 dark:text-green-400 mt-1">{{ __('Platzhalter') }}</div>
</div>
@svg('heroicon-o-eye', 'w-10 h-10 text-green-400 dark:text-green-600')
</div>
</flux:card>
</div>
{{-- Widgets --}}
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
{{-- Katalog-Pflege --}}
<flux:card>
<flux:heading size="lg">{{ __('Katalog-Pflege') }}</flux:heading>
<flux:subheading>{{ __('Verwalten Sie Ihre Produkte') }}</flux:subheading>
<div class="mt-4 space-y-3">
<div class="flex items-center justify-between p-3 bg-green-50 dark:bg-green-900/10 rounded-lg">
<div class="flex items-center gap-3">
@svg('heroicon-o-check-circle', 'w-5 h-5 text-green-500')
<span>{{ __('Aktive Produkte') }}</span>
</div>
<span class="font-bold text-lg">{{ $activeProducts }}</span>
</div>
<div class="flex items-center justify-between p-3 bg-orange-50 dark:bg-orange-900/10 rounded-lg">
<div class="flex items-center gap-3">
@svg('heroicon-o-pencil', 'w-5 h-5 text-orange-500')
<span>{{ __('Entwürfe') }}</span>
</div>
<span class="font-bold text-lg">{{ $draftProducts }}</span>
</div>
</div>
<div class="mt-4">
<flux:button variant="primary" size="sm" icon="plus">{{ __('Neues Produkt (Master)') }}</flux:button>
</div>
</flux:card>
{{-- Schnellzugriff --}}
<flux:card>
<flux:heading size="lg">{{ __('Schnellzugriff') }}</flux:heading>
<flux:subheading>{{ __('Häufig benötigte Funktionen') }}</flux:subheading>
<div class="mt-4 space-y-2">
<flux:button variant="ghost" icon="photo" class="w-full justify-start">
{{ __('Marketing-Material hochladen') }}
</flux:button>
<flux:button variant="ghost" icon="chart-bar" class="w-full justify-start">
{{ __('Händler-Performance') }} ({{ __('Platzhalter') }})
</flux:button>
<flux:button variant="ghost" icon="tag" class="w-full justify-start">
{{ __('Meine Marke bearbeiten') }}
</flux:button>
</div>
</flux:card>
</div>
</div>

View file

@ -0,0 +1,95 @@
<div class="space-y-6">
{{-- KPI-Karten --}}
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
{{-- Offene Bestellungen --}}
<flux:card>
<div class="flex items-start justify-between">
<div>
<div class="text-sm text-red-700 dark:text-red-300 font-medium">{{ __('Offene Bestellungen') }}</div>
<div class="text-3xl font-bold text-red-900 dark:text-red-100 mt-2">{{ $openOrders }}</div>
<div class="text-xs text-red-600 dark:text-red-400 mt-1">{{ __('Platzhalter') }}</div>
</div>
@svg('heroicon-o-shopping-cart', 'w-10 h-10 text-red-400 dark:text-red-600')
</div>
</flux:card>
{{-- Umsatz --}}
<flux:card>
<div class="flex items-start justify-between">
<div>
<div class="text-sm text-green-700 dark:text-green-300 font-medium">{{ __('Umsatz diesen Monat') }}</div>
<div class="text-3xl font-bold text-green-900 dark:text-green-100 mt-2">{{ number_format($monthlyRevenue, 0, ',', '.') }} </div>
<div class="text-xs text-green-600 dark:text-green-400 mt-1">{{ __('Platzhalter') }}</div>
</div>
@svg('heroicon-o-currency-euro', 'w-10 h-10 text-green-400 dark:text-green-600')
</div>
</flux:card>
{{-- Produkt-Views --}}
<flux:card>
<div class="flex items-start justify-between">
<div>
<div class="text-sm text-blue-700 dark:text-blue-300 font-medium">{{ __('Produkt-Views') }}</div>
<div class="text-3xl font-bold text-blue-900 dark:text-blue-100 mt-2">{{ number_format($productViews, 0, ',', '.') }}</div>
<div class="text-xs text-blue-600 dark:text-blue-400 mt-1">{{ __('Platzhalter') }}</div>
</div>
@svg('heroicon-o-eye', 'w-10 h-10 text-blue-400 dark:text-blue-600')
</div>
</flux:card>
{{-- Lager-Warnungen --}}
<flux:card>
<div class="flex items-start justify-between">
<div>
<div class="text-sm text-orange-700 dark:text-orange-300 font-medium">{{ __('Lager-Warnungen') }}</div>
<div class="text-3xl font-bold text-orange-900 dark:text-orange-100 mt-2">{{ $stockWarnings }}</div>
<div class="text-xs text-orange-600 dark:text-orange-400 mt-1">{{ __('Platzhalter') }}</div>
</div>
@svg('heroicon-o-exclamation-triangle', 'w-10 h-10 text-orange-400 dark:text-orange-600')
</div>
</flux:card>
</div>
{{-- Widgets --}}
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
{{-- To-Do Liste --}}
<flux:card>
<flux:heading size="lg">{{ __('To-Do Liste') }}</flux:heading>
<flux:subheading>{{ __('Ihre anstehenden Aufgaben') }}</flux:subheading>
<div class="mt-4 space-y-2">
<div class="flex items-center gap-3 p-3 bg-red-50 dark:bg-red-900/10 rounded-lg">
@svg('heroicon-o-shopping-cart', 'w-5 h-5 text-red-500')
<span class="font-medium">{{ $openOrders }} {{ __('neue Bestellungen warten') }}</span>
</div>
<div class="flex items-center gap-3 p-3 bg-blue-50 dark:bg-blue-900/10 rounded-lg">
@svg('heroicon-o-chat-bubble-left-right', 'w-5 h-5 text-blue-500')
<span class="font-medium">{{ __('2 Kundenfragen offen') }} ({{ __('Platzhalter') }})</span>
</div>
<div class="flex items-center gap-3 p-3 bg-orange-50 dark:bg-orange-900/10 rounded-lg">
@svg('heroicon-o-cube', 'w-5 h-5 text-orange-500')
<span class="font-medium">{{ $stockWarnings }} {{ __('Lager-Warnungen') }}</span>
</div>
</div>
<div class="mt-4 flex gap-2">
<flux:button variant="primary" size="sm" icon="plus">{{ __('Neues Produkt') }}</flux:button>
<flux:button variant="ghost" size="sm" icon="arrow-path">{{ __('Bestände aktualisieren') }}</flux:button>
</div>
</flux:card>
{{-- Meine Kunden --}}
<flux:card>
<flux:heading size="lg">{{ __('Meine Kunden') }}</flux:heading>
<flux:subheading>{{ __('Kunden in Ihrem Einzugsgebiet') }}</flux:subheading>
<div class="mt-4 flex items-center justify-center py-8 bg-blue-50 dark:bg-blue-900/10 rounded-lg">
<div class="text-center">
<div class="text-5xl font-bold text-blue-600 dark:text-blue-400">{{ $myCustomers }}</div>
<div class="text-sm text-blue-700 dark:text-blue-300 mt-2">{{ __('zugeordnete Kunden') }}</div>
</div>
</div>
</flux:card>
</div>
</div>