user()->hasRole(RoleEnum::PERUSAHAAN->value)) { return $ownerRecord->cooperationMedia() ->whereHas('partnerMedia.company', function ($query) { $query->where('user_id', auth()->id()); }) ->accepted() ->exists(); } return true; } public static function getBadge(Model $ownerRecord, string $pageClass): ?string { if (auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)) { return null; } return (string) $ownerRecord->proposal()->count(); } public function table(Table $table): Table { return $table ->columns([ ...RowIndexColumn::make(), TextColumn::make('partnerMedia.name') ->label('Media') ->searchable() ->visible(! auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)), TextColumn::make('e_catalog') ->label('E-Catalog') ->url(fn (CooperationProposal $record): ?string => $record->e_catalog) ->openUrlInNewTab() ->color('primary'), TextColumn::make('description') ->label('Deskripsi'), TextColumn::make('status') ->label('Status') ->badge(), TextColumn::make('submitted_at') ->label('Diajukan') ->dateTime('l, d F Y H:i:s') ->sortable(), TextColumn::make('responded_at') ->label('Ditanggapi') ->dateTime('l, d F Y H:i:s') ->sortable(), TextColumn::make('rejectionReasons.reason') ->label('Alasan Penolakan') ->searchable(), ]) ->recordActions([ ViewAction::make(), AcceptAction::make(), RejectAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make() ->successNotification( fn () => CheerfulNotification::success( CheerfulNotification::getByKey('cooperation.proposal_deleted'), CheerfulNotification::getByKey('cooperation.proposal_deleted_desc') ) ), ]), ]) ->emptyStateIcon(Heroicon::OutlinedDocumentText) ->emptyStateHeading(fn () => CheerfulNotification::getByKey('cooperation.proposal_empty_heading')) ->emptyStateDescription(fn () => CheerfulNotification::getByKey('cooperation.proposal_empty')) ->defaultSort('created_at', 'desc') ->modifyQueryUsing(function (Builder $query): void { $query->when(auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value), function (Builder $subQuery): void { $subQuery->whereHas('partnerMedia.company', function (Builder $q): void { $q->where('user_id', auth()->id()); }); }); }); } public function infolist(Schema $infolist): Schema { return $infolist ->components([ Grid::make(2) ->schema([ TextEntry::make('partnerMedia.name') ->label('Media') ->visible(! auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)), TextEntry::make('status') ->label('Status') ->badge(), TextEntry::make('submitted_at') ->label('Diajukan') ->dateTime('l, d F Y H:i:s'), TextEntry::make('responded_at') ->label('Ditanggapi') ->dateTime('l, d F Y H:i:s'), ]), TextEntry::make('e_catalog') ->label('E-Catalog') ->url(fn (CooperationProposal $record): ?string => $record->e_catalog) ->openUrlInNewTab() ->color('primary') ->visible(fn (CooperationProposal $record): ?string => $record->e_catalog), TextEntry::make('description') ->label('Deskripsi') ->columnSpanFull(), PdfViewerEntry::make('proposal_attachment') ->label('Lampiran Proposal') ->getStateUsing(fn (CooperationProposal $record): ?string => optional($record->getMedia('cooperations')->where('custom_properties.doc_type', 'proposal-attachment')->sortByDesc('created_at')->first())->getPathRelativeToRoot()) ->disk(config('filesystems.default')), TextEntry::make('rejectionReasons.reason') ->label('Alasan Penolakan') ->listWithLineBreaks() ->visible(fn (CooperationProposal $record): bool => $record->status === ApprovalStatus::REJECTED && $record->rejectionReasons->isNotEmpty()) ->columnSpanFull(), ]) ->columns(1); } }