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 { $query = $ownerRecord->payments(); if (auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)) { $query->whereHas('cooperationMedia.partnerMedia.company', function ($q) { $q->where('user_id', auth()->id()); }); } return (string) $query->count(); } public function table(Table $table): Table { return $table ->columns([ TextColumn::make('cooperationMedia.partnerMedia.name') ->label('Media') ->searchable() ->visible(! auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)), TextColumn::make('amount') ->label('Nominal') ->money('IDR', decimalPlaces: 0) ->placeholder('Menunggu Verifikasi'), TextColumn::make('payment_date') ->label('Tanggal Bayar') ->date('l, d F Y') ->placeholder('-'), TextColumn::make('description') ->label('Keterangan') ->limit(50), TextColumn::make('status') ->label('Status') ->badge(), TextColumn::make('rejectionReasons.reason') ->label('Alasan Penolakan') ->searchable(), ]) ->recordActions([ ViewAction::make(), AcceptAction::make(), RejectAction::make(), ]) ->headerActions([ SubmitInvoiceAction::make(), ]) ->emptyStateIcon(Heroicon::OutlinedCreditCard) ->emptyStateHeading(fn () => CheerfulNotification::getByKey('cooperation.payment_empty_heading')) ->emptyStateDescription(fn () => CheerfulNotification::getByKey('cooperation.payment_empty')) ->defaultSort('created_at', 'desc') ->modifyQueryUsing(function (Builder $query): void { $query->with(['cooperationMedia.media']) ->when(auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value), function (Builder $subQuery): void { $subQuery->whereHas('cooperationMedia.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('cooperationMedia.partnerMedia.name') ->label('Media') ->visible(! auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)), TextEntry::make('status') ->label('Status') ->badge(), TextEntry::make('amount') ->label('Nominal Penagihan') ->money('IDR', decimalPlaces: 0), TextEntry::make('created_at') ->label('Diajukan') ->dateTime('l, d F Y H:i:s'), ]), TextEntry::make('description') ->label('Keterangan') ->columnSpanFull() ->placeholder('-'), PdfViewerEntry::make('payment_attachment') ->label('Lampiran Penagihan') ->disk(config('filesystems.default')) ->getStateUsing(fn (CooperationPayment $record): ?string => optional($record->getMedia('cooperations')->where('custom_properties.doc_type', 'payment-attachment')->sortByDesc('created_at')->first())->getPathRelativeToRoot()) ->columnSpanFull(), TextEntry::make('rejectionReasons.reason') ->label('Alasan Penolakan') ->listWithLineBreaks() ->visible(fn (CooperationPayment $record): bool => $record->status === ApprovalStatus::REJECTED && $record->rejectionReasons->isNotEmpty()) ->columnSpanFull(), ]) ->columns(1); } }