Typo changes

This commit is contained in:
2025-10-31 12:48:41 +01:00
parent a8324e764d
commit e833b46d36
2 changed files with 302 additions and 304 deletions
+1 -1
View File
@@ -76,7 +76,7 @@
<p class="mt-2 text-2xl font-semibold text-indigo-100">{{ $formatNumber($averagePerAnalyst) }}</p> <p class="mt-2 text-2xl font-semibold text-indigo-100">{{ $formatNumber($averagePerAnalyst) }}</p>
</div> </div>
<div class="rounded-2xl border border-rose-400/30 bg-rose-500/20 p-4 backdrop-blur-sm shadow-lg shadow-rose-900/30"> <div class="rounded-2xl border border-rose-400/30 bg-rose-500/20 p-4 backdrop-blur-sm shadow-lg shadow-rose-900/30">
<p class="text-xs font-semibold uppercase tracking-wide text-rose-50">Prior 1 Fälle/p> <p class="text-xs font-semibold uppercase tracking-wide text-rose-50">Prior 1 Fälle</p>
<p class="mt-2 text-2xl font-semibold text-rose-100">{{ $formatNumber($highRiskAlerts->count()) }}</p> <p class="mt-2 text-2xl font-semibold text-rose-100">{{ $formatNumber($highRiskAlerts->count()) }}</p>
</div> </div>
</div> </div>
@@ -113,7 +113,7 @@ new #[Layout('components.layouts.app')] class extends Component {
->selectRaw('status, COUNT(*) AS total, COALESCE(SUM(amount), 0) AS volume') ->selectRaw('status, COUNT(*) AS total, COALESCE(SUM(amount), 0) AS volume')
->groupBy('status') ->groupBy('status')
->get() ->get()
->mapWithKeys(fn ($row) => [ ->mapWithKeys(fn($row) => [
$row->status => [ $row->status => [
'count' => (int) $row->total, 'count' => (int) $row->total,
'amount' => (float) $row->volume, 'amount' => (float) $row->volume,
@@ -148,7 +148,7 @@ new #[Layout('components.layouts.app')] class extends Component {
$search = trim($this->search); $search = trim($this->search);
return Transaction::query() return Transaction::query()
->when($this->status !== 'all', fn (Builder $query) => $query->where('status', $this->status)) ->when($this->status !== 'all', fn(Builder $query) => $query->where('status', $this->status))
->when($search !== '', function (Builder $query) use ($search) { ->when($search !== '', function (Builder $query) use ($search) {
$like = '%' . $search . '%'; $like = '%' . $search . '%';
@@ -166,88 +166,88 @@ new #[Layout('components.layouts.app')] class extends Component {
}; ?> }; ?>
@php @php
/** @var \Illuminate\Contracts\Pagination\LengthAwarePaginator $transactions */ /** @var \Illuminate\Contracts\Pagination\LengthAwarePaginator $transactions */
$transactions = $this->transactions; $transactions = $this->transactions;
/** @var \App\Models\Transaction|null $selected */ /** @var \App\Models\Transaction|null $selected */
$selected = $this->selectedTransaction; $selected = $this->selectedTransaction;
$metrics = $this->metrics; $metrics = $this->metrics;
$byStatus = collect($metrics['by_status']); $byStatus = collect($metrics['by_status']);
$resolveMetrics = static fn (string $status): array => $byStatus->get($status, ['count' => 0, 'amount' => 0.0]); $resolveMetrics = static fn (string $status): array => $byStatus->get($status, ['count' => 0, 'amount' => 0.0]);
$formatAmount = static fn (float $value): string => number_format($value, 2, ',', '.') . ' €'; $formatAmount = static fn (float $value): string => number_format($value, 2, ',', '.') . ' €';
$confirmed = $resolveMetrics(Transaction::STATUS_TRUE_POSITIVE); $confirmed = $resolveMetrics(Transaction::STATUS_TRUE_POSITIVE);
$falseAlarm = $resolveMetrics(Transaction::STATUS_FALSE_POSITIVE); $falseAlarm = $resolveMetrics(Transaction::STATUS_FALSE_POSITIVE);
$cleared = $resolveMetrics(Transaction::STATUS_CLEARED); $cleared = $resolveMetrics(Transaction::STATUS_CLEARED);
$total = $metrics['total']; $total = $metrics['total'];
$statusStyles = [ $statusStyles = [
Transaction::STATUS_TRUE_POSITIVE => 'bg-gradient-to-r from-rose-500/25 via-rose-500/10 to-rose-400/25 text-rose-700 dark:text-rose-200 border border-rose-500/30 shadow-[0_0_25px_-14px_rgba(244,63,94,0.85)]', Transaction::STATUS_TRUE_POSITIVE => 'bg-gradient-to-r from-rose-500/25 via-rose-500/10 to-rose-400/25 text-rose-700 dark:text-rose-200 border border-rose-500/30 shadow-[0_0_25px_-14px_rgba(244,63,94,0.85)]',
Transaction::STATUS_FALSE_POSITIVE => 'bg-gradient-to-r from-amber-400/25 via-amber-400/10 to-amber-300/25 text-amber-700 dark:text-amber-200 border border-amber-400/30 shadow-[0_0_25px_-14px_rgba(251,191,36,0.85)]', Transaction::STATUS_FALSE_POSITIVE => 'bg-gradient-to-r from-amber-400/25 via-amber-400/10 to-amber-300/25 text-amber-700 dark:text-amber-200 border border-amber-400/30 shadow-[0_0_25px_-14px_rgba(251,191,36,0.85)]',
Transaction::STATUS_CLEARED => 'bg-gradient-to-r from-emerald-400/25 via-emerald-400/10 to-emerald-300/25 text-emerald-700 dark:text-emerald-200 border border-emerald-400/30 shadow-[0_0_25px_-14px_rgba(52,211,153,0.85)]', Transaction::STATUS_CLEARED => 'bg-gradient-to-r from-emerald-400/25 via-emerald-400/10 to-emerald-300/25 text-emerald-700 dark:text-emerald-200 border border-emerald-400/30 shadow-[0_0_25px_-14px_rgba(52,211,153,0.85)]',
]; ];
$statusCopy = [ $statusCopy = [
Transaction::STATUS_TRUE_POSITIVE => 'Sofortige Sonderprüfung einleiten und Ermittlungsakte anlegen.', Transaction::STATUS_TRUE_POSITIVE => 'Sofortige Sonderprüfung einleiten und Ermittlungsakte anlegen.',
Transaction::STATUS_FALSE_POSITIVE => 'Anomalie begründen, Dokumentation ergänzen und Alarm schließen.', Transaction::STATUS_FALSE_POSITIVE => 'Anomalie begründen, Dokumentation ergänzen und Alarm schließen.',
Transaction::STATUS_CLEARED => 'Review-Ergebnis dokumentieren und Kontrollnachweis archivieren.', Transaction::STATUS_CLEARED => 'Review-Ergebnis dokumentieren und Kontrollnachweis archivieren.',
]; ];
$statusSummaryPhrases = [ $statusSummaryPhrases = [
Transaction::STATUS_TRUE_POSITIVE => [ Transaction::STATUS_TRUE_POSITIVE => [
'Verdachtsindikatoren bestätigen Treffer.', 'Verdachtsindikatoren bestätigen Treffer.',
'Risikotreiber stehen weiter auf Rot.', 'Risikotreiber stehen weiter auf Rot.',
'Sofortmaßnahmen priorisieren und dokumentieren.', 'Sofortmaßnahmen priorisieren und dokumentieren.',
'Ermittlungsteam unverzüglich koordinieren.', 'Ermittlungsteam unverzüglich koordinieren.',
'Audit-Trail aktuell halten und teilen.', 'Audit-Trail aktuell halten und teilen.',
], ],
Transaction::STATUS_FALSE_POSITIVE => [ Transaction::STATUS_FALSE_POSITIVE => [
'Alarm widerlegt, Dokumentation abschließen.', 'Alarm widerlegt, Dokumentation abschließen.',
'Risikoschwelle fällt unter interne Limits.', 'Risikoschwelle fällt unter interne Limits.',
'Regelwerk für Fehlalarm analysieren.', 'Regelwerk für Fehlalarm analysieren.',
'Stakeholder über Entwarnung informieren.', 'Stakeholder über Entwarnung informieren.',
'Kontrollnachweis im Archiv sichern.', 'Kontrollnachweis im Archiv sichern.',
], ],
Transaction::STATUS_CLEARED => [ Transaction::STATUS_CLEARED => [
'Keine Auffälligkeiten, Vorgang freigegeben.', 'Keine Auffälligkeiten, Vorgang freigegeben.',
'Monitoringdaten bestätigen Referenzverhalten.', 'Monitoringdaten bestätigen Referenzverhalten.',
'Freigabe mit Vier-Augen-Prinzip dokumentieren.', 'Freigabe mit Vier-Augen-Prinzip dokumentieren.',
'Compliance-Team über Abschluss informieren.', 'Compliance-Team über Abschluss informieren.',
'Revisionsunterlagen vollständig archivieren.', 'Revisionsunterlagen vollständig archivieren.',
], ],
]; ];
$statusSummary = array_map( $statusSummary = array_map(
static fn (array $phrases): string => $phrases[0] ?? 'Status gemäß aktuellem Prüfpfad.', static fn (array $phrases): string => $phrases[0] ?? 'Status gemäß aktuellem Prüfpfad.',
$statusSummaryPhrases $statusSummaryPhrases
); );
$statusSummaryBanner = [ $statusSummaryBanner = [
Transaction::STATUS_TRUE_POSITIVE => [ Transaction::STATUS_TRUE_POSITIVE => [
'classes' => 'border border-rose-400/60 bg-gradient-to-r from-rose-500/20 via-rose-500/10 to-rose-400/20 text-rose-900 shadow-[0_30px_70px_-50px_rgba(244,63,94,0.75)] dark:border-rose-500/50 dark:from-rose-500/20 dark:via-rose-500/10 dark:to-rose-400/20 dark:text-rose-100', 'classes' => 'border border-rose-400/60 bg-gradient-to-r from-rose-500/20 via-rose-500/10 to-rose-400/20 text-rose-900 shadow-[0_30px_70px_-50px_rgba(244,63,94,0.75)] dark:border-rose-500/50 dark:from-rose-500/20 dark:via-rose-500/10 dark:to-rose-400/20 dark:text-rose-100',
], ],
Transaction::STATUS_FALSE_POSITIVE => [ Transaction::STATUS_FALSE_POSITIVE => [
'classes' => 'border border-amber-400/60 bg-gradient-to-r from-amber-400/20 via-amber-400/10 to-amber-300/20 text-amber-900 shadow-[0_30px_70px_-50px_rgba(245,158,11,0.65)] dark:border-amber-400/50 dark:from-amber-400/20 dark:via-amber-400/10 dark:to-amber-300/20 dark:text-amber-100', 'classes' => 'border border-amber-400/60 bg-gradient-to-r from-amber-400/20 via-amber-400/10 to-amber-300/20 text-amber-900 shadow-[0_30px_70px_-50px_rgba(245,158,11,0.65)] dark:border-amber-400/50 dark:from-amber-400/20 dark:via-amber-400/10 dark:to-amber-300/20 dark:text-amber-100',
], ],
Transaction::STATUS_CLEARED => [ Transaction::STATUS_CLEARED => [
'classes' => 'border border-emerald-400/60 bg-gradient-to-r from-emerald-400/20 via-emerald-400/10 to-emerald-300/20 text-emerald-900 shadow-[0_30px_70px_-50px_rgba(16,185,129,0.65)] dark:border-emerald-400/50 dark:from-emerald-400/20 dark:via-emerald-400/10 dark:to-emerald-300/20 dark:text-emerald-100', 'classes' => 'border border-emerald-400/60 bg-gradient-to-r from-emerald-400/20 via-emerald-400/10 to-emerald-300/20 text-emerald-900 shadow-[0_30px_70px_-50px_rgba(16,185,129,0.65)] dark:border-emerald-400/50 dark:from-emerald-400/20 dark:via-emerald-400/10 dark:to-emerald-300/20 dark:text-emerald-100',
], ],
]; ];
$statusLegend = [ $statusLegend = [
Transaction::STATUS_TRUE_POSITIVE => [ Transaction::STATUS_TRUE_POSITIVE => [
'title' => 'Bestätigter Treffer', 'title' => 'Bestätigter Treffer',
'description' => 'Ermittlungsindikatoren bestätigen einen hinreichenden Verdacht. Fallverantwortliche Person informieren, Belege sichern und Maßnahmenplan starten.', 'description' => 'Ermittlungsindikatoren bestätigen einen hinreichenden Verdacht. Fallverantwortliche Person informieren, Belege sichern und Maßnahmenplan starten.',
'accent' => 'text-rose-500 dark:text-rose-300', 'accent' => 'text-rose-500 dark:text-rose-300',
], ],
Transaction::STATUS_FALSE_POSITIVE => [ Transaction::STATUS_FALSE_POSITIVE => [
'title' => 'Fehlalarm', 'title' => 'Fehlalarm',
'description' => 'Auslösung plausibel widerlegt (z. B. KYC-Daten, Geschäftslogik). Entscheidungsgrund dokumentieren und Regeloptimierung anstoßen.', 'description' => 'Auslösung plausibel widerlegt (z. B. KYC-Daten, Geschäftslogik). Entscheidungsgrund dokumentieren und Regeloptimierung anstoßen.',
'accent' => 'text-amber-500 dark:text-amber-200', 'accent' => 'text-amber-500 dark:text-amber-200',
], ],
Transaction::STATUS_CLEARED => [ Transaction::STATUS_CLEARED => [
'title' => 'Freigegeben', 'title' => 'Freigegeben',
'description' => 'Keine verdächtigen Auffälligkeiten. Abschluss mit Vier-Augen-Freigabe und revisionssicherer Ablage des Prüfpfads.', 'description' => 'Keine verdächtigen Auffälligkeiten. Abschluss mit Vier-Augen-Freigabe und revisionssicherer Ablage des Prüfpfads.',
'accent' => 'text-emerald-500 dark:text-emerald-300', 'accent' => 'text-emerald-500 dark:text-emerald-300',
], ],
]; ];
$riskExplanation = 'Der Risikowert (0100) fasst Monitoring-Regeln, KYC-Risiken, Negativmeldungen sowie Verhaltens- und Geodaten zu einer Priorität zusammen. Werte über 80 kennzeichnen Sofortmaßnahmen, 5079 markieren erhöhte Aufmerksamkeit, alles darunter gilt als Routineprüfung.'; $riskExplanation = 'Der Risikowert (0100) fasst Monitoring-Regeln, KYC-Risiken, Negativmeldungen sowie Verhaltens- und Geodaten zu einer Priorität zusammen. Werte über 80 kennzeichnen Sofortmaßnahmen, 5079 markieren erhöhte Aufmerksamkeit, alles darunter gilt als Routineprüfung.';
@endphp @endphp
<div class="flex flex-col gap-6"> <div class="flex flex-col gap-6">
@@ -259,7 +259,7 @@ new #[Layout('components.layouts.app')] class extends Component {
<p class="inline-flex items-center gap-2 rounded-full border border-white/25 bg-white/10 px-3 py-1 text-xs font-semibold uppercase tracking-[0.18em] text-slate-200 shadow-sm"> <p class="inline-flex items-center gap-2 rounded-full border border-white/25 bg-white/10 px-3 py-1 text-xs font-semibold uppercase tracking-[0.18em] text-slate-200 shadow-sm">
AFC-Kontrollzentrum AFC-Kontrollzentrum
</p> </p>
<h1 class="text-2xl font-semibold tracking-tight sm:text-3xl">Finanzkriminalitäts-Workbench</h1> <h1 class="text-2xl font-semibold tracking-tight sm:text-3xl">Verdachtsfall-Qualifizierungs-Workbench</h1>
<p class="text-sm leading-relaxed text-slate-300 sm:text-base"> <p class="text-sm leading-relaxed text-slate-300 sm:text-base">
Überwachen Sie verdächtige Transaktionen im DAX-Portfolio, priorisieren Sie Alarme und orchestrieren Sie das manuelle Review im Vier-Augen-Prozess. Überwachen Sie verdächtige Transaktionen im DAX-Portfolio, priorisieren Sie Alarme und orchestrieren Sie das manuelle Review im Vier-Augen-Prozess.
</p> </p>
@@ -291,19 +291,19 @@ new #[Layout('components.layouts.app')] class extends Component {
<div class="grid gap-4 rounded-3xl border border-zinc-200/60 bg-white/95 p-6 shadow-sm backdrop-blur dark:border-zinc-700/70 dark:bg-zinc-900/90 md:grid-cols-3"> <div class="grid gap-4 rounded-3xl border border-zinc-200/60 bg-white/95 p-6 shadow-sm backdrop-blur dark:border-zinc-700/70 dark:bg-zinc-900/90 md:grid-cols-3">
@foreach ($statusLegend as $key => $legend) @foreach ($statusLegend as $key => $legend)
<div class="flex flex-col gap-3 rounded-2xl border border-zinc-100/60 bg-slate-50/80 p-4 shadow-sm transition hover:-translate-y-0.5 hover:shadow-md dark:border-zinc-700/60 dark:bg-zinc-800/70"> <div class="flex flex-col gap-3 rounded-2xl border border-zinc-100/60 bg-slate-50/80 p-4 shadow-sm transition hover:-translate-y-0.5 hover:shadow-md dark:border-zinc-700/60 dark:bg-zinc-800/70">
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<span class="inline-flex h-2.5 w-2.5 rounded-full bg-gradient-to-r @class([ <span class="inline-flex h-2.5 w-2.5 rounded-full bg-gradient-to-r @class([
'from-rose-500 to-rose-400' => $key === Transaction::STATUS_TRUE_POSITIVE, 'from-rose-500 to-rose-400' => $key === Transaction::STATUS_TRUE_POSITIVE,
'from-amber-400 to-amber-300' => $key === Transaction::STATUS_FALSE_POSITIVE, 'from-amber-400 to-amber-300' => $key === Transaction::STATUS_FALSE_POSITIVE,
'from-emerald-400 to-emerald-300' => $key === Transaction::STATUS_CLEARED, 'from-emerald-400 to-emerald-300' => $key === Transaction::STATUS_CLEARED,
])"></span> ])"></span>
<p class="text-sm font-semibold {{ $legend['accent'] }}">{{ $legend['title'] }}</p> <p class="text-sm font-semibold {{ $legend['accent'] }}">{{ $legend['title'] }}</p>
</div>
<p class="text-sm leading-relaxed text-zinc-600 dark:text-zinc-300">
{{ $legend['description'] }}
</p>
</div> </div>
<p class="text-sm leading-relaxed text-zinc-600 dark:text-zinc-300">
{{ $legend['description'] }}
</p>
</div>
@endforeach @endforeach
</div> </div>
@@ -317,7 +317,7 @@ new #[Layout('components.layouts.app')] class extends Component {
<div class="flex w-full flex-col gap-3 sm:w-auto sm:flex-row sm:items-center"> <div class="flex w-full flex-col gap-3 sm:w-auto sm:flex-row sm:items-center">
<flux:select wire:model.live="status" class="w-full sm:w-56"> <flux:select wire:model.live="status" class="w-full sm:w-56">
@foreach ($this->statusOptions as $value => $label) @foreach ($this->statusOptions as $value => $label)
<option value="{{ $value }}">{{ $label }}</option> <option value="{{ $value }}">{{ $label }}</option>
@endforeach @endforeach
</flux:select> </flux:select>
<flux:input <flux:input
@@ -339,243 +339,241 @@ new #[Layout('components.layouts.app')] class extends Component {
<div class="divide-y divide-zinc-200/60 dark:divide-zinc-700/70"> <div class="divide-y divide-zinc-200/60 dark:divide-zinc-700/70">
@forelse ($transactions as $transaction) @forelse ($transactions as $transaction)
@php @php
$selectedState = $transaction->id === $this->selectedTransactionId; $selectedState = $transaction->id === $this->selectedTransactionId;
$buttonClasses = [ $buttonClasses = [
'flex w-full flex-col gap-3 px-4 py-4 text-left transition duration-200 sm:grid sm:grid-cols-[1.6fr_1fr_0.7fr]', 'flex w-full flex-col gap-3 px-4 py-4 text-left transition duration-200 sm:grid sm:grid-cols-[1.6fr_1fr_0.7fr]',
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-400/70', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-400/70',
]; ];
if ($selectedState) { if ($selectedState) {
$buttonClasses[] = 'border-s-4 border-indigo-500/80 bg-indigo-500/10 shadow-lg shadow-indigo-500/20 ring-2 ring-indigo-400/70 ring-offset-2 ring-offset-white dark:bg-indigo-500/20 dark:ring-offset-zinc-900 scale-[1.01]'; $buttonClasses[] = 'border-s-4 border-indigo-500/80 bg-indigo-500/10 shadow-lg shadow-indigo-500/20 ring-2 ring-indigo-400/70 ring-offset-2 ring-offset-white dark:bg-indigo-500/20 dark:ring-offset-zinc-900 scale-[1.01]';
} else { } else {
$buttonClasses[] = 'border-s-4 border-transparent hover:-translate-y-0.5 hover:border-indigo-400/70 hover:bg-zinc-50/70 hover:shadow-lg hover:shadow-zinc-900/20 dark:hover:bg-zinc-800/60'; $buttonClasses[] = 'border-s-4 border-transparent hover:-translate-y-0.5 hover:border-indigo-400/70 hover:bg-zinc-50/70 hover:shadow-lg hover:shadow-zinc-900/20 dark:hover:bg-zinc-800/60';
} }
@endphp @endphp
<button <button
wire:click="selectTransaction({{ $transaction->id }})" wire:click="selectTransaction({{ $transaction->id }})"
type="button" type="button"
class="{{ implode(' ', $buttonClasses) }}" class="{{ implode(' ', $buttonClasses) }}"
aria-pressed="{{ $selectedState ? 'true' : 'false' }}" aria-pressed="{{ $selectedState ? 'true' : 'false' }}">
> <div class="space-y-2">
<div class="space-y-2"> <div class="flex items-start justify-between gap-3">
<div class="flex items-start justify-between gap-3"> <div>
<div> <p class="text-sm font-semibold text-zinc-900 dark:text-zinc-100">{{ $transaction->company->legal_name }}</p>
<p class="text-sm font-semibold text-zinc-900 dark:text-zinc-100">{{ $transaction->company->legal_name }}</p> <p class="text-xs uppercase tracking-wide text-zinc-400">{{ $transaction->company->name }} &middot; {{ $transaction->company->sector }}</p>
<p class="text-xs uppercase tracking-wide text-zinc-400">{{ $transaction->company->name }} &middot; {{ $transaction->company->sector }}</p>
</div>
<span class="inline-flex items-center gap-1 rounded-full px-3 py-1 text-xs font-semibold {{ $statusStyles[$transaction->status] ?? 'bg-zinc-500/10 text-zinc-600 dark:text-zinc-300 border border-zinc-500/20' }}">
{{ $transaction->statusLabel() }}
</span>
</div>
<div class="flex flex-wrap items-center gap-2 text-sm text-zinc-500 dark:text-zinc-400">
<span class="font-medium text-zinc-700 dark:text-zinc-200">{{ $transaction->counterparty }}</span>
<span></span>
<span>{{ $transaction->counterparty_country }}</span>
<span></span>
<span>{{ $transaction->executed_at?->format('d.m.Y H:i') }}</span>
</div> </div>
<span class="inline-flex items-center gap-1 rounded-full px-3 py-1 text-xs font-semibold {{ $statusStyles[$transaction->status] ?? 'bg-zinc-500/10 text-zinc-600 dark:text-zinc-300 border border-zinc-500/20' }}">
{{ $transaction->statusLabel() }}
</span>
</div> </div>
<div class="flex flex-wrap items-center gap-2 text-sm text-zinc-500 dark:text-zinc-400">
<div class="space-y-2"> <span class="font-medium text-zinc-700 dark:text-zinc-200">{{ $transaction->counterparty }}</span>
<p class="text-sm font-medium text-zinc-700 dark:text-zinc-200">{{ $transaction->channel }}</p> <span></span>
<p class="font-mono text-xs text-zinc-400">{{ $transaction->reference }}</p> <span>{{ $transaction->counterparty_country }}</span>
<span></span>
<span>{{ $transaction->executed_at?->format('d.m.Y H:i') }}</span>
</div> </div>
<div class="flex flex-col items-end justify-between gap-2">
<p class="text-lg font-semibold text-zinc-900 dark:text-zinc-100">
{{ number_format($transaction->amount, 2, ',', '.') }} {{ $transaction->currency }}
</p>
<div class="flex flex-wrap items-center gap-2 text-xs text-zinc-500 dark:text-zinc-400">
<flux:tooltip :content="$riskExplanation" position="top">
<span class="inline-flex items-center gap-1 rounded-md bg-slate-100/60 px-2 py-1 font-semibold text-slate-700 dark:bg-slate-900/60 dark:text-slate-200">
Risiko {{ $transaction->risk_score }}
<span aria-hidden="true" class="inline-flex h-3.5 w-3.5 items-center justify-center rounded-full border border-slate-400/60 text-[0.55rem] font-semibold text-slate-600 dark:border-slate-500/60 dark:text-slate-300">
i
</span>
</span>
</flux:tooltip>
<span>{{ $statusCopy[$transaction->status] ?? '' }}</span>
</div>
</div>
</button>
@empty
<div class="px-6 py-16 text-center text-sm text-zinc-500 dark:text-zinc-400">
Keine Transaktionen für die aktuellen Filterkriterien gefunden. Bitte Seed-Daten neu laden oder Filter anpassen.
</div> </div>
<div class="space-y-2">
<p class="text-sm font-medium text-zinc-700 dark:text-zinc-200">{{ $transaction->channel }}</p>
<p class="font-mono text-xs text-zinc-400">{{ $transaction->reference }}</p>
</div>
<div class="flex flex-col items-end justify-between gap-2">
<p class="text-lg font-semibold text-zinc-900 dark:text-zinc-100">
{{ number_format($transaction->amount, 2, ',', '.') }} {{ $transaction->currency }}
</p>
<div class="flex flex-wrap items-center gap-2 text-xs text-zinc-500 dark:text-zinc-400">
<flux:tooltip :content="$riskExplanation" position="top">
<span class="inline-flex items-center gap-1 rounded-md bg-slate-100/60 px-2 py-1 font-semibold text-slate-700 dark:bg-slate-900/60 dark:text-slate-200">
Risiko {{ $transaction->risk_score }}
<span aria-hidden="true" class="inline-flex h-3.5 w-3.5 items-center justify-center rounded-full border border-slate-400/60 text-[0.55rem] font-semibold text-slate-600 dark:border-slate-500/60 dark:text-slate-300">
i
</span>
</span>
</flux:tooltip>
<span>{{ $statusCopy[$transaction->status] ?? '' }}</span>
</div>
</div>
</button>
@empty
<div class="px-6 py-16 text-center text-sm text-zinc-500 dark:text-zinc-400">
Keine Transaktionen für die aktuellen Filterkriterien gefunden. Bitte Seed-Daten neu laden oder Filter anpassen.
</div>
@endforelse @endforelse
</div> </div>
@if ($transactions->hasPages()) @if ($transactions->hasPages())
<div class="flex items-center justify-between gap-3 border-t border-zinc-200/70 bg-zinc-50/70 px-4 py-3 text-sm text-zinc-500 dark:border-zinc-700/60 dark:bg-zinc-900/70 dark:text-zinc-300"> <div class="flex items-center justify-between gap-3 border-t border-zinc-200/70 bg-zinc-50/70 px-4 py-3 text-sm text-zinc-500 dark:border-zinc-700/60 dark:bg-zinc-900/70 dark:text-zinc-300">
<button <button
wire:click="previousPage" wire:click="previousPage"
wire:loading.attr="disabled" wire:loading.attr="disabled"
@disabled($transactions->onFirstPage()) @disabled($transactions->onFirstPage())
class="inline-flex items-center gap-2 rounded-full border border-zinc-300/70 bg-white/70 px-4 py-1.5 font-medium text-zinc-700 transition hover:bg-white dark:border-zinc-600/70 dark:bg-zinc-800/80 dark:text-zinc-200 dark:hover:bg-zinc-800/60" class="inline-flex items-center gap-2 rounded-full border border-zinc-300/70 bg-white/70 px-4 py-1.5 font-medium text-zinc-700 transition hover:bg-white dark:border-zinc-600/70 dark:bg-zinc-800/80 dark:text-zinc-200 dark:hover:bg-zinc-800/60"
> >
Zurück Zurück
</button> </button>
<span class="text-xs font-medium uppercase tracking-wide text-zinc-500 dark:text-zinc-400"> <span class="text-xs font-medium uppercase tracking-wide text-zinc-500 dark:text-zinc-400">
Seite {{ $transactions->currentPage() }} von {{ $transactions->lastPage() }} Seite {{ $transactions->currentPage() }} von {{ $transactions->lastPage() }}
</span> </span>
<button <button
wire:click="nextPage" wire:click="nextPage"
wire:loading.attr="disabled" wire:loading.attr="disabled"
@disabled(! $transactions->hasMorePages()) @disabled(! $transactions->hasMorePages())
class="inline-flex items-center gap-2 rounded-full border border-zinc-300/70 bg-white/70 px-4 py-1.5 font-medium text-zinc-700 transition hover:bg-white dark:border-zinc-600/70 dark:bg-zinc-800/80 dark:text-zinc-200 dark:hover:bg-zinc-800/60" class="inline-flex items-center gap-2 rounded-full border border-zinc-300/70 bg-white/70 px-4 py-1.5 font-medium text-zinc-700 transition hover:bg-white dark:border-zinc-600/70 dark:bg-zinc-800/80 dark:text-zinc-200 dark:hover:bg-zinc-800/60"
> >
Weiter Weiter
</button> </button>
</div> </div>
@endif @endif
</div> </div>
<div class="space-y-4"> <div class="space-y-4">
@if ($selected) @if ($selected)
@php @php
$summaryStyles = $statusSummaryBanner[$selected->status] ?? [ $summaryStyles = $statusSummaryBanner[$selected->status] ?? [
'classes' => 'border border-zinc-300/70 bg-zinc-100/80 text-zinc-700 dark:border-zinc-600/60 dark:bg-zinc-800/60 dark:text-zinc-200', 'classes' => 'border border-zinc-300/70 bg-zinc-100/80 text-zinc-700 dark:border-zinc-600/60 dark:bg-zinc-800/60 dark:text-zinc-200',
]; ];
$summaryText = implode(' ', $statusSummaryPhrases[$selected->status] ?? ['Status gemäß aktuellem Prüfpfad.']); $summaryText = implode(' ', $statusSummaryPhrases[$selected->status] ?? ['Status gemäß aktuellem Prüfpfad.']);
@endphp @endphp
<div class="rounded-3xl px-6 py-5 text-sm leading-relaxed shadow-sm backdrop-blur {{ $summaryStyles['classes'] }}"> <div class="rounded-3xl px-6 py-5 text-sm leading-relaxed shadow-sm backdrop-blur {{ $summaryStyles['classes'] }}">
<div class="flex items-center justify-between gap-3"> <div class="flex items-center justify-between gap-3">
<span class="text-xs font-semibold uppercase tracking-wide">Statuszusammenfassung</span> <span class="text-xs font-semibold uppercase tracking-wide">Statuszusammenfassung</span>
<span class="inline-flex items-center gap-2 rounded-full border border-current/20 bg-white/10 px-3 py-1 text-xs font-semibold uppercase tracking-wide"> <span class="inline-flex items-center gap-2 rounded-full border border-current/20 bg-white/10 px-3 py-1 text-xs font-semibold uppercase tracking-wide">
{{ $selected->statusLabel() }} {{ $selected->statusLabel() }}
</span> </span>
</div>
<p class="mt-3 text-base font-medium leading-relaxed">
{{ $summaryText }}
</p>
</div>
<div class="rounded-3xl border border-zinc-200/70 bg-white/95 p-6 shadow-sm backdrop-blur dark:border-zinc-700/70 dark:bg-zinc-900/90">
<div class="flex flex-wrap items-start justify-between gap-4">
<div>
<h3 class="text-lg font-semibold text-zinc-900 dark:text-zinc-100">{{ $selected->company->legal_name }}</h3>
<p class="text-sm text-zinc-500 dark:text-zinc-400">{{ $selected->company->summary }}</p>
</div> </div>
<p class="mt-3 text-base font-medium leading-relaxed"> <div class="flex flex-col items-end gap-2">
{{ $summaryText }} <span class="inline-flex items-center rounded-full bg-slate-900/90 px-3 py-1 text-xs font-semibold uppercase tracking-wide text-white dark:bg-slate-200/20">
Prüfung erforderlich
</span>
@php($detailStatusStyle = $statusStyles[$selected->status] ?? 'bg-zinc-500/10 text-zinc-600 border border-zinc-500/20')
<span class="inline-flex items-center gap-2 rounded-full px-3 py-1 text-xs font-semibold {{ $detailStatusStyle }}">
Status: {{ $selected->statusLabel() }}
</span>
<span class="text-3xl font-semibold text-slate-900 dark:text-white">
{{ number_format($selected->amount, 2, ',', '.') }} {{ $selected->currency }}
</span>
<div class="flex items-center gap-2 text-xs text-zinc-500 dark:text-zinc-400">
<flux:tooltip :content="$riskExplanation" position="top">
<span class="inline-flex items-center gap-1 rounded-md bg-slate-900/10 px-2 py-1 font-semibold text-slate-700 dark:bg-slate-200/10 dark:text-slate-200">
Risikoscore {{ $selected->risk_score }}
<span aria-hidden="true" class="inline-flex h-3.5 w-3.5 items-center justify-center rounded-full border border-slate-500/60 text-[0.55rem] font-semibold text-slate-600 dark:border-slate-400/60 dark:text-slate-200">
i
</span>
</span>
</flux:tooltip>
<span>{{ $selected->executed_at?->format('d.m.Y, H:i') }}</span>
</div>
</div>
</div>
<dl class="mt-6 grid grid-cols-1 gap-4 text-sm text-zinc-600 dark:text-zinc-300">
<div class="rounded-2xl bg-zinc-50/80 p-4 dark:bg-zinc-800/80">
<dt class="text-xs uppercase tracking-wide text-zinc-400">Statusbegründung</dt>
<dd class="mt-1 font-medium text-zinc-900 dark:text-zinc-100">
{{ $statusSummary[$selected->status] ?? 'Status gemäß aktuellem Prüfpfad.' }}
</dd>
</div>
<div class="rounded-2xl bg-zinc-50/80 p-4 dark:bg-zinc-800/80">
<dt class="text-xs uppercase tracking-wide text-zinc-400">Gegenpartei</dt>
<dd class="mt-1 font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->counterparty }}</dd>
<dd class="text-xs text-zinc-500">{{ $selected->counterparty_country }}</dd>
</div>
<div class="rounded-2xl bg-zinc-50/80 p-4 dark:bg-zinc-800/80">
<dt class="text-xs uppercase tracking-wide text-zinc-400">Zahlungskanal &amp; Referenz</dt>
<dd class="mt-1 font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->channel }}</dd>
<dd class="font-mono text-xs text-zinc-500">{{ $selected->reference }}</dd>
</div>
<div class="rounded-2xl bg-zinc-50/80 p-4 dark:bg-zinc-800/80">
<dt class="text-xs uppercase tracking-wide text-zinc-400">Flagging-Engine</dt>
<dd class="mt-1 font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->flagged_by }}</dd>
<dd class="text-xs text-zinc-500">{{ $selected->flagged_reason }}</dd>
</div>
</dl>
@if (! empty($selected->signals))
<div class="mt-6 space-y-2">
<h4 class="text-xs font-semibold uppercase tracking-wide text-zinc-400">Detektionssignale</h4>
<div class="flex flex-wrap gap-2">
@foreach ($selected->signals as $signal)
<span class="inline-flex items-center gap-2 rounded-full border border-slate-300/70 bg-slate-100/60 px-3 py-1 text-xs font-medium text-slate-700 dark:border-slate-600 dark:bg-slate-800/60 dark:text-slate-200">
<span class="h-1.5 w-1.5 rounded-full bg-emerald-500"></span>
{{ data_get($signal, 'type') }} &middot; {{ data_get($signal, 'value') }}
</span>
@endforeach
</div>
</div>
@endif
<div class="mt-6 rounded-2xl border border-indigo-200/60 bg-indigo-500/10 p-4 text-sm text-indigo-900 dark:border-indigo-500/30 dark:bg-indigo-500/10 dark:text-indigo-100">
<p class="font-medium">Empfohlene Maßnahme</p>
<p class="mt-1 text-sm leading-relaxed">
{{ $statusCopy[$selected->status] ?? 'Review abschließen und vollständigen Audit-Trail dokumentieren.' }}
</p> </p>
</div> </div>
<div class="rounded-3xl border border-zinc-200/70 bg-white/95 p-6 shadow-sm backdrop-blur dark:border-zinc-700/70 dark:bg-zinc-900/90"> <div class="mt-4 flex justify-end">
<div class="flex flex-wrap items-start justify-between gap-4"> <flux:link
<div> :href="route('company.transactions', ['company' => $selected->company_id, 'transaction' => $selected->id])"
<h3 class="text-lg font-semibold text-zinc-900 dark:text-zinc-100">{{ $selected->company->legal_name }}</h3> wire:navigate
<p class="text-sm text-zinc-500 dark:text-zinc-400">{{ $selected->company->summary }}</p> class="inline-flex items-center gap-2 rounded-full border border-indigo-200/70 bg-indigo-500/10 px-4 py-1.5 text-xs font-semibold text-indigo-600 transition hover:bg-indigo-500/20 dark:border-indigo-500/40 dark:bg-indigo-500/10 dark:text-indigo-200">
</div> {{ __('Fallansicht maximieren') }}
<div class="flex flex-col items-end gap-2"> <flux:icon name="arrow-top-right-on-square" class="h-4 w-4" />
<span class="inline-flex items-center rounded-full bg-slate-900/90 px-3 py-1 text-xs font-semibold uppercase tracking-wide text-white dark:bg-slate-200/20"> </flux:link>
Prüfung erforderlich
</span>
@php($detailStatusStyle = $statusStyles[$selected->status] ?? 'bg-zinc-500/10 text-zinc-600 border border-zinc-500/20')
<span class="inline-flex items-center gap-2 rounded-full px-3 py-1 text-xs font-semibold {{ $detailStatusStyle }}">
Status: {{ $selected->statusLabel() }}
</span>
<span class="text-3xl font-semibold text-slate-900 dark:text-white">
{{ number_format($selected->amount, 2, ',', '.') }} {{ $selected->currency }}
</span>
<div class="flex items-center gap-2 text-xs text-zinc-500 dark:text-zinc-400">
<flux:tooltip :content="$riskExplanation" position="top">
<span class="inline-flex items-center gap-1 rounded-md bg-slate-900/10 px-2 py-1 font-semibold text-slate-700 dark:bg-slate-200/10 dark:text-slate-200">
Risikoscore {{ $selected->risk_score }}
<span aria-hidden="true" class="inline-flex h-3.5 w-3.5 items-center justify-center rounded-full border border-slate-500/60 text-[0.55rem] font-semibold text-slate-600 dark:border-slate-400/60 dark:text-slate-200">
i
</span>
</span>
</flux:tooltip>
<span>{{ $selected->executed_at?->format('d.m.Y, H:i') }}</span>
</div>
</div>
</div>
<dl class="mt-6 grid grid-cols-1 gap-4 text-sm text-zinc-600 dark:text-zinc-300">
<div class="rounded-2xl bg-zinc-50/80 p-4 dark:bg-zinc-800/80">
<dt class="text-xs uppercase tracking-wide text-zinc-400">Statusbegründung</dt>
<dd class="mt-1 font-medium text-zinc-900 dark:text-zinc-100">
{{ $statusSummary[$selected->status] ?? 'Status gemäß aktuellem Prüfpfad.' }}
</dd>
</div>
<div class="rounded-2xl bg-zinc-50/80 p-4 dark:bg-zinc-800/80">
<dt class="text-xs uppercase tracking-wide text-zinc-400">Gegenpartei</dt>
<dd class="mt-1 font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->counterparty }}</dd>
<dd class="text-xs text-zinc-500">{{ $selected->counterparty_country }}</dd>
</div>
<div class="rounded-2xl bg-zinc-50/80 p-4 dark:bg-zinc-800/80">
<dt class="text-xs uppercase tracking-wide text-zinc-400">Zahlungskanal &amp; Referenz</dt>
<dd class="mt-1 font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->channel }}</dd>
<dd class="font-mono text-xs text-zinc-500">{{ $selected->reference }}</dd>
</div>
<div class="rounded-2xl bg-zinc-50/80 p-4 dark:bg-zinc-800/80">
<dt class="text-xs uppercase tracking-wide text-zinc-400">Flagging-Engine</dt>
<dd class="mt-1 font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->flagged_by }}</dd>
<dd class="text-xs text-zinc-500">{{ $selected->flagged_reason }}</dd>
</div>
</dl>
@if (! empty($selected->signals))
<div class="mt-6 space-y-2">
<h4 class="text-xs font-semibold uppercase tracking-wide text-zinc-400">Detektionssignale</h4>
<div class="flex flex-wrap gap-2">
@foreach ($selected->signals as $signal)
<span class="inline-flex items-center gap-2 rounded-full border border-slate-300/70 bg-slate-100/60 px-3 py-1 text-xs font-medium text-slate-700 dark:border-slate-600 dark:bg-slate-800/60 dark:text-slate-200">
<span class="h-1.5 w-1.5 rounded-full bg-emerald-500"></span>
{{ data_get($signal, 'type') }} &middot; {{ data_get($signal, 'value') }}
</span>
@endforeach
</div>
</div>
@endif
<div class="mt-6 rounded-2xl border border-indigo-200/60 bg-indigo-500/10 p-4 text-sm text-indigo-900 dark:border-indigo-500/30 dark:bg-indigo-500/10 dark:text-indigo-100">
<p class="font-medium">Empfohlene Maßnahme</p>
<p class="mt-1 text-sm leading-relaxed">
{{ $statusCopy[$selected->status] ?? 'Review abschließen und vollständigen Audit-Trail dokumentieren.' }}
</p>
</div>
<div class="mt-4 flex justify-end">
<flux:link
:href="route('company.transactions', ['company' => $selected->company_id, 'transaction' => $selected->id])"
wire:navigate
class="inline-flex items-center gap-2 rounded-full border border-indigo-200/70 bg-indigo-500/10 px-4 py-1.5 text-xs font-semibold text-indigo-600 transition hover:bg-indigo-500/20 dark:border-indigo-500/40 dark:bg-indigo-500/10 dark:text-indigo-200"
>
{{ __('Fallansicht maximieren') }}
<flux:icon name="arrow-top-right-on-square" class="h-4 w-4" />
</flux:link>
</div>
</div> </div>
</div>
<div class="rounded-3xl border border-zinc-200/60 bg-white/95 p-6 shadow-sm backdrop-blur dark:border-zinc-700/70 dark:bg-zinc-900/90"> <div class="rounded-3xl border border-zinc-200/60 bg-white/95 p-6 shadow-sm backdrop-blur dark:border-zinc-700/70 dark:bg-zinc-900/90">
<h4 class="text-sm font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400">Unternehmensprofil</h4> <h4 class="text-sm font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400">Unternehmensprofil</h4>
<ul class="mt-4 space-y-3 text-sm text-zinc-600 dark:text-zinc-300"> <ul class="mt-4 space-y-3 text-sm text-zinc-600 dark:text-zinc-300">
<li class="flex items-center justify-between"> <li class="flex items-center justify-between">
<span>Rechtlicher Name</span> <span>Rechtlicher Name</span>
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->legal_name }}</span> <span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->legal_name }}</span>
</li> </li>
<li class="flex items-center justify-between"> <li class="flex items-center justify-between">
<span>Ticker</span> <span>Ticker</span>
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->ticker }}</span> <span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->ticker }}</span>
</li> </li>
<li class="flex items-center justify-between"> <li class="flex items-center justify-between">
<span>Sektor</span> <span>Sektor</span>
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->sector }}</span> <span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->sector }}</span>
</li> </li>
<li class="flex items-center justify-between"> <li class="flex items-center justify-between">
<span>Hauptsitz</span> <span>Hauptsitz</span>
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->headquarters }}</span> <span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->headquarters }}</span>
</li> </li>
<li class="flex items-center justify-between"> <li class="flex items-center justify-between">
<span>Land</span> <span>Land</span>
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->country }}</span> <span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->country }}</span>
</li> </li>
<li class="flex items-center justify-between"> <li class="flex items-center justify-between">
<span>KYC-Risikostufe</span> <span>KYC-Risikostufe</span>
<span class="inline-flex items-center rounded-full bg-slate-100 px-2 py-1 text-xs font-semibold uppercase tracking-wide text-slate-700 dark:bg-slate-800 dark:text-slate-200"> <span class="inline-flex items-center rounded-full bg-slate-100 px-2 py-1 text-xs font-semibold uppercase tracking-wide text-slate-700 dark:bg-slate-800 dark:text-slate-200">
{{ Str::title($selected->company->kyc_risk_level) }} {{ Str::title($selected->company->kyc_risk_level) }}
</span> </span>
</li> </li>
</ul> </ul>
</div> </div>
@else @else
<div class="rounded-3xl border border-dashed border-zinc-300/70 bg-white/80 p-6 text-center text-sm text-zinc-500 shadow-sm dark:border-zinc-600/50 dark:bg-zinc-900/60 dark:text-zinc-300"> <div class="rounded-3xl border border-dashed border-zinc-300/70 bg-white/80 p-6 text-center text-sm text-zinc-500 shadow-sm dark:border-zinc-600/50 dark:bg-zinc-900/60 dark:text-zinc-300">
Wählen Sie links einen Alarm aus, um den vollständigen Prüfkontext einzusehen. Wählen Sie links einen Alarm aus, um den vollständigen Prüfkontext einzusehen.
</div> </div>
@endif @endif
</div> </div>
</div> </div>
</div> </div>