label('Setujui') ->icon('heroicon-o-check-circle') ->color('success') ->requiresConfirmation() ->visible(fn () => $this->record->status === 'pending' && ! $this->record->items()->where('user_id', auth()->id())->exists()) ->form([Textarea::make('notes')->label('Catatan')->rows(2)]) ->action(function (array $data): void { ApprovalItem::create([ 'approval_id' => $this->record->id, 'user_id' => auth()->id(), 'decision' => 'approve', 'notes' => $data['notes'] ?? null, ]); $count = $this->record->items()->where('decision', 'approve')->count(); if ($count >= $this->record->required_approvals) { $this->record->update(['status' => 'approved']); } $this->refreshFormData([]); }), Action::make('reject') ->label('Tolak') ->icon('heroicon-o-x-circle') ->color('danger') ->visible(fn () => $this->record->status === 'pending' && ! $this->record->items()->where('user_id', auth()->id())->exists()) ->form([Textarea::make('notes')->label('Alasan Penolakan')->required()->rows(2)]) ->action(function (array $data): void { ApprovalItem::create([ 'approval_id' => $this->record->id, 'user_id' => auth()->id(), 'decision' => 'reject', 'notes' => $data['notes'], ]); $this->record->update(['status' => 'rejected']); $this->refreshFormData([]); }), ]; } public function infolist(Schema $infolist): Schema { $record = $this->record; $subject = $record->approvable; $label = class_basename($record->model_type); return $infolist->schema([ Section::make('Yang Dimintakan Persetujuan')->schema([ TextEntry::make('model_type')->label('Tipe') ->state($label), TextEntry::make('subject_title')->label('Judul / Deskripsi') ->state(match (true) { $subject instanceof \App\Models\CashRecord => "{$subject->description} — Rp " . number_format($subject->amount, 0, ',', '.'), $subject instanceof \App\Models\Activity => $subject->title, default => "#{$record->model_id}", }), TextEntry::make('status')->badge() ->color(fn ($state) => match ($state) { 'approved' => 'success', 'rejected' => 'danger', default => 'warning', }), TextEntry::make('required_approvals')->label('Persetujuan Dibutuhkan'), ])->columns(2), Section::make('Riwayat Keputusan')->schema([ TextEntry::make('decisions') ->label('') ->state(function () use ($record): string { if ($record->items->isEmpty()) return 'Belum ada keputusan.'; return $record->items->map(fn ($item) => "• {$item->user->name}: " . ($item->decision === 'approve' ? '✓ Setuju' : '✗ Tolak') . ($item->notes ? " — {$item->notes}" : '') )->join("\n"); }) ->columnSpanFull(), ]), ]); } }