@extends('admin.layouts.app') @section('title', $notification->title . ' — ' . __('admin.notification_center.title')) @section('page_title', __('admin.notification_center.title')) @php use App\Models\AdminNotification; $statusMeta = [ AdminNotification::STATUS_DRAFT => ['fg' => '#475569', 'bg' => '#f1f5f9'], AdminNotification::STATUS_SENDING => ['fg' => '#9a3412', 'bg' => '#ffedd5'], AdminNotification::STATUS_SENT => ['fg' => '#047857', 'bg' => '#ecfdf5'], AdminNotification::STATUS_PARTIAL => ['fg' => '#92400e', 'bg' => '#fef3c7'], AdminNotification::STATUS_FAILED => ['fg' => '#b91c1c', 'bg' => '#fef2f2'], ]; $sm = $statusMeta[$notification->status] ?? $statusMeta['draft']; @endphp @push('styles') @endpush @section('content') {{ __('admin.notification_center.back') }} @include('admin.partials.flash')
{{-- ── Summary ── --}}

{{ __('admin.notification_center.summary') }}

{{ __('admin.notification_center.status.' . $notification->status) }}
{{ __('admin.notification_center.col.channels') }} @forelse (($notification->channels ?: []) as $c) {{ __('admin.notification_center.channels.' . $c) }} @empty {{ __('admin.notification_center.errors.no_channels') }} @endforelse
{{ __('admin.notification_center.col.audience') }} {{ __('admin.notification_center.recipients_count', ['count' => $audienceTotal]) }}
{{ __('admin.notification_center.groups') }} @foreach ($notification->groups as $g) {{ $g->name }} @endforeach
@if ($notification->scheduled_at) @php $schedTz = $notification->timezone ?: 'UTC'; @endphp
{{ __('admin.notification_center.scheduled_for') }} {{ $notification->scheduled_at->copy()->setTimezone($schedTz)->format('Y-m-d H:i') }} ({{ $schedTz }})
@endif @if ($notification->sent_at)
{{ __('admin.notification_center.sent_at') }} {{ $notification->sent_at->format('Y-m-d H:i') }}
@endif
@if (filled($notification->email_subject) || filled($notification->email_body))
{{ __('admin.notification_center.channels.email') }} @if (filled($notification->email_subject))
{{ $notification->email_subject }}
@endif
{!! nl2br(e(strip_tags($notification->email_body ?? ''))) !!}
@endif @if (filled($notification->sms_body))
{{ __('admin.notification_center.channels.sms') }}
{{ $notification->sms_body }}
@endif @if (filled($notification->whatsapp_template_id))
{{ __('admin.notification_center.channels.whatsapp') }}
{{ $notification->whatsapp_template_id }}
@endif
@php $ncSendBtn = ''; @endphp @if ($notification->isDraft())
@csrf @method('DELETE')
{{ __('admin.actions.edit') }}
@csrf
@elseif ($notification->isScheduled()) {{-- Pending scheduled broadcast: editable, cancellable, and can be sent earlier — all reuse the same engine + atomic claim. --}} {{ __('admin.actions.edit') }}
@csrf
@csrf
@csrf
@elseif ($notification->isCancelled()) {{-- Cancelled: read-only; duplicate to send again. --}}
@csrf
@else
@csrf
{{-- SAME Smart-Retry modal + planner + dry-run used by Demo pages (the shared component). Automation-only filters are hidden because a broadcast is a single source targeting investors. --}} @endif
{{-- ── Delivery stats (only once sent) ── --}} @if ($stats)

{{ __('admin.notification_center.delivery') }}

{{ $stats['targeted'] }}
{{ __('admin.notification_center.stats.targeted') }}
{{ $stats['delivered'] }}
{{ __('admin.notification_center.stats.delivered') }}
{{ $stats['partial'] }}
{{ __('admin.notification_center.stats.partial') }}
{{ $stats['failed'] }}
{{ __('admin.notification_center.stats.failed') }}
{{ $stats['pending'] }}
{{ __('admin.notification_center.stats.pending') }}
@foreach (($stats['channels'] ?? []) as $channel => $counts) @php $total = max(1, array_sum($counts)); $sent = $counts['sent'] ?? 0; $failed = $counts['failed'] ?? 0; $notSent = $counts['not_sent'] ?? 0; @endphp
{{ __('admin.notification_center.channels.' . $channel) }}
✓ {{ $sent }} {{ __('admin.notification_center.stats.delivered') }} ✕ {{ $failed }} {{ __('admin.notification_center.stats.failed') }} • {{ $notSent }} {{ __('admin.notification_center.stats.pending') }}
@endforeach

{{ __('admin.notification_center.stats.hint') }}

@endif {{-- ── Recipients (per-recipient × channel delivery, from the shared log) ── --}} @if (! $notification->isDraft()) @php $logStatusMeta = [ 'sent' => ['#047857', '#ecfdf5'], 'delivered' => ['#047857', '#ecfdf5'], 'read' => ['#047857', '#ecfdf5'], 'pending' => ['#475569', '#f1f5f9'], 'failed' => ['#b91c1c', '#fef2f2'], 'undelivered' => ['#b91c1c', '#fef2f2'], 'permanently_failed' => ['#b91c1c', '#fef2f2'], ]; @endphp

{{ __('admin.notification_center.recipients_heading') }}

@if ($recipients->isEmpty())
{{ __('admin.notification_center.recipients_empty') }}
@else
@foreach ($recipients as $log) @php $lm = $logStatusMeta[$log->status] ?? $logStatusMeta['pending']; @endphp @endforeach
{{ __('admin.notification_center.recipients_table.investor') }} {{ __('admin.notification_center.recipients_table.channel') }} {{ __('admin.notification_center.recipients_table.status') }} {{ __('admin.notification_center.recipients_table.sent_at') }} {{ __('admin.notification_center.recipients_table.error') }} {{ __('admin.notification_center.recipients_table.retries') }}
{{ optional($log->recipient)->display_name ?? $log->address ?? '—' }} {{ __('admin.notification_center.channels.' . $log->channel) }} {{ $log->status }} {{ $log->sent_at?->format('Y-m-d H:i') ?? '—' }} {{ $log->error ? \Illuminate\Support\Str::limit($log->error, 80) : '—' }} {{ (int) $log->attempt_count }}
@if ($recipients->count() >= 500)
{{ __('admin.notification_center.recipients_capped') }}
@endif @endif
@endif {{-- ── Audience preview (draft) ── --}} @if ($notification->isDraft() && $audiencePreview->isNotEmpty())

{{ __('admin.notification_center.audience_preview') }}

@foreach ($audiencePreview as $inv) {{ $inv->display_name ?? $inv->email }} @endforeach @if ($audienceTotal > $audiencePreview->count()) +{{ $audienceTotal - $audiencePreview->count() }} @endif
@endif
@endsection