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 static function getBadge(Model $ownerRecord, string $pageClass): ?string { if (auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)) { return $ownerRecord->reports() ->whereHas('mediaTaskAssignment.partnerMedia.company', function ($q) { $q->where('user_id', auth()->id()); }) ->count(); } return $ownerRecord->reports()->count(); } public function form(Schema $schema): Schema { return $schema ->components([ TextInput::make('title') ->label('Judul') ->placeholder('Dirgahayu Purwakarta') ->required() ->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(255) ->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() ->helperText('Format yang diterima: JPEG, PNG, GIF, WEBP. Ukuran maksimum: 3 MB.') ->required(), ]) ->columns(1); } public function table(Table $table): Table { return $table ->columns([ ...RowIndexColumn::make(), TextColumn::make('mediaTaskAssignment.partnerMedia.name') ->label('Media') ->searchable() ->visible(! auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)), 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 Bukti Tayang') ->modalWidth(Width::Large) ->modalHeading(fn () => CheerfulNotification::getByKey('cooperation.create_report_title')) ->modalDescription(fn () => CheerfulNotification::getByKey('cooperation.create_report_desc')) ->mutateDataUsing(function (array $data): array { $taskAssignment = $this->getOwnerRecord()->taskAssignment; if (auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)) { $mediaTaskAssignment = $taskAssignment?->mediaTaskAssignments() ->whereHas('partnerMedia.company', function ($query) { $query->where('user_id', auth()->id()); }) ->first(); $data['media_task_assignment_id'] = $mediaTaskAssignment?->id; } return $data; }) ->successNotification(null) ->after(function (Report $record): void { CheerfulNotification::success( CheerfulNotification::getByKey('cooperation.report_sent_success'), CheerfulNotification::getByKey('cooperation.report_sent_desc') )->send(); // Notify Admins User::superAdmin() ->get() ->each(function ($admin) use ($record): void { $user = auth()->user(); $admin->notify(new BroadcastNotification([ 'title' => CheerfulNotification::getByKey('auto_generated.msg_bukti_tayang_kerja_sama_baru'), 'body' => CheerfulNotification::getByKey('notification.user_submitted_report', ['user__name' => $user->name, 'record__title' => $record->title, 'this__getOwnerRecord____title' => $this->getOwnerRecord()->title]), '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() ->whereHas('mediaTaskAssignment.partnerMedia.company', fn ($q) => $q->where('user_id', auth()->id())) ->where('reports.status', '!=', ApprovalStatus::REJECTED) ->count() < $taskAssignment->report_amount; }), ]) ->toolbarActions([]) ->emptyStateIcon(Heroicon::OutlinedInboxArrowDown) ->emptyStateHeading(fn () => CheerfulNotification::getByKey('cooperation.report_empty_heading')) ->emptyStateDescription(fn () => CheerfulNotification::getByKey('cooperation.report_empty')) ->defaultSort('created_at', 'desc'); } public function getEloquentQuery(): Builder { return parent::getEloquentQuery() ->when(auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value), function (Builder $query): void { $query->whereHas('mediaTaskAssignment.partnerMedia.company', function (Builder $q): void { $q->where('user_id', auth()->id()); }); }); } }