public static function table(Table $table): Table
{
// 1. CEK HAK AKSES DI SINI (Paling Atas)
$isAdmin = auth()->check() && auth()->user()->User === 'admin';
// 2. SIAPKAN TOMBOL BERDASARKAN HAK AKSES
// Jika Admin, buat tombolnya. Jika bukan Admin, biarkan kosong (array []).
$headerActions = $isAdmin ? [
Tables\Actions\CreateAction::make(),
] : [];
$rowActions = $isAdmin ? [
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
] : [];
$bulkActions = $isAdmin ? [
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
] : [];
// 3. KEMBALIKAN TABEL DENGAN TOMBOL YANG SUDAH DISELEKSI
return $table
->headerActions($headerActions)
->columns([
Tables\Columns\TextColumn::make('NoPlat')
->label('No. Plat')
->searchable()
->sortable()
->weight('bold')
->formatStateUsing(function ($record) {
$parts = [];
if ($record->DD) $parts[] = $record->DD;
if ($record->NoPlat) $parts[] = $record->NoPlat;
if ($record->EndPlat) $parts[] = $record->EndPlat;
return implode(' ', $parts) ?: '-';
}),
Tables\Columns\TextColumn::make('MerkKendaraan')
->label('Merk/Model')
->searchable(),
Tables\Columns\TextColumn::make('StnkNama')
->label('Nama STNK')
->searchable(),
Tables\Columns\TextColumn::make('NamaPJ')
->label('Nama PJ')
->searchable(),
Tables\Columns\TextColumn::make('TglPajakStnk')
->label('Pajak STNK')
->date('d M Y')
->sortable()
->searchable(query: function (\Illuminate\Database\Eloquent\Builder $query, string $search): \Illuminate\Database\Eloquent\Builder {
$bulanMap = [
'jan' => 1, 'januari' => 1, 'january' => 1, '1' => 1, '01' => 1,
'feb' => 2, 'februari' => 2, 'february' => 2, '2' => 2, '02' => 2,
'mar' => 3, 'maret' => 3, 'march' => 3, '3' => 3, '03' => 3,
'apr' => 4, 'april' => 4, '4' => 4, '04' => 4,
'mei' => 5, 'may' => 5, '5' => 5, '05' => 5,
'jun' => 6, 'juni' => 6, 'june' => 6, '6' => 6, '06' => 6,
'jul' => 7, 'juli' => 7, 'july' => 7, '7' => 7, '07' => 7,
'agu' => 8, 'ags' => 8, 'agustus' => 8, 'august' => 8, 'aug' => 8, '8' => 8, '08' => 8,
'sep' => 9, 'september' => 9, '9' => 9, '09' => 9,
'okt' => 10, 'oktober' => 10, 'october' => 10, 'oct' => 10, '10' => 10,
'nov' => 11, 'november' => 11, '11' => 11,
'des' => 12, 'desember' => 12, 'december' => 12, 'dec' => 12, '12' => 12,
];
$parts = preg_split('/\s+/', trim($search));
if (count($parts) === 2) {
$bulanKey = strtolower($parts[0]);
$tahun = $parts[1];
if (isset($bulanMap[$bulanKey]) && is_numeric($tahun)) {
return $query->whereMonth('TglPajakStnk', $bulanMap[$bulanKey])->whereYear('TglPajakStnk', $tahun);
}
}
try {
$date = \Carbon\Carbon::parse($search);
return $query->whereMonth('TglPajakStnk', $date->month)->whereYear('TglPajakStnk', $date->year);
} catch (\Exception $e) {
return $query->where('TglPajakStnk', 'like', "%{$search}%");
}
}),
Tables\Columns\TextColumn::make('expired')
->label('Expired')
->badge()
->formatStateUsing(fn (string $state): string => match ($state) {
'True', '1' => 'Sudah Expired',
'False', '0' => 'Masih Berlaku',
default => $state,
})
->color(fn (string $state): string => match ($state) {
'True', '1' => 'danger',
'False', '0' => 'success',
default => 'gray',
})
->sortable(),
Tables\Columns\TextColumn::make('foto')
->label('Foto')
->html()
->getStateUsing(function ($record) {
$image = \DB::table('stnkimage')
->where('DD', $record->DD)
->where('NoPlat', $record->NoPlat)
->where('EndPlat', $record->EndPlat)
->first();
if ($image && $image->namaimage) {
$base64 = base64_encode($image->namaimage);
return '';
}
return '-';
}),
])
->filters([
Tables\Filters\SelectFilter::make('bulan_pajak')
->label('Bulan Pajak')
->options([
1 => 'Januari', 2 => 'Februari', 3 => 'Maret', 4 => 'April',
5 => 'Mei', 6 => 'Juni', 7 => 'Juli', 8 => 'Agustus',
9 => 'September', 10 => 'Oktober', 11 => 'November', 12 => 'Desember',
])
->query(function ($query, array $data): \Illuminate\Database\Eloquent\Builder {
if ($data['value']) {
return $query->whereMonth('TglPajakStnk', $data['value']);
}
return $query;
}),
Tables\Filters\SelectFilter::make('tahun_pajak')
->label('Tahun Pajak')
->options(function () {
return \DB::table('stnk')
->selectRaw('YEAR(TglPajakStnk) as tahun')
->whereNotNull('TglPajakStnk')
->distinct()
->orderBy('tahun', 'desc')
->pluck('tahun', 'tahun')
->toArray();
})
->query(function ($query, array $data): \Illuminate\Database\Eloquent\Builder {
if ($data['value']) {
return $query->whereYear('TglPajakStnk', $data['value']);
}
return $query;
}),
Tables\Filters\TernaryFilter::make('expired')
->label('Status Expired')
->trueLabel('Sudah Expired')
->falseLabel('Masih Berlaku')
->queries(
true: fn ($query) => $query->where('expired', 'True')->orWhere('expired', '1'),
false: fn ($query) => $query->where('expired', 'False')->orWhere('expired', '0'),
blank: fn ($query) => $query,
),
])
->actions($rowActions)
->bulkActions($bulkActions);
}