schema([ Section::make('Akun') ->schema([ Grid::make(3) ->schema([ TextEntry::make('name') ->label('Nama'), TextEntry::make('email') ->label('Email'), TextEntry::make('username') ->label('Nama Pengguna'), TextEntry::make('is_active') ->label('Status') ->badge(), TextEntry::make('email_verified_at') ->label('Email Verifikasi') ->placeholder('Akun Belum Diverifikasi') ->dateTime('l, d F Y H:i'), ]), ]), Section::make('Perusahaan') ->schema([ Grid::make(3) ->schema([ TextEntry::make('company.name') ->label('Nama'), TextEntry::make('company.email') ->label('Email'), TextEntry::make('company.address') ->label('Alamat'), TextEntry::make('company.director_name') ->label('Nama Direktur'), TextEntry::make('company.validated_at') ->label('Tanggal Validasi') ->dateTime('d F Y H:i'), TextEntry::make('company.rejection_reason') ->label('Alasan Penolakan') ->visible(fn (User $record): ?string => $record->company?->rejection_reason), ]), Grid::make(3) ->schema([ Section::make('NIK Direktur') ->schema([ TextEntry::make('company.director_nik') ->hiddenLabel(), TextEntry::make('company.director_nik_docs') ->hiddenLabel() ->html() ->getStateUsing(function (User $record): string { $media = $record->company ?->getMedia('companies') ->where('custom_properties.doc_type', 'director-nik') ->sortByDesc('created_at') ->first(); if (! $media) { return 'Tidak ada dokumen'; } $url = $media->getUrl(); $mime = $media->mime_type; if (str_contains($mime, 'image')) { return 'Dokumen NIK Direktur'; } if (str_contains($mime, 'pdf')) { return ''; } return 'Unduh Dokumen'; }), ]), Section::make('Akta Pendirian') ->schema([ TextEntry::make('company.deed_incorporation') ->hiddenLabel(), self::fileEntry('company.deed_incorporation'), ]), Section::make('SIUP') ->schema([ TextEntry::make('company.trade_license') ->hiddenLabel(), self::fileEntry('company.trade_license'), ]), Section::make('NPWP') ->schema([ TextEntry::make('company.tax_id_number') ->hiddenLabel(), self::fileEntry('company.tax_id_number'), ]), Section::make('PKP') ->schema([ TextEntry::make('company.taxable_enterprise') ->hiddenLabel(), self::fileEntry('company.taxable_enterprise'), ]), Section::make('SPT Tahunan') ->schema([ TextEntry::make('company.annual_tax_return') ->hiddenLabel(), self::fileEntry('company.annual_tax_return'), ]), Section::make('SK Domisili') ->schema([ TextEntry::make('company.domicile_certificate') ->hiddenLabel(), self::fileEntry('company.domicile_certificate'), ]), Section::make('Profil Perusahaan') ->schema([ TextEntry::make('company.profile') ->hiddenLabel(), self::fileEntry('company.profile'), ]), ]), ]), Section::make('Media') ->schema([ Grid::make(4) ->schema([ TextEntry::make('company.partnerMedia.name') ->label('Nama'), TextEntry::make('company.partnerMedia.link') ->label('Tautan') ->url(fn (User $record): ?string => $record->company?->partnerMedia?->link, true), TextEntry::make('company.partnerMedia.type') ->label('Jenis') ->badge(), TextEntry::make('company.partnerMedia.classification') ->label('Klasifikasi') ->badge(), TextEntry::make('company.partnerMedia.address') ->label('Alamat') ->columnSpanFull(), ]), Grid::make(2) ->schema([ Section::make('Sertifikat Organisasi Kewartawanan') ->schema([ TextEntry::make('company.partnerMedia.journalism_organization') ->hiddenLabel(), self::fileEntry('company.partnerMedia.journalism_organization', 'company.partnerMedia', 'partnerMedia'), ]), Section::make('Sertifikat Dewan Pers') ->schema([ TextEntry::make('company.partnerMedia.press_council_certificate') ->hiddenLabel(), self::fileEntry('company.partnerMedia.press_council_certificate', 'company.partnerMedia', 'partnerMedia'), ]), ]), ]), Section::make('Jurnalis') ->schema([ RepeatableEntry::make('company.partnerMedia.journalists') ->hiddenLabel() ->schema([ Grid::make(3) ->schema([ TextEntry::make('name') ->label('Nama'), TextEntry::make('email') ->label('Email'), TextEntry::make('phone_number') ->label('No. Telepon'), ]), Grid::make(2) ->schema([ Section::make('Kartu Pers') ->schema([ TextEntry::make('press_card') ->hiddenLabel(), self::fileEntry('press_card', null, 'journalists'), ]), Section::make('Sertifikat UKW') ->schema([ TextEntry::make('ukw_certificate') ->hiddenLabel(), self::fileEntry('ukw_certificate', null, 'journalists'), ]), ]), ]), ]), ]) ->columns(1); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('company.name') ->label('Perusahaan') ->searchable() ->sortable() ->description( fn (User $record) => new HtmlString( 'Akun: '.$record->name. '
Direktur: '.$record->company?->director_name ) ), TextColumn::make('company.partnerMedia.name') ->label('Media') ->searchable() ->sortable(), TextColumn::make('company.journalists.name') ->label('Jurnalis') ->searchable() ->sortable() ->badge(), TextColumn::make('company.status') ->label('Status') ->badge(), TextColumn::make('created_at') ->label('Tgl Daftar') ->date() ->sortable() ->searchable() ->dateTime('l, d F Y H:i:s') ->wrap(), ]) ->filters([ TrashedFilter::make() ->native(false) ->visible(fn () => auth()->user()?->hasRole('Developer')), ]) ->recordActions([ ViewAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ ...DefaultBulkActions::make('rekanan'), ]), ]) ->emptyStateIcon(Heroicon::BuildingOffice2) ->emptyStateDescription('Setelah Anda membubat data pertama, maka akan muncul disini.') ->defaultSort('created_at', 'desc') ->deferFilters(false) ->reorderable('sort_order') ->modifyQueryUsing(function (Builder $query): void { $query->role('Perusahaan') ->whereHas('company'); }); } public static function getPages(): array { return [ 'index' => ManagePartners::route('/'), 'view' => ViewPartner::route('/{record}'), ]; } private static function fileEntry( string $name, ?string $mediaOwner = 'company', string $collection = 'companies' ): PdfViewerEntry { return PdfViewerEntry::make($name) ->hiddenLabel() ->getStateUsing(function (Model $record) use ($name, $mediaOwner, $collection): ?string { $owner = data_get($record, $mediaOwner); if (! $owner) { return null; } $docType = str($name) ->afterLast('.') ->slug('-'); return $owner->getMedia($collection) ->where('custom_properties.doc_type', (string) $docType) ->sortByDesc('created_at') ->first() ?->getUrl(); }); } }