typo and design changes Frontend-Optimierung Powerpoint
This commit is contained in:
@@ -45,7 +45,7 @@
|
||||
'avg_risk' => (int) round($group->avg('risk_score')),
|
||||
])
|
||||
->sortByDesc('alerts')
|
||||
->take(3);
|
||||
->take(5);
|
||||
@endphp
|
||||
|
||||
<div class="flex flex-col gap-8">
|
||||
@@ -55,11 +55,11 @@
|
||||
<div class="relative flex flex-col gap-6 lg:flex-row lg:items-end lg:justify-between">
|
||||
<div class="max-w-2xl space-y-3">
|
||||
<p class="inline-flex items-center gap-2 rounded-full border border-white/20 bg-white/10 px-3 py-1 text-xs font-semibold uppercase tracking-[0.2em] text-slate-200">
|
||||
Advanced AI-Powered AFC
|
||||
Anti Financial Crime - Dashboard
|
||||
</p>
|
||||
<h1 class="text-3xl font-semibold tracking-tight sm:text-4xl">Qualifizierung der Verdachtsfälle juristischer Personen o.Ä.</h1>
|
||||
<h1 class="text-3xl font-semibold tracking-tight sm:text-4xl">Qualifizierung der Verdachtsfälle juristischer Personen</h1>
|
||||
<p class="text-sm leading-relaxed text-slate-300 sm:text-base">
|
||||
KI-gestützte Detection Engines, Wissensgraphen und Analyst:innen bilden ein gemeinsames Lagebild. Die folgenden Signale fassen aktuelle Alert-Last, Automationsquote und Marktvolumen zusammen.
|
||||
Übersicht für AML-Verantwortliche für die Kapazitätssteuerung
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid w-full grid-cols-2 gap-4 text-center sm:grid-cols-4 lg:w-auto">
|
||||
@@ -83,14 +83,11 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="grid gap-6 lg:grid-cols-[2fr_1fr]">
|
||||
<section class="grid gap-6">
|
||||
<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-end justify-between gap-4">
|
||||
<div>
|
||||
<h2 class="text-xl font-semibold text-zinc-900 dark:text-zinc-100">Realtime Alert Intelligence</h2>
|
||||
<p class="text-sm text-zinc-500 dark:text-zinc-400">
|
||||
KI priorisiert {{ $formatNumber($activeAlerts->count()) }} offene Vorgänge anhand von Netzwerk-, Verhaltens- und Sanktionssignalen.
|
||||
</p>
|
||||
<h2 class="text-xl font-semibold text-zinc-900 dark:text-zinc-100">Risikolassen und Automatisierungsscore</h2>
|
||||
</div>
|
||||
<div 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 uppercase tracking-wide text-indigo-700 dark:border-indigo-500/30 dark:text-indigo-200">
|
||||
Automationspräzision {{ $precisionRate }}%
|
||||
@@ -118,7 +115,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col gap-6">
|
||||
<!-- <div class="flex flex-col gap-6">
|
||||
<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">
|
||||
<h2 class="text-base font-semibold text-zinc-900 dark:text-zinc-100">AI-Agent Telemetrie</h2>
|
||||
<ul class="mt-4 space-y-4 text-sm text-zinc-600 dark:text-zinc-300">
|
||||
@@ -144,9 +141,9 @@
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</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="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">
|
||||
<h2 class="text-base font-semibold text-zinc-900 dark:text-zinc-100">Top-Alarme nach Unternehmen</h2>
|
||||
<ul class="mt-4 space-y-3 text-sm text-zinc-600 dark:text-zinc-300">
|
||||
@forelse ($topCompanies as $company)
|
||||
@@ -167,7 +164,7 @@
|
||||
@endforelse
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
</section>
|
||||
|
||||
<section class="grid gap-6 lg:grid-cols-3">
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -43,16 +43,16 @@ new #[Layout('components.layouts.app'), Title('Unternehmensauskunft')] class ext
|
||||
{
|
||||
$query = Company::query()
|
||||
->withCount([
|
||||
'transactions as alert_count' => fn ($transactions) => $transactions->where('requires_review', true),
|
||||
'transactions as alert_count' => fn($transactions) => $transactions->where('requires_review', true),
|
||||
])
|
||||
->withSum([
|
||||
'transactions as alert_volume' => fn ($transactions) => $transactions->where('requires_review', true),
|
||||
'transactions as alert_volume' => fn($transactions) => $transactions->where('requires_review', true),
|
||||
], 'amount')
|
||||
->withAvg([
|
||||
'transactions as alert_risk' => fn ($transactions) => $transactions->where('requires_review', true),
|
||||
'transactions as alert_risk' => fn($transactions) => $transactions->where('requires_review', true),
|
||||
], 'risk_score')
|
||||
->with([
|
||||
'transactions' => fn ($transactions) => $transactions->where('requires_review', true)->latest('executed_at')->limit(1),
|
||||
'transactions' => fn($transactions) => $transactions->where('requires_review', true)->latest('executed_at')->limit(1),
|
||||
])
|
||||
->when(
|
||||
$this->search !== '',
|
||||
@@ -76,82 +76,77 @@ new #[Layout('components.layouts.app'), Title('Unternehmensauskunft')] class ext
|
||||
}; ?>
|
||||
|
||||
@php
|
||||
$overview = $this->overview;
|
||||
/** @var \Illuminate\Support\Collection<int, \App\Models\Company> $companies */
|
||||
$overview = $this->overview;
|
||||
/** @var \Illuminate\Support\Collection<int, \App\Models\Company> $companies */
|
||||
$companies = $this->companies;
|
||||
$formatCurrency = static fn (float $value): string => number_format($value, 2, ',', '.') . ' €';
|
||||
$formatNumber = static fn ($value): string => number_format((float) $value, 0, ',', '.');
|
||||
@endphp
|
||||
@endphp
|
||||
|
||||
<div class="flex flex-col gap-8">
|
||||
<section class="rounded-3xl border border-slate-200/70 bg-white/95 p-8 shadow-sm backdrop-blur dark:border-slate-700/70 dark:bg-slate-900/90">
|
||||
<div class="flex flex-col gap-6 lg:flex-row lg:items-end lg:justify-between">
|
||||
<div class="max-w-2xl space-y-2">
|
||||
<flux:heading size="xl">{{ __('Unternehmensauskunft') }}</flux:heading>
|
||||
<flux:text>{{ __('Suchen Sie nach Unternehmensinformationen') }}</flux:text>
|
||||
<flux:text>
|
||||
{{ __('KI-gestützte Einsichten zu DAX-Unternehmen: Screening-Ergebnisse, Risikostapel und alle offenen Alerts auf einen Blick.') }}
|
||||
</flux:text>
|
||||
</div>
|
||||
<div class="w-full max-w-md">
|
||||
<flux:input
|
||||
wire:model.live.debounce.300ms="search"
|
||||
type="search"
|
||||
icon="magnifying-glass"
|
||||
placeholder="{{ __('Rechtlicher Name, Ticker oder Branche durchsuchen …') }}"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-8 grid gap-4 sm:grid-cols-2 xl:grid-cols-4">
|
||||
<div class="rounded-2xl border border-slate-200/70 bg-slate-50/90 p-5 text-sm dark:border-slate-700/70 dark:bg-slate-800/70">
|
||||
<p class="text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-300">{{ __('Unternehmen im Screening') }}</p>
|
||||
<p class="mt-2 text-2xl font-semibold text-slate-900 dark:text-white">{{ $formatNumber($overview['companies']) }}</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-emerald-400/40 bg-emerald-500/10 p-5 text-sm shadow-sm shadow-emerald-900/10">
|
||||
<p class="text-xs font-semibold uppercase tracking-wide text-emerald-800 dark:text-emerald-200">{{ __('Offene Alerts') }}</p>
|
||||
<p class="mt-2 text-2xl font-semibold text-emerald-900 dark:text-emerald-100">{{ $formatNumber($overview['open_alerts']) }}</p>
|
||||
<p class="text-xs text-emerald-700 dark:text-emerald-200">{{ __('Volumen') }} {{ $formatCurrency($overview['open_volume']) }}</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-indigo-400/40 bg-indigo-500/10 p-5 text-sm shadow-sm shadow-indigo-900/10">
|
||||
<p class="text-xs font-semibold uppercase tracking-wide text-indigo-800 dark:text-indigo-200">{{ __('Ø Risikoscore offene Fälle') }}</p>
|
||||
<p class="mt-2 text-2xl font-semibold text-indigo-900 dark:text-indigo-100">{{ $overview['avg_risk'] }}</p>
|
||||
<p class="text-xs text-indigo-700 dark:text-indigo-200">{{ __('Watchlist-Hits') }} {{ $formatNumber($overview['watchlist_hits']) }}</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-zinc-200/70 bg-zinc-50/90 p-5 text-sm dark:border-zinc-700/70 dark:bg-zinc-800/70">
|
||||
<p class="text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-300">{{ __('Automationsquote') }}</p>
|
||||
<p class="mt-2 text-2xl font-semibold text-zinc-900 dark:text-white">{{ $overview['automation_share'] }}%</p>
|
||||
<p class="text-xs text-zinc-500 dark:text-zinc-400">{{ __('Analyst:innen übernehmen nur komplexe Spezialfälle') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="grid gap-6 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]">
|
||||
<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-end justify-between gap-4">
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-zinc-900 dark:text-zinc-100">{{ __('Screening-Portfolio') }}</h2>
|
||||
<p class="text-sm text-zinc-500 dark:text-zinc-400">
|
||||
{{ __('Die relevantesten Unternehmen nach offenem Alert-Volumen — inklusive Risikokommentar und letztem Trigger.') }}
|
||||
</p>
|
||||
<div class="flex flex-col gap-8">
|
||||
<section class="rounded-3xl border border-slate-200/70 bg-white/95 p-8 shadow-sm backdrop-blur dark:border-slate-700/70 dark:bg-slate-900/90">
|
||||
<div class="flex flex-col gap-6 lg:flex-row lg:items-end lg:justify-between">
|
||||
<div class="max-w-2xl space-y-2">
|
||||
<flux:heading size="xl">{{ __('Unternehmensauskunft') }}</flux:heading>
|
||||
<flux:text>
|
||||
{{ __('Einfache Suche für Unternehmensdaten und historische Cases') }}
|
||||
</flux:text>
|
||||
</div>
|
||||
<div class="w-full max-w-md">
|
||||
<flux:input
|
||||
wire:model.live.debounce.300ms="search"
|
||||
type="search"
|
||||
icon="magnifying-glass"
|
||||
placeholder="{{ __('Rechtlicher Name, Ticker oder Branche durchsuchen …') }}" />
|
||||
</div>
|
||||
<flux:badge variant="outline">
|
||||
{{ $companies->count() }} {{ __('Treffer') }}
|
||||
</flux:badge>
|
||||
</div>
|
||||
|
||||
<div class="mt-6 space-y-4">
|
||||
@forelse ($companies as $company)
|
||||
<!-- <div class="mt-8 grid gap-4 sm:grid-cols-2 xl:grid-cols-4">
|
||||
<div class="rounded-2xl border border-slate-200/70 bg-slate-50/90 p-5 text-sm dark:border-slate-700/70 dark:bg-slate-800/70">
|
||||
<p class="text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-300">{{ __('Unternehmen im Screening') }}</p>
|
||||
<p class="mt-2 text-2xl font-semibold text-slate-900 dark:text-white">{{ $formatNumber($overview['companies']) }}</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-emerald-400/40 bg-emerald-500/10 p-5 text-sm shadow-sm shadow-emerald-900/10">
|
||||
<p class="text-xs font-semibold uppercase tracking-wide text-emerald-800 dark:text-emerald-200">{{ __('Offene Alerts') }}</p>
|
||||
<p class="mt-2 text-2xl font-semibold text-emerald-900 dark:text-emerald-100">{{ $formatNumber($overview['open_alerts']) }}</p>
|
||||
<p class="text-xs text-emerald-700 dark:text-emerald-200">{{ __('Volumen') }} {{ $formatCurrency($overview['open_volume']) }}</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-indigo-400/40 bg-indigo-500/10 p-5 text-sm shadow-sm shadow-indigo-900/10">
|
||||
<p class="text-xs font-semibold uppercase tracking-wide text-indigo-800 dark:text-indigo-200">{{ __('Ø Risikoscore offene Fälle') }}</p>
|
||||
<p class="mt-2 text-2xl font-semibold text-indigo-900 dark:text-indigo-100">{{ $overview['avg_risk'] }}</p>
|
||||
<p class="text-xs text-indigo-700 dark:text-indigo-200">{{ __('Watchlist-Hits') }} {{ $formatNumber($overview['watchlist_hits']) }}</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-zinc-200/70 bg-zinc-50/90 p-5 text-sm dark:border-zinc-700/70 dark:bg-zinc-800/70">
|
||||
<p class="text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-300">{{ __('Automationsquote') }}</p>
|
||||
<p class="mt-2 text-2xl font-semibold text-zinc-900 dark:text-white">{{ $overview['automation_share'] }}%</p>
|
||||
<p class="text-xs text-zinc-500 dark:text-zinc-400">{{ __('Analyst:innen übernehmen nur komplexe Spezialfälle') }}</p>
|
||||
</div>
|
||||
</div> -->
|
||||
</section>
|
||||
|
||||
<section class="grid gap-6">
|
||||
<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-end justify-between gap-4">
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-zinc-900 dark:text-zinc-100">{{ __('Historische Cases') }}</h2>
|
||||
</div>
|
||||
<flux:badge variant="outline">
|
||||
{{ $companies->count() }} {{ __('Treffer') }}
|
||||
</flux:badge>
|
||||
</div>
|
||||
|
||||
<div class="mt-6 space-y-4">
|
||||
@forelse ($companies as $company)
|
||||
@php
|
||||
$latestAlert = optional($company->transactions->first());
|
||||
$alertVolume = (float) ($company->alert_volume ?? 0);
|
||||
$alertCount = (int) ($company->alert_count ?? 0);
|
||||
$alertRisk = (int) round($company->alert_risk ?? 0);
|
||||
$riskBadgeClasses = match (Str::lower($company->kyc_risk_level)) {
|
||||
'high', 'hoch' => 'bg-rose-500/10 text-rose-600 dark:text-rose-300 border border-rose-500/20',
|
||||
'low', 'niedrig' => 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-300 border border-emerald-500/20',
|
||||
default => 'bg-amber-500/10 text-amber-600 dark:text-amber-300 border border-amber-500/20',
|
||||
};
|
||||
$latestAlert = optional($company->transactions->first());
|
||||
$alertVolume = (float) ($company->alert_volume ?? 0);
|
||||
$alertCount = (int) ($company->alert_count ?? 0);
|
||||
$alertRisk = (int) round($company->alert_risk ?? 0);
|
||||
$riskBadgeClasses = match (Str::lower($company->kyc_risk_level)) {
|
||||
'high', 'hoch' => 'bg-rose-500/10 text-rose-600 dark:text-rose-300 border border-rose-500/20',
|
||||
'low', 'niedrig' => 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-300 border border-emerald-500/20',
|
||||
default => 'bg-amber-500/10 text-amber-600 dark:text-amber-300 border border-amber-500/20',
|
||||
};
|
||||
@endphp
|
||||
<a href="{{ route('company.transactions', ['company' => $company->id]) }}" wire:navigate class="grid gap-4 rounded-2xl border border-zinc-200/70 bg-zinc-50/70 p-4 text-sm transition hover:-translate-y-0.5 hover:shadow-md dark:border-zinc-700/60 dark:bg-zinc-800/60 md:grid-cols-[1.4fr_1fr]">
|
||||
<div class="space-y-2">
|
||||
@@ -160,17 +155,20 @@ new #[Layout('components.layouts.app'), Title('Unternehmensauskunft')] class ext
|
||||
<p class="text-base font-semibold text-zinc-900 dark:text-zinc-100">{{ $company->legal_name ?? $company->name }}</p>
|
||||
<p class="text-xs uppercase tracking-wide text-zinc-500 dark:text-zinc-400">{{ $company->ticker }} · {{ $company->sector }}</p>
|
||||
</div>
|
||||
<span class="inline-flex items-center gap-2 rounded-full px-3 py-1 text-xs font-semibold {{ $riskBadgeClasses }}">
|
||||
<!-- <span class="inline-flex items-center gap-2 rounded-full px-3 py-1 text-xs font-semibold {{ $riskBadgeClasses }}">
|
||||
{{ __('KYC-Risiko') }}: {{ Str::title($company->kyc_risk_level) }}
|
||||
</span>
|
||||
</span> -->
|
||||
</div>
|
||||
<p class="text-xs text-zinc-500 dark:text-zinc-400">{{ $company->summary }}</p>
|
||||
<div class="flex flex-wrap gap-3 text-xs text-zinc-500 dark:text-zinc-400">
|
||||
<span class="inline-flex items-center gap-1 rounded-full bg-white/60 px-2 py-1 font-medium text-zinc-700 dark:bg-zinc-900/60 dark:text-zinc-200">
|
||||
<!-- <span class="inline-flex items-center gap-1 rounded-full bg-white/60 px-2 py-1 font-medium text-zinc-700 dark:bg-zinc-900/60 dark:text-zinc-200">
|
||||
{{ __('Alerts offen') }}: {{ $formatNumber($alertCount) }}
|
||||
</span>
|
||||
<span class="inline-flex items-center gap-1 rounded-full bg-white/60 px-2 py-1 font-medium text-zinc-700 dark:bg-zinc-900/60 dark:text-zinc-200">
|
||||
</span> -->
|
||||
<!-- <span class="inline-flex items-center gap-1 rounded-full bg-white/60 px-2 py-1 font-medium text-zinc-700 dark:bg-zinc-900/60 dark:text-zinc-200">
|
||||
{{ __('Volumen') }}: {{ $formatCurrency($alertVolume) }}
|
||||
</span> -->
|
||||
<span class="inline-flex items-center gap-1 rounded-full bg-white/60 px-2 py-1 font-medium text-zinc-700 dark:bg-zinc-900/60 dark:text-zinc-200">
|
||||
Automatisierungsscore: muss noch eingebaut werden
|
||||
</span>
|
||||
<span class="inline-flex items-center gap-1 rounded-full bg-white/60 px-2 py-1 font-medium text-zinc-700 dark:bg-zinc-900/60 dark:text-zinc-200">
|
||||
{{ __('Ø Risikoscore') }}: {{ $alertRisk }}
|
||||
@@ -180,13 +178,13 @@ new #[Layout('components.layouts.app'), Title('Unternehmensauskunft')] class ext
|
||||
<div class="space-y-3 rounded-2xl border border-zinc-200/70 bg-white/80 p-4 dark:border-zinc-700/60 dark:bg-zinc-900/70">
|
||||
<p class="text-xs font-semibold uppercase tracking-wide text-zinc-400">{{ __('Neuester Alert') }}</p>
|
||||
@if ($latestAlert)
|
||||
<div class="space-y-1">
|
||||
<p class="text-sm font-medium text-zinc-900 dark:text-zinc-100">{{ $latestAlert->counterparty }}</p>
|
||||
<p class="text-xs text-zinc-500 dark:text-zinc-400">{{ $latestAlert->executed_at?->format('d.m.Y H:i') }} · {{ $latestAlert->channel }}</p>
|
||||
<p class="text-xs text-zinc-500 dark:text-zinc-400">{{ __('Grund') }}: {{ $latestAlert->flagged_reason }}</p>
|
||||
</div>
|
||||
<div class="space-y-1">
|
||||
<p class="text-sm font-medium text-zinc-900 dark:text-zinc-100">{{ $latestAlert->counterparty }}</p>
|
||||
<p class="text-xs text-zinc-500 dark:text-zinc-400">{{ $latestAlert->executed_at?->format('d.m.Y H:i') }} · {{ $latestAlert->channel }}</p>
|
||||
<p class="text-xs text-zinc-500 dark:text-zinc-400">{{ __('Grund') }}: {{ $latestAlert->flagged_reason }}</p>
|
||||
</div>
|
||||
@else
|
||||
<p class="text-xs text-zinc-500 dark:text-zinc-400">{{ __('Keine offenen Alerts – Monitoring im grünen Bereich.') }}</p>
|
||||
<p class="text-xs text-zinc-500 dark:text-zinc-400">{{ __('Keine offenen Alerts – Monitoring im grünen Bereich.') }}</p>
|
||||
@endif
|
||||
<div class="flex flex-wrap gap-2 text-xs text-indigo-600 dark:text-indigo-300">
|
||||
<span class="inline-flex items-center gap-1 rounded-full bg-indigo-500/10 px-2 py-1">
|
||||
@@ -196,59 +194,59 @@ new #[Layout('components.layouts.app'), Title('Unternehmensauskunft')] class ext
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
@empty
|
||||
@empty
|
||||
<div class="rounded-2xl border border-dashed border-zinc-300/70 bg-white/80 p-6 text-center text-sm text-zinc-500 dark:border-zinc-600/60 dark:bg-zinc-900/60 dark:text-zinc-300">
|
||||
{{ __('Keine Unternehmen gefunden. Bitte Suchkriterien anpassen oder Seed-Daten neu laden.') }}
|
||||
</div>
|
||||
@endforelse
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<aside class="flex flex-col gap-6">
|
||||
<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">
|
||||
<h3 class="text-base font-semibold text-zinc-900 dark:text-zinc-100">{{ __('Proof-of-Concept Checks') }}</h3>
|
||||
<ul class="mt-4 space-y-3 text-sm text-zinc-600 dark:text-zinc-300">
|
||||
<li class="flex gap-3">
|
||||
<span class="mt-0.5 h-2 w-2 rounded-full bg-emerald-500"></span>
|
||||
<div>
|
||||
<p class="font-medium text-zinc-900 dark:text-zinc-100">{{ __('Adverse-Media Analyse in Echtzeit') }}</p>
|
||||
<p class="text-xs text-zinc-500 dark:text-zinc-400">{{ __('LLM-Agenten extrahieren Risikosignale aus Nachrichtenclustern und verknüpfen sie mit dem Unternehmensnetzwerk.') }}</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="flex gap-3">
|
||||
<span class="mt-0.5 h-2 w-2 rounded-full bg-indigo-500"></span>
|
||||
<div>
|
||||
<p class="font-medium text-zinc-900 dark:text-zinc-100">{{ __('Beneficial Ownership Mapping') }}</p>
|
||||
<p class="text-xs text-zinc-500 dark:text-zinc-400">{{ __('Regelmäßiger Abgleich von UBO-Graphen gegen Sanktionslisten, PEP-Register und Hochrisikoländer.') }}</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="flex gap-3">
|
||||
<span class="mt-0.5 h-2 w-2 rounded-full bg-amber-500"></span>
|
||||
<div>
|
||||
<p class="font-medium text-zinc-900 dark:text-zinc-100">{{ __('Runbook-Automatisierung') }}</p>
|
||||
<p class="text-xs text-zinc-500 dark:text-zinc-400">{{ __('Case-Workflows generieren Audit-Trails, Delegationen und Eskalationspfade automatisch.') }}</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
@endforelse
|
||||
</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">
|
||||
<h3 class="text-base font-semibold text-zinc-900 dark:text-zinc-100">{{ __('Sofortmaßnahmen (PoC)') }}</h3>
|
||||
<ul class="mt-4 space-y-2 text-sm text-zinc-600 dark:text-zinc-300">
|
||||
<li class="flex items-center justify-between gap-2 rounded-2xl bg-zinc-50/80 px-3 py-2 dark:bg-zinc-800/60">
|
||||
<span>{{ __('KYC Refresh initiiert') }}</span>
|
||||
<span class="text-xs font-semibold text-emerald-600 dark:text-emerald-300">{{ __('automatisiert') }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between gap-2 rounded-2xl bg-zinc-50/80 px-3 py-2 dark:bg-zinc-800/60">
|
||||
<span>{{ __('AI Investigations Summary') }}</span>
|
||||
<span class="text-xs font-semibold text-indigo-600 dark:text-indigo-300">{{ __('bereit in 12s') }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between gap-2 rounded-2xl bg-zinc-50/80 px-3 py-2 dark:bg-zinc-800/60">
|
||||
<span>{{ __('Case Handover an 2nd Line') }}</span>
|
||||
<span class="text-xs font-semibold text-rose-600 dark:text-rose-300">{{ __('3 Eskalationen') }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</aside>
|
||||
</section>
|
||||
</div>
|
||||
<!-- <aside class="flex flex-col gap-6">
|
||||
<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">
|
||||
<h3 class="text-base font-semibold text-zinc-900 dark:text-zinc-100">{{ __('Proof-of-Concept Checks') }}</h3>
|
||||
<ul class="mt-4 space-y-3 text-sm text-zinc-600 dark:text-zinc-300">
|
||||
<li class="flex gap-3">
|
||||
<span class="mt-0.5 h-2 w-2 rounded-full bg-emerald-500"></span>
|
||||
<div>
|
||||
<p class="font-medium text-zinc-900 dark:text-zinc-100">{{ __('Adverse-Media Analyse in Echtzeit') }}</p>
|
||||
<p class="text-xs text-zinc-500 dark:text-zinc-400">{{ __('LLM-Agenten extrahieren Risikosignale aus Nachrichtenclustern und verknüpfen sie mit dem Unternehmensnetzwerk.') }}</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="flex gap-3">
|
||||
<span class="mt-0.5 h-2 w-2 rounded-full bg-indigo-500"></span>
|
||||
<div>
|
||||
<p class="font-medium text-zinc-900 dark:text-zinc-100">{{ __('Beneficial Ownership Mapping') }}</p>
|
||||
<p class="text-xs text-zinc-500 dark:text-zinc-400">{{ __('Regelmäßiger Abgleich von UBO-Graphen gegen Sanktionslisten, PEP-Register und Hochrisikoländer.') }}</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="flex gap-3">
|
||||
<span class="mt-0.5 h-2 w-2 rounded-full bg-amber-500"></span>
|
||||
<div>
|
||||
<p class="font-medium text-zinc-900 dark:text-zinc-100">{{ __('Runbook-Automatisierung') }}</p>
|
||||
<p class="text-xs text-zinc-500 dark:text-zinc-400">{{ __('Case-Workflows generieren Audit-Trails, Delegationen und Eskalationspfade automatisch.') }}</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</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">
|
||||
<h3 class="text-base font-semibold text-zinc-900 dark:text-zinc-100">{{ __('Sofortmaßnahmen (PoC)') }}</h3>
|
||||
<ul class="mt-4 space-y-2 text-sm text-zinc-600 dark:text-zinc-300">
|
||||
<li class="flex items-center justify-between gap-2 rounded-2xl bg-zinc-50/80 px-3 py-2 dark:bg-zinc-800/60">
|
||||
<span>{{ __('KYC Refresh initiiert') }}</span>
|
||||
<span class="text-xs font-semibold text-emerald-600 dark:text-emerald-300">{{ __('automatisiert') }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between gap-2 rounded-2xl bg-zinc-50/80 px-3 py-2 dark:bg-zinc-800/60">
|
||||
<span>{{ __('AI Investigations Summary') }}</span>
|
||||
<span class="text-xs font-semibold text-indigo-600 dark:text-indigo-300">{{ __('bereit in 12s') }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between gap-2 rounded-2xl bg-zinc-50/80 px-3 py-2 dark:bg-zinc-800/60">
|
||||
<span>{{ __('Case Handover an 2nd Line') }}</span>
|
||||
<span class="text-xs font-semibold text-rose-600 dark:text-rose-300">{{ __('3 Eskalationen') }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</aside> -->
|
||||
</section>
|
||||
</div>
|
||||
@@ -226,302 +226,217 @@ Transaction::STATUS_CLEARED => [
|
||||
|
||||
$statusLegend = [
|
||||
Transaction::STATUS_TRUE_POSITIVE => [
|
||||
'title' => 'Bestätigter Treffer',
|
||||
'description' => 'Ermittlungsindikatoren bestätigen einen hinreichenden Verdacht. Fallverantwortliche Person informieren, Belege sichern und Maßnahmenplan starten.',
|
||||
'title' => 'Gruppe mit hohem Risikoscore Scorewert > 66',
|
||||
'description' => 'Wenn man draufklickt, werden alles diese Fälle angezeigt',
|
||||
'accent' => 'text-rose-500 dark:text-rose-300',
|
||||
],
|
||||
Transaction::STATUS_FALSE_POSITIVE => [
|
||||
'title' => 'Fehlalarm',
|
||||
'description' => 'Auslösung plausibel widerlegt (z. B. KYC-Daten, Geschäftslogik). Entscheidungsgrund dokumentieren und Regeloptimierung anstoßen.',
|
||||
'title' => 'Gruppe mit mittlerem Risikoscore Scorewert 33- 65',
|
||||
'description' => 'Wenn man draufklickt, werden alles diese Fälle angezeigt',
|
||||
'accent' => 'text-amber-500 dark:text-amber-200',
|
||||
],
|
||||
Transaction::STATUS_CLEARED => [
|
||||
'title' => 'Freigegeben',
|
||||
'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',
|
||||
],
|
||||
];
|
||||
$riskExplanation = 'Der Risikowert (0–100) fasst Monitoring-Regeln, KYC-Risiken, Negativmeldungen sowie Verhaltens- und Geodaten zu einer Priorität zusammen. Werte über 80 kennzeichnen Sofortmaßnahmen, 50–79 markieren erhöhte Aufmerksamkeit, alles darunter gilt als Routineprüfung.';
|
||||
@endphp
|
||||
'title' => 'Gruppe mit niedrigem Risikoscore Scorewert < 33', 'description'=> 'Wenn man draufklickt, werden alles diese Fälle angezeigt',
|
||||
'accent' => 'text-emerald-500 dark:text-emerald-300',
|
||||
],
|
||||
];
|
||||
$riskExplanation = 'Der Risikowert (0–100) fasst Monitoring-Regeln, KYC-Risiken, Negativmeldungen sowie Verhaltens- und Geodaten zu einer Priorität zusammen. Werte über 80 kennzeichnen Sofortmaßnahmen, 50–79 markieren erhöhte Aufmerksamkeit, alles darunter gilt als Routineprüfung.';
|
||||
@endphp
|
||||
|
||||
<div class="flex flex-col gap-6">
|
||||
<div class="relative overflow-hidden rounded-3xl border border-slate-200/60 bg-slate-950/95 p-8 text-white shadow-[0_30px_80px_-45px_rgba(15,23,42,0.9)] dark:border-slate-800/60">
|
||||
<span class="pointer-events-none absolute -left-24 top-1/2 aspect-square w-72 -translate-y-1/2 rounded-full bg-sky-500/15 blur-3xl"></span>
|
||||
<span class="pointer-events-none absolute -right-16 -top-16 aspect-square w-64 rounded-full bg-indigo-500/15 blur-3xl"></span>
|
||||
<div class="relative flex flex-wrap items-end justify-between gap-6">
|
||||
<div class="max-w-xl space-y-3">
|
||||
<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
|
||||
</p>
|
||||
<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">
|
||||
Überwachen Sie verdächtige Transaktionen im DAX-Portfolio, priorisieren Sie Alarme und orchestrieren Sie das manuelle Review im Vier-Augen-Prozess.
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-4 text-sm sm:text-base md:grid-cols-4">
|
||||
<div class="rounded-2xl border border-white/10 bg-white/10 p-4 text-center backdrop-blur-sm shadow-lg shadow-slate-900/30">
|
||||
<p class="text-xs font-medium uppercase tracking-wide text-slate-200">Gesamtfälle</p>
|
||||
<p class="text-2xl font-semibold text-white">{{ $total['count'] }}</p>
|
||||
<p class="mt-1 text-xs text-slate-300">Volumen: {{ $formatAmount($total['amount']) }}</p>
|
||||
<div class="flex flex-col gap-6">
|
||||
<div class="relative overflow-hidden rounded-3xl border border-slate-200/60 bg-slate-950/95 p-8 text-white shadow-[0_30px_80px_-45px_rgba(15,23,42,0.9)] dark:border-slate-800/60">
|
||||
<span class="pointer-events-none absolute -left-24 top-1/2 aspect-square w-72 -translate-y-1/2 rounded-full bg-sky-500/15 blur-3xl"></span>
|
||||
<span class="pointer-events-none absolute -right-16 -top-16 aspect-square w-64 rounded-full bg-indigo-500/15 blur-3xl"></span>
|
||||
<div class="relative flex flex-wrap items-end justify-between gap-6">
|
||||
<div class="max-w-xl space-y-3">
|
||||
<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">
|
||||
Anti Financial Crime - Cases
|
||||
</p>
|
||||
<h1 class="text-2xl font-semibold tracking-tight sm:text-3xl">Übersicht Verdachtsfälle nach Automatisierung- und Risikoscore</h1>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-rose-400/40 bg-rose-500/15 p-4 text-center backdrop-blur-sm shadow-lg shadow-rose-900/40">
|
||||
<p class="text-xs font-medium uppercase tracking-wide text-rose-50">Bestätigte Treffer</p>
|
||||
<p class="text-2xl font-semibold text-rose-100">{{ $confirmed['count'] }}</p>
|
||||
<p class="mt-1 text-xs text-rose-100/80">Volumen: {{ $formatAmount($confirmed['amount']) }}</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-amber-400/40 bg-amber-400/15 p-4 text-center backdrop-blur-sm shadow-lg shadow-amber-900/30">
|
||||
<p class="text-xs font-medium uppercase tracking-wide text-amber-50">Fehlalarme</p>
|
||||
<p class="text-2xl font-semibold text-amber-100">{{ $falseAlarm['count'] }}</p>
|
||||
<p class="mt-1 text-xs text-amber-100/80">Volumen: {{ $formatAmount($falseAlarm['amount']) }}</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-emerald-400/40 bg-emerald-400/15 p-4 text-center backdrop-blur-sm shadow-lg shadow-emerald-900/30">
|
||||
<p class="text-xs font-medium uppercase tracking-wide text-emerald-50">Freigegeben</p>
|
||||
<p class="text-2xl font-semibold text-emerald-100">{{ $cleared['count'] }}</p>
|
||||
<p class="mt-1 text-xs text-emerald-100/80">Volumen: {{ $formatAmount($cleared['amount']) }}</p>
|
||||
<div class="grid grid-cols-2 gap-4 text-sm sm:text-base md:grid-cols-4">
|
||||
<div class="rounded-2xl border border-white/10 bg-white/10 p-4 text-center backdrop-blur-sm shadow-lg shadow-slate-900/30">
|
||||
<p class="text-xs font-medium uppercase tracking-wide text-slate-200">Gesamtfälle</p>
|
||||
<p class="text-2xl font-semibold text-white">{{ $total['count'] }}</p>
|
||||
<p class="mt-1 text-xs text-slate-300">Volumen: {{ $formatAmount($total['amount']) }}</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-rose-400/40 bg-rose-500/15 p-4 text-center backdrop-blur-sm shadow-lg shadow-rose-900/40">
|
||||
<p class="text-xs font-medium uppercase tracking-wide text-rose-50">Bestätigte Treffer</p>
|
||||
<p class="text-2xl font-semibold text-rose-100">{{ $confirmed['count'] }}</p>
|
||||
<p class="mt-1 text-xs text-rose-100/80">Volumen: {{ $formatAmount($confirmed['amount']) }}</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-amber-400/40 bg-amber-400/15 p-4 text-center backdrop-blur-sm shadow-lg shadow-amber-900/30">
|
||||
<p class="text-xs font-medium uppercase tracking-wide text-amber-50">Fehlalarme</p>
|
||||
<p class="text-2xl font-semibold text-amber-100">{{ $falseAlarm['count'] }}</p>
|
||||
<p class="mt-1 text-xs text-amber-100/80">Volumen: {{ $formatAmount($falseAlarm['amount']) }}</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-emerald-400/40 bg-emerald-400/15 p-4 text-center backdrop-blur-sm shadow-lg shadow-emerald-900/30">
|
||||
<p class="text-xs font-medium uppercase tracking-wide text-emerald-50">Freigegeben</p>
|
||||
<p class="text-2xl font-semibold text-emerald-100">{{ $cleared['count'] }}</p>
|
||||
<p class="mt-1 text-xs text-emerald-100/80">Volumen: {{ $formatAmount($cleared['amount']) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<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)
|
||||
<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">
|
||||
<span class="inline-flex h-2.5 w-2.5 rounded-full bg-gradient-to-r @class([
|
||||
<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)
|
||||
<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">
|
||||
<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-amber-400 to-amber-300' => $key === Transaction::STATUS_FALSE_POSITIVE,
|
||||
'from-emerald-400 to-emerald-300' => $key === Transaction::STATUS_CLEARED,
|
||||
])"></span>
|
||||
<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>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between">
|
||||
<div class="space-y-1">
|
||||
<h2 class="text-xl font-semibold text-zinc-900 dark:text-zinc-100">Aktive Prüfwarteschlange</h2>
|
||||
<p class="text-sm text-zinc-500 dark:text-zinc-400">
|
||||
Alle untenstehenden Meldungen benötigen eine finale Analystenentscheidung.
|
||||
</p>
|
||||
</div>
|
||||
<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">
|
||||
@foreach ($this->statusOptions as $value => $label)
|
||||
<option value="{{ $value }}">{{ $label }}</option>
|
||||
@endforeach
|
||||
</flux:select>
|
||||
<flux:input
|
||||
wire:model.live.debounce.400ms="search"
|
||||
type="search"
|
||||
placeholder="Unternehmen, Gegenpartei oder Referenz suchen …"
|
||||
class="w-full sm:w-80"
|
||||
icon="magnifying-glass" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid gap-6 lg:grid-cols-[minmax(0,2.1fr)_minmax(0,1fr)]">
|
||||
<div class="overflow-hidden rounded-3xl border border-zinc-200/70 bg-white/95 shadow-sm backdrop-blur dark:border-zinc-700/70 dark:bg-zinc-900/90">
|
||||
<div class="hidden border-b border-zinc-200/70 bg-zinc-50/80 px-6 py-3 text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:border-zinc-700/60 dark:bg-zinc-900/70 dark:text-zinc-400 sm:grid sm:grid-cols-[1.6fr_1fr_0.7fr]">
|
||||
<span>Unternehmen & Gegenpartei</span>
|
||||
<span>Kanal & Referenz</span>
|
||||
<span class="text-right">Betrag</span>
|
||||
</div>
|
||||
|
||||
<div class="divide-y divide-zinc-200/60 dark:divide-zinc-700/70">
|
||||
@forelse ($transactions as $transaction)
|
||||
@php
|
||||
$selectedState = $transaction->id === $this->selectedTransactionId;
|
||||
$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]',
|
||||
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-400/70',
|
||||
];
|
||||
|
||||
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]';
|
||||
} 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';
|
||||
}
|
||||
@endphp
|
||||
<button
|
||||
wire:click="selectTransaction({{ $transaction->id }})"
|
||||
type="button"
|
||||
class="{{ implode(' ', $buttonClasses) }}"
|
||||
aria-pressed="{{ $selectedState ? 'true' : 'false' }}">
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-start justify-between gap-3">
|
||||
<div>
|
||||
<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 }} · {{ $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>
|
||||
|
||||
<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.
|
||||
<p class="text-xl font-semibold {{ $legend['accent'] }}">{{ $legend['title'] }}</p>
|
||||
</div>
|
||||
@endforelse
|
||||
</div>
|
||||
|
||||
@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">
|
||||
<button
|
||||
wire:click="previousPage"
|
||||
wire:loading.attr="disabled"
|
||||
@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"
|
||||
>
|
||||
‹ Zurück
|
||||
</button>
|
||||
<span class="text-xs font-medium uppercase tracking-wide text-zinc-500 dark:text-zinc-400">
|
||||
Seite {{ $transactions->currentPage() }} von {{ $transactions->lastPage() }}
|
||||
</span>
|
||||
<button
|
||||
wire:click="nextPage"
|
||||
wire:loading.attr="disabled"
|
||||
@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"
|
||||
>
|
||||
Weiter ›
|
||||
</button>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="space-y-4">
|
||||
@if ($selected)
|
||||
@php
|
||||
$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',
|
||||
];
|
||||
$summaryText = implode(' ', $statusSummaryPhrases[$selected->status] ?? ['Status gemäß aktuellem Prüfpfad.']);
|
||||
@endphp
|
||||
|
||||
<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">
|
||||
<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">
|
||||
{{ $selected->statusLabel() }}
|
||||
</span>
|
||||
</div>
|
||||
<p class="mt-3 text-base font-medium leading-relaxed">
|
||||
{{ $summaryText }}
|
||||
<p class="text-sm leading-relaxed text-zinc-600 dark:text-zinc-300">
|
||||
{{ $legend['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
@endforeach
|
||||
</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 class="flex flex-col items-end gap-2">
|
||||
<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 class="flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between">
|
||||
<div class="space-y-1">
|
||||
<h2 class="text-xl font-semibold text-zinc-900 dark:text-zinc-100">Aktive Prüfwarteschlange</h2>
|
||||
<p class="text-sm text-zinc-500 dark:text-zinc-400">
|
||||
Alle untenstehenden Meldungen benötigen eine finale Analystenentscheidung.
|
||||
</p>
|
||||
</div>
|
||||
<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">
|
||||
@foreach ($this->statusOptions as $value => $label)
|
||||
<option value="{{ $value }}">{{ $label }}</option>
|
||||
@endforeach
|
||||
</flux:select>
|
||||
<flux:input
|
||||
wire:model.live.debounce.400ms="search"
|
||||
type="search"
|
||||
placeholder="Unternehmen, Gegenpartei oder Referenz suchen …"
|
||||
class="w-full sm:w-80"
|
||||
icon="magnifying-glass" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid gap-6 lg:grid-cols-[minmax(0,2.1fr)_minmax(0,1fr)]">
|
||||
<div class="overflow-hidden rounded-3xl border border-zinc-200/70 bg-white/95 shadow-sm backdrop-blur dark:border-zinc-700/70 dark:bg-zinc-900/90">
|
||||
<div class="hidden border-b border-zinc-200/70 bg-zinc-50/80 px-6 py-3 text-xs font-semibold uppercase tracking-wide text-zinc-500 dark:border-zinc-700/60 dark:bg-zinc-900/70 dark:text-zinc-400 sm:grid sm:grid-cols-[1.6fr_1fr_0.7fr]">
|
||||
<span>Unternehmen & Gegenpartei</span>
|
||||
<span>Transaktionstyp & Referenznummer</span>
|
||||
<span class="text-right">Betrag</span>
|
||||
</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 & 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>
|
||||
<div class="divide-y divide-zinc-200/60 dark:divide-zinc-700/70">
|
||||
@forelse ($transactions as $transaction)
|
||||
@php
|
||||
$selectedState = $transaction->id === $this->selectedTransactionId;
|
||||
$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]',
|
||||
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-400/70',
|
||||
];
|
||||
|
||||
@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') }} · {{ data_get($signal, 'value') }}
|
||||
</span>
|
||||
@endforeach
|
||||
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]';
|
||||
} 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';
|
||||
}
|
||||
@endphp
|
||||
<button
|
||||
wire:click="selectTransaction({{ $transaction->id }})"
|
||||
type="button"
|
||||
class="{{ implode(' ', $buttonClasses) }}"
|
||||
aria-pressed="{{ $selectedState ? 'true' : 'false' }}">
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-start justify-between gap-3">
|
||||
<div>
|
||||
<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 }} · {{ $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>
|
||||
|
||||
<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
|
||||
</div>
|
||||
|
||||
@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">
|
||||
<button
|
||||
wire:click="previousPage"
|
||||
wire:loading.attr="disabled"
|
||||
@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"
|
||||
>
|
||||
‹ Zurück
|
||||
</button>
|
||||
<span class="text-xs font-medium uppercase tracking-wide text-zinc-500 dark:text-zinc-400">
|
||||
Seite {{ $transactions->currentPage() }} von {{ $transactions->lastPage() }}
|
||||
</span>
|
||||
<button
|
||||
wire:click="nextPage"
|
||||
wire:loading.attr="disabled"
|
||||
@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"
|
||||
>
|
||||
Weiter ›
|
||||
</button>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<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.' }}
|
||||
<div class="space-y-4">
|
||||
@if ($selected)
|
||||
@php
|
||||
$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',
|
||||
];
|
||||
$summaryText = implode(' ', $statusSummaryPhrases[$selected->status] ?? ['Status gemäß aktuellem Prüfpfad.']);
|
||||
@endphp
|
||||
|
||||
<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">
|
||||
<span class="text-xs font-semibold uppercase tracking-wide">Analyseergebnisse Summary</span>
|
||||
</div>
|
||||
<p class="mt-3 text-base font-medium leading-relaxed">
|
||||
{{ $summaryText }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="mt-4 flex justify-end">
|
||||
</br>
|
||||
<flux:link
|
||||
:href="route('company.transactions', ['company' => $selected->company_id, 'transaction' => $selected->id])"
|
||||
wire:navigate
|
||||
@@ -530,44 +445,130 @@ $riskExplanation = 'Der Risikowert (0–100) fasst Monitoring-Regeln, KYC-Risike
|
||||
<flux:icon name="arrow-top-right-on-square" class="h-4 w-4" />
|
||||
</flux:link>
|
||||
</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">
|
||||
<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">
|
||||
<li class="flex items-center justify-between">
|
||||
<span>Rechtlicher Name</span>
|
||||
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->legal_name }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between">
|
||||
<span>Ticker</span>
|
||||
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->ticker }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between">
|
||||
<span>Sektor</span>
|
||||
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->sector }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between">
|
||||
<span>Hauptsitz</span>
|
||||
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->headquarters }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between">
|
||||
<span>Land</span>
|
||||
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->country }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between">
|
||||
<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">
|
||||
{{ Str::title($selected->company->kyc_risk_level) }}
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
<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 class="flex flex-col items-end gap-2">
|
||||
<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">Transaktionstyp & Referenznummer</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 aus dem AML-Vorsystem</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') }} · {{ 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 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">Kerndaten Unternehmen</h4>
|
||||
<ul class="mt-4 space-y-3 text-sm text-zinc-600 dark:text-zinc-300">
|
||||
<li class="flex items-center justify-between">
|
||||
<span>Rechtlicher Name</span>
|
||||
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->legal_name }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between">
|
||||
<span>Ticker</span>
|
||||
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->ticker }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between">
|
||||
<span>Sektor</span>
|
||||
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->sector }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between">
|
||||
<span>Hauptsitz</span>
|
||||
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->headquarters }}</span>
|
||||
</li>
|
||||
<li class="flex items-center justify-between">
|
||||
<span>Land</span>
|
||||
<span class="font-medium text-zinc-900 dark:text-zinc-100">{{ $selected->company->country }}</span>
|
||||
</li>
|
||||
<!-- <li class="flex items-center justify-between">
|
||||
<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">
|
||||
{{ Str::title($selected->company->kyc_risk_level) }}
|
||||
</span>
|
||||
</li> -->
|
||||
</ul>
|
||||
</div>
|
||||
@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">
|
||||
Wählen Sie links einen Alarm aus, um den vollständigen Prüfkontext einzusehen.
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
@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">
|
||||
Wählen Sie links einen Alarm aus, um den vollständigen Prüfkontext einzusehen.
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user