diff --git a/app/Exports/LaporanPenilaianJaminanExport.php b/app/Exports/LaporanPenilaianJaminanExport.php new file mode 100644 index 0000000..8f696ed --- /dev/null +++ b/app/Exports/LaporanPenilaianJaminanExport.php @@ -0,0 +1,126 @@ +request = $request; + } + + public function collection() + { + $query = Permohonan::query(); + $query = $query->where('status', 'done'); + + // 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 branch filter if provided + if ($this->request->has('branch_id') && !empty($this->request->branch_id)) { + $query->where('branch_id', $this->request->branch_id); + } + + // 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->with(['debiture.branch'])->get(); + } + + public function map($permohonan): array + { + $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; + $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 [ + $permohonan->id, + $permohonan->nomor_registrasi, + $permohonan->tanggal_permohonan, + $permohonan->debiture->branch->name, + $permohonan->debiture->name, + $permohonan->creator->name, + $permohonan->tujuanPenilaian->name, + $permohonan->documents->pluck('jenisJaminan.name')->unique()->implode(', '), + $permohonan->documents->map(function ($document) { + return formatAlamat($document); + })->unique()->implode(', '), + $luas_tanah . ' m²', + formatRupiah($nilai_tanah, 2), + $luas_bangunan . ' m²', + formatRupiah($nilai_bangunan, 2), + '', // tanggal_laporan + '', // tanggal_review + formatRupiah($npw, 2), + formatRupiah($nilai_liquidasi, 2), + $permohonan->penilaian->_user_penilai->userPenilaiTeam->name, + ]; + } + + public function headings(): array + { + return [ + 'ID', + 'Nomor Registrasi', + 'Tanggal Permohonan', + 'Cabang', + 'Nama Debitur', + 'Pemohon', + 'Tujuan Penilaian', + 'Jenis Agunan', + 'Alamat Agunan', + 'Luas Tanah', + 'Nilai Tanah', + 'Luas Bangunan', + 'Nilai Bangunan', + 'Tanggal Laporan', + 'Tanggal Review', + 'Nilai Pasar Wajar', + 'Nilai Likuidasi', + 'Nama Penilai', + ]; + } + } diff --git a/app/Exports/LaporanPermohonanExport.php b/app/Exports/LaporanPermohonanExport.php index e7f4f1d..96cd369 100644 --- a/app/Exports/LaporanPermohonanExport.php +++ b/app/Exports/LaporanPermohonanExport.php @@ -19,8 +19,7 @@ public function collection() { - $query = Permohonan::with(['user', 'branch', 'tujuanPenilaian', 'jenisFasilitasKredit', 'jenisPenilaian']) - ->select('permohonan.*'); + $query = Permohonan::query(); // Apply role-based filtering if (!Auth::user()->hasAnyRole(['administrator'])) { diff --git a/app/Helpers/Lpj.php b/app/Helpers/Lpj.php index 48db599..5c9351e 100644 --- a/app/Helpers/Lpj.php +++ b/app/Helpers/Lpj.php @@ -1,574 +1,596 @@ translatedFormat('d F Y'); + function formatTanggalIndonesia($date, $time = false) + { + Carbon::setLocale('id'); + try { + $waktu = Carbon::parse($date); + if (!$time) { + return $waktu->translatedFormat('d F Y'); + } + return $waktu->translatedFormat('d F Y') . ' pukul ' . $waktu->format('H.i') . ' WIB'; + } catch (Throwable $e) { + return $date; } - return $waktu->translatedFormat('d F Y') . ' pukul ' . $waktu->format('H.i') . ' WIB'; - } catch (\Throwable $e) { - return $date; + } -} + + function formatRupiah($number, $decimals = 0) + { + $number = (float) $number; + return 'Rp ' . number_format($number, $decimals, ',', '.'); + } -function formatRupiah($number,$decimals = 0) -{ - $number = (float) $number; - return 'Rp ' . number_format($number, $decimals, ',', '.'); -} + function formatAlamat($alamat) + { + return ($alamat->address ? $alamat->address . ', ' : '') . (isset($alamat->village) ? $alamat->village->name . ', ' : '') . (isset($alamat->city) ? $alamat->city->name . ', ' : '') . (isset($alamat->province) ? $alamat->province->name . ', ' : '') . ($alamat->village->postal_code ?? ''); + } + // andy add + function checkActiveDateRangePenawaran($id) + { + $penawaran = PenawaranTender::find($id); -function formatAlamat($alamat) -{ - return ($alamat->address ? $alamat->address . ', ' : '') . (isset($alamat->village) ? $alamat->village->name . ', ' : '') . (isset($alamat->city) ? $alamat->city->name . ', ' : '') . (isset($alamat->province) ? $alamat->province->name . ', ' : '') . ($alamat->village->postal_code ?? ''); -} + $start_date = strtotime($penawaran->start_date); + $end_date = strtotime($penawaran->end_date); + $todays_date = strtotime(now()); + //$todays_date = strtotime("+1 day", strtotime(now())); -// andy add -function checkActiveDateRangePenawaran($id) -{ - $penawaran = PenawaranTender::find($id); - - $start_date = strtotime($penawaran->start_date); - $end_date = strtotime($penawaran->end_date); - $todays_date = strtotime(now()); - //$todays_date = strtotime("+1 day", strtotime(now())); - - $allow = true; - if ($todays_date >= $start_date && $todays_date <= $end_date) { - //Penawaran dibuka $allow = true; - } else { - if ($todays_date < $start_date) { - //Penawaran Belum dibuka + if ($todays_date >= $start_date && $todays_date <= $end_date) { + //Penawaran dibuka $allow = true; } else { - //Penawaran sudah ditutup + if ($todays_date < $start_date) { + //Penawaran Belum dibuka + $allow = true; + } else { + //Penawaran sudah ditutup + $allow = false; + } + } + + return $allow; + } + + function checkKelengkapanDetailKJPP($id) + { + $allow = true; + // DB::enableQueryLog(); + // detail_penawaran apakah isian biaya_penawaran, attachment, dokumen_persetujuan sudah lengkap? + $query = PenawaranDetailTender::select('id')->where('penawaran_id', '=', $id)->where('status', '=', 1)->where( + function ($query) { + // no_proposal + $query->orWhere('no_proposal', '', ""); + $query->orWhereNull('no_proposal'); + + // tgl_proposal + $query->orWhere('tgl_proposal', '', ""); + $query->orWhereNull('tgl_proposal'); + + $query->orWhere('biaya_penawaran', '', ""); + $query->orWhereNull('biaya_penawaran'); + + $query->orWhere('attachment', '', ""); + $query->orWhereNull('attachment'); + + $query->orWhere('dokumen_persetujuan', '', ""); + $query->orWhereNull('dokumen_persetujuan'); + }, + )->get(); + // $sql = DB::getQueryLog(); + + + if (sizeof($query) > 0) { $allow = false; } + + return $allow; } - return $allow; -} + // convert + function convertSlug($slug) + { + $words = explode('-', $slug); -function checkKelengkapanDetailKJPP($id) -{ - $allow = true; - // DB::enableQueryLog(); - // detail_penawaran apakah isian biaya_penawaran, attachment, dokumen_persetujuan sudah lengkap? - $query = PenawaranDetailTender::select('id')->where('penawaran_id', '=', $id)->where('status', '=', 1)->where( - function ($query) { - // no_proposal - $query->orWhere('no_proposal', '', ""); - $query->orWhereNull('no_proposal'); + foreach ($words as $index => $word) { + $words[$index] = strtoupper($word); + } - // tgl_proposal - $query->orWhere('tgl_proposal', '', ""); - $query->orWhereNull('tgl_proposal'); - - $query->orWhere('biaya_penawaran', '', ""); - $query->orWhereNull('biaya_penawaran'); - - $query->orWhere('attachment', '', ""); - $query->orWhereNull('attachment'); - - $query->orWhere('dokumen_persetujuan', '', ""); - $query->orWhereNull('dokumen_persetujuan'); - }, - )->get(); - // $sql = DB::getQueryLog(); - - - if (sizeof($query) > 0) { - $allow = false; + return implode(' ', $words); } - return $allow; -} + // generate last penawaran.code + function onLastnumberCodePenawaran() + : string + { + // ambil code terakhir + $maxCode = PenawaranTender::max('code'); + // chek data penawaran terakhir --> mengurutkan data berdasarkan kolom `created_at` secara DESC + // $penawaran = PenawaranTender::latest()->first(); + $penawaran = PenawaranTender::where('code', '=', $maxCode)->first(); + $code_penawaran_last = ''; -// convert -function convertSlug($slug) -{ - $words = explode('-', $slug); - - foreach ($words as $index => $word) { - $words[$index] = strtoupper($word); - } - - return implode(' ', $words); -} - -// generate last penawaran.code -function onLastnumberCodePenawaran(): string -{ - // ambil code terakhir - $maxCode = PenawaranTender::max('code'); - // chek data penawaran terakhir --> mengurutkan data berdasarkan kolom `created_at` secara DESC - // $penawaran = PenawaranTender::latest()->first(); - $penawaran = PenawaranTender::where('code', '=', $maxCode)->first(); - $code_penawaran_last = ''; - - // nomor di set 0001 - $noUrutAkhirString = sprintf("%04s", 1); - if ($penawaran) { - $isNum = substr($maxCode, 2); // memastikan string ke 3 s/d 8 adalan numiric - $isNP = substr($maxCode, 0, 2); - if ((8 == strlen($maxCode)) && ("NP" == $isNP) && (isNumeric($isNum))) { - $code_penawaran_last = substr($maxCode, -4); - $year_penawaran_last = Carbon::parse($penawaran->created_at)->year; - $year_now = Carbon::now()->year; - if ($year_now == $year_penawaran_last) { - $noUrutAkhirString = sprintf("%04s", abs($code_penawaran_last + 1)); + // nomor di set 0001 + $noUrutAkhirString = sprintf("%04s", 1); + if ($penawaran) { + $isNum = substr($maxCode, 2); // memastikan string ke 3 s/d 8 adalan numiric + $isNP = substr($maxCode, 0, 2); + if ((8 == strlen($maxCode)) && ("NP" == $isNP) && (isNumeric($isNum))) { + $code_penawaran_last = substr($maxCode, -4); + $year_penawaran_last = Carbon::parse($penawaran->created_at)->year; + $year_now = Carbon::now()->year; + if ($year_now == $year_penawaran_last) { + $noUrutAkhirString = sprintf("%04s", abs($code_penawaran_last + 1)); + } + // jika ternyata tahun tdk sama (kurang dari tahun sekarang), maka nomor di set 0001 } - // jika ternyata tahun tdk sama (kurang dari tahun sekarang), maka nomor di set 0001 + + } + + return 'NP' . Carbon::now()->format('y') . $noUrutAkhirString; + } + + function isNumeric($str) + { + return ctype_digit($str); + } + + // generate last penawaran.no_spk + function onLastnumberCodePenawaranSPK($jenis_laporan_code) + : string + { + + // 20241124_001 ==> spk_no_core + // XXX / PJ / JKT / MONTH-ROM / FR|SR / 2024 + // 001 / PJ / JKT / XI / FR / 2024 + $maxCode = PenawaranTender::max('spk_no_core'); + $penawaran = PenawaranTender::where('spk_no_core', '=', $maxCode)->first(); + $no_spk_penawaran_last = ''; + $year_penawaran_last = ''; + $year_now = Carbon::now()->year; + // nomor di set 001 + $noUrutAkhirString = sprintf("%03s", 1); + if ($penawaran) { + $no_spk_penawaran_last = substr($maxCode, -3); + $year_penawaran_last = substr($maxCode, 0, 4); + + if ($year_now == $year_penawaran_last) { + $noUrutAkhirString = sprintf("%03s", abs($no_spk_penawaran_last + 1)); + } + // jika ternyata tahun tdk sama (kurang dari tahun sekarang), maka nomor di set 001 + } + + $month = onRomawi(Carbon::now()->month); + + $lastSPK = $noUrutAkhirString . ' / PJ / JKT / ' . $month . ' / ' . $jenis_laporan_code . ' / ' . $year_now; + return $lastSPK; + } + + function onRomawi(int $bln) + : string + { + switch ($bln) { + case 1: + return "I"; + break; + case 2: + return "II"; + break; + case 3: + return "III"; + break; + case 4: + return "IV"; + break; + case 5: + return "V"; + break; + case 6: + return "VI"; + break; + case 7: + return "VII"; + break; + case 8: + return "VIII"; + break; + case 9: + return "IX"; + break; + case 10: + return "X"; + break; + case 11: + return "XI"; + break; + case 12: + return "XII"; + break; + } } - return 'NP' . Carbon::now()->format('y') . $noUrutAkhirString; -} - -function isNumeric($str) -{ - return ctype_digit($str); -} - -// generate last penawaran.no_spk -function onLastnumberCodePenawaranSPK($jenis_laporan_code): string -{ - - // 20241124_001 ==> spk_no_core - // XXX / PJ / JKT / MONTH-ROM / FR|SR / 2024 - // 001 / PJ / JKT / XI / FR / 2024 - $maxCode = PenawaranTender::max('spk_no_core'); - $penawaran = PenawaranTender::where('spk_no_core', '=', $maxCode)->first(); - $no_spk_penawaran_last = ''; - $year_penawaran_last = ''; - $year_now = Carbon::now()->year; - // nomor di set 001 - $noUrutAkhirString = sprintf("%03s", 1); - if ($penawaran) { - $no_spk_penawaran_last = substr($maxCode, -3); - $year_penawaran_last = substr($maxCode, 0, 4); - - if ($year_now == $year_penawaran_last) { - $noUrutAkhirString = sprintf("%03s", abs($no_spk_penawaran_last + 1)); + function penyebut($nilai) + { + $nilai = abs($nilai); + $huruf = [ + "", + "satu", + "dua", + "tiga", + "empat", + "lima", + "enam", + "tujuh", + "delapan", + "sembilan", + "sepuluh", + "sebelas" + ]; + $temp = ""; + if ($nilai < 12) { + $temp = " " . $huruf[$nilai]; + } else if ($nilai < 20) { + $temp = penyebut($nilai - 10) . " belas"; + } else if ($nilai < 100) { + $temp = penyebut($nilai / 10) . " puluh" . penyebut($nilai % 10); + } else if ($nilai < 200) { + $temp = " seratus" . penyebut($nilai - 100); + } else if ($nilai < 1000) { + $temp = penyebut($nilai / 100) . " ratus" . penyebut($nilai % 100); + } else if ($nilai < 2000) { + $temp = " seribu" . penyebut($nilai - 1000); + } else if ($nilai < 1000000) { + $temp = penyebut($nilai / 1000) . " ribu" . penyebut($nilai % 1000); + } else if ($nilai < 1000000000) { + $temp = penyebut($nilai / 1000000) . " juta" . penyebut($nilai % 1000000); + } else if ($nilai < 1000000000000) { + $temp = penyebut($nilai / 1000000000) . " milyar" . penyebut(fmod($nilai, 1000000000)); + } else if ($nilai < 1000000000000000) { + $temp = penyebut($nilai / 1000000000000) . " trilyun" . penyebut(fmod($nilai, 1000000000000)); } - // jika ternyata tahun tdk sama (kurang dari tahun sekarang), maka nomor di set 001 + return $temp; } - $month = onRomawi(Carbon::now()->month); - - $lastSPK = $noUrutAkhirString.' / PJ / JKT / '. $month .' / ' .$jenis_laporan_code.' / '.$year_now; - return $lastSPK; -} - -function onRomawi(int $bln): string -{ - switch ($bln) { - case 1: - return "I"; - break; - case 2: - return "II"; - break; - case 3: - return "III"; - break; - case 4: - return "IV"; - break; - case 5: - return "V"; - break; - case 6: - return "VI"; - break; - case 7: - return "VII"; - break; - case 8: - return "VIII"; - break; - case 9: - return "IX"; - break; - case 10: - return "X"; - break; - case 11: - return "XI"; - break; - case 12: - return "XII"; - break; - - } - -} - -function penyebut($nilai) -{ - $nilai = abs($nilai); - $huruf = array("", "satu", "dua", "tiga", "empat", "lima", "enam", "tujuh", "delapan", "sembilan", "sepuluh", "sebelas"); - $temp = ""; - if ($nilai < 12) { - $temp = " ". $huruf[$nilai]; - } elseif ($nilai < 20) { - $temp = penyebut($nilai - 10). " belas"; - } elseif ($nilai < 100) { - $temp = penyebut($nilai / 10)." puluh". penyebut($nilai % 10); - } elseif ($nilai < 200) { - $temp = " seratus" . penyebut($nilai - 100); - } elseif ($nilai < 1000) { - $temp = penyebut($nilai / 100) . " ratus" . penyebut($nilai % 100); - } elseif ($nilai < 2000) { - $temp = " seribu" . penyebut($nilai - 1000); - } elseif ($nilai < 1000000) { - $temp = penyebut($nilai / 1000) . " ribu" . penyebut($nilai % 1000); - } elseif ($nilai < 1000000000) { - $temp = penyebut($nilai / 1000000) . " juta" . penyebut($nilai % 1000000); - } elseif ($nilai < 1000000000000) { - $temp = penyebut($nilai / 1000000000) . " milyar" . penyebut(fmod($nilai, 1000000000)); - } elseif ($nilai < 1000000000000000) { - $temp = penyebut($nilai / 1000000000000) . " trilyun" . penyebut(fmod($nilai, 1000000000000)); - } - return $temp; -} - -function terbilang($nilai) -{ - if ($nilai < 0) { - $hasil = "minus ". trim(penyebut($nilai)); - } else { - $hasil = trim(penyebut($nilai)); - } - return $hasil; -} -// andy add - - -function hitungHariKerja($tanggalMulai, $tanggalSelesai) -{ - $tanggalMulai = Carbon::parse($tanggalMulai)->startOfDay(); - $tanggalSelesai = Carbon::parse($tanggalSelesai)->endOfDay(); - - $hariKerja = 0; - $tanggalSekarang = $tanggalMulai->copy(); - - while ($tanggalSekarang <= $tanggalSelesai) { - // Cek apakah hari ini bukan Sabtu atau Minggu dan bukan hari libur - if (!$tanggalSekarang->isWeekend() && !in_array($tanggalSekarang->format('Y-m-d'), holidays())) { - $hariKerja++; + function terbilang($nilai) + { + if ($nilai < 0) { + $hasil = "minus " . trim(penyebut($nilai)); + } else { + $hasil = trim(penyebut($nilai)); } - $tanggalSekarang->addDay(); + return $hasil; } - return $hariKerja; -} + // andy add -function holidays() -{ - return HolidayCalendar::pluck('date')->map( - function ($item) { - return Carbon::parse($item)->format('Y-m-d'); - }, - )->toArray(); -} -function countPermohonanForUser($userId) -{ - $validStatuses = [ - 'assign', - 'survey-completed', - 'proses-laporan', - 'paparan', - 'proses-paparan', - 'revisi-laporan', - 'revisi-paparan', - 'survey', - 'proses-survey', - 'request-reschedule', - 'reschedule', - 'rejected-reschedule', - 'approved-reschedule', - 'revisi-survey', - 'revisi-pembayaran' - ]; + function hitungHariKerja($tanggalMulai, $tanggalSelesai) + { + $tanggalMulai = Carbon::parse($tanggalMulai)->startOfDay(); + $tanggalSelesai = Carbon::parse($tanggalSelesai)->endOfDay(); - $result = Penilaian::whereHas('userPenilai', function ($query) use ($userId) { - $query->where('user_id', $userId); - }) - ->whereHas('permohonan', function ($query) use ($validStatuses) { - $query->whereIn('status', $validStatuses); + $hariKerja = 0; + $tanggalSekarang = $tanggalMulai->copy(); + + while ($tanggalSekarang <= $tanggalSelesai) { + // Cek apakah hari ini bukan Sabtu atau Minggu dan bukan hari libur + if (!$tanggalSekarang->isWeekend() && !in_array($tanggalSekarang->format('Y-m-d'), holidays())) { + $hariKerja++; + } + $tanggalSekarang->addDay(); + } + + return $hariKerja; + } + + function holidays() + { + return HolidayCalendar::pluck('date')->map( + function ($item) { + return Carbon::parse($item)->format('Y-m-d'); + }, + )->toArray(); + } + + function countPermohonanForUser($userId) + { + $validStatuses = [ + 'assign', + 'survey-completed', + 'proses-laporan', + 'paparan', + 'proses-paparan', + 'revisi-laporan', + 'revisi-paparan', + 'survey', + 'proses-survey', + 'request-reschedule', + 'reschedule', + 'rejected-reschedule', + 'approved-reschedule', + 'revisi-survey', + 'revisi-pembayaran' + ]; + + $result = Penilaian::whereHas('userPenilai', function ($query) use ($userId) { + $query->where('user_id', $userId); }) - ->get() - ->groupBy(function ($item) { - // Pastikan mengakses properti dari model yang valid - return $item->userPenilai->first()->user_id . '-' . $item->permohonan->id; - }) - ->map(function ($group) { - return [ - 'statuses' => $group->pluck('permohonan.status')->unique()->values()->all(), - ]; - }); + ->whereHas('permohonan', function ($query) use ($validStatuses) { + $query->whereIn('status', $validStatuses); + }) + ->get() + ->groupBy(function ($item) { + // Pastikan mengakses properti dari model yang valid + return $item->userPenilai->first()->user_id . '-' . $item->permohonan->id; + }) + ->map(function ($group) { + return [ + 'statuses' => $group->pluck('permohonan.status')->unique()->values()->all(), + ]; + }); - return $result->count(); -} - - -function getMaxFileSize($jenis) -{ - $jenisDokumen = JenisDokumen::where('name', $jenis)->first(); - if (!$jenisDokumen) { - return 2048; - } - //konversi ke KB (1 MB = 1024 KB) - $maxSizeInKB = (int) $jenisDokumen->max_size * 1024; - - return $maxSizeInKB; -} - -function getUser($userId) -{ - return User::find($userId); -} - -function generateLpjUniqueCode($randomLength = 6) -{ - - $year = date('y'); - $month = str_pad(date('m'), 2, '0', STR_PAD_LEFT); - $day = str_pad(date('d'), 2, '0', STR_PAD_LEFT); - - // Generate random numbers - $randomNumber = str_pad(mt_rand(0, pow(10, $randomLength) - 1), $randomLength, '0', STR_PAD_LEFT); - - // Concatenate components to create the custom code - return $year . $month . $day . $randomNumber; -} - -function checkRegionUserName($userId) -{ - $region = TeamsUsers::where('user_id', $userId)->first(); - if ($region) { - return $region->team->regions->name; - } else { - return null; - } -} - -function getNomorLaporan($permohonanId, $documentId, $type = 'nomor_laporan') -{ - - $laporan = Laporan::where([ - 'permohonan_id' => $permohonanId, - 'dokumen_jaminan_id' => $documentId, - ])->first(); - - if (!$laporan) { - return $type == 'nomor_laporan' ? '-' : null; + return $result->count(); } - return $type == 'nomor_laporan' ? $laporan->nomor_laporan : $laporan->created_at; -} -function getCustomField($param) -{ - if (is_numeric($param)) { - $field = CustomField::find($param); - } else { - $field = CustomField::where(['name' => $param])->first(); - } - if ($field) { - return $field; - } else { - return null; - } -} -function getWilayahName($code, $type) -{ - try { - $wilayah = null; + function getMaxFileSize($jenis) + { + $jenisDokumen = JenisDokumen::where('name', $jenis)->first(); + if (!$jenisDokumen) { + return 2048; + } + //konversi ke KB (1 MB = 1024 KB) + $maxSizeInKB = (int) $jenisDokumen->max_size * 1024; - if (!$code) { + return $maxSizeInKB; + } + + function getUser($userId) + { + return User::find($userId); + } + + function generateLpjUniqueCode($randomLength = 6) + { + + $year = date('y'); + $month = str_pad(date('m'), 2, '0', STR_PAD_LEFT); + $day = str_pad(date('d'), 2, '0', STR_PAD_LEFT); + + // Generate random numbers + $randomNumber = str_pad(mt_rand(0, pow(10, $randomLength) - 1), $randomLength, '0', STR_PAD_LEFT); + + // Concatenate components to create the custom code + return $year . $month . $day . $randomNumber; + } + + function checkRegionUserName($userId) + { + $region = TeamsUsers::where('user_id', $userId)->first(); + if ($region) { + return $region->team->regions->name; + } else { + return null; + } + } + + function getNomorLaporan($permohonanId, $documentId, $type = 'nomor_laporan') + { + + $laporan = Laporan::where([ + 'permohonan_id' => $permohonanId, + 'dokumen_jaminan_id' => $documentId, + ])->first(); + + if (!$laporan) { + return $type == 'nomor_laporan' ? '-' : null; + } + + return $type == 'nomor_laporan' ? $laporan->nomor_laporan : $laporan->created_at; + } + + function getCustomField($param) + { + if (is_numeric($param)) { + $field = CustomField::find($param); + } else { + $field = CustomField::where(['name' => $param])->first(); + } + if ($field) { + return $field; + } else { + return null; + } + } + + function getWilayahName($code, $type) + { + try { + $wilayah = null; + + if (!$code) { + return null; + } + + switch ($type) { + case 'province': + $wilayah = Province::where('code', $code)->first(); + return $wilayah ? $wilayah->name : null; + + case 'city': + $wilayah = City::where('code', $code)->first(); + return $wilayah ? $wilayah->name : null; + + case 'district': + $wilayah = District::where('code', $code)->first(); + return $wilayah ? $wilayah->name : null; + + case 'village': + $wilayah = Village::where('code', $code)->first(); + return $wilayah ? $wilayah->name : null; + + default: + return null; + } + } catch (Exception $e) { return null; } - - switch ($type) { - case 'province': - $wilayah = Province::where('code', $code)->first(); - return $wilayah ? $wilayah->name : null; - - case 'city': - $wilayah = City::where('code', $code)->first(); - return $wilayah ? $wilayah->name : null; - - case 'district': - $wilayah = District::where('code', $code)->first(); - return $wilayah ? $wilayah->name : null; - - case 'village': - $wilayah = Village::where('code', $code)->first(); - return $wilayah ? $wilayah->name : null; - - default: - return null; - } - } catch (\Exception $e) { - return null; } -} -function formatLabel($key) -{ + function formatLabel($key) + { + + static $labelCache = []; + if (isset($labelCache[$key])) { + return $labelCache[$key]; + } + + $customLabel = CustomField::where('name', $key)->first(); + $labelCache[$key] = $customLabel->label ?? ucwords(str_replace('_', ' ', $key)); - static $labelCache = []; - if (isset($labelCache[$key])) { return $labelCache[$key]; } - $customLabel = CustomField::where('name', $key)->first(); - $labelCache[$key] = $customLabel->label ?? ucwords(str_replace('_', ' ', $key)); + function calculateSLA($permohonan, $type) + { + if (!$type) { + return null; + } - return $labelCache[$key]; -} + $nilai_plafond = in_array($permohonan->nilai_plafond_id, [2, 3]); + $nilai_plafond_2 = in_array($permohonan->nilai_plafond_id, [1]); -function calculateSLA($permohonan, $type) -{ - if (!$type) { - return null; + $slaMap = [ + 'resume' => $nilai_plafond ? 2 : null, + 'paparan' => $nilai_plafond ? 2 : null, + 'standard' => $nilai_plafond ? 3 : null, + 'sederhana' => $nilai_plafond ? 2 : null, + 'paparan' => $nilai_plafond_2 ? 3 : null, + 'rap' => 3, + 'memo' => $nilai_plafond ? 1 : null + ]; + + if ($type === 'paparan' && isset($permohonan->tujuanPenilaian->name) && $permohonan->tujuanPenilaian->name === 'rap') { + return 2; + } + + return $slaMap[$type] ?? null; } - $nilai_plafond = in_array($permohonan->nilai_plafond_id, [2, 3]); - $nilai_plafond_2 = in_array($permohonan->nilai_plafond_id, [1]); - $slaMap = [ - 'resume' => $nilai_plafond ? 2 : null, - 'paparan' => $nilai_plafond ? 2 : null, - 'standard' => $nilai_plafond ? 3 : null, - 'sederhana' => $nilai_plafond ? 2 : null, - 'paparan' => $nilai_plafond_2 ? 3 : null, - 'rap' => 3, - 'memo' => $nilai_plafond ? 1 : null - ]; - - if ($type === 'paparan' && isset($permohonan->tujuanPenilaian->name) && $permohonan->tujuanPenilaian->name === 'rap') { - return 2; - } - - return $slaMap[$type] ?? null; -} - - -/** + /** * Menghitung total nilai berdasarkan key dan jenis legalitas. * - * @param array $detailsArray + * @param array $detailsArray * @param string $key - * @param int $jenisLegalitas + * @param int $jenisLegalitas + * * @return int */ -function calculateTotalLuas($detailsArray, $key, $jenisLegalitas, $defaultJenisLegalitas, $fallbackJenisLegalitas) -{ - $total = 0; + function calculateTotalLuas($detailsArray, $key, $jenisLegalitas, $defaultJenisLegalitas, $fallbackJenisLegalitas) + { + $total = 0; - if ($detailsArray) { - foreach ($detailsArray as $item) { - if (isset($item->jenis_legalitas_jaminan_id) && $item->jenis_legalitas_jaminan_id === $jenisLegalitas) { - $details = json_decode($item->details, true); - - if (is_array($details)) { - foreach ($details as $detail) { - if (isset($detail[$key])) { - $total += (int) $detail[$key]; - } - } - } - } - } - - // Jika total masih 0, gunakan jenis jaminan ppjb - if ($total === 0) { + if ($detailsArray) { foreach ($detailsArray as $item) { - if (isset($item->jenis_legalitas_jaminan_id) && $item->jenis_legalitas_jaminan_id === $defaultJenisLegalitas) { + if (isset($item->jenis_legalitas_jaminan_id) && $item->jenis_legalitas_jaminan_id === $jenisLegalitas) { $details = json_decode($item->details, true); if (is_array($details)) { foreach ($details as $detail) { - if (isset($detail[$key]) && $detail[$key] !== null) { + if (isset($detail[$key])) { $total += (int) $detail[$key]; } } } } } + + // Jika total masih 0, gunakan jenis jaminan ppjb + if ($total === 0) { + foreach ($detailsArray as $item) { + if (isset($item->jenis_legalitas_jaminan_id) && $item->jenis_legalitas_jaminan_id === $defaultJenisLegalitas) { + $details = json_decode($item->details, true); + + if (is_array($details)) { + foreach ($details as $detail) { + if (isset($detail[$key]) && $detail[$key] !== null) { + $total += (int) $detail[$key]; + } + } + } + } + } + } + + // jika total masih kosong juga maka gunakan ppb + if ($total === 0 && $fallbackJenisLegalitas !== null) { + foreach ($detailsArray as $item) { + if (isset($item->jenis_legalitas_jaminan_id) && $item->jenis_legalitas_jaminan_id === $fallbackJenisLegalitas) { + $details = json_decode($item->details, true); + + if (is_array($details)) { + foreach ($details as $detail) { + if (isset($detail[$key]) && $detail[$key] !== null) { + $total += (int) $detail[$key]; + } + } + } + } + } + } } - // jika total masih kosong juga maka gunakan ppb - if ($total === 0 && $fallbackJenisLegalitas !== null) { - foreach ($detailsArray as $item) { - if (isset($item->jenis_legalitas_jaminan_id) && $item->jenis_legalitas_jaminan_id === $fallbackJenisLegalitas) { - $details = json_decode($item->details, true); + return $total > 0 ? $total : 0; + } - if (is_array($details)) { - foreach ($details as $detail) { - if (isset($detail[$key]) && $detail[$key] !== null) { - $total += (int) $detail[$key]; - } - } - } - } - } + + function ubahNomorHp($nomorHp) + { + + $nomorHp = preg_replace('/\D/', '', $nomorHp); + if (strpos($nomorHp, '62') === 0) { + $nomorBaru = substr($nomorHp, 0, 5) . "xxxxx"; + return '+' . $nomorBaru; + } else if (strpos($nomorHp, '0') === 0) { + + $nomorBaru = substr($nomorHp, 0, 5) . "xxxxxx"; + return $nomorBaru; + } else { + return "Nomor HP tidak valid"; } } - return $total > 0 ? $total : 0; -} - - -function ubahNomorHp($nomorHp) { - - $nomorHp = preg_replace('/\D/', '', $nomorHp); - if (strpos($nomorHp, '62') === 0) { - $nomorBaru = substr($nomorHp, 0, 5) . "xxxxx"; - return '+' . $nomorBaru; - } elseif (strpos($nomorHp, '0') === 0) { - - $nomorBaru = substr($nomorHp, 0, 5) . "xxxxxx"; - return $nomorBaru; - } else { - return "Nomor HP tidak valid"; - } -} - - function formatNotifikasi($data){ - $data = json_decode(json_encode($data->data)); - $data = $data->data; + function formatNotifikasi($notifikasi) + { + $data = json_decode(json_encode($notifikasi->data)); + $message = $data->message; + $data = $data->data; $notifikasi = [ - 'title'=> 'Permohonan : '.$data->nomor_registrasi, - 'message'=> 'Status : '.str_replace(['-','_'],' ',ucwords($data->status)) + 'title' => 'Permohonan : ' . $data->nomor_registrasi, + 'message' => $message, ]; return $notifikasi; } diff --git a/app/Http/Controllers/LaporanAdminKreditController.php b/app/Http/Controllers/LaporanAdminKreditController.php index f9adfca..a9a17aa 100644 --- a/app/Http/Controllers/LaporanAdminKreditController.php +++ b/app/Http/Controllers/LaporanAdminKreditController.php @@ -19,12 +19,7 @@ */ public function index() { - $permohonan = Permohonan::with([ - 'documents.jenisJaminan', - 'penilaian._user_penilai', - 'penilai', - 'documents.detail.jenisLegalitasJaminan' - ])->where(['status' => 'done'])->get(); + $permohonan = Permohonan::where(['status' => 'done'])->get(); foreach ($permohonan as $_permohonan) { $npw = 0; if (isset($_permohonan->penilai->lpj)) { diff --git a/app/Http/Controllers/LaporanPenilaianJaminanController.php b/app/Http/Controllers/LaporanPenilaianJaminanController.php new file mode 100644 index 0000000..ecde913 --- /dev/null +++ b/app/Http/Controllers/LaporanPenilaianJaminanController.php @@ -0,0 +1,155 @@ +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->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' => '', + 'tanggal_review' => '', + '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'); + } + } diff --git a/app/Http/Controllers/PermohonanController.php b/app/Http/Controllers/PermohonanController.php index 7da543c..5212e92 100644 --- a/app/Http/Controllers/PermohonanController.php +++ b/app/Http/Controllers/PermohonanController.php @@ -65,10 +65,6 @@ class PermohonanController extends Controller // Save to database $permohonan = Permohonan::create($validate); - $user_ = User::find($permohonan->created_by); - $user_->notify(new PermohonanNotif($permohonan)); - - // Create history $this->historyService->createHistory( $permohonan, diff --git a/app/Notifications/PermohonanNotif.php b/app/Notifications/PermohonanNotif.php index 3902cfd..78de41c 100644 --- a/app/Notifications/PermohonanNotif.php +++ b/app/Notifications/PermohonanNotif.php @@ -1,50 +1,58 @@ permohonan = $permohonan; - } + class PermohonanNotif extends Notification + { + use Queueable; - /** - * Get the notification's delivery channels. - */ - public function via($notifiable): array - { - return ['mail','database']; - } + protected $permohonan; + protected $message; - /** - * Get the mail representation of the notification. - */ - public function toMail($notifiable): MailMessage - { - return (new MailMessage) - ->line('The introduction to the notification.') - ->action('Notification Action', 'https://laravel.com') - ->line('Thank you for using our application!'); - } + /** + * Create a new notification instance. + */ + public function __construct($permohonan, $message) + { + $this->permohonan = $permohonan; + $this->message = $message; + } - /** - * Get the array representation of the notification. - */ - public function toArray($notifiable): array - { - return [ - 'data' => $this->permohonan, - ]; - } -} + /** + * Get the notification's delivery channels. + */ + public function via($notifiable) + : array + { + return ['mail', 'database']; + } + + /** + * Get the mail representation of the notification. + */ + public function toMail($notifiable) + : MailMessage + { + return (new MailMessage) + ->line('The introduction to the notification.') + ->action('Notification Action', 'https://laravel.com') + ->line('Thank you for using our application!'); + } + + /** + * Get the array representation of the notification. + */ + public function toArray($notifiable) + : array + { + return [ + 'data' => $this->permohonan, + 'message' => $this->message, + ]; + } + } diff --git a/app/Services/PermohonanHistoryService.php b/app/Services/PermohonanHistoryService.php index 05bf609..723eb42 100644 --- a/app/Services/PermohonanHistoryService.php +++ b/app/Services/PermohonanHistoryService.php @@ -4,6 +4,8 @@ namespace Modules\Lpj\Services; use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\PermohonanHistory; +use Modules\Lpj\Notifications\PermohonanNotif; +use Modules\Usermanagement\Models\User; class PermohonanHistoryService { @@ -21,6 +23,8 @@ class PermohonanHistoryService 'user_id' => auth()->id(), ]); + $this->createNotification($permohonan, $status, $beforeRequest, $afterRequest); + } catch (\Exception $e) { // Log the error \Log::error('Error creating PermohonanHistory: ' . $e->getMessage()); @@ -34,4 +38,25 @@ class PermohonanHistoryService throw new \Exception('Failed to create PermohonanHistory: ' . $e->getMessage()); } } + + private function createNotification(Permohonan $permohonan, string $status, array $beforeRequest, array $afterRequest) + { + $beforeStatus = ''; + if(!empty($beforeRequest)){ + $beforeStatus = $beforeRequest['status'] ?? ''; + } + + if($beforeStatus !== $status){ + if($status === 'order'){ + $users = User::where(['branch_id' => $permohonan->branch_id])->whereHas('roles',function($q){ + $q->where('name', 'pemohon-eo'); + })->get(); + + foreach ($users as $user) { + $message = "telah diorder oleh {$permohonan->creator->name}, Mohon Lakukan konfirmasi"; + $user->notify(new PermohonanNotif($permohonan,$message)); + } + } + } + } } diff --git a/resources/views/laporan_penilaian_jaminan/index.blade.php b/resources/views/laporan_penilaian_jaminan/index.blade.php new file mode 100644 index 0000000..449eddd --- /dev/null +++ b/resources/views/laporan_penilaian_jaminan/index.blade.php @@ -0,0 +1,311 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{ Breadcrumbs::render('laporan-penilaian-jaminan') }} +@endsection + +@section('content') +
| + + | ++ Nomor Registrasi + + | ++ Tanggal Permohonan + + | ++ Cabang + + | ++ Pemohon + + | ++ Nama Debitur + + | + ++ Tujuan Penilaian + + | ++ Jenis Agunan + + | ++ Alamat Agunan + + | ++ Luas Tanah + + | ++ Nilai Tanah + + | ++ Luas Bangunan + + | ++ Nilai Bangunan + + | ++ Tanggal Laporan + + | ++ Tanggal Review + + | ++ Nilai Pasar Wajar + + | ++ Nilai Likuidasi + + | ++ Nama Penilai + + | +
|---|