user()->hasRole(RoleEnum::PERUSAHAAN->value)) { return $ownerRecord->cooperationMedia() ->whereHas('partnerMedia', function ($query) { $query->whereHas('company', function ($query) { $query->where('user_id', auth()->id()); }); }) ->where('status', ApprovalStatus::ACCEPTED) ->exists(); } return true; } public function isReadOnly(): bool { return false; } public static function getBadge(Model $ownerRecord, string $pageClass): ?string { return $ownerRecord->reports()->count(); } public function form(Schema $schema): Schema { return $schema ->components([ TextInput::make('title') ->placeholder('Dirgahayu Purwakarta') ->required() ->maxLength(200) ->autocomplete(false) ->autofocus(), DatePicker::make('publication_date') ->label('Tanggal Publikasi') ->placeholder(fn (): string => now()->translatedFormat('l, d F Y')) ->native(false) ->displayFormat('l, d F Y') ->required(), TextInput::make('link') ->label('Tautan') ->placeholder('https://example.com') ->maxLength(50) ->url() ->required() ->autocomplete(false), Textarea::make('description') ->label('Deskripsi') ->placeholder('....') ->required() ->autocomplete(false), SpatieMediaLibraryFileUpload::make('image') ->label('Gambar') ->disk(config('filesystems.default')) ->acceptedFileTypes(['image/*']) ->maxSize(1024 * 3) ->collection('reports') ->image() ->required(), ]) ->columns(1); } public function table(Table $table): Table { return $table ->columns([ TextColumn::make('title') ->label('Judul') ->searchable(), TextColumn::make('publication_date') ->label('Tanggal Publikasi') ->date('l, d F Y'), TextColumn::make('link') ->label('Link') ->limit(30) ->url(fn (Report $record): string => $record->link) ->openUrlInNewTab(), TextColumn::make('status') ->label('Status') ->badge(), TextColumn::make('rejectionReasons.reason') ->label('Alasan Penolakan') ->searchable(), ]) ->filters([]) ->recordActions([ AcceptAction::make('accept'), RejectAction::make('reject'), ]) ->headerActions([ CreateAction::make() ->label('Buat Laporan') ->modalWidth(Width::Large) ->modalHeading('Buat Laporan') ->mutateDataUsing(function (array $data): array { $data['task_assignment_id'] = $this->getOwnerRecord()->taskAssignment?->id; return $data; }) ->successNotification(null) ->after(function (Report $record): void { CheerfulNotification::success( 'Laporan Berhasil Terkirim! 🚀✨', 'Hore! Laporan Anda sudah masuk ke sistem. Admin akan segera memeriksanya. Terima kasih atas kerja kerasnya! 💪' )->send(); // Notify Admins User::superAdmin() ->get() ->each(function ($admin) use ($record): void { $user = auth()->user(); $admin->notify(new BroadcastNotification([ 'title' => 'Ada Laporan Baru! 📝✨', 'body' => "Halo Admin! {$user->name} baru saja mengirimkan laporan \"{$record->title}\" untuk kerja sama \"{$this->getOwnerRecord()->title}\". Yuk, dicek! 😊", 'action' => [ Action::make('view') ->label('Lihat') ->url(CooperationResource::getUrl('view', ['record' => $this->getOwnerRecord()->id, 'relation' => 3])), ], ])); }); }) ->visible(function (): bool { $user = auth()->user(); if (! $user || ! $user->hasRole(RoleEnum::PERUSAHAAN->value)) { return false; } $taskAssignment = $this->getOwnerRecord()->taskAssignment; if (! $taskAssignment) { return false; } return $this->getOwnerRecord()->status === CooperationStatus::ASSIGNMENT && $taskAssignment->start_date->toDateString() <= now()->toDateString() && $taskAssignment->end_date->toDateString() >= now()->toDateString() && $taskAssignment->reports() ->where('status', '!=', ApprovalStatus::REJECTED) ->count() < $taskAssignment->report_amount; }), ]) ->toolbarActions([]); } }