simedkom/app/Filament/Pages/AdminVerification/Actions/Concerns/CanProcessReview.php

114 lines
4.2 KiB
PHP

<?php
namespace App\Filament\Pages\AdminVerification\Actions\Concerns;
use App\Enums\DecisionAdmin;
use App\Enums\VerificationStatus;
use App\Filament\Pages\Verification;
use App\Filament\Support\CheerfulNotification;
use App\Models\VerificationRequest;
use App\Models\VerificationReview;
use App\Notifications\BroadcastNotification;
use Filament\Actions\Action;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
trait CanProcessReview
{
protected function processReview(int $requestId, DecisionAdmin $decision, ?string $note): void
{
$verificationRequest = VerificationRequest::with(['company.partnerMedia.journalists'])->find($requestId);
if (! $verificationRequest) {
CheerfulNotification::danger(
'Belum ketemu nih 🙌',
'Data verifikasi belum kami temukan. Coba sebentar lagi, ya.',
)
->send();
return;
}
try {
DB::beginTransaction();
// Create review record
VerificationReview::create([
'verification_request_id' => $verificationRequest->id,
'reviewer_id' => auth()->id(),
'decision' => $decision,
'note' => $note,
]);
// Update verification request status
$newStatus = match ($decision) {
DecisionAdmin::APPROVED => VerificationStatus::APPROVED,
DecisionAdmin::NEED_REVISION => VerificationStatus::NEED_REVISION,
DecisionAdmin::REJECTED => VerificationStatus::REJECTED,
};
$verificationRequest->update([
'status' => $newStatus,
]);
DB::commit();
$actionLabel = match ($decision) {
DecisionAdmin::APPROVED => 'disetujui',
DecisionAdmin::NEED_REVISION => 'diminta revisi',
DecisionAdmin::REJECTED => 'ditolak',
};
CheerfulNotification::success(
'Berhasil Diproses! ✨',
"Mantap! Verifikasi telah {$actionLabel} dan notifikasi sudah dikirim ke pengguna. Kerja bagus, Admin! 💪"
)
->send();
// Notify User
$partnerUser = $verificationRequest->company?->user;
if ($partnerUser) {
$statusTitle = match ($decision) {
DecisionAdmin::APPROVED => 'Horee! Verifikasi Disetujui 🎉',
DecisionAdmin::NEED_REVISION => 'Yah, Ada Yang Perlu Direvisi nih 📝',
DecisionAdmin::REJECTED => 'Maaf, Verifikasi Ditolak 😔',
};
$body = match ($decision) {
DecisionAdmin::APPROVED => 'Yeay! Pengajuan verifikasi perusahaan Anda telah disetujui. Sekarang Anda sudah resmi terverifikasi dan bekerja sama dengan kami! 🎊',
DecisionAdmin::NEED_REVISION => 'Ayo sedikit lagi! Admin meminta beberapa perbaikan pada pengajuan Anda agar bisa segera disetujui. 💪',
DecisionAdmin::REJECTED => 'Yah, maaf banget... pengajuan verifikasi perusahaan Anda belum bisa kami terima saat ini. 💔',
};
if ($note) {
$body .= "\n\nCatatan Admin: {$note}";
}
$partnerUser->notify(new BroadcastNotification([
'title' => $statusTitle,
'body' => $body,
'action' => [
Action::make('view')
->label('Lihat')
->url(Verification::getUrl()),
],
]));
}
} catch (\Throwable $e) {
DB::rollBack();
Log::error('Verification processing failed', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
'request_id' => $requestId,
'decision' => $decision->value,
]);
CheerfulNotification::danger(
'Terjadi Kesalahan ⚠️',
'Proses verifikasi gagal karena kesalahan sistem. Tim kami sudah mencatat masalah ini. Silakan coba lagi nanti.',
)
->send();
}
}
}