Files
lpj/app/Http/Controllers/LaporanPermohonanController.php
Daeng Deni Mardaeni 22f6e3c8b2 feat(laporan): tambah fitur laporan permohonan
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
2025-04-09 10:19:08 +07:00

115 lines
4.5 KiB
PHP

<?php
namespace Modules\Lpj\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\StatusPermohonan;
use Modules\Lpj\Exports\LaporanPermohonanExport;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Support\Facades\Auth;
class LaporanPermohonanController extends Controller
{
public $user;
public function index()
{
return view('lpj::laporan_permohonan.index');
}
public function export(Request $request)
{
return Excel::download(new LaporanPermohonanExport($request), 'laporan_permohonan.xlsx');
}
public function dataForDatatables(Request $request)
{
if (is_null($this->user) || !$this->user->can('debitur.view')) {
//abort(403, 'Sorry! You are not allowed to view users.');
}
// Retrieve data from the database
$query = Permohonan::query();
if (!Auth::user()->hasAnyRole(['administrator'])) {
$query = $query->where('branch_id', Auth::user()->branch_id);
}
$query = $query->orderBy('nomor_registrasi', 'desc');
// Apply search filter if provided
if ($request->has('search') && !empty($request->get('search'))) {
$search = json_decode($request->get('search'));
if (isset($search->start_date) || isset($search->end_date)) {
$query->whereBetween('tanggal_permohonan', [
$search->start_date ?? '1900-01-01',
$search->end_date ?? now()->toDateString()
]);
}
if(isset($search->search)) {
$query->where(function ($q) use ($search) {
$q->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%');
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhere('status', 'LIKE', '%' . $search->search . '%');
});
}
}
// Apply sorting if provided
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
$order = $request->get('sortOrder');
$column = $request->get('sortField');
$query->orderBy($column, $order);
}
// Get the total count of records
$totalRecords = $query->count();
$size = $request->get('size', 10);
if ($size == 0) {
$size = 10;
}
// Apply pagination if provided
if ($request->has('page') && $request->has('size')) {
$page = $request->get('page');
$size = $request->get('size');
$offset = ($page - 1) * $size; // Calculate the offset
$query->skip($offset)->take($size);
}
// Get the filtered count of records
$filteredRecords = $query->count();
// Get the data for the current page
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian','documents','jenisFasilitasKredit', 'jenisPenilaian'])->get();
// Calculate the page count
$pageCount = ceil($totalRecords / $size);
// Calculate the current page number
$currentPage = max(1, $request->get('page', 1));
// Return the response data as a JSON object
return response()->json([
'draw' => $request->get('draw'),
'recordsTotal' => $totalRecords,
'recordsFiltered' => $filteredRecords,
'pageCount' => $pageCount,
'page' => $currentPage,
'totalCount' => $totalRecords,
'data' => $data,
]);
}
}