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

147 lines
6.6 KiB
PHP

<?php
namespace App\Filament\Resources\Manage\Cooperations\Actions\Cooperation;
use App\Enums\ApprovalStatus;
use App\Filament\Resources\Manage\Cooperations\CooperationResource;
use App\Filament\Support\CheerfulNotification;
use App\Models\Cooperation;
use App\Models\User;
use App\Notifications\BroadcastNotification;
use Asmit\FilamentUpload\Forms\Components\AdvancedFileUpload;
use Filament\Actions\Action;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Support\Enums\Width;
use Filament\Support\Icons\Heroicon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
class SendProposalAction extends Action
{
protected function setUp(): void
{
parent::setUp();
$this->label('Ajukan Proposal')
->icon(Heroicon::DocumentText)
->color('info')
->schema([
TextInput::make('e_catalog')
->label('E-Catalog')
->placeholder('https://katalog.inaproc.id/purwakarta-kita-media-karya')
->autocomplete(false)
->autofocus()
->nullable()
->url(),
Textarea::make('description')
->label('Deskripsi')
->autocomplete(false)
->required()
->rows(4)
->placeholder('...'),
AdvancedFileUpload::make('proposal_attachment')
->label('Lampiran')
->disk(config('filesystems.default'))
->acceptedFileTypes(['application/pdf'])
->maxSize(1024 * 10)
->directory(fn (): string => 'cooperations/proposal-attachment/'.now()->toDateString())
->required(),
])
->action(function (Cooperation $record, array $data): void {
$cooperationMedia = $record->cooperationMedia()
->whereHas('partnerMedia', function (Builder $query): void {
$query->whereHas('company', function (Builder $subQuery): void {
$subQuery->where('user_id', Auth::id());
});
})
->first();
if ($cooperationMedia) {
$existingProposal = $record->proposals()
->where('partner_media_id', $cooperationMedia->partner_media_id)
->first();
$isRevision = (bool) $existingProposal;
$proposal = $record->proposals()->create([
'partner_media_id' => $cooperationMedia->partner_media_id,
'description' => $data['description'],
'e_catalog' => $data['e_catalog'],
'status' => ApprovalStatus::PENDING->value,
]);
if (! empty($data['proposal_attachment'])) {
$filePath = collect($data['proposal_attachment'])->first();
$fullPath = Storage::disk(config('filesystems.default'))->path($filePath);
if (file_exists($fullPath)) {
$proposal->addMediaFromDisk($filePath, config('filesystems.default'))
->preservingOriginal()
->withCustomProperties([
'feature' => 'cooperations',
'date' => now()->toDateString(),
'doc_type' => 'proposal-attachment',
])
->toMediaCollection('cooperations');
}
}
CheerfulNotification::success(
'Berhasil Diajukan! 🚀',
'Yeay! Proposal kerja sama Anda sudah terkirim ke Admin. Mohon ditunggu ya, semoga hasilnya memuaskan! ✨'
)->send();
// Notify Admin
User::superAdmin()
->get()
->each(function ($admin) use ($isRevision, $record, $cooperationMedia): void {
$user = Auth::user();
$admin->notify(new BroadcastNotification([
'title' => $isRevision ? 'Pembaruan Proposal Kerja Sama ✨' : 'Ada Proposal Kerja Sama Baru! 🚀',
'body' => $isRevision
? "Cihuy! {$user->name} baru saja memperbarui proposal kerja sama untuk media {$cooperationMedia->partnerMedia->name} pada kampanye {$record->title}. Yuk, cek perubahannya!"
: "Halo Admin! {$user->name} baru saja mengajukan proposal kerja sama baru untuk media {$cooperationMedia->partnerMedia->name} pada kampanye {$record->title}. Segera diproses ya! 😊",
'action' => [
Action::make('view')
->label('Lihat')
->url(CooperationResource::getUrl('view', ['record' => $record->id, 'relation' => 1])),
],
]));
});
}
})
->modalHeading('Proposal Kerja Sama')
->modalSubmitActionLabel('Kirim Proposal')
->visible(function (Cooperation $record): bool {
$user = Auth::user();
if (! $user->hasRole('Perusahaan')) {
return false;
}
$cooperationMedia = $record->cooperationMedia()
->whereHas('partnerMedia', function (Builder $query): void {
$query->whereHas('company', function (Builder $subQuery): void {
$subQuery->where('user_id', Auth::id());
});
})
->first();
return $cooperationMedia
&& $cooperationMedia->status === ApprovalStatus::ACCEPTED
&& $record->initial_submission_date->toDateString() === now()->toDateString()
&& ! $record->proposals()
->where('partner_media_id', $cooperationMedia->partner_media_id)
->where(fn (Builder $q): Builder => $q->accepted()->orWhere(fn (Builder $q): Builder => $q->pending()))
->exists();
})
->modalWidth(Width::Large);
}
}