From 45f0d387fdc608749090bf5b06dd476e64ec4139 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Mon, 10 Nov 2025 10:09:24 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(lpj):=20peningkatan=20model=20?= =?UTF-8?q?&=20service=20inspeksi,=20penawaran,=20preview?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Models: Inspeksi tambah 'mig_detail_data_jaminan' pada 'fillable'. - Models: PersetujuanPenawaran ubah import User, hapus 3 field lama. - Models: PersetujuanPenawaran tambah relasi 'region' (belongsTo Region). - Services: PreviewLaporanService tambah 22 item kategori preview. - Services: SaveFormInspesksiService refaktor parsing action & rules. - Services: TypeLaporanService tambah helper alamat & lokasi wilayah. - Services: TypeLaporanService tambahkan updateOrCreate untuk Penilai. - Services: TypeLaporanService tambah getInspeksi dan stub updatePenilai. - Cleanup: penataan kode, trimming, kurangi nested kondisi; mohon cek namespace. --- app/Models/Inspeksi.php | 2 +- app/Models/PersetujuanPenawaran.php | 11 +- app/Services/PreviewLaporanService.php | 733 ++++++++++++++++++++++ app/Services/SaveFormInspesksiService.php | 46 +- app/Services/TypeLaporanService.php | 107 ++++ 5 files changed, 872 insertions(+), 27 deletions(-) create mode 100644 app/Services/PreviewLaporanService.php create mode 100644 app/Services/TypeLaporanService.php diff --git a/app/Models/Inspeksi.php b/app/Models/Inspeksi.php index 38a6f05..327e9bb 100644 --- a/app/Models/Inspeksi.php +++ b/app/Models/Inspeksi.php @@ -14,7 +14,7 @@ class Inspeksi extends Base /** * The attributes that are mass assignable. */ - protected $fillable = ['data_form', 'foto_form', 'denah_form','permohonan_id', 'name', 'status', 'authorized_status', 'authorized_at', 'authorized_by', 'created_by', 'updated_by', 'deleted_by','dokument_id','data_pembanding']; + protected $fillable = ['data_form', 'foto_form', 'denah_form','permohonan_id', 'name', 'status', 'authorized_status', 'authorized_at', 'authorized_by', 'created_by', 'updated_by', 'deleted_by','dokument_id','data_pembanding','mig_detail_data_jaminan']; public function permohonan() { diff --git a/app/Models/PersetujuanPenawaran.php b/app/Models/PersetujuanPenawaran.php index e42e343..0bb8158 100644 --- a/app/Models/PersetujuanPenawaran.php +++ b/app/Models/PersetujuanPenawaran.php @@ -2,7 +2,7 @@ namespace Modules\Lpj\Models; - use Modules\Usermanagement\Models\User; + use Modules\Usermanagemenet\Models\User; class PersetujuanPenawaran extends Base { @@ -13,9 +13,6 @@ 'permohonan_id', 'penawaran_id', 'nomor_proposal_penawaran', - 'nomor_tiket', - 'nominal_kurang_bayar', - 'bukti_ksl_kurang_bayar', 'tanggal_proposal_penawaran', 'biaya_final', 'sla_resume', @@ -49,6 +46,12 @@ return $this->belongsTo(Permohonan::class, 'permohonan_id'); } + // Relationship with Region + public function region() + { + return $this->belongsTo(Region::class); + } + // Relationship with User (for authorized_by) public function authorizedBy() { diff --git a/app/Services/PreviewLaporanService.php b/app/Services/PreviewLaporanService.php new file mode 100644 index 0000000..712f3eb --- /dev/null +++ b/app/Services/PreviewLaporanService.php @@ -0,0 +1,733 @@ +getPermohonanJaminanId( + $permohonan_id, + $dokumen_id, + $jaminan_id + ); + // $tipeLaporanResponse = $this->checkPrintOutLaporan($permohonan_id, $document_id); + // $tipeLaporan = $tipeLaporanResponse->getData(); + + // if (!$tipeLaporan->status) { + // return redirect()->back()->with('error', 'Laporan tidak valid'); + // } + $basicData = $this->getCommonData(); + + $inspeksi = Inspeksi::where('permohonan_id', $permohonan_id)->where('dokument_id', $dokumen_id)->first(); + $lpj = Penilai::where('permohonan_id', $permohonan_id)->where('dokument_id', $dokumen_id)->first(); + + $mig_permohonan = json_decode($permohonan->mig_permohonan); + + $nomorLaporan = getNomorLaporan($permohonan_id, $dokumen_id); + $tanggalLaporan = $permohonan->is_mig + ? ($mig_permohonan->mig_mst_jaminan_tgl_laporan ?? $mig_permohonan->mig_mst_jaminan_tgl_create ?? null) + : ($lpj->created_at ?? null); + $forminspeksi = null; + $lpjData = null; + $formFoto = null; + + // if ($inspeksi) { + $forminspeksi = json_decode($inspeksi?->data_form, true) ?? null; + + $formFoto = json_decode($inspeksi?->foto_form, true) ?? null; + // $denahForm = json_decode($data->denah_form, true); + $dataPembanding = json_decode($inspeksi?->data_pembanding, true) ?? null; + // } + + // if ($lpj) { + $lpjData = json_decode($lpj?->lpj, true) ?? null; + $memo = json_decode($lpj?->memo, true) ?? null; + $resumeData = json_decode($lpj?->resume, true) ?? null; + $rap = json_decode($lpj?->rap, true); + $report = json_decode($lpj?->call_report, true) ?? null; + // } + + $inputAddress = $forminspeksi['asset']['alamat']['sesuai'] ?? $forminspeksi['asset']['alamat']['tidak sesuai'] ?? []; + + $alamat = [ + 'address' => $inputAddress['address'] ?? null, + 'village_code' => getWilayahName($inputAddress['village_code'] ?? null, 'village'), + 'district_code' => getWilayahName($inputAddress['district_code'] ?? null, 'district'), + 'city_code' => getWilayahName($inputAddress['city_code'] ?? null, 'city'), + 'province_code' => getWilayahName($inputAddress['province_code'] ?? null, 'province') + ]; + + $statusLpj = 0; + + // $viewLaporan = $this->getViewLaporan($tipeLaporan); + return view('lpj::component.show-laporan-inspeksi', compact('permohonan', 'basicData', 'forminspeksi', 'alamat', 'lpjData', 'memo', 'resumeData', 'rap', 'report', 'lpj', 'formFoto', 'nomorLaporan', 'tanggalLaporan', 'dataPembanding', 'inspeksi', 'statusLpj', 'permohonan_id', 'back', )); + } + + public function printOutLaporan($permohonan_id, $document_id, $jaminan_id) + { + $tipeLaporanResponse = $this->checkPrintOutLaporan($permohonan_id, $document_id); + $tipeLaporan = $tipeLaporanResponse->getData(); + + //dd($permohonan_id, $document_id, $tipeLaporan); + + if (!$tipeLaporan->status) { + //return redirect()->back()->with('error', 'Laporan tidak valid'); + } + $permohonan = $this->getPermohonanJaminanId( + $permohonan_id, + $document_id, + $jaminan_id + ); + + $basicData = $this->getCommonData(); + + $inspeksi = Inspeksi::where('permohonan_id', $permohonan_id)->where('dokument_id', $document_id)->first(); + $lpj = Penilai::where('permohonan_id', $permohonan_id)->first(); //->where('dokument_id', $document_id)->first(); + + $mig_permohonan = json_decode($permohonan->mig_permohonan); + $nomorLaporan = getNomorLaporan($permohonan_id, $document_id); + + //Carbon::createFromFormat('d/m/Y H:i:s', $mig_permohonan->mig_mst_jaminan_tgl_laporan)->format('Y-m-d H:i:s'); + + $tanggalLaporan = $permohonan->is_mig + ? ($mig_permohonan->mig_mst_jaminan_tgl_laporan + ? Carbon::createFromFormat('d/m/Y H:i:s', $mig_permohonan->mig_mst_jaminan_tgl_laporan)->format('Y-m-d H:i:s') + : ($mig_permohonan->mig_mst_jaminan_tgl_oto + ? Carbon::createFromFormat('d/m/Y H:i:s', $mig_permohonan->mig_mst_jaminan_tgl_oto)->format('Y-m-d H:i:s') + : null)) + : ($lpj->created_at ?? null); + + + $forminspeksi = null; + $lpjData = null; + $formFoto = null; + + $dataPembanding =''; + if ($inspeksi) { + $forminspeksi = json_decode($inspeksi->data_form, true); + $formFoto = json_decode($inspeksi->foto_form, true); + // $denahForm = json_decode($data->denah_form, true); + $dataPembanding = json_decode($inspeksi->data_pembanding, true); + } + + + if ($lpj) { + $lpjData = json_decode($lpj->lpj, true); + $memo = json_decode($lpj->memo, true); + $resumeData = json_decode($lpj->resume, true); + $rap = json_decode($lpj->rap, true); + $report = json_decode($lpj->call_report, true); + } + + $inputAddress = $forminspeksi['asset']['alamat']['sesuai'] ?? $forminspeksi['asset']['alamat']['tidak sesuai'] ?? []; + + $inputAddress = $forminspeksi['asset']['alamat']['sesuai'] ?? $forminspeksi['asset']['alamat']['tidak sesuai'] ?? []; + $alamat = [ + 'address' => $inputAddress['address'] ?? null, + 'village_code' => getWilayahName($inputAddress['village_code'] ?? null, 'village'), + 'district_code' => getWilayahName($inputAddress['district_code'] ?? null, 'district'), + 'city_code' => getWilayahName($inputAddress['city_code'] ?? null, 'city'), + 'province_code' => getWilayahName($inputAddress['province_code'] ?? null, 'province') + ]; + + $viewLaporan = $this->getViewLaporan($tipeLaporan->status); + + $statusLpj = 1; + + $mig_permohonan = json_decode($permohonan->mig_permohonan); + if(($tipeLaporan->status === 'memo' && $permohonan->mig_permohonan) || $mig_permohonan->mig_mst_lpj_tot_nilai_pasar < 1){ + $paths = $formFoto['upload_foto'] ?? null; + + if (!is_array($paths) || empty($paths)) { + return response()->json(['error' => 'No files to download'], 404); + } + + $files = []; + foreach ($paths as $path) { + if (!$path['path']) { + Log::warning('PreviewLaporanService: Path kosong terdeteksi dalam daftar paths.'); + continue; + } + + // Logika fallback untuk path file + $originalPath = $path['path']; + $fallbackPath = null; + + // Jika file asli tidak ditemukan, buat fallback path + if ($statusLpj == 1) { + $fullOriginalPath = storage_path('app/public/' . $originalPath); + + if (!file_exists($fullOriginalPath)) { + // Ekstrak bagian akhir path (contoh: 251051/251051_2_2.png) + $pathParts = explode('/', $originalPath); + if (count($pathParts) >= 2) { + $lastTwoParts = array_slice($pathParts, -2); + $fallbackPath = 'surveyor/001/' . implode('/', $lastTwoParts); + Log::info('PreviewLaporanService: Menggunakan fallback path kandidat.', [ + 'original' => $originalPath, + 'fallback' => $fallbackPath, + ]); + } + } + } + + // Tentukan path yang akan digunakan + $pathToUse = ($fallbackPath && $statusLpj == 1 && file_exists(storage_path('app/public/' . $fallbackPath))) + ? $fallbackPath + : $originalPath; + + $fullPath = storage_path('app/public/' . $pathToUse); + if (!file_exists($fullPath)) { + Log::warning('PreviewLaporanService: File tidak ditemukan untuk original maupun fallback.', [ + 'original' => $originalPath, + 'fallback' => $fallbackPath, + 'resolved' => $pathToUse, + ]); + continue; + } + + Log::info('PreviewLaporanService: Menambahkan file untuk diunduh.', [ + 'resolved' => $pathToUse, + 'fullPath' => $fullPath, + ]); + $files[] = $fullPath; + } + + if (empty($files)) { + Log::warning('PreviewLaporanService: Tidak ada file valid ditemukan setelah resolusi path.'); + return response()->json(['error' => 'No valid files found'], 404); + } + + // For single file, download directly + if (count($files) === 1) { + Log::info('PreviewLaporanService: Mengunduh single file.', ['file' => $files[0]]); + return response()->download($files[0]); + } + + // For multiple files, create zip and download + $zipName = 'photos_' . time() . '.zip'; + $zipPath = storage_path('app/public/' . $zipName); + + $zip = new \ZipArchive(); + if ($zip->open($zipPath, \ZipArchive::CREATE) === true) { + foreach ($files as $file) { + $zip->addFile($file, basename($file)); + } + $zip->close(); + Log::info('PreviewLaporanService: Zip file berhasil dibuat.', ['zip' => $zipPath, 'count' => count($files)]); + return response()->download($zipPath)->deleteFileAfterSend(true); + } + + Log::error('PreviewLaporanService: Gagal membuat zip file.'); + return response()->json(['error' => 'Failed to create zip file'], 500); + } + try { + $pdf = $this->generatePDF($viewLaporan, compact( + 'permohonan', + 'forminspeksi', + 'lpjData', + 'formFoto', + 'basicData', + 'inspeksi', + 'lpj', + 'statusLpj', + 'alamat', + 'dataPembanding', + 'nomorLaporan', + 'memo', + 'resumeData', + 'tanggalLaporan', + 'rap', + 'report' + )); + + $cleanNomorLaporan = str_replace(['/', '\\'], '-', $nomorLaporan); + $filename = 'Laporan_' . $tipeLaporan->status . '_' . $permohonan->debiture->name . '_' . $cleanNomorLaporan; + + return $pdf->download($filename . '_data.pdf'); + } catch (\Exception $e) { + Log::error('PDF generation failed: ' . $e->getMessage()); + return response()->json(['error' => 'Failed to generate PDF. Please check the log for details.'], 500); + } + } + + private function generatePDF(string $viewLaporan, array $data) + { + //return view('lpj::' . $viewLaporan, $data); + + $pdf = PDF::loadView('lpj::' . $viewLaporan, $data); + $pdf->setPaper('A4', 'portrait'); + $pdf->set_option('isHtml5ParserEnabled', true); + $pdf->set_option('isPhpEnabled', true); + + return $pdf; + } + + + private function getViewLaporan($tipe) + { + $viewMap = [ + 'sederhana' => 'penilai.components.print-out-sederhana', + 'standar' => 'penilai.components.print-out-standar', + 'resume' => 'penilai.components.print-resume', + 'memo' => 'penilai.components.print-memo', + 'rap' => 'penilai.components.print-out-rap', + 'call-report' => 'penilai.components.print-out-call-report' + ]; + return $viewMap[$tipe] ?? 'penilai.components.print-resume'; + } + + public function checkPrintOutLaporan($permohonan_id, $dokumen_id) + { + + // Ambil data berdasarkan ID + $statusLpj = Penilai::where('permohonan_id', $permohonan_id) + //->where('dokument_id', $dokumen_id) + ->first(); + + + $permohonan = Permohonan::where('id', $permohonan_id)->first(); + + // Jika data tidak ditemukan, kembalikan status null + if (!$statusLpj) { + return response()->json(['status' => null]); + } + + // Tentukan tipe berdasarkan kondisi + $type = $statusLpj->type_penilai ?? null; + + if ($type === 'memo' && $permohonan->is_mig!=1) { + return $this->checkDataMemo($type, $statusLpj); + } + + if ($type === 'resume') { + return $this->checkDataResume($type, $statusLpj); + } + + + if ($type === 'standar' || $type === 'sederhana') { + return $this->checkDataLpj($type, $statusLpj); + } + + if ($type === 'rap') { + return $this->checkDataRap($type, $statusLpj); + } + + + + // Kembalikan respons dengan tipe yang sesuai + return response()->json(['status' => $type]); + } + + public function checkDataMemo($type, $statusLpj) + { + // Ambil data JSON dari statusLpj + $data = json_decode($statusLpj->memo, true) ?? []; + + + $validationRules = [ + 'memo' => [ + 'kepada', + 'dari', + 'nomor_memo', + 'tanggal', + 'perihal', + 'jenis_asset_tidak_sesuai', + 'lokasi.lokasi', + 'lokasi.province_code', + 'lokasi.city_code', + 'lokasi.district_code', + 'lokasi.village_code', + 'lokasi.penilai', + 'terlampir', + 'hasil_survey', + 'kesimpulan_saran', + ], + ]; + + // Validasi data JSON + if (isset($validationRules[$type])) { + $missingFields = []; + + foreach ($validationRules[$type] as $field) { + $keys = explode('.', $field); + $value = $data; + + foreach ($keys as $key) { + if (!isset($value[$key])) { + $missingFields[] = $field; + break; + } + $value = $value[$key]; + } + } + + // Jika ada field yang kosong, kembalikan error + if (!empty($missingFields)) { + return response()->json([ + 'status' => null, + 'message' => "Silahkan lengkapi data memo terlebih dahulu.", + 'missing_fields' => $missingFields, + ], 400); + } + } + + // Jika data valid + return response()->json([ + 'status' => $type, + 'message' => "Data memo valid.", + ]); + } + + + + + public function checkDataResume($type, $statusLpj) + { + // Ambil data JSON dari statusLpj + $data = json_decode($statusLpj->resume, true) ?? []; + + $validationRules = [ + 'resume' => [ + 'fisik' + ], + ]; + + // Validasi data JSON + if (isset($validationRules[$type])) { + $missingFields = []; + + foreach ($validationRules[$type] as $field) { + $keys = explode('.', $field); + $value = $data; + + foreach ($keys as $key) { + if (!isset($value[$key])) { + $missingFields[] = $field; + break; + } + $value = $value[$key]; + } + + // Validasi khusus untuk array fisik dan sesuai_imb + if ($field === 'fisik' || $field === 'sesuai_imb') { + if (empty($value) || !is_array($value)) { + $missingFields[] = $field; + continue; + } + + // Validasi struktur data di dalam array + foreach ($value as $item) { + $requiredKeys = ['sertifikat', 'luas_tanah', 'nilai']; + foreach ($requiredKeys as $requiredKey) { + if (!isset($item[$requiredKey])) { + $missingFields[] = $field . '.' . $requiredKey; + } + } + } + } + } + + // Jika ada field yang kosong, kembalikan error + if (!empty($missingFields)) { + return response()->json([ + 'status' => null, + 'message' => "Silahkan lengkapi data resume terlebih dahulu.", + 'missing_fields' => $missingFields, + ], 400); + } + } + + // Jika data valid + return response()->json([ + 'status' => $type, + 'message' => "Data resume valid.", + ]); + } + + public function checkDataLpj($type, $statusLpj) + { + // Ambil data JSON dari statusLpj + $data = json_decode($statusLpj->lpj, true) ?? []; + + $validationRules = [ + 'lpj' => [ + 'luas_tanah', + 'nilai_tanah_1', + 'nilai_tanah_2', + 'luas_bangunan', + 'nilai_bangunan_1', + 'nilai_bangunan_2', + 'total_nilai_pasar_wajar', + 'likuidasi', + 'likuidasi_nilai_1', + 'likuidasi_nilai_2', + 'asuransi_luas_bangunan', + 'asuransi_nilai_1', + 'asuransi_nilai_2', + 'npw_tambahan' + ], + ]; + + // Validasi data JSON + if (isset($validationRules[$type])) { + $missingFields = []; + + foreach ($validationRules[$type] as $field) { + // Penanganan khusus untuk field yang boleh null + if (in_array($field, ['sarana_pelengkap_penilai', 'nilai_sarana_pelengkap_1', 'nilai_sarana_pelengkap_2'])) { + continue; + } + + if (!isset($data[$field])) { + $missingFields[] = $field; + continue; + } + + // Validasi khusus untuk npw_tambahan + if ($field === 'npw_tambahan' && is_array($data[$field])) { + foreach ($data[$field] as $index => $item) { + $requiredKeys = ['name', 'luas', 'nilai_1', 'nilai_2']; + foreach ($requiredKeys as $key) { + if (!isset($item[$key])) { + $missingFields[] = "npw_tambahan[$index].$key"; + } + } + } + } + } + + + // Jika ada field yang kosong, kembalikan error + if (!empty($missingFields)) { + return response()->json([ + 'status' => null, + 'message' => "Silahkan lengkapi data LPJ terlebih dahulu.", + 'missing_fields' => $missingFields, + ], 400); + } + } + + // Jika data valid + return response()->json([ + 'status' => $type, + 'message' => "Data LPJ valid.", + ]); + } + + public function checkDataRap($type, $statusLpj) + { + // Ambil data JSON dari statusLpj + $data = json_decode($statusLpj->rap, true) ?? []; + + $requiredFields = [ + 'dari', + 'kepada', + 'perihal', + 'tanggal', + 'nomor_rap' + ]; + + // Cek apakah ada field yang kosong + $missingFields = []; + foreach ($requiredFields as $field) { + if (!isset($data[$field]) || empty($data[$field])) { + $missingFields[] = $field; + } + } + + // Jika ada field yang kosong, kembalikan error + if (!empty($missingFields)) { + return response()->json([ + 'status' => null, + 'message' => "Silahkan lengkapi data RAP terlebih dahulu.", + 'missing_fields' => $missingFields + ], 400); + } + + // Jika semua data terisi + return response()->json([ + 'status' => $type, + 'message' => "Data RAP valid." + ]); + } + private function getPermohonanJaminanId($id, $dokumentId, $jaminanId) + { + return Permohonan::with([ + 'user', + 'debiture.province', + 'debiture.city', + 'debiture.district', + 'debiture.village', + 'branch', + 'tujuanPenilaian', + 'penilaian', + 'penawaran', + 'debiture.documents' => function ($query) use ($dokumentId, $jaminanId) { + $query->where('id', $dokumentId) + ->where('jenis_jaminan_id', $jaminanId); + } + ])->findOrFail($id); + } + + public function getCommonData() + { + return [ + 'branches' => Branch::all(), + 'bentukTanah' => BentukTanah::all(), + 'konturTanah' => KonturTanah::all(), + 'posisiKavling' => PosisiKavling::all(), + 'ketinggianTanah' => KetinggianTanah::all(), + 'kondisiFisikTanah' => KondisiFisikTanah::all(), + 'jenisBangunan' => JenisBangunan::all(), + 'kondisiBangunan' => KondisiBangunan::all(), + 'sifatBangunan' => SifatBangunan::all(), + 'spekKategoriBangunan' => SpekKategoritBangunan::all(), + 'spekBangunan' => SpekBangunan::all(), + 'saranaPelengkap' => SaranaPelengkap::all(), + 'arahMataAngin' => ArahMataAngin::all(), + 'lantai' => Lantai::all(), + 'viewUnit' => ViewUnit::all(), + 'golMasySekitar' => GolonganMasySekitar::all(), + 'tingkatKeramaian' => TingkatKeramaian::all(), + 'laluLintasLokasi' => LaluLintasLokasi::all(), + 'jenisPesawat' => JenisPesawat::all(), + 'modelAlatBerat' => ModelAlatBerat::all(), + 'jenisKapal' => JenisKapal::all(), + 'jenisKendaraan' => JenisKendaraan::all(), + 'terletakArea' => TerletakArea::all(), + 'posisiUnit' => PosisiUnit::all(), + 'bentukUnit' => BentukUnit::all(), + 'fasilitasObjek' => FasilitasObjek::all(), + 'merupakanDaerah' => MerupakanDaerah::all(), + 'jenisUnit' => JenisUnit::all(), + 'jenisJaminan' => JenisJaminan::all(), + 'hubCadeb' => HubunganPemilikJaminan::all(), + 'hubPenghuni' => HubunganPenghuniJaminan::all(), + 'perkerasanJalan' => PerkerasanJalan::all(), + 'terletakDiArea' => TerletakArea::all(), + 'tujuanPenilaian' => TujuanPenilaian::all(), + 'perizinan' => Perizinan::all(), + 'foto' => FotoObjekJaminan::all() + ]; + } + + private const HEADERS = [ + 'bentuk-tanah' => ['Bentuk Tanah', 'bentuk-tanah'], + 'kontur-tanah' => ['Kontur Tanah', 'kontur-tanah'], + 'posisi-kavling' => ['Posisi Kavling', 'posisi-kavling'], + 'ketinggian-tanah' => ['Ketinggian Tanah', 'ketinggian-tanah'], + 'kondisi-fisik-tanah' => ['Kondisi Fisik Tanah', 'kondisi-fisik-tanah'], + 'jenis-bangunan' => ['Jenis Bangunan', 'jenis-bangunan'], + 'kondisi-bangunan' => ['Kondisi Bangunan', 'kondisi-bangunan'], + 'sifat-bangunan' => ['Sifat Bangunan', 'sifat-bangunan'], + 'sarana-pelengkap' => ['Sarana Pelengkap', 'sarana-pelengkap'], + 'lalu-lintas-lokasi' => ['Lalu Lintas Depan Lokasi', 'lalu-lintas-lokasi'], + 'tingkat-keramaian' => ['Tingkat Keramaian', 'tingkat-keramaian'], + 'gol-mas-sekitar' => ['Golongan Masyarakat Sekitar', 'gol-mas-sekitar'], + 'spek-kategori-bangunan' => ['Spek Kategori Bangunan', 'spek-kategori-bangunan'], + 'spek-bangunan' => ['Spek Bangunan', 'spek-bangunan'], + 'lantai-unit' => ['Lantai Unit', 'lantai-unit'], + 'view-unit' => ['View Unit', 'view-unit'], + 'perkerasan-jalan' => ['Perkerasan jalan', 'perkerasan-jalan'], + 'jenis-pesawat' => ['Jenis pesawat', 'jenis-pesawat'], + 'model-alat-berat' => ['Model alat berat', 'model-alat-berat'], + 'jenis-kapal' => ['Jenis kapal', 'jenis-kapal'], + 'jenis-kendaraan' => ['Jenis kendaraan', 'jenis-kendaraan'], + 'jenis-unit' => ['Jenis unit', 'jenis-unit'], + 'terletak-area' => ['Terletak di Area', 'terletak-area'], + 'merupakan-daerah' => ['Merupakan Daerah', 'merupakan-daerah'], + 'posisi-unit' => ['Posisi unit', 'posisi-unit'], + 'bentuk-unit' => ['Bentuk unit', 'bentuk-unit'], + 'fasilitas-objek' => ['Fasilitas Umum Dekat Objek', 'fasilitas-objek'], + 'foto-objek-jaminan' => ['Foto Objek Jaminan', 'foto-objek-jaminan'], + 'perizinan' => ['Perizinan', 'perizinan'], + ]; + +} diff --git a/app/Services/SaveFormInspesksiService.php b/app/Services/SaveFormInspesksiService.php index 90c76f0..c20b317 100644 --- a/app/Services/SaveFormInspesksiService.php +++ b/app/Services/SaveFormInspesksiService.php @@ -4,7 +4,6 @@ namespace Modules\Lpj\Services; use Modules\Lpj\Models\Inspeksi; use Illuminate\Http\Request; -use \Illuminate\Support\Facades\Log; class SaveFormInspesksiService { @@ -21,7 +20,6 @@ class SaveFormInspesksiService $inspeksi->name = $request->input('type'); $processedData = $this->getActionSpecificRules($validatedData, $type, $request, $inspeksi); - Log::info($processedData); // Merge data lama dengan data baru $existingData = json_decode($inspeksi->data_form, true) ?: []; @@ -35,7 +33,6 @@ class SaveFormInspesksiService 'upload_gs' ]; - foreach ($fotoTypes as $fotoType) { if (isset($existingData[$fotoType])) { $processedData[$fotoType] = $existingData[$fotoType]; @@ -60,7 +57,7 @@ class SaveFormInspesksiService } catch (\Exception $e) { return [ 'success' => false, - 'message' => 'Gagal menyimpan data : '.$e->getMessage(), + 'message' => 'Gagal menyimpan data', 'error' => $e->getMessage() ]; } @@ -88,31 +85,36 @@ class SaveFormInspesksiService $hasAssetDescriptionRules = false; $hasFactaData = false; - $actions = array_map('trim', explode(',', $action)); - $pisah = array_filter($actions, function($act) use ($allowedActions) { - return isset($allowedActions[$act]); - }); + + + $pisah = array_filter( + explode(',', $action), + function ($act) use ($allowedActions) { + return isset($allowedActions[trim($act)]); + } + ); + + // dd($pisah); foreach ($pisah as $act) { $act = trim($act); // Bersihkan spasi - if($act){ - if (isset($allowedActions[$act])) { - $method = $allowedActions[$act]; + if (isset($allowedActions[$act])) { + $method = $allowedActions[$act]; - $actionRules = $this->$method($data, $request, $inspeksi); - $rules = array_merge($rules, $actionRules); - // Cek apakah act memerlukan asset description rules - if($act){ - if (in_array($act, ['apartemen-kantor', 'tanah', 'bangunan', 'rap'])) { - $hasAssetDescriptionRules = true; - } + $actionRules = $this->$method($data, $request, $inspeksi); + $rules = array_merge($rules, $actionRules); - if (in_array($act, ['rap'])) { - $hasFactaData = true; - } - } + // Cek apakah act memerlukan asset description rules + if (in_array($act, ['apartemen-kantor', 'tanah', 'bangunan', 'rap'])) { + $hasAssetDescriptionRules = true; + } + + // Cek apakah act memerlukan fakta data + if (in_array($act, ['rap'])) { + $hasFactaData = true; } } + } if ($hasAssetDescriptionRules) { diff --git a/app/Services/TypeLaporanService.php b/app/Services/TypeLaporanService.php new file mode 100644 index 0000000..b6dfcf4 --- /dev/null +++ b/app/Services/TypeLaporanService.php @@ -0,0 +1,107 @@ +getPermohonanData($surveyorController, $permohonanId, $documentId, $jaminanId); + + if ($permohonan->status == 'proses-laporan') { + throw new \Exception('Masih dalam proses laporan'); + } + + $nomorLaporan = $this->generateNomorLaporan($surveyorController, $permohonan, $documentId, $type); + $inspeksi = $this->getInspeksi($permohonanId, $documentId); + $this->updatePenilai($permohonanId, $documentId, $type); + + $debitur = Debiture::find($permohonan->debiture_id); + $forminspeksi = $inspeksi ? json_decode($inspeksi->data_form, true) : null; + + $locationCodes = $this->getAlamatData($debitur, $forminspeksi); + $locationData = $this->getLocationData( + $locationCodes['provinceCode'], + $locationCodes['cityCode'], + $locationCodes['districtCode'], + $forminspeksi + ); + + return [ + 'permohonan' => $permohonan, + 'nomorLaporan' => $nomorLaporan, + 'basicData' => $surveyorController->getCommonData(), + 'cities' => $locationData['cities'], + 'districts' => $locationData['districts'], + 'villages' => $locationData['villages'], + 'forminspeksi' => $forminspeksi, + ]; + } + + private function getPermohonanData($surveyorController, $permohonanId, $documentId, $jaminanId) + { + return $surveyorController->getPermohonanData($permohonanId, $documentId, $jaminanId); + } + + private function generateNomorLaporan($surveyorController, $permohonan, $documentId, $type) + { + return $surveyorController->generateNomorLaporan($permohonan, $documentId, $type); + } + + private function getInspeksi($permohonanId, $documentId) + { + return Inspeksi::where('permohonan_id', $permohonanId) + ->where('document_id', $documentId) + ->first(); + } + + private function updatePenilai($permohonanId, $documentId, $type) + { + // Logika untuk memperbarui data berdasarkan tipe laporan + } + + private function getAlamatData($debitur, $forminspeksi) + { + return [ + 'provinceCode' => $debitur->province_id ?? $forminspeksi['province'], + 'cityCode' => $debitur->city_id ?? $forminspeksi['city'], + 'districtCode' => $debitur->district_id ?? $forminspeksi['district'], + ]; + } + + private function getLocationData($provinceCode, $cityCode, $districtCode, $forminspeksi) + { + return [ + 'cities' => $this->fetchCityData($provinceCode), + 'districts' => $this->fetchDistrictData($cityCode), + 'villages' => $this->fetchVillageData($districtCode), + ]; + } + + private function fetchCityData($provinceCode) + { + return City::where('province_code', $provinceCode)->get(); + } + private function fetchDistrictData($cityCode) + { + return District::where('city_code', $cityCode)->get(); + } + private function fetchVillageData($districtCode) + { + return Village::where('district_code', $districtCode)->get(); + } + + private function updateOrCreatePenilai($permohonan_id, $document_id, $type, $data) + { + return Penilai::updateOrCreate( + [ + 'permohonan_id' => $permohonan_id, + 'dokument_id' => $document_id, + + ], + [ + $type => json_encode($data), + ] + ); + } +}