simedkom/app/Filament/Resources/Manage/Cooperations/Actions/Cooperation/CompleteCooperationAction.php

74 lines
3.4 KiB
PHP

<?php
namespace App\Filament\Resources\Manage\Cooperations\Actions\Cooperation;
use App\Enums\CooperationStatus;
use App\Enums\RoleEnum;
use App\Filament\Support\CheerfulNotification;
use App\Models\Cooperation;
use Filament\Actions\Action;
use Filament\Support\Icons\Heroicon;
class CompleteCooperationAction extends Action
{
protected function setUp(): void
{
parent::setUp();
$this->label('Selesaikan Kerjasama')
->icon(Heroicon::OutlinedCheckBadge)
->color('success')
->requiresConfirmation()
->modalHeading(fn () => CheerfulNotification::getMessage('Selesaikan Kerja Sama? 🏁✨', 'Selesaikan Kerja Sama'))
->modalDescription(fn () => CheerfulNotification::getMessage('Yakin mau menyelesaikan kerja sama ini? Pastikan semua pembayaran ke media sudah lunas dan aman ya! 🤝😊', 'Apakah Anda yakin ingin menyelesaikan kerja sama ini? Pastikan seluruh kewajiban pembayaran telah terpenuhi.'))
->action(function (Cooperation $record): void {
// Verify all accepted media are paid
$acceptedMedia = $record->cooperationMedia()->accepted()->get();
if ($acceptedMedia->isEmpty()) {
CheerfulNotification::danger(
CheerfulNotification::getMessage('Tidak Ada Media! ❌', 'Data Media Kosong'),
CheerfulNotification::getMessage('Tidak ada media yang menerima kerja sama ini. Tidak dapat diselesaikan.', 'Proses tidak dapat dilanjutkan karena tidak ada media yang terlibat dalam kerja sama ini.')
)->send();
return;
}
$unpaidMedia = $acceptedMedia->filter(function ($media) {
return ! $media->payment()->exists();
});
if ($unpaidMedia->isNotEmpty()) {
CheerfulNotification::danger(
CheerfulNotification::getMessage('Pembayaran Belum Lunas! ⚠️', 'Pembayaran Belum Terpenuhi'),
CheerfulNotification::getMessage('Masih ada media yang belum dibayar. Harap selesaikan pembayaran untuk semua media yang menerima kerja sama.', 'Terdapat kewajiban pembayaran yang belum diselesaikan untuk media terkait.')
)->send();
$this->halt();
return;
}
// Calculate total payment from media payments
$totalPayment = $acceptedMedia->sum(fn ($media) => $media->payment->amount);
$record->update([
'payment_amount' => $totalPayment,
'completed_at' => now(),
'status' => CooperationStatus::COMPLETED,
]);
CheerfulNotification::success(
CheerfulNotification::getMessage('Kerja Sama Selesai! 🎉✨', 'Kerja Sama Berhasil Diselesaikan'),
CheerfulNotification::getMessage('Alhamdulillah! Kerja sama ini telah resmi diselesaikan. Terima kasih atas kerja samanya! 🙌😊', 'Proses kerja sama ini telah resmi ditutup dan diselesaikan.')
)->send();
})
->visible(function (Cooperation $record): bool {
$user = auth()->user();
return $user && ! $user->hasRole(RoleEnum::PERUSAHAAN->value)
&& $record->status === CooperationStatus::PAYMENT;
});
}
}