diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index 2d23a9d..a075da6 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -306,6 +306,7 @@ class ActivityController extends Controller $query = Permohonan::query(); // Apply search filter if provided + $query = $query->orderBy('nomor_registrasi', 'desc'); if ($request->has('search') && !empty($request->get('search'))) { $search = $request->get('search'); $query->where(function ($q) use ($search) { @@ -324,7 +325,9 @@ class ActivityController extends Controller }); } - // Default sorting if no sort provided + + + // Apply sorting if provided if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { $order = $request->get('sortOrder'); $column = $request->get('sortField'); diff --git a/app/Http/Controllers/LaporanHasilPenilaianJaminanInternalExternalController.php b/app/Http/Controllers/LaporanHasilPenilaianJaminanInternalExternalController.php index 081d455..aa64758 100644 --- a/app/Http/Controllers/LaporanHasilPenilaianJaminanInternalExternalController.php +++ b/app/Http/Controllers/LaporanHasilPenilaianJaminanInternalExternalController.php @@ -4,6 +4,7 @@ use App\Http\Controllers\Controller; use Illuminate\Http\Request; + use Illuminate\Support\Facades\DB; use Maatwebsite\Excel\Facades\Excel; use Modules\Lpj\Exports\LaporanHasilPenilaianJaminanInternalExternalExport; use Modules\Lpj\Models\Permohonan; @@ -60,6 +61,7 @@ $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%'); $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%'); $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%'); + $q->orWhereRelation('debiture', DB::raw('LOWER(name)'), 'LIKE', '%' . strtolower($search->search) . '%'); $q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%'); $q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%'); $q->orWhere('status', 'LIKE', '%' . $search->search . '%'); @@ -69,7 +71,7 @@ // Apply sorting if provided if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { - $order = $request->get('sortOrder'); + $order = $request->get('sortOrder'); $column = $request->get('sortField'); $query->orderBy($column, $order); } @@ -104,12 +106,12 @@ $lpj = json_decode($permohonan->penilai->lpj, true); $npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0); - $luas_tanah = $lpj['luas_tanah'] ?? 0; + $luas_tanah = $lpj['luas_tanah'] ?? 0; $luas_bangunan = $lpj['luas_bangunan'] ?? 0; // Calculate nilai_tanah dynamically by looking for all keys that start with 'nilai_tanah_' $nilai_tanah = str_replace('.', '', $lpj['nilai_tanah_2'] ?? 0); - $nilai_bangunan = str_replace('.', '', $lpj['nilai_bangunan_2'] ?? 0); + $nilai_bangunan = str_replace('.', '', $lpj['nilai_bangunan_2'] ?? 0); $nilai_liquidasi = str_replace('.', '', $lpj['likuidasi_nilai_2'] ?? 0); } diff --git a/app/Http/Controllers/LaporanPenilaiJaminanController.php b/app/Http/Controllers/LaporanPenilaiJaminanController.php index 1832dd1..1c10739 100644 --- a/app/Http/Controllers/LaporanPenilaiJaminanController.php +++ b/app/Http/Controllers/LaporanPenilaiJaminanController.php @@ -9,6 +9,10 @@ use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\StatusPermohonan; use Modules\Lpj\Exports\LaporanPenilaiJaminanExport; use Maatwebsite\Excel\Facades\Excel; +use Modules\Lpj\Models\Branch; +use Modules\Lpj\Services\PreviewLaporanService; +use Modules\Lpj\Models\Inspeksi; +use Modules\Lpj\Models\Penilai; class LaporanPenilaiJaminanController extends Controller { @@ -16,59 +20,31 @@ class LaporanPenilaiJaminanController extends Controller /** * Display a listing of the resource. */ + + protected $previewLaporanService; + + public function __construct(PreviewLaporanService $previewLaporanService) + { + $this->previewLaporanService = $previewLaporanService; + } + public function index() { $status_permohonan = StatusPermohonan::all(); return view('lpj::laporan-penilai-jaminan.index', compact('status_permohonan')); } - /** - * Show the form for creating a new resource. - */ - public function create() - { - return view('lpj::create'); - } - - /** - * Store a newly created resource in storage. - */ - public function store(Request $request) - { - // - } /** * Show the specified resource. */ - public function show($id) + public function show($permohonan_id, $dokumen_id, $jaminan_id) { - return view('lpj::laporan-penilai-jaminan.show'); + $back = route('laporan-penilai-jaminan.index'); + return $this->previewLaporanService->previewLaporan($permohonan_id, $dokumen_id, $jaminan_id, $back); } - /** - * Show the form for editing the specified resource. - */ - public function edit($id) - { - return view('lpj::edit'); - } - /** - * Update the specified resource in storage. - */ - public function update(Request $request, $id) - { - // - } - - /** - * Remove the specified resource from storage. - */ - public function destroy($id) - { - // - } public function dataForDatatables(Request $request) { @@ -93,91 +69,104 @@ class LaporanPenilaiJaminanController extends Controller // dd($startDate); // Retrieve data from the database $query = Permohonan::query(); - + $query = $query->where('status', 'done')->orderBy('tanggal_permohonan', 'desc'); // Apply search filter if provided if ($request->has('search') && !empty($request->get('search'))) { - $search = $request->get('search'); - $paramsSearch = json_decode($search); + $search = json_decode($request->get('search')); - $query->where(function ($q) use ($search) { - $q->where('nomor_registrasi', 'LIKE', '%' . $search . '%') - ->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%') - ->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%') - ->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%') - ->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%') - ->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); + if (!empty($search->start_date) || !empty($search->end_date)) { + $startDate = $search->start_date ?? '1900-01-01'; + $endDate = $search->end_date ?? now()->toDateString(); - if (!empty($paramsSearch->tanggal_awal) && !empty($paramsSearch->tanggal_akhir)) { - $q->whereBetween('tanggal_permohonan', [$paramsSearch->tanggal_awal, $paramsSearch->tanggal_akhir]); + $query->where(function ($q) use ($startDate, $endDate) { + + $q->whereHas('penilaian', function ($q2) use ($startDate, $endDate) { + $q2->whereBetween('tanggal_kunjungan', [$startDate, $endDate]); + }); + + // OR check if has penawaran with date in range + $q->orWhereHas('penawaran', function ($q3) use ($startDate, $endDate) { + $q3->whereBetween('tanggal_penilaian_sebelumnya', [$startDate, $endDate]); + }); + }); + + + } + + + if (isset($search->branch_id) && !empty($search->branch_id)) { + $query->where('branch_id', $search->branch_id); + } + + if (isset($search->laporan) && is_array($search->laporan) && !empty($search->laporan)) { + foreach ($search->laporan as $type) { + $query->whereHas('penilai', function ($q) use ($type) { + $q->where('type_penilai', 'LIKE', '%' . $type . '%'); + }); } + } - $statusKeywords = explode(',', $search); - foreach ($statusKeywords as $keyword) { - $q->orWhereRelation('penilai', 'type_penilai', 'LIKE', '%' . trim($keyword) . '%'); - } - }); + // dd($search->search); + + 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('debiture', DB::raw('LOWER(name)'), 'LIKE', '%' . strtolower($search->search) . '%'); + + $q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%'); + $q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%'); + $q->orWhere('status', 'LIKE', '%' . $search->search . '%'); + }); + } + } - $query->where('status', 'done'); - - - // Default sorting if no sort provided + // Apply sorting if provided if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { $order = $request->get('sortOrder'); $column = $request->get('sortField'); $query->orderBy($column, $order); - } else { - $query->orderBy('nomor_registrasi', 'asc'); } - // Get total count of records before pagination + + // Get the total count of records $totalRecords = $query->count(); - // Pagination + // Apply pagination if provided if ($request->has('page') && $request->has('size')) { - $page = (int) $request->get('page', 1); - $size = (int) $request->get('size', 10); - $offset = ($page - 1) * $size; + $page = $request->get('page'); + $size = $request->get('size'); + $offset = ($page - 1) * $size; // Calculate the offset + $query->skip($offset)->take($size); } - // Get filtered count + // Get the filtered count of records $filteredRecords = $query->count(); - - $totalRecords = $query->count(); - - // Pagination - if ($request->has('page') && $request->has('size')) { - $page = (int) $request->get('page', 1); - $size = (int) $request->get('size', 10); - $offset = ($page - 1) * $size; - $query->skip($offset)->take($size); - } - - // Get filtered count - $filteredRecords = $query->count(); - // Get data with necessary relationships - $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan.jenisJaminan','nilaiPlafond', 'penilai'])->get(); + $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan.jenisJaminan','nilaiPlafond', 'penilai', 'dokumenjaminan.inspeksi'])->get(); - // Calculate total pages - $pageCount = ceil($totalRecords / $request->get('size', 10)); + // Calculate the page count + $pageCount = ceil($totalRecords / $size); + // Calculate the current page number + $currentPage = max(1, $request->get('page', 1)); - - - // Calculate total pages - $pageCount = ceil($totalRecords / $request->get('size', 10)); - + // Return the response data as a JSON object return response()->json([ 'draw' => $request->get('draw'), 'recordsTotal' => $totalRecords, 'recordsFiltered' => $filteredRecords, 'pageCount' => $pageCount, - 'page' => $request->get('page', 1), + 'page' => $currentPage, 'totalCount' => $totalRecords, 'data' => $data, ]); @@ -185,15 +174,53 @@ class LaporanPenilaiJaminanController extends Controller public function export(Request $request) { - $tanggalAwal = $request->input('tanggal_awal'); - $tanggalAkhir = $request->input('tanggal_akhir'); - $status = $request->input('status'); - $selectedIds = $request->input('selected_ids'); + $startDate = $request->input('start_date'); + $endDate = $request->input('end_date'); + + // Validate the date format + if (isset($startDate) && isset($endDate)) { + $startDate = date('Y-m-d', strtotime($startDate)); + $endDate = date('Y-m-d', strtotime($endDate)); + + if ($startDate > $endDate) { + return redirect()->back()->with('error', 'Tanggal awal tidak boleh lebih kecil dari tanggal akhir'); + } + } + // name the file + $filename = $this->createNameLaporan($request); - $filename = 'laporan_penilai_jaminan_' . date('YmdHis') . '.xlsx'; return Excel::download( - new LaporanPenilaiJaminanExport($tanggalAwal, $tanggalAkhir, $status, $selectedIds), + new LaporanPenilaiJaminanExport($request), $filename ); } + + + public function createNameLaporan($request) + { + $startDate = $request->start_date ?? null; + $endDate = $request->end_date ?? null; + $branchId = $request->branch_id ?? null; + $laporan = $request->laporan ?? null; + + // Initialize filename parts + $parts = ['Laporan Penilai Jaminan']; + if ($startDate && $endDate) { + $parts[] = "{$startDate}_{$endDate}"; + } + if ($laporan) { + $parts[] = $laporan; + } + if ($branchId) { + $parts[] = $this->getBranchId($branchId); + } + // Return concatenated filename with extension + return implode('_', $parts) . '.xlsx'; + } + + public function getBranchId($branchId) + { + $branchesName = Branch::find($branchId)->name ?? null; + return $branchesName; + } } diff --git a/app/Http/Controllers/LaporanPenilaianJaminanController.php b/app/Http/Controllers/LaporanPenilaianJaminanController.php index 9596161..2a6ddad 100644 --- a/app/Http/Controllers/LaporanPenilaianJaminanController.php +++ b/app/Http/Controllers/LaporanPenilaianJaminanController.php @@ -1,161 +1,180 @@ user) || !$this->user->can('laporan-admin-kredit.view')) { - //abort(403, 'Sorry! You are not allowed to view laporan admin kredit.'); - } - - // Retrieve data from the database - $query = Permohonan::query(); - $query = $query->where('status', 'done'); - - // 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() - ]); - } - - // Filter by branch if provided - if (isset($search->branch_id) && !empty($search->branch_id)) { - $query->where('branch_id', $search->branch_id); - } - - if (isset($search->penilai_id) && !empty($search->penilai_id)) { - $query->whereHas('penilaian._user_penilai.userPenilaiTeam', function($q) use ($search) { - $q->where('user_id', $search->penilai_id); - }); - } - - 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(); - - // 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(['debiture.branch'])->get(); - - $data = $data->map(function ($permohonan) { - $luas_tanah = 0; - $luas_bangunan = 0; - $nilai_tanah = 0; - $nilai_bangunan = 0; - $npw = 0; - $nilai_liquidasi = 0; - if (isset($permohonan->penilai->lpj)) { - $lpj = json_decode($permohonan->penilai->lpj, true); - $npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0); - - $luas_tanah = $lpj['luas_tanah'] ?? 0; - $luas_bangunan = $lpj['luas_bangunan'] ?? 0; - // Calculate nilai_tanah dynamically by looking for all keys that start with 'nilai_tanah_' - $nilai_tanah = str_replace('.', '', $lpj['nilai_tanah_2'] ?? 0); - - $nilai_bangunan = str_replace('.', '', $lpj['nilai_bangunan_2'] ?? 0); - $nilai_liquidasi = str_replace('.', '', $lpj['likuidasi_nilai_2'] ?? 0); - } - - return [ - 'id' => $permohonan->id, - 'nomor_registrasi' => $permohonan->nomor_registrasi, - 'tanggal_permohonan' => $permohonan->tanggal_permohonan, - 'branch' => $permohonan->debiture?->branch?->name, - 'name' => $permohonan->debiture?->name, - 'pemohon' => $permohonan->creator?->name, - 'tujuan_penilaian' => $permohonan->tujuanPenilaian?->name, - 'jenis_agunan' => $permohonan->documents?->pluck('jenisJaminan.name')->unique()->implode(', '), - 'alamat_agunan' => $permohonan->documents?->map(function ($document) { - return formatAlamat($document); - })->unique()->implode(', '), - 'luas_tanah' => $luas_tanah . ' m²', - 'nilai_tanah' => formatRupiah($nilai_tanah,2), - 'luas_bangunan' => $luas_bangunan . ' m²', - 'nilai_bangunan' => formatRupiah($nilai_bangunan,2), - 'tanggal_laporan' => $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? '', - 'tanggal_review' => $permohonan->penilaian?->tanggal_kunjungan ?? '', - 'nilai_pasar_wajar' => formatRupiah($npw,2), - 'nilai_likuidasi' => formatRupiah($nilai_liquidasi,2), - 'nama_penilai' => $permohonan->penilaian?->_user_penilai?->userPenilaiTeam?->name, - ]; - }); - - // Calculate the page count - $pageCount = ceil($totalRecords / $request->get('size')); - - // Calculate the current page number - $currentPage = $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, - ]); - } - - public function export(Request $request) - { - return Excel::download(new LaporanPenilaianJaminanExport($request), 'laporan_penilaian_jaminan.xlsx'); - } + return view('lpj::laporan_penilaian_jaminan.index'); } + + public function dataForDatatables(Request $request) + { + if (is_null($this->user) || !$this->user->can('laporan-admin-kredit.view')) { + //abort(403, 'Sorry! You are not allowed to view laporan admin kredit.'); + } + + // Retrieve data from the database + $query = Permohonan::query(); + $query = $query->where('status', 'done'); + + // Apply search filter if provided + if ($request->has('search') && !empty($request->get('search'))) { + $search = json_decode($request->get('search')); + + + if (!empty($search->start_date) || !empty($search->end_date)) { + $startDate = $search->start_date ?? '1900-01-01'; + $endDate = $search->end_date ?? now()->toDateString(); + + $query->where(function ($q) use ($startDate, $endDate) { + $q->whereHas('penilaian', function ($q2) use ($startDate, $endDate) { + $q2->whereBetween('tanggal_kunjungan', [$startDate, $endDate]); + }) + ->orWhereHas('penawaran', function ($q3) use ($startDate, $endDate) { + $q3->whereBetween('tanggal_penilaian_sebelumnya', [$startDate, $endDate]); + }); + }); + } + + // Filter by branch if provided + if (isset($search->branch_id) && !empty($search->branch_id)) { + $query->where('branch_id', $search->branch_id); + } + + if (isset($search->penilai_id) && !empty($search->penilai_id)) { + $query->whereHas('penilaian._user_penilai.userPenilaiTeam', function ($q) use ($search) { + $q->where('user_id', $search->penilai_id); + }); + } + + 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('debiture', DB::raw('LOWER(name)'), 'LIKE', '%' . strtolower($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(); + + // 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(['debiture.branch'])->get(); + + $data = $data->map(function ($permohonan) { + $luas_tanah = 0; + $luas_bangunan = 0; + $nilai_tanah = 0; + $nilai_bangunan = 0; + $npw = 0; + $nilai_liquidasi = 0; + if (isset($permohonan->penilai->lpj)) { + $lpj = json_decode($permohonan->penilai->lpj, true); + $npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0); + + $luas_tanah = $lpj['luas_tanah'] ?? 0; + $luas_bangunan = $lpj['luas_bangunan'] ?? 0; + // Calculate nilai_tanah dynamically by looking for all keys that start with 'nilai_tanah_' + $nilai_tanah = str_replace('.', '', $lpj['nilai_tanah_2'] ?? 0); + + $nilai_bangunan = str_replace('.', '', $lpj['nilai_bangunan_2'] ?? 0); + $nilai_liquidasi = str_replace('.', '', $lpj['likuidasi_nilai_2'] ?? 0); + } + + return [ + 'id' => $permohonan->id, + 'nomor_registrasi' => $permohonan->nomor_registrasi, + 'tanggal_permohonan' => $permohonan->tanggal_permohonan, + 'branch' => $permohonan->debiture?->branch?->name, + 'name' => $permohonan->debiture?->name, + 'pemohon' => $permohonan->creator?->name, + 'tujuan_penilaian' => $permohonan->tujuanPenilaian?->name, + 'jenis_agunan' => $permohonan->documents?->pluck('jenisJaminan.name')->unique()->implode(', '), + 'alamat_agunan' => $permohonan->documents?->map(function ($document) { + return formatAlamat($document); + })->unique()->implode(', '), + 'luas_tanah' => $luas_tanah . ' m²', + 'nilai_tanah' => formatRupiah($nilai_tanah, 2), + 'luas_bangunan' => $luas_bangunan . ' m²', + 'nilai_bangunan' => formatRupiah($nilai_bangunan, 2), + 'tanggal_laporan' => $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? '', + 'tanggal_review' => $permohonan->penilaian?->tanggal_kunjungan ?? '', + 'nilai_pasar_wajar' => formatRupiah($npw, 2), + 'nilai_likuidasi' => formatRupiah($nilai_liquidasi, 2), + 'nama_penilai' => $permohonan->penilaian?->_user_penilai?->userPenilaiTeam?->name, + ]; + }); + + // Calculate the page count + $pageCount = ceil($totalRecords / $request->get('size')); + + // Calculate the current page number + $currentPage = $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, + ]); + } + + public function export(Request $request) + { + $startDate = $request->start_date; + $endDate = $request->end_date; + // name of the file + $fileName = 'laporan_penilaian_jaminan_' . $startDate . '_' . $endDate . '.xlsx'; + return Excel::download(new LaporanPenilaianJaminanExport($request), $fileName); + } + + +} diff --git a/app/Http/Controllers/NilaiPlafondController.php b/app/Http/Controllers/NilaiPlafondController.php index fc843b9..058c2fd 100644 --- a/app/Http/Controllers/NilaiPlafondController.php +++ b/app/Http/Controllers/NilaiPlafondController.php @@ -17,224 +17,238 @@ public $user; /** - * Tampilkan halaman daftar Nilai Plafond. - * - * @return \Illuminate\Contracts\View\View + * Menampilkan halaman daftar Nilai Plafond. + * Log setiap akses dan sebelum return view. */ public function index() { - Log::info('[NilaiPlafondController@index] Return view index nilai_plafond'); - return view('lpj::nilai_plafond.index'); + Log::info('NilaiPlafondController@index: akses halaman index'); + return \view('lpj::nilai_plafond.index'); } /** - * Simpan data Nilai Plafond baru ke database. - * Menggunakan transaksi untuk menjamin konsistensi data. - * - * @param NilaiPlafondRequest $request - * @return \Illuminate\Http\RedirectResponse + * Menyimpan data Nilai Plafond baru termasuk field biaya. + * Gunakan validasi dari NilaiPlafondRequest, log proses, dan bungkus dengan transaksi DB. */ public function store(NilaiPlafondRequest $request) { + Log::info('NilaiPlafondController@store: mulai proses simpan'); $validate = $request->validated(); if ($validate) { DB::beginTransaction(); try { - // Save to database - $created = NilaiPlafond::create($validate); + $record = NilaiPlafond::create($validate); DB::commit(); - Log::info('[NilaiPlafondController@store] NilaiPlafond created', ['id' => $created->id, 'payload' => $validate]); - return redirect() + + Log::info('NilaiPlafondController@store: simpan berhasil', ['id' => $record->id]); + return \redirect() ->route('basicdata.nilai-plafond.index') ->with('success', 'Nilai Plafond berhasil dibuat'); } catch (Exception $e) { DB::rollBack(); - Log::error('[NilaiPlafondController@store] Failed to create nilai plafond', ['error' => $e->getMessage(), 'payload' => $validate]); - return redirect() + Log::error('NilaiPlafondController@store: simpan gagal', ['error' => $e->getMessage()]); + + return \redirect() ->route('basicdata.nilai-plafond.create') ->with('error', 'Gagal membuat Nilai Plafond'); } } - - Log::warning('[NilaiPlafondController@store] Validation failed'); - return redirect() - ->route('basicdata.nilai-plafond.create') - ->with('error', 'Validasi gagal'); } /** - * Tampilkan form pembuatan Nilai Plafond. - * - * @return \Illuminate\Contracts\View\View + * Menampilkan form pembuatan Nilai Plafond. + * Log akses sebelum return view. */ public function create() { - Log::info('[NilaiPlafondController@create] Return view create nilai_plafond'); - return view('lpj::nilai_plafond.create'); + Log::info('NilaiPlafondController@create: akses halaman create'); + return \view('lpj::nilai_plafond.create'); } /** - * Tampilkan form edit Nilai Plafond berdasarkan ID. - * - * @param int $id - * @return \Illuminate\Contracts\View\View + * Menampilkan form edit Nilai Plafond berdasarkan ID. + * Gunakan transaksi untuk pembacaan data dan logging. */ public function edit($id) { - $nilaiPlafond = NilaiPlafond::find($id); - Log::info('[NilaiPlafondController@edit] Return view edit nilai_plafond', ['id' => $id]); - return view('lpj::nilai_plafond.create', compact('nilaiPlafond')); + Log::info('NilaiPlafondController@edit: mulai proses edit', ['id' => $id]); + + DB::beginTransaction(); + try { + $nilaiPlafond = NilaiPlafond::find($id); + DB::commit(); + + Log::info('NilaiPlafondController@edit: data ditemukan', ['id' => $id]); + return \view('lpj::nilai_plafond.create', compact('nilaiPlafond')); + } catch (Exception $e) { + DB::rollBack(); + Log::error('NilaiPlafondController@edit: gagal mengambil data', ['id' => $id, 'error' => $e->getMessage()]); + return \redirect() + ->route('basicdata.nilai-plafond.index') + ->with('error', 'Gagal mengambil data Nilai Plafond'); + } } /** - * Update data Nilai Plafond pada database. - * Menggunakan transaksi untuk menjamin konsistensi data. - * - * @param NilaiPlafondRequest $request - * @param int $id - * @return \Illuminate\Http\RedirectResponse + * Memperbarui data Nilai Plafond termasuk field biaya. + * Validasi input, logging, dan gunakan transaksi DB. */ public function update(NilaiPlafondRequest $request, $id) { + Log::info('NilaiPlafondController@update: mulai proses update', ['id' => $id]); $validate = $request->validated(); if ($validate) { DB::beginTransaction(); try { - // Update in database $nilaiPlafond = NilaiPlafond::find($id); + if (!$nilaiPlafond) { + Log::warning('NilaiPlafondController@update: data tidak ditemukan', ['id' => $id]); + DB::rollBack(); + return \redirect() + ->route('basicdata.nilai-plafond.index') + ->with('error', 'Data Nilai Plafond tidak ditemukan'); + } + $nilaiPlafond->update($validate); DB::commit(); - Log::info('[NilaiPlafondController@update] NilaiPlafond updated', ['id' => $id, 'payload' => $validate]); - return redirect() + + Log::info('NilaiPlafondController@update: update berhasil', ['id' => $id]); + return \redirect() ->route('basicdata.nilai-plafond.index') ->with('success', 'Nilai Plafond berhasil diperbarui'); } catch (Exception $e) { DB::rollBack(); - Log::error('[NilaiPlafondController@update] Failed to update nilai plafond', ['id' => $id, 'error' => $e->getMessage(), 'payload' => $validate]); - return redirect() + Log::error('NilaiPlafondController@update: update gagal', ['id' => $id, 'error' => $e->getMessage()]); + + return \redirect() ->route('basicdata.nilai-plafond.edit', $id) ->with('error', 'Gagal memperbarui Nilai Plafond'); } } - - Log::warning('[NilaiPlafondController@update] Validation failed', ['id' => $id]); - return redirect() - ->route('basicdata.nilai-plafond.edit', $id) - ->with('error', 'Validasi gagal'); } /** - * Hapus data Nilai Plafond dari database. - * Menggunakan transaksi untuk menjamin konsistensi data. - * - * @param int $id - * @return void + * Menghapus data Nilai Plafond berdasarkan ID. + * Logging setiap langkah dan gunakan transaksi DB. */ public function destroy($id) { + Log::info('NilaiPlafondController@destroy: mulai proses hapus', ['id' => $id]); DB::beginTransaction(); try { - // Delete from database $nilaiPlafond = NilaiPlafond::find($id); + if (!$nilaiPlafond) { + DB::rollBack(); + Log::warning('NilaiPlafondController@destroy: data tidak ditemukan', ['id' => $id]); + return \response()->json(['success' => false, 'message' => 'Data Nilai Plafond tidak ditemukan']); + } + $nilaiPlafond->delete(); DB::commit(); - Log::info('[NilaiPlafondController@destroy] NilaiPlafond deleted', ['id' => $id]); - echo json_encode(['success' => true, 'message' => 'Nilai Plafond berhasil dihapus']); + Log::info('NilaiPlafondController@destroy: hapus berhasil', ['id' => $id]); + return \response()->json(['success' => true, 'message' => 'Nilai Plafond berhasil dihapus']); } catch (Exception $e) { DB::rollBack(); - Log::error('[NilaiPlafondController@destroy] Failed to delete nilai plafond', ['id' => $id, 'error' => $e->getMessage()]); - echo json_encode(['success' => false, 'message' => 'Gagal menghapus Nilai Plafond']); + Log::error('NilaiPlafondController@destroy: hapus gagal', ['id' => $id, 'error' => $e->getMessage()]); + return \response()->json(['success' => false, 'message' => 'Gagal menghapus Nilai Plafond']); } } /** - * Endpoint data untuk DataTables custom. - * Menyediakan pencarian, sorting, dan pagination. - * - * @param Request $request - * @return \Illuminate\Http\JsonResponse + * Menyediakan data untuk datatables dengan pencarian, sortir, dan paginasi. + * Logging proses dan gunakan transaksi DB untuk konsistensi pembacaan. */ public function dataForDatatables(Request $request) { + Log::info('NilaiPlafondController@dataForDatatables: mulai proses'); + if (is_null($this->user) || !$this->user->can('nilai_plafond.view')) { //abort(403, 'Sorry! You are not allowed to view users.'); } - // Retrieve data from the database - $query = NilaiPlafond::query(); + DB::beginTransaction(); + try { + // Retrieve data from the database + $query = NilaiPlafond::query(); - // Apply search filter if provided - if ($request->has('search') && !empty($request->get('search'))) { - $search = $request->get('search'); - $query->where(function ($q) use ($search) { - $q->where('code', 'LIKE', "%$search%"); - $q->orWhere('name', 'LIKE', "%$search%"); - // CAST ke TEXT agar LIKE bekerja di PostgreSQL - $q->orWhereRaw('CAST(biaya AS TEXT) LIKE ?', ["%$search%"]); - }); + // Apply search filter if provided + if ($request->has('search') && !empty($request->get('search'))) { + $search = $request->get('search'); + $query->where(function ($q) use ($search) { + $q->where('code', 'LIKE', "%$search%"); + $q->orWhere('name', 'LIKE', "%$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(); + + // 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->get(); + + // Calculate the page count + $pageCount = ceil($totalRecords / $request->get('size')); + + // Calculate the current page number + $currentPage = 0 + 1; + + DB::commit(); + Log::info('NilaiPlafondController@dataForDatatables: proses selesai, mengembalikan data'); + + // 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, + ]); + } catch (Exception $e) { + DB::rollBack(); + Log::error('NilaiPlafondController@dataForDatatables: gagal memproses data', ['error' => $e->getMessage()]); + return \response()->json([ + 'draw' => $request->get('draw'), + 'recordsTotal' => 0, + 'recordsFiltered' => 0, + 'pageCount' => 0, + 'page' => 1, + 'totalCount' => 0, + 'data' => [], + ]); } - - // 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(); - - // 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->get(); - - // Calculate the page count - $pageCount = ceil($totalRecords / $request->get('size')); - - // Calculate the current page number - $currentPage = 0 + 1; - - Log::info('[NilaiPlafondController@dataForDatatables] Return datatables payload', [ - 'recordsTotal' => $totalRecords, - 'recordsFiltered' => $filteredRecords, - 'pageCount' => $pageCount, - 'page' => $currentPage, - ]); - - // 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, - ]); } /** - * Export data Nilai Plafond ke file Excel. - * - * @return \Symfony\Component\HttpFoundation\BinaryFileResponse + * Mengekspor data Nilai Plafond ke Excel. + * Log akses sebelum proses download. */ public function export() { - Log::info('[NilaiPlafondController@export] Export nilai_plafond to Excel'); + Log::info('NilaiPlafondController@export: mulai proses export'); return Excel::download(new NilaiPlafondExport, 'nilai_plafond.xlsx'); } } diff --git a/app/Http/Controllers/PenilaiController.php b/app/Http/Controllers/PenilaiController.php index 0116e9b..01d6f76 100644 --- a/app/Http/Controllers/PenilaiController.php +++ b/app/Http/Controllers/PenilaiController.php @@ -26,18 +26,21 @@ use Modules\Lpj\Http\Requests\FormSurveyorRequest; use Modules\Lpj\Models\Authorization; use Modules\Lpj\Models\Debiture; use Modules\Lpj\Services\SaveFormInspesksiService; +use Modules\Lpj\Services\PreviewLaporanService; class PenilaiController extends Controller { public $user; protected $surveyorController; protected $inspeksiService; + protected $previewLaporanService; - public function __construct(SurveyorController $surveyorController, SaveFormInspesksiService $inspeksiService) + public function __construct(SurveyorController $surveyorController, SaveFormInspesksiService $inspeksiService, PreviewLaporanService $previewLaporanService) { $this->surveyorController = $surveyorController; $this->inspeksiService = $inspeksiService; + $this->previewLaporanService = $previewLaporanService; } /** @@ -548,13 +551,7 @@ class PenilaiController extends Controller return view('lpj::penilai.components.call-report', compact('permohonan', 'basicData', 'nomorLaporan', 'forminspeksi', 'cities', 'districts', 'villages', 'cekAlamat', 'callReport')); } - /** - * Remove the specified resource from storage. - */ - public function destroy($id) - { - // - } + public function dataForDatatables(Request $request) { @@ -701,15 +698,17 @@ class PenilaiController extends Controller 'lokasi_lengkap' => $data->lokasi_lengkap ?? '', ]; - // Extract data pembanding - if (isset($dataPembanding['data_pembanding'])) { - foreach ($dataPembanding['data_pembanding'] as $index => $pembanding) { - if ($index == 0) { - $exportData['pembanding1'] = $pembanding; - } elseif ($index == 1) { - $exportData['pembanding2'] = $pembanding; - } elseif ($index == 2) { - $exportData['pembanding3'] = $pembanding; + if(isset($dataPembanding)){ + // Extract data pembanding + if (isset($dataPembanding['data_pembanding'])) { + foreach ($dataPembanding['data_pembanding'] as $index => $pembanding) { + if ($index == 0) { + $exportData['pembanding1'] = $pembanding; + } elseif ($index == 1) { + $exportData['pembanding2'] = $pembanding; + } elseif ($index == 2) { + $exportData['pembanding3'] = $pembanding; + } } } } @@ -1276,8 +1275,6 @@ class PenilaiController extends Controller } } - - public function print_out(Request $request) { $documentId = $request->query('documentId'); @@ -1393,6 +1390,15 @@ class PenilaiController extends Controller } } + public function print_out_laporan($permohonan_id, $document_id, $jaminan_id) + { + // jika tidak ada id kembalikan ke halaman sebelumnya + if (!$permohonan_id || !$document_id || !$jaminan_id) { + return redirect()->back()->with('error', 'Laporan tidak valid'); + } + return $this->previewLaporanService->printOutLaporan($permohonan_id, $document_id, $jaminan_id); + } + private function getViewLaporan($tipe) { $viewMap = [ @@ -1772,4 +1778,24 @@ class PenilaiController extends Controller 'message' => 'Berhasil Revisi Ke surveyor', ], 200); } + + public function showLaporanInspeksi( + $permohonan_id, + $dokumen_id, + $jaminan_id, + Request $request) + { + if ($request->type == 'penilai') { + $back = route('penilai.show', $permohonan_id); + }else{ + $back = route('surveyor.show', $permohonan_id); + } + + return $this->previewLaporanService->previewLaporan($permohonan_id, $dokumen_id, $jaminan_id, $back); + } + + public function showInspectionReportReview($permohonan_id, $dokumen_id, $jaminan_id) + { + + } } diff --git a/resources/views/debitur/components/debitur.blade.php b/resources/views/debitur/components/debitur.blade.php index f2e47b9..348235f 100644 --- a/resources/views/debitur/components/debitur.blade.php +++ b/resources/views/debitur/components/debitur.blade.php @@ -1,6 +1,5 @@ -
- @if (isset($debitur->id)) + + @if(isset($debitur->id)) @method('PUT') @endif @@ -11,13 +10,11 @@ *
- @if (auth()->user()->hasRole(['administrator'])) - - @foreach ($branches as $branch) - @endforeach @@ -27,7 +24,7 @@ @endif @error('branch_id') - {{ $message }} + {{ $message }} @enderror
@@ -36,13 +33,12 @@ CIF * - +
- + @error('cif') - {{ $message }} + {{ $message }} @enderror
@@ -51,10 +47,9 @@ Nomor Rekening
- + @error('nomor_rekening') - {{ $message }} + {{ $message }} @enderror
@@ -63,13 +58,12 @@ Nama Debitur * - +
- + @error('name') - {{ $message }} + {{ $message }} @enderror
@@ -78,22 +72,20 @@ NPWP
- + @error('npwp') - {{ $message }} + {{ $message }} @enderror
-
- - @foreach ($provinces as $province) - @if (isset($debitur)) - @else @@ -136,18 +125,16 @@ @endforeach @error('province_code') - {{ $message }} + {{ $message }} @enderror
- - @if (isset($cities)) - @foreach ($cities as $city) - @if (isset($debitur)) - @else @@ -160,20 +147,18 @@ @endif @error('city_code') - {{ $message }} + {{ $message }} @enderror
- - @if (isset($districts)) - @foreach ($districts as $district) - @if (isset($debitur)) - @else @@ -186,18 +171,16 @@ @endif @error('district_code') - {{ $message }} + {{ $message }} @enderror
- - @if (isset($villages)) - @foreach ($villages as $village) - @if (isset($debitur)) - @else @@ -210,23 +193,20 @@ @endif @error('district_code') - {{ $message }} + {{ $message }} @enderror
- + @error('postal_code') - {{ $message }} + {{ $message }} @enderror
- + @error('address') - {{ $message }} + {{ $message }} @enderror
@@ -239,7 +219,7 @@ @push('scripts') @endpush diff --git a/resources/views/laporan-penilai-jaminan/show.blade.php b/resources/views/laporan-penilai-jaminan/show.blade.php new file mode 100644 index 0000000..68df3d4 --- /dev/null +++ b/resources/views/laporan-penilai-jaminan/show.blade.php @@ -0,0 +1,117 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{-- {{ Breadcrumbs::render(request()->route()->getName()) }} --}} +@endsection + +@section('content') +
+
+
+
+ + +
+
+ + Back +
+
+
+
+ @php + $permohonan_id = request()->segment(3); + $dokumen_id = request()->segment(4); + $jenis_jaminan_id = request()->segment(5); + @endphp + +
+ + + @php + $laporan = [ + 'sederhana' => 'lpj::penilai.components.print-out-sederhana', + 'standar' => 'lpj::penilai.components.print-out-standar', + 'resume' => 'lpj::penilai.components.print-resume', + 'memo' => 'lpj::penilai.components.print-memo', + 'rap' => 'lpj::penilai.components.print-out-rap', + 'call-report' => 'penilai.components.print-out-call-report', + ]; + @endphp + @if (array_key_exists($lpj->type_penilai, $laporan)) + @include($laporan[$lpj->type_penilai]) + @else +

Tipe laporan tidak ditemukan.

+ @endif +
+
+ + @include('lpj::surveyor.components.print-out.main') +
+
+ + + + + + {{-- @include('lpj::surveyor.js.utils') --}} + @endsection diff --git a/resources/views/laporan/index.blade.php b/resources/views/laporan/index.blade.php index f8c59a1..46f13b6 100644 --- a/resources/views/laporan/index.blade.php +++ b/resources/views/laporan/index.blade.php @@ -151,7 +151,7 @@ user_id: { title: 'User Pemohon', render: (item, data) => { - return `${data.user.name}`; + return `${data.user?.name}`; }, }, tujuan_penilaian_id: { @@ -180,16 +180,16 @@ jenis_fasilitas_kredit_id: { title: 'Fasilitas Kredit', render: (item, data) => { - return `${data.jenis_fasilitas_kredit.name}`; + return `${data.jenis_fasilitas_kredit?.name}`; } }, tanggal_survei: { title: 'Tanggal Survei', render: (item, data) => { - if (data.penilaian.waktu_penilaian) { - return `${formatDate(new Date(data.penilaian.waktu_penilaian))}`; + if (data.penilaian?.waktu_penilaian) { + return `${formatDate(new Date(data.penilaian?.waktu_penilaian))}`; } - return `${formatDate(new Date(data.penilaian.created_at))}`; + return `${formatDate(new Date(data.penilaian?.created_at))}`; }, }, due_date_sla: { @@ -197,10 +197,10 @@ render: (item, data) => { const tujuan_penilaian = data.tujuan_penilaian.name; const tipe_laporan = data.penilai?.type; - const nilai_plafond = data.penilaian.nilaiPlafond?.name; - let waktu_penilaian = new Date(data.penilaian.created_at); - if (data.penilaian.waktu_penilaian) { - waktu_penilaian = new Date(data.penilaian.waktu_penilaian); + const nilai_plafond = data.penilaian?.nilaiPlafond?.name; + let waktu_penilaian = new Date(data.penilaian?.created_at); + if (data.penilaian?.waktu_penilaian) { + waktu_penilaian = new Date(data.penilaian?.waktu_penilaian); } if (tujuan_penilaian.name === "RAP") { diff --git a/resources/views/noc/penyelesaian.blade.php b/resources/views/noc/penyelesaian.blade.php index 06c49fb..66e8742 100644 --- a/resources/views/noc/penyelesaian.blade.php +++ b/resources/views/noc/penyelesaian.blade.php @@ -6,8 +6,7 @@ @section('content')
-
+

Daftar NOC Penyelesaian