Menambahkan fitur laporan permohonan dengan kemampuan ekspor data ke Excel dan filtering yang komprehensif. - Membuat view laporan_permohonan/index.blade.php untuk menampilkan daftar permohonan dalam format datatable - Mengimplementasikan LaporanPermohonanController dengan method index, dataForDatatables, dan export - Menambahkan fitur filter berdasarkan tanggal (start_date dan end_date) untuk memudahkan pencarian data berdasarkan rentang waktu - Mengimplementasikan fitur pencarian global yang dapat mencari di berbagai kolom termasuk nomor_registrasi, tanggal, pemohon, cabang, dll - Membuat LaporanPermohonanExport class yang mengimplementasikan FromCollection, WithHeadings, dan WithMapping - Menyesuaikan export data agar konsisten dengan filter yang diterapkan pada datatable - Menerapkan role-based filtering sehingga hanya administrator yang dapat melihat semua data - Mengoptimalkan query dengan eager loading untuk meningkatkan performa - Menambahkan pagination dan sorting untuk meningkatkan user experience - Menyesuaikan tampilan status dengan badge yang berbeda warna sesuai dengan statusnya
90 lines
3.4 KiB
PHP
90 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace Modules\Lpj\Exports;
|
|
|
|
use Maatwebsite\Excel\Concerns\FromCollection;
|
|
use Maatwebsite\Excel\Concerns\WithHeadings;
|
|
use Maatwebsite\Excel\Concerns\WithMapping;
|
|
use Modules\Lpj\Models\Permohonan;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class LaporanPermohonanExport implements FromCollection, WithHeadings, WithMapping
|
|
{
|
|
protected $request;
|
|
|
|
public function __construct($request)
|
|
{
|
|
$this->request = $request;
|
|
}
|
|
|
|
public function collection()
|
|
{
|
|
$query = Permohonan::with(['user', 'branch', 'tujuanPenilaian', 'jenisFasilitasKredit', 'jenisPenilaian'])
|
|
->select('permohonan.*');
|
|
|
|
// Apply role-based filtering
|
|
if (!Auth::user()->hasAnyRole(['administrator'])) {
|
|
$query->where('branch_id', Auth::user()->branch_id);
|
|
}
|
|
|
|
|
|
// Apply date range filter if provided
|
|
if ($this->request->has('start_date') || $this->request->has('end_date')) {
|
|
$query->whereBetween('tanggal_permohonan', [
|
|
$this->request->start_date ?? '1900-01-01',
|
|
$this->request->end_date ?? now()->toDateString()
|
|
]);
|
|
}
|
|
|
|
// Apply search filter if provided
|
|
if ($this->request->has('search') && !empty($this->request->search)) {
|
|
$search = $this->request->search;
|
|
$query->where(function ($q) use ($search) {
|
|
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
|
|
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
|
|
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%');
|
|
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%');
|
|
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
|
|
$q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search . '%');
|
|
$q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search . '%');
|
|
$q->orWhere('status', 'LIKE', '%' . $search . '%');
|
|
});
|
|
}
|
|
|
|
// Default ordering
|
|
$query->orderBy('nomor_registrasi', 'asc');
|
|
|
|
return $query->get();
|
|
}
|
|
|
|
public function map($permohonan): array
|
|
{
|
|
return [
|
|
$permohonan->id,
|
|
$permohonan->nomor_registrasi,
|
|
$permohonan->tanggal_permohonan,
|
|
$permohonan->user ? $permohonan->user->name : '',
|
|
$permohonan->branch ? $permohonan->branch->name : '',
|
|
$permohonan->tujuanPenilaian ? $permohonan->tujuanPenilaian->name : '',
|
|
$permohonan->jenisFasilitasKredit ? $permohonan->jenisFasilitasKredit->name : '',
|
|
$permohonan->jenisPenilaian ? $permohonan->jenisPenilaian->name : '',
|
|
$permohonan->status,
|
|
];
|
|
}
|
|
|
|
public function headings(): array
|
|
{
|
|
return [
|
|
'ID',
|
|
'Nomor Registrasi',
|
|
'Tanggal Permohonan',
|
|
'Pemohon',
|
|
'Cabang',
|
|
'Tujuan Penilaian',
|
|
'Jenis Fasilitas Kredit',
|
|
'Jenis Penilaian',
|
|
'Status',
|
|
];
|
|
}
|
|
}
|