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(); 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; if($tipeLaporan->status === 'memo' && $permohonan->mig_permohonan){ $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']) { continue; } $fullPath = storage_path('app/public/' . $path['path']); if (!file_exists($fullPath)) { continue; } $files[] = $fullPath; } if (empty($files)) { return response()->json(['error' => 'No valid files found'], 404); } // For single file, download directly if (count($files) === 1) { 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(); return response()->download($zipPath)->deleteFileAfterSend(true); } 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) { $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'], ]; }