@php $typeBadge = match ($typeColor) { 'warning' => 'warning', 'success' => 'success', default => 'neutral', }; // Warna status di-drive enum WithdrawalStatus::color() (palet x-ui.badge). $statusBadge = $withdrawal->status->color(); // State machine view: draft → acc → cair (atau ditolak). State per langkah // dihitung dari timestamp (approved_at/disbursed_at) agar tahan urutan. $status = $withdrawal->status; $rejected = $status === \App\Enums\WithdrawalStatus::Ditolak; $accDone = $withdrawal->approved_at !== null; $cairDone = $withdrawal->disbursed_at !== null; $steps = [ [ 'label' => 'Diajukan', 'desc' => 'Pengajuan dibuat sebagai draft.', 'icon' => 'document', 'state' => 'done', 'time' => $withdrawal->created_at, 'who' => $withdrawal->recordedBy?->name, ], [ 'label' => 'Disetujui (ACC)', 'desc' => 'Mata kedua sebelum dana keluar.', 'icon' => 'check', 'state' => $accDone ? 'done' : ($status === \App\Enums\WithdrawalStatus::Draft && !$rejected ? 'current' : 'upcoming'), 'time' => $withdrawal->approved_at, 'who' => $withdrawal->approvedBy?->name, ], [ 'label' => 'Dana Cair', 'desc' => 'Saldo anggota berkurang.', 'icon' => 'banknotes', 'state' => $cairDone ? 'done' : ($status === \App\Enums\WithdrawalStatus::Acc && !$rejected ? 'current' : 'upcoming'), 'time' => $withdrawal->disbursed_at, 'who' => null, ], ]; $node = [ 'done' => ['ring' => 'bg-success text-white', 'line' => 'bg-success', 'label' => 'text-text'], 'current' => [ 'ring' => 'border-2 border-primary bg-primary/10 text-primary', 'line' => 'bg-border', 'label' => 'text-text', ], 'upcoming' => [ 'ring' => 'border-2 border-border bg-surface text-muted', 'line' => 'bg-border', 'label' => 'text-muted', ], ]; @endphp
{{-- Back --}} Kembali ke daftar {{-- Header --}}
{{ $withdrawal->withdrawal_number }} {{ $typeLabel }} {{ $statusLabel }} @if ($withdrawal->is_reversal) Reversal @endif

{{ $withdrawal->member?->full_name ?? '—' }}

{{ $withdrawal->member?->member_number }}

{{-- Tombol yang pasti ditolak tidak ditampilkan. Sebabnya dijelaskan di panel bawah, bukan lewat notifikasi setelah tombol ditekan. --}} @if ($this->canApprove($withdrawal) && (!$scheduleBlock || $canBypassSchedule)) Setujui (ACC) @endif @if ($this->canDisburse($withdrawal) && (!$scheduleBlock || $canBypassSchedule)) Cairkan Dana @endif @if ($this->canReject($withdrawal)) Tolak @endif @if ($this->canReverse($withdrawal)) Reversal @endif
{{-- Halangan jadwal Tabungan Berjangka. Menetap di halaman: pengurus yang membukanya seminggu kemudian tetap menemukan alasannya, dan tak perlu menekan tombol untuk mengetahui bahwa ia akan ditolak. --}} @if ($scheduleBlock) !$canBypassSchedule, 'border-l-warning' => $canBypassSchedule, ])>
!$canBypassSchedule, 'bg-warning/10 text-warning' => $canBypassSchedule, ])>

{{ $canBypassSchedule ? 'Di luar jadwal — pencairan akan dicatat sebagai pengecualian' : 'Belum waktunya dicairkan' }}

{{ $scheduleBlock['pesan'] }}

@if ($canBypassSchedule)

Kamu memegang izin melewati jadwal. Bila diteruskan, pencairan ini tercatat di Log Aktivitas sebagai Pencairan di Luar Jadwal beserta alasannya.

@else

Pengajuan ini tidak dapat disetujui maupun dicairkan sampai jadwalnya terbuka. Bila anggota sudah keluar atau meninggal, perbarui statusnya lebih dulu — keduanya dikecualikan dari jadwal.

@endif
@endif
{{-- KIRI: nominal + rincian --}}

{{ $withdrawal->is_reversal ? 'Nominal Dikoreksi' : 'Nominal Pencairan' }}

{{ $withdrawal->is_reversal ? '+' : '−' }}Rp {{ number_format((float) ($isRefund && !$withdrawal->is_reversal ? $refundTotal : $withdrawal->amount), 0, ',', '.') }}

@if ($isRefund && !$withdrawal->is_reversal)

SWP Rp {{ number_format((float) $refundSwp, 0, ',', '.') }} · Tab. Berjangka Rp {{ number_format((float) $refundTab, 0, ',', '.') }}

@endif
Tanggal Pengajuan
{{ $withdrawal->withdrawal_date?->translatedFormat('d M Y') }}
Jenis Pencairan
{{ \App\Filament\Resources\SavingsWithdrawalResource::DISBURSEMENT_METHODS[$withdrawal->disbursement_method] ?? '—' }}
@if ($withdrawal->disbursement_method === 'transfer')
Rekening Tujuan
@if (filled($withdrawal->member?->payroll_account_number)) {{ $withdrawal->member->bank_name ?: 'Bank —' }} {{ $withdrawal->member->payroll_account_number }} @else Belum ada data rekening anggota. @endif
@endif
Tahun Program
{{ $withdrawal->period_year ?: '—' }}
OPD / Instansi
{{ $withdrawal->member?->agency?->agency_name ?? '—' }}
Diajukan Oleh
{{ $withdrawal->recordedBy?->name ?? '—' }}
Dicatat Pada
{{ $withdrawal->created_at?->translatedFormat('d M Y · H.i') }} WIB
Disetujui Oleh
{{ $withdrawal->approvedBy?->name ?? '—' }}
@if ($withdrawal->is_reversal && $withdrawal->reversalOf) @endif
Catatan
{{ $withdrawal->notes ?: '—' }}
{{-- KANAN: workflow stepper + audit --}}
{{-- Workflow stepper --}}

Alur Pencairan

@if ($rejected)
Pengajuan ini ditolak dan bersifat final. Saldo tidak berubah.
@endif
    @foreach ($steps as $i => $step) @php($n = $node[$step['state']])
  1. {{-- Garis penghubung --}} @unless ($loop->last) @endunless {{-- Node --}} @if ($step['state'] === 'done') @else @endif {{-- Konten --}}

    {{ $step['label'] }}

    @if ($step['state'] === 'current') Menunggu @endif

    {{ $step['desc'] }}

    @if ($step['time'])

    {{ $step['time']->translatedFormat('d M Y · H.i') }} WIB{{ $step['who'] ? ' · ' . $step['who'] : '' }}

    @endif
  2. @endforeach
{{-- Audit Trail --}}

Audit Trail

Klik untuk detail
@include('livewire.master.partials.audit-trail')
{{-- Modal: Konfirmasi transisi --}} @php($meta = $this->confirmMeta())
{{-- Modal: Reversal --}}