validateService = $validateService; } public function index() { return view('lpj::surveyor.index'); } /** * Show the specified resource. */ public function show($id) { $permohonan = Permohonan::with([ 'user', 'debiture.province', 'debiture.city', 'debiture.district', 'debiture.village', 'branch', 'tujuanPenilaian', 'penilaian', 'documents.jenisJaminan', 'documents', ])->findOrFail($id); $surveyor = $id; $branches = Branch::all(); $provinces = Province::all(); $bentukTanah = BentukTanah::all(); // Get all inspeksi data for this permohonan if (strtolower($permohonan->tujuanPenilaian->name) == 'rap') { $inspeksiData = Inspeksi::where('permohonan_id', $id) ->get() ->keyBy('dokument_id') ->map(function ($item) { return [ 'data_form' => json_decode($item->data_form, true), 'foto_form' => json_decode($item->foto_form, true) ]; }); } else { $inspeksiData = Inspeksi::where('permohonan_id', $id) ->get() ->keyBy('dokument_id') ->map(function ($item) { return [ 'data_form' => json_decode($item->data_form, true), 'foto_form' => json_decode($item->foto_form, true), 'denah_form' => json_decode($item->denah_form, true), 'data_pembanding' => json_decode($item->data_pembanding, true), ]; }); } return view('lpj::surveyor.detail', compact( 'permohonan', 'surveyor', 'branches', 'provinces', 'bentukTanah', 'inspeksiData' )); } /** * Store form inspeksi. */ public function store(Request $request) { try { // Validate request data $validatedData = $request->all(); // Get action specific rules and process data $processedData = $this->getActionSpecificRules( $validatedData, $request->input('type'), $request ); $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id')) ->where('dokument_id', $request->input('dokument_id')) ->first(); if ($inspeksi) { // Jika data sudah ada, merge dengan data yang baru $existingData = json_decode($inspeksi->data_form, true) ?: []; if (isset($existingData['signature']) && !isset($processedData['signature'])) { $processedData['signature'] = $existingData['signature']; } $mergedData = $this->arrayMergeRecursive($existingData, $processedData); // Update record $inspeksi->update([ 'data_form' => json_encode($mergedData), 'name' => $request->input('type') ]); $responseData = $mergedData; } else { // Jika belum ada data, buat record baru $inspeksi = Inspeksi::create([ 'permohonan_id' => $request->input('permohonan_id'), 'dokument_id' => $request->input('dokument_id'), 'data_form' => json_encode($processedData), 'name' => $request->input('type') ]); $responseData = $processedData; } return response()->json([ 'success' => true, 'message' => 'Data berhasil disimpan', 'data' => $processedData ], 200); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Gagal menyimpan data', 'error' => $e->getMessage() ], 500); } } private function getActionSpecificRules($data, $action, $request): array { $allowedActions = [ 'apartemen-kantor' => 'getUnitData', 'tanah' => 'getTanahData', 'bangunan' => 'getBangunanData', 'kapal' => 'getKapalData', 'kendaraan' => 'getKendaraanData', 'mesin' => 'getMesinData', 'pesawat' => 'getPesawatData', 'alat-berat' => 'getAlatBeratData', 'lingkungan' => 'getLingkunganData', 'fakta' => 'getFactData', 'rap' => 'getRapData', ]; $rules = []; $hasAssetDescriptionRules = false; $hasFactaData = false; $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 (isset($allowedActions[$act])) { $method = $allowedActions[$act]; $actionRules = $this->$method($data, $request); $rules = array_merge($rules, $actionRules); // 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) { $rules = array_merge($rules, $this->getAssetData($data)); } if ($hasFactaData) { $rules = array_merge($rules, $this->getFactData($data, $request)); } return $rules; } public function storeDenah(Request $request) { $validator = $request->validate([ 'foto_denah.*' => 'nullable|file|mimes:jpg,jpeg,png,bmp,gif,webp,pdf', 'nama_denah.*' => 'nullable|string|max:255', 'luas_denah.*' => 'nullable', 'permohonan_id' => 'required|exists:permohonan,id', 'dokument_id' => 'required', 'nomor_registrasi' => 'required' ]); if ($validator) { try { $denahs = []; $inspeksi = Inspeksi::where('permohonan_id', $request->permohonan_id) ->where('dokument_id', $request->dokument_id) ->first(); $existingDenah = $inspeksi ? json_decode($inspeksi->denah_form ?? '[]', true) : []; $existingDenahs = $existingDenah['denahs'] ?? []; if ($request->has('nama_denah')) { foreach ($request->nama_denah as $index => $namaDenah) { $denahItem = [ 'nama_denah' => $namaDenah, 'luas_denah' => $request->luas_denah[$index] ?? null ]; if ($request->hasFile('foto_denah') && isset($request->file('foto_denah')[$index])) { $file = $request->file('foto_denah')[$index]; $denahItem['foto_denah'] = $this->uploadFile($file, 'foto_denah'); } elseif (isset($existingDenahs[$index]['foto_denah'])) { $denahItem['foto_denah'] = $existingDenahs[$index]['foto_denah']; } $denahs[] = $denahItem; } } if (empty($denahs) && !empty($existingDenahs)) { $denahs = $existingDenahs; } $inspeksi = Inspeksi::firstOrNew([ 'permohonan_id' => $request->permohonan_id, 'dokument_id' => $request->dokument_id ]); // Update denah_form $updatedDenah = ['denahs' => $denahs]; $inspeksi->denah_form = json_encode($updatedDenah); $inspeksi->save(); return response()->json([ 'success' => true, 'message' => 'Data berhasil disimpan', 'data' => $updatedDenah ], 200); } catch (\Exception $e) { \Log::error('Denah Store Error: ' . $e->getMessage()); return response()->json([ 'success' => false, 'message' => 'Gagal menyimpan data: ' . $e->getMessage() ], 500); } } } public function storeFoto(Request $request) { $validatedData = $this->validateFotoRequest($request); try { $inspeksi = Inspeksi::firstOrNew([ 'permohonan_id' => $request->input('permohonan_id'), 'dokument_id' => $request->input('dokument_id') ]); // Get existing foto_form data if it exists $existingData = $inspeksi->exists && $inspeksi->foto_form ? json_decode($inspeksi->foto_form, true) : []; if (!$this->isValidFormat($existingData)) { $existingData = []; } // Upload berbagai jenis foto $newFoto = $this->handleFileUpload($request, 'upload_foto', $existingData); if (!empty($newFoto)) { $inspeksi->foto_form = json_encode($existingData); $inspeksi->save(); return response()->json([ 'success' => true, 'message' => 'Data berhasil disimpan', 'path' => $newFoto[0]['path'], ], 200); } return response()->json([ 'success' => false, 'message' => 'Tidak ada data untuk disimpan' ], 400); } catch (Exception $e) { return response()->json(['success' => false, 'message' => 'Failed to upload: ' . $e->getMessage()], 500); } } /** * Validasi apakah format JSON sesuai dengan yang diinginkan. * * @param array $data * @return bool */ private function isValidFormat($data) { if (!isset($data['upload_foto']) || !is_array($data['upload_foto'])) { return false; } return true; } public function updateFoto(Request $request) { try { // Validasi input $validated = $request->validate([ 'permohonan_id' => 'required', 'dokument_id' => 'required|string', 'name' => 'required|string|max:255', 'description' => 'nullable|string', 'category' => 'required|string|max:255', 'sub' => 'nullable|string|max:255', 'path' => 'nullable|string', ]); $inspeksi = Inspeksi::firstOrNew([ 'permohonan_id' => $validated['permohonan_id'], 'dokument_id' => $validated['dokument_id'], ]); $cleanRequestPath = str_replace('/storage/', '', $validated['path']); $fotoForm = json_decode($inspeksi->foto_form, true) ?? []; if (!isset($fotoForm['upload_foto'])) { $fotoForm['upload_foto'] = []; } $existingIndex = null; if (!empty($validated['path'])) { foreach ($fotoForm['upload_foto'] as $index => $foto) { if ($foto['path'] === $cleanRequestPath) { $existingIndex = $index; break; } } } // Siapkan data baru $newFotoData = [ 'name' => $validated['name'], 'description' => $validated['description'], 'category' => $validated['category'], 'sub' => $validated['sub'], 'path' => $cleanRequestPath, 'created_by' => Auth::user()->name, 'created_at' => now()->toDateTimeString(), 'updated_by' => Auth::user()->name, 'updated_at' => now()->toDateTimeString(), ]; if ($existingIndex !== null) { $existingFoto = $fotoForm['upload_foto'][$existingIndex]; $fotoForm['upload_foto'][$existingIndex] = [ 'name' => $validated['name'], 'description' => $validated['description'], 'category' => $validated['category'], 'sub' => $validated['sub'], 'path' => $cleanRequestPath, 'created_by' => $existingFoto['created_by'] ?? Auth::user()->name, 'created_at' => $existingFoto['created_at'] ?? now()->toDateTimeString(), 'updated_by' => Auth::user()->name, 'updated_at' => now()->toDateTimeString(), ]; } else { $fotoForm['upload_foto'][] = $newFotoData; } // Simpan kembali data ke database $inspeksi->foto_form = json_encode($fotoForm); $inspeksi->save(); return response()->json([ 'success' => true, 'message' => 'Data berhasil diperbarui.', ], 200); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Gagal memperbarui data: ' . $e->getMessage(), ], 500); } } private function handleFileUpload(Request $request, $paramName, &$formatFotojson) { if ($request->hasFile($paramName)) { $files = $request->file($paramName); if (!is_array($files)) { $files = [$files]; } $formatFotoData = []; $nomor_registrasi = $request->nomor_registrasi; $batchTimestamp = time(); $existingFilePaths = []; if (isset($formatFotojson[$paramName]) && is_array($formatFotojson[$paramName])) { foreach ($formatFotojson[$paramName] as $existingFile) { if (isset($existingFile['path'])) { $existingFilePaths[] = $existingFile['path']; } } } foreach ($files as $index => $file) { $originalName = $file->getClientOriginalName(); $extension = $file->getClientOriginalExtension(); $fileNameWithoutExt = pathinfo($originalName, PATHINFO_FILENAME); if (empty($fileNameWithoutExt)) { $fileNameWithoutExt = "file_{$batchTimestamp}_{$index}"; } $safeFileName = preg_replace('/[^a-zA-Z0-9_-]/', '_', $fileNameWithoutExt); $uniqueFileName = "{$batchTimestamp}_{$index}_{$safeFileName}.{$extension}"; $path = "surveyor/{$paramName}/{$nomor_registrasi}/{$uniqueFileName}"; if (in_array($path, $existingFilePaths)) { $counter = 1; do { $uniquePath = "surveyor/{$paramName}/{$nomor_registrasi}/{$batchTimestamp}_{$index}_{$safeFileName}_{$counter}.{$extension}"; $counter++; } while (in_array($uniquePath, $existingFilePaths)); $path = $uniquePath; } $savedPath = $file->storeAs('', $path, 'public'); $existingFilePaths[] = $path; // Add file data $fotoData = [ 'name' => $fileNameWithoutExt, 'path' => $savedPath, 'category' => 'lainnya', 'sub' => null, 'description' => null, 'created_by' => Auth::user()->name, 'created_at' => now()->toDateTimeString(), ]; $formatFotoData[] = $fotoData; } // Only update if we have new photos to add if (!empty($formatFotoData)) { // Struktur JSON yang konsisten if (!isset($formatFotojson[$paramName])) { $formatFotojson[$paramName] = $formatFotoData; } else { $formatFotojson[$paramName] = array_merge( $formatFotojson[$paramName] ?? [], $formatFotoData ); } return $formatFotoData; } } return []; } public function hapusFoto(Request $request) { try { $permohonanId = $request->permohonan_id; $dokumentId = $request->dokument_id; $paramName = $request->param_name; $cleanRequestPath = str_replace('/storage/', '', $request->path); $inspeksi = Inspeksi::firstOrNew( ['permohonan_id' => $permohonanId, 'dokument_id' => $dokumentId] ); $fotoForm = json_decode($inspeksi->foto_form, true); if (isset($fotoForm[$paramName]) && is_array($fotoForm[$paramName])) { // Filter foto yang tidak sesuai dengan path yang akan dihapus $fotoForm[$paramName] = array_values(array_filter( $fotoForm[$paramName], function ($foto) use ($cleanRequestPath) { if ($foto['path'] === $cleanRequestPath) { // Hapus file dari storage \Storage::disk('public')->delete($cleanRequestPath); return false; } return true; } )); // Simpan kembali data ke database $inspeksi->foto_form = json_encode($fotoForm); $inspeksi->save(); return response()->json([ 'success' => true, 'message' => 'Foto berhasil dihapus', ], 200); } // Jika parameter tidak ditemukan return response()->json([ 'success' => false, 'message' => 'Foto atau parameter tidak ditemukan', ], 400); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => $e->getMessage() ], 500); } } // Metode untuk mendapatkan foto yang sudah diupload public function getFoto(Request $request) { $permohonanId = $request->permohonan_id; $dokumentId = $request->dokument_id; $paramName = $request->param_name; $inspeksi = Inspeksi::firstOrNew( ['permohonan_id' => $permohonanId, 'dokument_id' => $dokumentId] ); // Decode foto_form $fotoForm = json_decode($inspeksi->foto_form, true) ?? []; // Cari foto berdasarkan param name $fotos = $this->findFotoByParamName($fotoForm, $paramName); $data = array_map(function ($foto) { return [ 'name' => $foto['name'] ?? 'Foto', 'path' => \Storage::url($foto['path'] ?? ''), 'category' => $foto['category'] ?? 'lainnya', 'sub' => $foto['sub'] ?? null, 'description' => $foto['description'] ?? null, 'upload_by' => $foto['upload_by'] ?? null, ]; }, $fotos); return response()->json([ 'fotos' => $data, 'success' => !empty($data), ]); } public function saveEditedImage(Request $request) { try { $request->validate([ 'edited_image' => 'required|string', 'original_path' => 'required|string', 'nomor_registrasi' => 'required', ]); // Decode base64 image $base64Image = $request->input('edited_image'); if (str_contains($base64Image, ';base64,')) { [$metadata, $base64Image] = explode(';base64,', $base64Image); } $decodedImage = base64_decode($base64Image); if (!$decodedImage) { return response()->json([ 'status' => 'error', 'message' => 'Gambar tidak valid', ], 400); } // Path asli $originalPath = $request->input('original_path'); $fileName = basename($originalPath); $newFilePath = 'surveyor/upload_foto/'. $request->input('nomor_registrasi') . '/' . $fileName; // Simpan file ke storage Storage::disk('public')->put($newFilePath, $decodedImage); return response()->json([ 'status' => 'success', 'message' => 'Gambar berhasil disimpan', 'file_path' => $newFilePath, ], 200); } catch (\Exception $e) { return response()->json([ 'status' => 'error', 'message' => 'Terjadi kesalahan: ' . $e->getMessage(), ], 500); } } private function findFotoByParamName($fotoForm, $paramName) { // Mapping parameter name ke struktur JSON if (isset($fotoForm[$paramName]) && is_array($fotoForm[$paramName])) { return $fotoForm[$paramName]; // Kembalikan array foto jika ditemukan } // Jika parameter tidak ditemukan atau bukan array, kembalikan array kosong return []; } private function processObjekJaminanPhotos(Request $request, array $existingPhotos = []) { $photoField = 'foto_objek'; $nameField = 'name_objek'; $descriptionField = 'deskripsi_objek'; // Mulai dengan data lama $result = $existingPhotos; if ($request->hasFile($photoField)) { $newFiles = $request->file($photoField, []); $newNames = $request->input($nameField, []); $newDescriptions = $request->input($descriptionField, []); foreach ($newFiles as $key => $file) { // Cari atau buat entri berdasarkan nama objek $existingIndex = $this->findObjekJaminanIndexByName($result, $newNames[$key]); // Buat entri baru untuk file yang diunggah $newPhotoEntry = [ $nameField => $newNames[$key], $photoField => $this->uploadFile($file, $photoField . '.' . $key), $descriptionField => $newDescriptions[$key] ?? '', ]; // Jika sudah ada, update; jika belum, tambahkan if ($existingIndex !== false) { // Hapus file lama jika ada if (isset($result[$existingIndex][$photoField])) { $this->deleteOfFile($result[$existingIndex][$photoField]); } $result[$existingIndex] = $newPhotoEntry; } else { $result[] = $newPhotoEntry; } } } // Pastikan array tetap terurut dengan benar return array_values($result); } /** * Cari index objek jaminan berdasarkan nama objek */ private function findObjekJaminanIndexByName(array $existingPhotos, string $name) { foreach ($existingPhotos as $index => $photo) { if (isset($photo['name_objek']) && $photo['name_objek'] === $name) { return $index; } } return false; } private function generateUniqueFileName($file, $prefix = '') { $extension = $file->getClientOriginalExtension(); return $prefix . '_' . uniqid() . '.' . $extension; } private function deleteOfFile($filePath) { if ($filePath && Storage::exists($filePath)) { Storage::delete($filePath); } } /** * Custom validation request for foto */ public function validateFotoRequest(Request $request) { $maxSize = getMaxFileSize('Foto'); return $request->validate([ 'permohonan_id' => 'required', 'dokument_id' => 'required', 'nomor_registrasi' => 'required', 'upload_foto.*' => 'required|image|mimes:jpeg,png,jpg,gif,svg,webp,bmp,tiff,heic,heif|max:'. $maxSize, ]); } public function submitSurveyor($id) { try { // Get button status check result $buttonStatusCheck = $this->checkButtonStatus($id); $buttonStatus = json_decode($buttonStatusCheck->getContent(), true); // Check if button should be disabled if ($buttonStatus['buttonDisable']) { return response()->json([ 'success' => false, 'message' => 'Form belum lengkap. Pastikan semua data telah diisi dengan benar.', ], 422); } $inspeksiRecords = Inspeksi::with(['dokument.jenisJaminan']) ->where('permohonan_id', $id) ->get(); $validateConfig = [ 'tanah' => 'validateTanah', 'bangunan' => 'validateBangunan', 'lingkungan' => 'validateLingkungan', 'fakta' => 'validateFactData', 'rap' => 'validateRapData', ]; // Ambil data inspeksi $inspeksiRecords = Inspeksi::with(['dokument.jenisJaminan']) ->where('permohonan_id', $id) ->get(); foreach ($inspeksiRecords as $inspeksi) { $cekname = $inspeksi->name; // Pecah nama menjadi array $names = array_map('trim', explode(',', $cekname)); $dataForm = json_decode($inspeksi->data_form, true); foreach ($names as $name) { // Validasi hanya untuk nama yang ada dalam konfigurasi if (array_key_exists($name, $validateConfig)) { $validateMethod = $validateConfig[$name]; $invalidFields = $this->validateService->{$validateMethod}($dataForm); // Jika validasi gagal, kembalikan respons error if ($invalidFields) { return response()->json([ 'success' => false, 'message' => ucfirst($name) . ' tidak valid: ' . implode(', ', $invalidFields), ], 422); } } } } // If validation passes, update permohonan status $permohonan = Permohonan::findOrFail($id); $permohonan->update([ 'status' => 'survey-completed', 'submitted_at' => now() ]); return response()->json([ 'success' => true, 'message' => 'Form surveyor berhasil disubmit' ], 200); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Terjadi kesalahan', 'error' => $e->getMessage() ], 500); } } public function checkButtonStatus($id) { try { // Get all inspeksi records for this permohonan $inspeksiRecords = Inspeksi::with(['dokument.jenisJaminan']) ->where('permohonan_id', $id) ->get(); if ($inspeksiRecords->isEmpty()) { return response()->json(['buttonDisable' => true]); } $rapComplete = false; foreach ($inspeksiRecords as $inspeksi) { if (strtolower($inspeksi->name) === 'rap') { $dataForm = json_decode($inspeksi->data_form, true); $fotoForm = json_decode($inspeksi->foto_form, true); $isInvalid = empty($dataForm) && empty($fotoForm); if ($isInvalid) { return response()->json(['buttonDisable' => true]); } } else { $dataForm = json_decode($inspeksi->data_form, true); $fotoForm = json_decode($inspeksi->foto_form, true); $denahForm = json_decode($inspeksi->denah_form, true); $dataPembanding = json_decode($inspeksi->data_pembanding, true); $jenisJaminan = $inspeksi->dokument->jenisJaminan->name ?? ''; $isTanahBangunan = !in_array( strtoupper($jenisJaminan ?? ''), ['KAPAL', 'PESAWAT', 'KENDARAAN', 'ALAT BERAT', 'MESIN'] ); $isInvalid = empty($dataForm) || empty($fotoForm) || (($isTanahBangunan && empty($denahForm)) || empty($dataPembanding)); if ($isInvalid) { return response()->json(['buttonDisable' => true]); } } } // If we get here, all checks passed return response()->json(['buttonDisable' => false]); } catch (\Exception $e) { return response()->json([ 'error' => 'Something went wrong', 'message' => $e->getMessage(), 'buttonDisable' => true ], 500); } } public function storeJadwal(Request $request, $id) { try { $validate = $request->validate([ 'id' => 'required', 'waktu_penilaian' => 'required', 'deskripsi_penilaian' => 'required', 'keterangan' => 'required', ]); $penilaian = Penilaian::findOrFail($id); if (Carbon::parse($validate['waktu_penilaian']) <= Carbon::parse($penilaian->tanggal_kunjungan)) { return response()->json([ 'success' => false, 'message' => 'Waktu penilaian harus lebih besar dari tanggal assign.' ], 422); } $emailData = [ 'email' => $penilaian->permohonan->user->email, 'subject' => 'Jadwal Kunjungan', 'emailData' => $validate, ]; SendJadwalKunjunganEmailJob::dispatch($emailData); $penilaian->update([ 'waktu_penilaian' => $validate['waktu_penilaian'], 'deskripsi_penilaian' => $validate['deskripsi_penilaian'], ]); return response()->json([ 'success' => true, 'message' => 'Berhasil kirim jadwal kunjungan' ], 200); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Terjadi kesalahan', 'error' => $e->getMessage() ], 500); } } public function storeFreeze($id, Request $request) { try { $permohonan = Permohonan::findOrFail($id); Authorization::updateOrCreate([ 'permohonan_id' => $permohonan->id, 'jenis' => 'sla' ], [ 'request' => 'freeze', 'user_id' => Auth::user()->id ]); return response()->json([ 'success' => true, 'message' => 'Berhasil Kirim permintaan Request Freeaze ke So' ], 200); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Terjadi kesalahan', 'error' => $e->getMessage() ], 500); } } private function formatDataPembanding($request) { $dataPembanding = []; $pembandingCount = count($request->input('address_pembanding', [])); $fotoPembanding = $request->file('foto_objek_pembanding') ?? []; $existingData = null; if ($request->has('permohonan_id') && $request->has('dokument_id')) { $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id')) ->where('dokument_id', $request->input('dokument_id')) ->first(); if ($inspeksi) { $existingData = json_decode($inspeksi->data_pembanding, true) ?? []; } } for ($i = 0; $i < $pembandingCount; $i++) { $pembanding = $this->formatSinglePembanding($request, $i); $existingFoto = null; if ($existingData && isset($existingData['data_pembanding'][$i]['foto_objek'])) { $existingFoto = $existingData['data_pembanding'][$i]['foto_objek']; } // Penanganan foto pembanding if (isset($fotoPembanding[$i]) && $fotoPembanding[$i]->isValid()) { $pembanding['foto_objek'] = $this->handleupdateOrDeleteFile( $fotoPembanding[$i], 'pembanding', "pembanding_{$i}" ); } else { $pembanding['foto_objek'] = $existingFoto; } $dataPembanding[] = $pembanding; } return $dataPembanding; } private function formatSinglePembanding($request, $index) { $tanahBangunanTypes = ['KAPAL', 'PESAWAT', 'KENDARAAN', 'ALAT BERAT', 'MESIN']; $action = isset($request->action) ? strtoupper(str_replace('-', ' ', $request->action)) : ''; if (in_array($action, $tanahBangunanTypes)) { $fields = [ 'address', 'village_code', 'district_code', 'city_code', 'province_code', 'nama', 'type','warna','lokasi', 'total', 'diskon', 'harga_diskon', 'sumber_data', 'harga', 'tahun','transmisi','telepon', 'kordinat_lat', 'kordinat_lng', 'tahun_pembuatan','merek_buatan','kapasitas','power','kondisi','tanggal', 'harga_penawaran' ]; } else { $fields = [ 'address', 'village_code', 'district_code', 'city_code', 'province_code', 'tahun', 'luas_tanah', 'luas_bangunan', 'tahun_bangunan', 'status_nara_sumber', 'harga', 'harga_diskon', 'diskon', 'total', 'nama_nara_sumber', 'peruntukan', 'penawaran', 'telepon','hak_properti', 'kordinat_lat', 'kordinat_lng', 'jenis_aset','foto_objek','tanggal', 'harga_penawaran' ]; } $pembanding = []; foreach ($fields as $field) { $inputName = "{$field}_pembanding"; $inputValue = $request->input($inputName); // Pastikan input adalah array dan index valid if (is_array($inputValue) && isset($inputValue[$index])) { $value = $inputValue[$index]; // Format hanya untuk harga, harga_diskon, dan total if (in_array($field, ['harga', 'harga_diskon', 'total', 'harga_penawaran'])) { $value = preg_replace('/[^0-9]/', '', $value); // Hapus karakter non-angka } $pembanding[$field] = $value; } else { $pembanding[$field] = null; } } return $pembanding; } private function handleupdateOrDeleteFile($file, $type, $prefix) { try { if ($file) { // Generate nama file unik $fileName = $prefix . '_' . uniqid() . '_' . time() . '.' . $file->getClientOriginalExtension(); $path = "{$type}/" . date('Y/m'); Storage::makeDirectory("public/{$path}"); $filePath = $file->storeAs("public/{$path}", $fileName); return str_replace('public/', '', $filePath); } return null; } catch (\Exception $e) { \Log::error('File upload error: ' . $e->getMessage()); throw new \Exception("Gagal mengupload file: " . $e->getMessage()); } } private function formatObjekPenilaian($request) { $fields = [ 'address', 'village_code', 'district_code', 'city_code', 'province_code', 'luas_tanah', 'luas_tanah_bagunan', 'total', 'diskon', 'harga_diskon', 'status_nara_sumber', 'harga', 'nama_nara_sumber','hak_properti','telepon', 'kordinat_lat', 'kordinat_lng', 'jenis_aset','penawaran', 'tanggal','harga_penawaran' ]; $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id')) ->where('dokument_id', $request->input('dokument_id')) ->first(); if ($inspeksi) { $needsSave = false; // Handle foto_form $fotoForm = json_decode($inspeksi->foto_form, true) ?: []; if (!isset($fotoForm['object_jaminan'])) { $fotoForm['object_jaminan'] = [['foto_objek' => null]]; $needsSave = true; } // Handle data_form $dataForm = json_decode($inspeksi->data_form, true) ?: []; // Inisialisasi struktur data jika belum ada if ($request->filled('luas_tanah_bagunan')) { if (!isset($dataForm['bangunan'])) { $dataForm['bangunan'] = []; } if (!isset($dataForm['bangunan']['luas_tanah_bagunan'])) { $dataForm['bangunan']['luas_tanah_bagunan'] = []; } $cekBanguan = isset($dataForm['bangunan']['luas_tanah_bagunan']['sesuai']) && $dataForm['bangunan']['luas_tanah_bagunan']['sesuai'] === 'sesuai' ? 'sesuai' : 'tidak sesuai'; $dataForm['bangunan']['luas_tanah_bagunan'][$cekBanguan] = $request->input('luas_tanah_bagunan'); $needsSave = true; } if ($request->filled('luas_tanah')) { if (!isset($dataForm['tanah'])) { $dataForm['tanah'] = []; } if (!isset($dataForm['tanah']['luas_tanah'])) { $dataForm['tanah']['luas_tanah'] = []; } $cekLuas = isset($dataForm['tanah']['luas_tanah']['sesuai']) && $dataForm['tanah']['luas_tanah']['sesuai'] === 'sesuai' ? 'sesuai' : 'tidak sesuai'; $dataForm['tanah']['luas_tanah'][$cekLuas] = $request->input('luas_tanah'); $needsSave = true; } if (!isset($dataForm['asset'])) { $dataForm['asset'] = []; $needsSave = true; } // Update data dengan mempertahankan struktur sesuai/tidak sesuai foreach ($fields as $field) { if ($request->filled($field)) { $newValue = $request->input($field); if (in_array($field, ['harga', 'harga_diskon', 'total'])) { $newValue = preg_replace('/[^0-9]/', '', $newValue); } // Fields untuk tanah if (in_array($field, ['luas_tanah'])) { // Pastikan struktur array ada sebelum diakses if (!isset($dataForm['tanah']['luas_tanah'])) { $dataForm['tanah']['luas_tanah'] = []; } $cekLuas = isset($dataForm['tanah']['luas_tanah']['sesuai']) && $dataForm['tanah']['luas_tanah']['sesuai'] === 'sesuai' ? 'sesuai' : 'tidak sesuai'; $dataForm['tanah']['luas_tanah'][$cekLuas] = $newValue; $needsSave = true; } // Fields untuk bangunan elseif (in_array($field, ['luas_tanah_bagunan'])) { if (!isset($dataForm['bangunan']['luas_tanah_bagunan'])) { $dataForm['bangunan']['luas_tanah_bagunan'] = []; } $cekBanguan = isset($dataForm['bangunan']['luas_tanah_bagunan']['sesuai']) && $dataForm['bangunan']['luas_tanah_bagunan']['sesuai'] === 'sesuai' ? 'sesuai' : 'tidak sesuai'; $dataForm['bangunan']['luas_tanah_bagunan'][$cekBanguan] = $newValue; $needsSave = true; } // Fields untuk alamat dalam asset // Fields untuk alamat dalam asset elseif (in_array($field, ['address', 'village_code', 'district_code', 'city_code', 'province_code'])) { if (!isset($dataForm['asset']['alamat'])) { $dataForm['asset']['alamat'] = [ 'sesuai' => [ 'address' => '', 'village_code' => '', 'district_code' => '', 'city_code' => '', 'province_code' => '' ] ]; } // Tentukan status alamat (sesuai/tidak sesuai) $alamatStatus = isset($dataForm['asset']['alamat']['sesuai']) ? 'sesuai' : 'tidak sesuai'; // Update nilai dalam status yang ada if (!isset($dataForm['asset']['alamat'][$alamatStatus])) { $dataForm['asset']['alamat'][$alamatStatus] = []; } // Update nilai field yang sesuai $dataForm['asset']['alamat'][$alamatStatus][$field] = $newValue; } // Jenis asset dalam asset elseif ($field === 'jenis_asset') { $assetStatus = $request->input('asset_status', 'sesuai'); $dataForm['asset']['jenis_asset'] = [ $assetStatus => $newValue ]; } // Fields lainnya dalam asset else { if (!isset($dataForm['asset'][$field])) { $dataForm['asset'][$field] = []; } $dataForm['asset'][$field] = $newValue; } $needsSave = true; } } if ($needsSave) { $inspeksi->foto_form = json_encode($fotoForm); $inspeksi->data_form = json_encode($dataForm); $inspeksi->save(); } $existingFoto = $fotoForm['object_jaminan'][0]['foto_objek'] ?? null; // Gabungkan data dari tanah, bangunan, dan asset $objekPenilaian = array_merge( ['foto_objek' => $existingFoto], $dataForm['tanah'] ?? [], $dataForm['bangunan'] ?? [], array_reduce($fields, function ($carry, $field) use ($request, $dataForm) { if (isset($dataForm['asset'][$field])) { if (is_array($dataForm['asset'][$field])) { if (isset($dataForm['asset'][$field]['sesuai'])) { $carry[$field] = $dataForm['asset'][$field]['sesuai']; } elseif (isset($dataForm['asset'][$field]['tidak sesuai'])) { $carry[$field] = $dataForm['asset'][$field]['tidak sesuai']; } } else { $carry[$field] = $dataForm['asset'][$field]; } } else { $carry[$field] = $request->input($field); } return $carry; }, []) ); } else { // Inisialisasi data baru $objekPenilaian = array_reduce($fields, function ($carry, $field) use ($request) { $carry[$field] = $request->input($field); return $carry; }, ['foto_objek' => null]); } return $objekPenilaian; } private function formatObjekPenilaiankendaraan($request) { $fields = [ 'address', 'village_code', 'district_code', 'city_code', 'province_code', 'nama', 'type','warna','lokasi', 'total', 'diskon', 'harga_diskon', 'sumber_data', 'harga', 'tahun','transmisi','telepon', 'kordinat_lat', 'kordinat_lng', 'tahun_pembuatan','merek_buatan','kapasitas','power','kondisi' ]; $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id')) ->where('dokument_id', $request->input('dokument_id')) ->first(); if ($inspeksi) { $needsSave = false; // Handle foto_form $fotoForm = json_decode($inspeksi->foto_form, true) ?: []; if (!isset($fotoForm['object_jaminan'])) { $fotoForm['object_jaminan'] = [['foto_objek' => null]]; $needsSave = true; } // Handle data_form $dataForm = json_decode($inspeksi->data_form, true) ?: []; // Update data dengan mempertahankan struktur sesuai/tidak sesuai foreach ($fields as $field) { if ($request->filled($field)) { $newValue = $request->input($field); if (in_array($field, ['harga', 'harga_diskon', 'total'])) { $newValue = preg_replace('/[^0-9]/', '', $newValue); } // Fields untuk alamat dalam asset if (in_array($field, ['address', 'village_code', 'district_code', 'city_code', 'province_code'])) { if (!isset($dataForm['alamat'])) { $dataForm['alamat'] = []; } $alamatStatus = $dataForm['alamat'] == 'sesuai' ? 'sesuai' : 'tidak sesuai'; if (!isset($dataForm['alamat'][$alamatStatus])) { $dataForm['alamat'][$alamatStatus] = []; } $dataForm['alamat'][$alamatStatus][$field] = $newValue; } else { if (!isset($dataForm[$field])) { $dataForm[$field] = []; } $dataForm[$field] = $newValue; } $needsSave = true; } } if ($needsSave) { $inspeksi->foto_form = json_encode($fotoForm); $inspeksi->data_form = json_encode($dataForm); $inspeksi->save(); } $existingFoto = $fotoForm['object_jaminan'][0]['foto_objek'] ?? null; // Gabungkan data dari tanah, bangunan, dan asset $objekPenilaian = array_merge( ['foto_objek' => $existingFoto], array_reduce($fields, function ($carry, $field) use ($request, $dataForm) { if (isset($dataForm[$field])) { if (is_array($dataForm[$field])) { if (isset($dataForm[$field]['sesuai'])) { $carry[$field] = $dataForm[$field]['sesuai']; } elseif (isset($dataForm[$field]['tidak sesuai'])) { $carry[$field] = $dataForm[$field]['tidak sesuai']; } } else { $carry[$field] = $dataForm[$field]; } } else { $carry[$field] = $request->input($field); } return $carry; }, []) ); } else { // Inisialisasi data baru $objekPenilaian = array_reduce($fields, function ($carry, $field) use ($request) { $carry[$field] = $request->input($field); return $carry; }, ['foto_objek' => null]); } return $objekPenilaian; } private function saveInspeksi($formattedData) { $inspeksi = Inspeksi::updateOrCreate( [ 'permohonan_id' => $formattedData['permohonan_id'], 'dokument_id' => $formattedData['dokument_id'] ], [ 'data_pembanding' => json_encode($formattedData), 'name' => $formattedData['type'] ] ); return $inspeksi; } public function storeDataPembanding(Request $request) { try { DB::beginTransaction(); $maxSize = getMaxFileSize('Foto'); $validator = $request->validate([ 'permohonan_id' => 'required|exists:permohonan,id', 'type' => 'required|string', 'dokument_id' => 'required', 'name_foto_objek' => 'nullable|string', 'nomor_registrasi' => 'required|string', 'foto_objek' => 'nullable|image|max:'.$maxSize, 'foto_objek_pembanding.*' => 'nullable|image|max:'.$maxSize, ]); $tanahBangunanTypes = ['KAPAL', 'PESAWAT', 'KENDARAAN', 'ALAT BERAT', 'MESIN']; $action = isset($request->action) ? strtoupper(str_replace('-', ' ', $request->action)) : ''; if (in_array($action, $tanahBangunanTypes)) { $objekPenilaian = $this->formatObjekPenilaiankendaraan($request); } else { $objekPenilaian = $this->formatObjekPenilaian($request); } if ($request->hasFile('foto_objek')) { $newFoto = $this->handleEditTampakDepan($request); $objekPenilaian['foto_objek'] = $newFoto; } $formattedData = [ 'permohonan_id' => $request->input('permohonan_id'), 'type' => $request->input('type'), 'dokument_id' => $request->input('dokument_id'), 'objek_penilaian' => $objekPenilaian, 'data_pembanding' => $this->formatDataPembanding($request), 'keterangan' => $request->input('keterangan') ]; $inspeksi = $this->saveInspeksi($formattedData); DB::commit(); return response()->json([ 'success' => true, 'message' => 'Data berhasil disimpan', 'data' => $formattedData ], 200); } catch (\Exception $e) { DB::rollBack(); return response()->json([ 'success' => false, 'message' => 'Gagal menyimpan data: ' . $e->getMessage() ], 500); } } public function handleEditTampakDepan(Request $request) { $nomor_registrasi = $request->nomor_registrasi; // Ambil data inspeksi $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id')) ->where('dokument_id', $request->input('dokument_id')) ->firstOrFail(); // Bersihkan path dari request $cleanRequestPath = str_replace('/storage/', '', $request['path']); // Ambil foto_form dari inspeksi $fotoForm = json_decode($inspeksi->foto_form, true) ?? []; $fotoForm['upload_foto'] = $fotoForm['upload_foto'] ?? []; $existingIndex = null; if (!empty($request['path'])) { foreach ($fotoForm['upload_foto'] as $index => $foto) { if ($foto['path'] === $cleanRequestPath) { $existingIndex = $index; break; } } } if ($request->hasFile('foto_objek')) { $file = $request->file('foto_objek'); $timestamp = time(); $originalName = $file->getClientOriginalName(); $extension = $file->getClientOriginalExtension(); // Validasi nama file if (empty($originalName)) { $originalName = "file_{$timestamp}"; } $uniqueFileName = "{$timestamp}.{$extension}"; // Simpan file ke penyimpanan publik $path = $file->storeAs("surveyor/upload_foto/{$nomor_registrasi}", $uniqueFileName, 'public'); // Data baru untuk foto $newFotoData = [ 'name' => $originalName, 'description' => null, 'category' => 'Tampak Depan', 'sub' => null, 'path' => $path, 'created_by' => Auth::user()->name, 'created_at' => now()->toDateTimeString(), 'updated_by' => Auth::user()->name, 'updated_at' => now()->toDateTimeString(), ]; // Update atau tambahkan data baru if ($existingIndex !== null) { $fotoForm['upload_foto'][$existingIndex] = $newFotoData; } else { $fotoForm['upload_foto'][] = $newFotoData; } // Simpan kembali data ke database $inspeksi->foto_form = json_encode($fotoForm); $inspeksi->save(); return $path; } } /** * Form inspeksi. */ public function formInspeksi(Request $request, $id) { $validated = $request->validate([ 'dokument' => 'required', 'jenis_jaminan' => 'required' ]); $dokumentId = $validated['dokument']; $jaminanId = $validated['jenis_jaminan']; $permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId); $link_url_region = Teams::with('regions', 'teamsUsers') ->whereHas('teamsUsers', function ($query) { $query->where('user_id', Auth::user()->id); })->first(); $branches = Branch::all(); $provinces = Province::all(); $surveyor = $id; $basicData = $this->getCommonData(); $inpeksi = Inspeksi::where('permohonan_id', $id)->where('dokument_id', $dokumentId)->first(); $forminspeksi = null; if ($inpeksi) { $forminspeksi = json_decode($inpeksi->data_form, true); } // Default: gunakan data dari debitur $debitur = Debiture::find($permohonan->debiture_id); $provinceCode = $debitur->province_code; $cityCode = $debitur->city_code; $districtCode = $debitur->district_code; // Jika alamat tidak sesuai, override dengan kode dari alamat $cekAlamat = $forminspeksi['asset']['alamat']['tidak sesuai'] ?? null; if ($cekAlamat) { $provinceCode = $cekAlamat['province_code'] ?? $provinceCode; $cityCode = $cekAlamat['city_code'] ?? $cityCode; $districtCode = $cekAlamat['district_code'] ?? $districtCode; // Ambil data menggunakan kode yang telah ditentukan } $cities = City::where('province_code', $provinceCode)->get(); $districts = District::where('city_code', $cityCode)->get(); $villages = Village::where('district_code', $districtCode)->get(); if ($forminspeksi) { if (isset($forminspeksi['alamat']['sesuai']['province_code'])) { $cities = City::where('province_code', $forminspeksi['alamat']['sesuai']['province_code'])->get(); } if (isset($forminspeksi['alamat']['sesuai']['city_code'])) { $districts = District::where('city_code', $forminspeksi['alamat']['sesuai']['city_code'])->get(); } if (isset($forminspeksi['alamat']['sesuai']['district_code'])) { $villages = Village::where('district_code', $forminspeksi['alamat']['sesuai']['district_code'])->get(); } } return view('lpj::surveyor.components.inspeksi', compact( 'permohonan', 'surveyor', 'branches', 'provinces', 'debitur', 'cities', 'districts', 'villages', 'link_url_region', 'forminspeksi', 'basicData', 'cekAlamat' )); } /** * Denah. */ public function denah(Request $request, $id) { $validated = $request->validate([ 'dokument' => 'required', 'jenis_jaminan' => 'required' ]); $dokumentId = $validated['dokument']; $jaminanId = $validated['jenis_jaminan']; $permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId); $denah = null; $inpeksi = Inspeksi::where('permohonan_id', $id)->where('dokument_id', $dokumentId)->first(); $formDenah = null; if ($inpeksi) { $formDenah = json_decode($inpeksi->denah_form, true); } // return response()->json($formDenah); return view('lpj::surveyor.components.denah', compact('permohonan', 'denah', 'formDenah')); } /** * Foto. */ public function foto(Request $request, $id) { $validated = $request->validate([ 'dokument' => 'required', 'jenis_jaminan' => 'required' ]); $dokumentId = $validated['dokument']; $jaminanId = $validated['jenis_jaminan']; $fotoObjekJaminan = FotoObjekJaminan::all(); $permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId); $surveyor = $id; $branches = Branch::all(); $provinces = Province::all(); $inpeksi = Inspeksi::where('permohonan_id', $id)->where('dokument_id', $dokumentId)->first(); $formFoto = null; if ($inpeksi) { $formFoto = json_decode($inpeksi->foto_form, true); } $fotoJaminan = null; return view('lpj::surveyor.components.foto', compact('permohonan', 'surveyor', 'branches', 'provinces', 'fotoJaminan', 'formFoto', 'fotoObjekJaminan')); } /** * Data pembanding. */ public function dataPembanding(Request $request, $id) { try { // Ambil data permohonan dengan eager loading $validated = $request->validate([ 'dokument' => 'required', 'jenis_jaminan' => 'required' ]); $dokumentId = $validated['dokument']; $jaminanId = $validated['jenis_jaminan']; $permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId); // Ambil data inspeksi $inspeksi = Inspeksi::where([ 'permohonan_id' => $id, 'dokument_id' => $dokumentId ])->first(); // Inisialisasi variabel $inspectionData = null; $comparisons = null; $fotoForm = null; if ($inspeksi) { $inspectionData = json_decode($inspeksi->data_form, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new \Exception('Harap mengisi form inspeksi terlebih dahulu.'); } if ($inspeksi->data_pembanding) { $comparisons = json_decode($inspeksi->data_pembanding, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new \Exception('Error decoding comparison data: ' . json_last_error_msg()); } } $fotoForm = json_decode($inspeksi->foto_form, true); } // Ambil data pendukung $data = $this->getCommonData(); $provinces = Province::all(); $cities = City::where('province_code', $this->getCodeAlamat('province_code', $inspectionData))->get(); $districts = District::where('city_code', $this->getCodeAlamat('city_code', $inspectionData))->get(); $villages = Village::where('district_code', $this->getCodeAlamat('district_code', $inspectionData))->get(); return view('lpj::surveyor.components.data-pembanding', compact( 'permohonan', 'id', 'inspectionData', 'comparisons', 'data', 'jaminanId', 'fotoForm', 'cities', 'districts', 'villages', 'provinces', 'inspeksi' )); } catch (\Exception $e) { return redirect() ->back() ->with('error', 'Terjadi kesalahan saat memuat data: ' . $e->getMessage()); } } public function getCodeAlamat($code, $inspectionData) { $tanahBangunanTypes = ['KAPAL', 'PESAWAT', 'KENDARAAN', 'ALAT BERAT', 'MESIN']; $action = isset($inspectionData['action']) ? strtoupper(str_replace('-', ' ', $inspectionData['action'])) : ''; if (in_array($action, $tanahBangunanTypes)) { return $selectedProvince = $inspectionData['alamat']['sesuai'][$code] ?? null; } if (isset($inspectionData['asset'])) { $cekAlamat = isset($inspectionData['asset']['alamat']['sesuai']) ? 'sesuai' : 'tidak sesuai'; $selectedProvince = $inspectionData['asset']['alamat'][$cekAlamat][$code] ?? null; return $selectedProvince; } return null; } private function getHeader(string $type): array { return self::HEADERS[$type] ?? []; } public function data(Request $request) { $type = $request->route('type'); $header = $this->getHeader($request->route('type')); return view('lpj::surveyor.data.index', compact('header')); } public function createData($type) { $spekKategoriBagunan = SpekKategoritBangunan::all(); $header = $this->getHeader($type); return view('lpj::surveyor.data.form', compact('header', 'spekKategoriBagunan')); } public function storeData(SurveyorRequest $request, $type) { $validate = $request->validated(); if ($validate) { try { $type = $request->route('type'); $modelClass = $this->getModelClass($type); if (!$modelClass) { return redirect() ->route('basicdata.' . $type . '.index') ->with('error', 'Invalid type specified.'); } if ($type == 'spek-bangunan') { $validate['spek_kategori_bagunan_id'] = $request->spek_kategori_bagunan_id; } $data = array_merge($validate, ['status' => true]); $modelClass::create($data); return redirect() ->route('basicdata.' . $type . '.index') ->with('success', 'created successfully'); } catch (Exeception $e) { return redirect() ->route('basicdata.' . $type . '.index') ->with('error', $th->getMessage()); } } } public function editData($type, $id) { $dataMap = [ 'bentuk-tanah' => ['Bentuk Tanah', 'bentuk-tanah', BentukTanah::class], 'kontur-tanah' => ['Kontur Tanah', 'kontur-tanah', KonturTanah::class], 'posisi-kavling' => ['Posisi Kavling', 'posisi-kavling', PosisiKavling::class], 'ketinggian-tanah' => ['Ketinggian Tanah', 'ketinggian-tanah', KetinggianTanah::class], 'kondisi-fisik-tanah' => ['Kondisi Fisik Tanah', 'kondisi-fisik-tanah', KondisiFisikTanah::class], 'jenis-bangunan' => ['Jenis Bangunan', 'jenis-bangunan', JenisBangunan::class], 'kondisi-bangunan' => ['Kondisi Bangunan', 'kondisi-bangunan', KondisiBangunan::class], 'sifat-bangunan' => ['Sifat Bangunan', 'sifat-bangunan', SifatBangunan::class], 'spek-bangunan' => ['Spek Bangunan', 'spek-bangunan', SpekBangunan::class], 'spek-kategori-bangunan' => ['Spek Kategori Bangunan', 'spek-kategori-bangunan', SpekKategoritBangunan::class], 'sarana-pelengkap' => ['Sarana Pelengkap', 'sarana-pelengkap', SaranaPelengkap::class], 'lantai-unit' => ['Lantai Unit', 'lantai-unit', Lantai::class], 'view-unit' => ['View Unit', 'view-unit', ViewUnit::class], 'gol-mas-sekitar' => ['Golongan Masyarakat Sekitar', 'gol-mas-sekitar', GolonganMasySekitar::class], 'jenis-pesawat' => ['Jenis Pasawat', 'jenis-pesawat', JenisPesawat::class], 'model-alat-berat' => ['Model Alat Berat', 'model-alat-berat', ModelAlatBerat::class], 'jenis-kapal' => ['Jenis Kapal', 'jenis-kapal', JenisKapal::class], 'jenis-kendaraan' => ['Jenis Kendaraan', 'jenis-kendaraan', JenisKendaraan::class], 'jenis-unit' => ['Jenis unit', 'jenis-unit', JenisUnit::class], 'terletak-area' => ['Terletak di Area', 'terletak-area', TerletakArea::class], 'merupakan-daerah' => ['Merupakan Daerah', 'merupakan-daerah', MerupakanDaerah::class], 'posisi-unit' => ['Posisi unit', 'posisi-unit', PosisiUnit::class], 'bentuk-unit' => ['Bentuk unit', 'bentuk-unit', BentukUnit::class], 'fasilitas-objek' => ['Fasilitas Umum Dekat Objek', 'fasilitas-objek', FasilitasObjek::class], 'foto-objek-jaminan' => ['Foto Objek Jaminan', 'foto-objek-jaminan', FotoObjekJaminan::class], ]; if (!array_key_exists($type, $dataMap)) { return redirect()->back()->with('error', 'Invalid type specified.'); } [$headers, $routeName, $modelClass] = $dataMap[$type]; $header = $dataMap[$type] ?? ''; $model = $modelClass::findOrFail($id); $spekKategoriBagunan = null; if ($type == 'spek-bangunan') { $spekKategoriBagunan = SpekKategoritBangunan::all(); } return view('lpj::surveyor.data.form', compact('header', 'model', 'spekKategoriBagunan')); } public function updateData(SurveyorRequest $request, $type, $id) { $validate = $request->validated(); if ($validate) { $modelClass = $this->getModelClass($type); if ($type == 'spek-bangunan') { $validate['spek_kategori_bagunan_id'] = $request->spek_kategori_bagunan_id; } if ($type == 'foto-objek-jaminan') { $validate['kategori'] = $request->kategori; } // Check if the provided type exists in the modelClasses if (!$modelClass) { return redirect() ->route('basicdata.' . $type . '.index') ->with('error', 'Invalid type specified.'); } $model = $modelClass::findOrFail($id); $model->update($validate); // Redirect back with a success message return redirect() ->route('basicdata.' . $type . '.index') ->with('success', 'Updated successfully'); } } public function update_analisa($id, Request $request) { try { $permohonan = Permohonan::with([ 'user', 'debiture.province', 'debiture.city', 'debiture.district', 'debiture.village', 'branch', 'tujuanPenilaian', 'penilaian', 'documents', ])->findOrFail($id); $jenisAssetUpdated = false; if ($request->input('types') == 'jenis_asset') { $this->updateJenisAsset($permohonan, $request); $jenisAssetUpdated = true; } if (in_array($request->input('types'), ['analisa_tanah', 'analisa_bangunan', 'analisa_unit'])) { $key = match ($request->input('types')) { 'analisa_tanah' => 'luas_tanah', 'analisa_bangunan' => 'luas_bangunan', 'analisa_unit' => 'luas_unit', }; $jenis_jaminan_mapping = [ 'luas_unit' => $request->input('jenis_legalistas_jaminan_unit_id'), 'luas_bangunan' => $request->input('jenis_legalistas_jaminan_bangunan_id'), 'luas_tanah' => $request->input('jenis_legalistas_jaminan_tanah_id'), ]; $jenis_jaminan_id = $jenis_jaminan_mapping[$key] ?? 0; // dd($jenis_jaminan_id); $inputValue = $request->input($key); $cleanedValue = preg_replace('/\D/', '', $inputValue); $this->updateDetails($permohonan, $key, $cleanedValue, $jenis_jaminan_id); } return response()->json([ 'success' => true, 'message' => 'Data berhasil disimpan', 'jenis_asset' => $jenisAssetUpdated, ], 200); } catch (\Exception $e) { return response()->json(['error' => 'Something went wrong', 'message' => $e->getMessage()], 500); } } private function updateJenisAsset($permohonan, $request) { $jenis_jaminan_id = $permohonan->documents->first()->jenis_jaminan_id; DokumenJaminan::where('permohonan_id', $permohonan->id) ->where('jenis_jaminan_id', $jenis_jaminan_id) ->update([ 'jenis_jaminan_id' => $request->input('jenis_asset'), ]); } private function updateDetails($permohonan, $key, $newValue, $jenis_jaminan_id) { $document = $permohonan->documents->first(); if (!$document) { throw new \Exception("Document not found"); } // dd($jenis_jaminan_id); $detailsUpdate = DetailDokumenJaminan::where('dokumen_jaminan_id', $document->id) ->where('jenis_legalitas_jaminan_id', $jenis_jaminan_id) ->first(); // dd($detailsUpdate); if (!$detailsUpdate) { throw new \Exception("DetailDokumenJaminan not found"); } $datas = json_decode($detailsUpdate->details, true) ?? []; if (!is_scalar($newValue)) { throw new \InvalidArgumentException("New value must be a scalar (string/number)"); } // Update nilai berdasarkan kunci if (array_key_exists($key, $datas)) { $datas[$key] = $newValue; } else { $datas[$key] = $newValue; } // Simpan kembali ke database $detailsUpdate->update([ 'details' => json_encode($datas), ]); } public function dataForDatatables(Request $request) { if (is_null($this->user) || !$this->user->can('debitur.view')) { // abort(403, 'Sorry! You are not allowed to view users.'); } $query = Permohonan::query(); if ($request->has('search') && !empty($request->get('search'))) { $search = $request->get('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('debiture', 'name', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); $q->orWhere('status', 'LIKE', '%' . $search . '%'); }); } $query->whereRaw('LOWER(status) IN (?, ?, ?, ?, ?, ? ,?,?)', ['assign', 'survey', 'proses-survey', 'request-reschedule', 'reschedule', 'rejected-reschedule', 'approved-reschedule', 'revisi-survey' ]); if (!Auth::user()->hasRole('administrator')) { $query->whereHas('penilaian.userPenilai', function ($q) { $q->where('user_id', Auth::user()->id); $q->where('role', 'surveyor'); }); } if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { $order = $request->get('sortOrder'); $column = $request->get('sortField'); $query->orderBy($column, $order); } $totalRecords = $query->count(); $size = $request->get('size', 10); if ($size == 0) { $size = 10; } if ($request->has('page') && $request->has('size')) { $page = $request->get('page', 1); $offset = ($page - 1) * $size; $query->skip($offset)->take($size); } $filteredRecords = $query->count(); $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'jenisFasilitasKredit', 'penilaian'])->get(); $pageCount = ceil($totalRecords / $size); $currentPage = max(1, $request->get('page', 1)); return response()->json([ 'draw' => $request->get('draw'), 'recordsTotal' => $totalRecords, 'recordsFiltered' => $filteredRecords, 'pageCount' => $pageCount, 'page' => $currentPage, 'totalCount' => $totalRecords, 'data' => $data, ]); } public function dataForDatatablesData(Request $request, $type) { if (is_null($this->user) || !$this->user->can('jenis_aset.view')) { //abort(403, 'Sorry! You are not allowed to view users.'); } $models = [ 'Bentuk Tanah' => BentukTanah::class, 'Kontur Tanah' => KonturTanah::class, 'Posisi Kavling' => PosisiKavling::class, 'Ketinggian Tanah' => KetinggianTanah::class, 'Kondisi Fisik Tanah' => KondisiFisikTanah::class, 'Jenis Bangunan' => JenisBangunan::class, 'Kondisi Bangunan' => KondisiBangunan::class, 'Sifat Bangunan' => SifatBangunan::class, 'Spek Kategori Bangunan' => SpekKategoritBangunan::class, 'Spek Bangunan' => SpekBangunan::class, 'Sarana Pelengkap' => SaranaPelengkap::class, 'Lalu Lintas Depan Lokasi' => LaluLintasLokasi::class, 'Tingkat Keramaian' => TingkatKeramaian::class, 'Golongan Masyarakat Sekitar' => GolonganMasySekitar::class, 'Lantai Unit' => Lantai::class, 'View Unit' => ViewUnit::class, 'Perkerasan jalan' => PerkerasanJalan::class, 'Jenis pesawat' => JenisPesawat::class, 'Model alat berat' => ModelAlatBerat::class, 'Jenis kapal' => JenisKapal::class, 'Jenis kendaraan' => JenisKendaraan::class, 'Terletak di Area' => TerletakArea::class, 'Posisi unit' => PosisiUnit::class, 'Bentuk unit' => BentukUnit::class, 'Fasilitas Umum Dekat Objek' => FasilitasObjek::class, 'Merupakan Daerah' => MerupakanDaerah::class, 'Jenis unit' => JenisUnit::class, 'Foto Objek Jaminan' => FotoObjekJaminan::class, 'Perizinan' => Perizinan::class, ]; if (array_key_exists($type, $models)) { $query = $models[$type]::query(); } else { throw new InvalidArgumentException("Invalid type: $type"); } 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 if ($type == 'Spek Bangunan') { $data = $query->with(['bangunanKategori'])->get(); } else { $data = $query->get(); } // Calculate the page count $pageCount = ceil($totalRecords / $request->get('size')); // Calculate the current page number $currentPage = 0 + 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 destroy($id, $type) { try { $modelClass = $this->getModelClass($type); if (!$modelClass) { return response()->json(['success' => false, 'message' => 'Invalid type specified.'], 400); } $model = $modelClass::findOrFail($id); $model->delete(); return response()->json(['success' => true, 'message' => 'deleted successfully']); } catch (ModelNotFoundException $e) { return response()->json(['success' => false, 'message' => 'not found.'], 404); } catch (Exception $e) { return response()->json(['success' => false, 'message' => 'Failed to delete.'], 500); } } public 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); } private function getModelClass(string $type): ?string { return $this->modelClasses[$type] ?? null; } private $modelClasses = [ 'bentuk-tanah' => BentukTanah::class, 'kontur-tanah' => KonturTanah::class, 'posisi-kavling' => PosisiKavling::class, 'ketinggian-tanah' => KetinggianTanah::class, 'kondisi-fisik-tanah' => KondisiFisikTanah::class, 'jenis-bangunan' => JenisBangunan::class, 'kondisi-bangunan' => KondisiBangunan::class, 'sifat-bangunan' => SifatBangunan::class, 'sarana-pelengkap' => SaranaPelengkap::class, 'lalu-lintas-lokasi' => LaluLintasLokasi::class, 'tingkat-keramaian' => TingkatKeramaian::class, 'gol-mas-sekitar' => GolonganMasySekitar::class, 'spek-kategori-bangunan' => SpekKategoritBangunan::class, 'spek-bangunan' => SpekBangunan::class, 'lantai-unit' => Lantai::class, 'view-unit' => ViewUnit::class, 'jenis-pesawat' => JenisPesawat::class, 'model-alat-berat' => ModelAlatBerat::class, 'jenis-kapal' => JenisKapal::class, 'jenis-kendaraan' => JenisKendaraan::class, 'terletak-area' => TerletakArea::class, 'posisi-unit' => PosisiUnit::class, 'bentuk-unit' => BentukUnit::class, 'fasilitas-objek' => FasilitasObjek::class, 'merupakan-daerah' => MerupakanDaerah::class, 'jenis-unit' => JenisUnit::class, 'perkerasan-jalan' => PerkerasanJalan::class, 'foto-objek-jaminan' => FotoObjekJaminan::class, 'perizinan' => Perizinan::class ]; 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'], ]; private function getAssetData(array $data): array { $alamatData = [ 'address' => $data['address'] ?? null, 'village_code' => $data['village_code'] ?? null, 'district_code' => $data['district_code'] ?? null, 'city_code' => $data['city_code'] ?? null, 'province_code' => $data['province_code'] ?? null, ]; $alamatKey = ($data['alamat_sesuai'] ?? null) === 'sesuai' ? 'sesuai' : 'tidak sesuai'; $alamat = []; // Masukkan key baru yang sesuai $alamat[$alamatKey] = $alamatData; return [ 'asset' => [ 'debitur_perwakilan' => $data['debitur_perwakilan'] ?? [], 'jenis_asset' => [ $data['jenis_asset'] ?? null => ($data['jenis_asset'] ?? null) === 'sesuai' ? ($data['jenis_asset_name'] ?? null) : ($data['jenis_asset_tidak_sesuai'] ?? null) ], 'alamat' => $alamat, 'hub_cadeb' => [ $data['hub_cadeb'] ?? null => ($data['hub_cadeb'] ?? null) === 'sesuai' ? ($data['hub_cadeb_sesuai'] ?? null) : ($data['hub_cadeb_tidak_sesuai'] ?? null) ], 'hub_cadeb_penghuni' => [ $data['hub_cadeb_penghuni'] ?? null => ($data['hub_cadeb_penghuni'] ?? null) === 'sesuai' ? ($data['hub_cadeb_penghuni_sesuai'] ?? null) : ($data['hub_penghuni_tidak_sesuai'] ?? null) ], 'pihak_bank' => $data['pihak_bank'] ?? null, 'kordinat_lng' => $data['kordinat_lng'] ?? null, 'kordinat_lat' => $data['kordinat_lat'] ?? null, 'nomor_nib' => $data['nomor_nib'] ?? null ] ]; } private function getTanahData(array $data): array { //luas tanah key // Luas tanah key $luas_tanah_key = ($data['luas_tanah'] ?? null) === 'sesuai' ? 'sesuai' : 'tidak sesuai'; $luas_tanah = []; $hasil_tanah = $luas_tanah_key === 'sesuai' ? ($data['luas_tanah_sesuai'] ?? null) : ($data['luas_tanah_tidak_sesuai'] ?? null); $luas_tanah[$luas_tanah_key] = preg_replace('/[^0-9.,]/', '', $hasil_tanah); // Hadap mata angin key $hadap_mata_angin_key = ($data['hadap_mata_angin'] ?? null) === 'sesuai' ? 'sesuai' : 'tidak sesuai'; $hadap_mata_angin = []; $hasil_hadap_mata_angin = $hadap_mata_angin_key === 'sesuai' ? ($data['hadap_mata_angin_sesuai'] ?? null) : ($data['hadap_mata_angin_tidak_sesuai'] ?? null); $hadap_mata_angin[$hadap_mata_angin_key] = $hasil_hadap_mata_angin; $tusuk_sate_key = ($data['tusuk_sate'] ?? null) === 'Ya' ? 'Ya' : 'Tidak'; $tusuk_sate = []; $tusuk_sate[$tusuk_sate_key] = $data['tusuk_sate_ya'] ?? null; return [ 'tanah' => [ 'luas_tanah' => $luas_tanah, 'hadap_mata_angin' => $hadap_mata_angin, 'bentuk_tanah' => $this->getFieldData( $data, 'bentuk_tanah', false, 'lainnya' ), 'kontur_tanah' => $data['kontur_tanah'] ?? [], 'ketinggian_tanah' => [ 'ketinggian' => $data['ketinggian_jalan'] ?? null, 'lebih_tinggi' => $data['ketinggian_lebih_tinggi'] ?? null, 'lebih_rendah' => $data['ketinggian_lebih_rendah'] ?? null ], 'kontur_jalan' => $data['kontur_jalan'] ?? null, 'ketinggian_jalan' => $data['ketinggian_jalan'] ?? [], 'posisi_kavling' => $this->getFieldData( $data, 'posisi_kavling', false, 'lainnya' ), 'tusuk_sate' => $tusuk_sate, 'lockland' => $data['lockland'] ?? null, 'kondisi_fisik_tanah' => $this->getFieldData( $data, 'kondisi_fisik_tanah', false, 'lainnya' ) ] ]; } private function getBangunanData($data, $request): array { $data = $request->all(); $result = []; foreach ($request->input('nama_bangunan') as $index => $buildingName) { if (empty($buildingName)) { continue; } // Skip if building name is empty $buildingData = []; $buildingData['bagunan'] = $buildingName; $specCategories = $request->input('spek_kategori_bangunan'); $buildingData['spek_kategori_bangunan'] = []; if (!empty($specCategories)) { foreach ($specCategories as $category) { if (empty($category)) { continue; } // Skip empty categories $specs = $request->input("spek_bangunan.{$index}.{$category}", []); // Only add category if it has specifications if (!empty($specs)) { $buildingData['spek_kategori_bangunan'][$category] = $specs; } } } // Only add building data if it has specifications if (!empty($buildingData['spek_kategori_bangunan'])) { $result[] = $buildingData; } } $luas_tanah_bagunan_key = ($data['luas_tanah_bagunan'] ?? null) === 'sesuai' ? 'sesuai' : 'tidak sesuai'; $luas_tanah_bagunan = []; $hasil_tanah_bagunan = $luas_tanah_bagunan_key === 'sesuai' ? ($data['luas_bangunan_sesuai'] ?? null) : ($data['luas_tanah_bagunan_tidak_sesuai'] ?? null); // Masukkan key baru yang sesuai $luas_tanah_bagunan[$luas_tanah_bagunan_key] = preg_replace('/[^0-9.,]/', '', $hasil_tanah_bagunan); return [ 'bangunan' => [ 'luas_tanah_bagunan' => $luas_tanah_bagunan, 'jenis_bangunan' => $data['jenis_bangunan'] ?? null, 'kondisi_bangunan' => $data['kondisi_bangunan'] ?? null, 'sifat_bangunan' => $data['sifat_bangunan'] ?? null, 'sifat_bangunan_input' => $data['sifat_bangunan_input'] ?? null, 'spesifikasi_bangunan' => $result ?? null, 'sarana_pelengkap' => $data['sarana_pelengkap'] ?? null, 'sarana_pelengkap_input' => $data['sarana_pelengkap_input'] ?? null, ], ]; } private function getLingkunganData($data, $request): array { return [ 'lingkungan' => [ 'jarak_jalan_utama' => $data['jarak_jalan_utama'] ?? null, 'jalan_linkungan' => $data['jalan_linkungan'] ?? null, 'jarak_cbd_point' => $data['jarak_cbd_point'] ?? null, 'nama_cbd_point' => $data['nama_cbd_point'] ?? null, 'lebar_perkerasan_jalan' => $data['lebar_perkerasan_jalan'] ?? null, 'perkerasan_jalan' => $this->getFieldData( $data, 'perkerasan_jalan', false, 'lainnya' ), 'lalu_lintas' => $data['lalu_lintas'] ?? null, 'gol_mas_sekitar' => $data['gol_mas_sekitar'] ?? null, 'tingkat_keramaian' => $data['tingkat_keramaian'] ?? null, 'terletak_diarea' => $this->getFieldData( $data, 'terletak_diarea', false, 'lainnya' ), 'disekitar_lokasi' => ($data['disekitar_lokasi'] ?? null) === 'yes' ? [ 'kondisi' => $data['kondisi_bagunan_disekitar_lokasi'] ?? null, 'sifat' => $data['sifat_bagunan_disekitar_lokasi'] ?? null, ] : ($data['disekitar_lokasi'] ?? null), 'kondisi_bagunan_disekitar_lokasi' => $data['kondisi_bagunan_disekitar_lokasi'] ?? null, 'sifat_bagunan_disekitar_lokasi' => $data['sifat_bagunan_disekitar_lokasi'] ?? null, 'dekat_makam' => $data['dekat_makam'] ?? null, 'jarak_makam' => $data['jarak_makam'] ?? null, 'nama_makam' => $data['nama_makam'] ?? null, 'dekat_tps' => $data['dekat_tps'] ?? null, 'jarak_tps' => $data['jarak_tps'] ?? null, 'nama_tps' => $data['nama_tps'] ?? null, 'dekat_lainnya' => $data['dekat_lainnya'] ?? null, 'merupakan_daerah' => $data['merupakan_daerah'] ?? null, 'fasilitas_dekat_object' => $data['fasilitas_dekat_object'] ?? null, 'fasilitas_dekat_object_input' => $data['fasilitas_dekat_object_input'] ?? null, ] ]; } private function getFactData($data, $request): array { $factData = [ 'fakta' => [ 'fakta_positif' => $data['fakta_positif'] ?? null, 'fakta_negatif' => $data['fakta_negatif'] ?? null, 'rute_menuju' => $data['rute_menuju'] ?? null, 'batas_batas' => $data['batas_batas'] ?? null, 'batas_batas_input' => $data['batas_batas_input'] ?? null, 'kondisi_lingkungan' => $data['kondisi_lingkungan'] ?? null, 'kondisi_lain_bangunan' => $data['kondisi_lain_bangunan'] ?? null, 'informasi_dokument' => $data['informasi_dokument'] ?? null, 'peruntukan' => $data['peruntukan'] ?? null, 'kdb' => $data['kdb'] ?? null, 'kdh' => $data['kdh'] ?? null, 'gsb' => $data['gsb'] ?? null, 'max_lantai' => $data['max_lantai'] ?? null, 'klb' => $data['klb'] ?? null, 'gss' => $data['gss'] ?? null, 'pelebaran_jalan' => $data['pelebaran_jalan'] ?? null, 'nama_petugas' => $data['nama_petugas'] ?? null, 'keterangan' => $data['keterangan'] ?? null, ] ]; $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))->where('dokument_id', $request->input('dokument_id'))->first(); $fotoTypes = [ 'foto_gistaru', 'foto_bhumi', 'foto_argis_region', 'foto_tempat', 'foto_sentuh_tanahku' ]; if ($inspeksi) { $dataForm = json_decode($inspeksi->data_form, true); foreach ($fotoTypes as $fotoType) { // Jika ada file baru diupload if ($request->hasFile($fotoType)) { $factData[$fotoType] = $this->updateOrDeleteFile($dataForm, $request, $fotoType) ?: null; } else { $factData[$fotoType] = $dataForm[$fotoType] ?? null; } } } else { foreach ($fotoTypes as $fotoType) { $factData[$fotoType] = $this->updateOrDeleteFile($data, $request, $fotoType) ?: null; } } return $factData; } private function getRapData($data, $request): array { $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id')) ->where('dokument_id', $request->input('dokument_id')) ->first(); $dataForm = json_decode($inspeksi->data_form, true); $perizinanData = isset($dataForm['perizinan']) ? $dataForm['perizinan'] : []; if ($request->has('perizinan')) { foreach ($request->perizinan as $key => $perizinanName) { // Cek apakah ada file baru yang diupload if ($request->hasFile("perizinan_file.{$key}")) { // Jika ada file baru, tambahkan/update data $file = $request->file("perizinan_file.{$key}"); $path = $file->store('perizinan', 'public'); // Cek apakah perizinan dengan nama yang sama sudah ada $existingIndex = array_search($perizinanName, array_column($perizinanData, 'perizinan')); if ($existingIndex !== false) { // Update file untuk perizinan yang sudah ada $perizinanData[$existingIndex] = [ 'perizinan' => $perizinanName, 'perizinan_file' => $path ]; } else { // Tambah perizinan baru $perizinanData[] = [ 'perizinan' => $perizinanName, 'perizinan_file' => $path ]; } } } } $data['perizinan'] = $perizinanData; $partisiResult = []; if (isset($data['partisi'])) { foreach ($data['partisi'] as $name => $values) { if (!empty($values['value'])) { $partisiResult[$name] = [ 'nama' => $values['nama'], 'value' => $values['value'] ]; } } } $brosurData = isset($dataForm['brosur_price_list']) ? $dataForm['brosur_price_list'] : []; if ($request->has('brosur_price_list')) { foreach ($request->brosur_price_list as $key => $jenis) { // Cek apakah ada file baru yang diupload if ($request->hasFile("brosur_price_list_file.{$key}")) { // Jika ada file baru, tambahkan/update data $file = $request->file("brosur_price_list_file.{$key}"); $path = $file->store('brosur-pricelist', 'public'); // Cek apakah jenis brosur yang sama sudah ada $existingIndex = array_search($jenis, array_column($brosurData, 'jenis')); if ($existingIndex !== false) { // Update file untuk jenis yang sudah ada $brosurData[$existingIndex] = [ 'jenis' => $jenis, 'file_path' => $path ]; } else { // Tambah jenis brosur baru $brosurData[] = [ 'jenis' => $jenis, 'file_path' => $path ]; } } } } $data['brosur_price_list'] = $brosurData; $rapData = [ 'perizinan' => $perizinanData ?? null, 'brosur_price_list' => $brosurData ?? null, 'pengalaman_developer' => $data['pengalaman_developer'] ?? null, 'developer_anggota' => $data['developer_anggota'] ?? null, 'lainnya_developer' => $data['lainnya_developer'] ?? null, 'kapan_mulai_dibangun' => $data['kapan_mulai_dibangun'] ?? null, 'kondisi_perumahan' => $data['kondisi_perumahan'] ?? null, 'progres_pembangunan' => $data['progres_pembangunan'] ?? null, 'kontraktor' => $data['kontraktor'] ?? null, 'lingkungan_sekitar' => $data['lingkungan_sekitar'] ?? null, 'komplek_disekitar' => $data['komplek_disekitar'] ?? null, 'pusat_keramaian' => $data['pusat_keramaian'] ?? null, 'transportasi_umum' => $data['transportasi_umum'] ?? null, 'lainnya_kondisi' => $data['lainnya_kondisi'] ?? null, 'partisi' => $partisiResult ?? null, 'jumlah_unit' => $data['jumlah_unit'] ?? null, 'batas_batas_perumahan' => $data['batas_batas_perumahan'] ?? null, 'fasus_fasum' => $data['fasus_fasum'] ?? null, 'progres_penjualan' => $data['progres_penjualan'] ?? null, 'harga_unit' => $data['harga_unit'] ?? null, 'target_market' => $data['target_market'] ?? null, 'kerjasama_dengan_bank' => $data['kerjasama_dengan_bank'] ?? null, 'rute_menuju_lokasi' => $data['rute_menuju_lokasi'] ?? null, 'properti_sejenis' => $data['properti_sejenis'] ?? null, ]; return $rapData; } private function updateOrDeleteFile($data, $request, $fileKey) { if ($request->hasFile($fileKey)) { $file = $request->file($fileKey); if ($file->isValid()) { $fileName = time() . '_' . $file->getClientOriginalName(); $path = $file->storeAs("public/surveyor/{$request->type}", $fileName); if ($path === false) { throw new Exception("Failed to store file for {$fileKey}"); } if (isset($data[$fileKey]) && $data[$fileKey]) { $this->deleteFile($data[$fileKey]); } return str_replace('public/', '', $path); } else { throw new Exception("Invalid file upload for {$fileKey}"); } } elseif (isset($data[$fileKey]) && $data[$fileKey]) { return $data[$fileKey]; } else { return null; } } private function deleteFile($filePath) { $fullPath = storage_path('app/public/' . $filePath); if (file_exists($fullPath)) { unlink($fullPath); } } private function getKapalData($data, $request): array { $alamatData = [ 'village_code' => $data['village_code'] ?? null, 'district_code' => $data['district_code'] ?? null, 'city_code' => $data['city_code'] ?? null, 'province_code' => $data['province_code'] ?? null, ]; return [ 'action' => $data['action'] ?? null, 'nama_wakil_debitur' => $data['nama_wakil_debitur'] ?? null, 'hub_calon_debitur' => $data['hub_calon_debitur'] ?? null, 'dermaga' => $data['dermaga'] ?? null, 'nama_jalan' => $data['nama_jalan'] ?? null, 'perumahan_gang' => $data['perumahan_gang'] ?? null, 'blok_nomor' => $data['blok_nomor'] ?? null, 'bandara' => $data['bandara'] ?? null, 'alamat' => [ 'sesuai' => $alamatData ], 'jenis_kapal' => $data['jenis_kapal'] ?? null, 'jenis_kapal_lainnya' => $data['jenis_kapal_lainnya'] ?? null, 'size' => $data['size'] ?? null, 'kondisi' => $data['kondisi'] ?? null, 'klasifikasi' => $data['klasifikasi'] ?? null, 'nama_kapal' => $data['nama_kapal'] ?? null, 'pemilik_kapal' => $data['pemilik_kapal'] ?? null, 'bendera' => $data['bendera'] ?? null, 'nomor_selar' => $data['nomor_selar'] ?? null, 'kapal' => $data['kapal'] ?? null, 'galangan_kapal' => $data['galangan_kapal'] ?? null, 'kapal_shipyard' => $data['kapal_shipyard'] ?? null, 'tahun_pembuatan' => $data['tahun_pembuatan'] ?? null, 'tahun_launcing' => $data['tahun_launcing'] ?? null, 'dwt' => $data['dwt'] ?? null, 'lwt' => $data['lwt'] ?? null, 'gross_tonnage' => $data['gross_tonnage'] ?? null, 'net_tonnage' => $data['net_tonnage'] ?? null, 'tenaga_mesin' => $data['tenaga_mesin'] ?? null, 'loa' => $data['loa'] ?? null, 'lbp' => $data['lbp'] ?? null, 'beam' => $data['beam'] ?? null, 'depth' => $data['depth'] ?? null, 'draft' => $data['draft'] ?? null, 'lambung_kapal' => $data['lambung_kapal'] ?? null, 'dek' => $data['dek'] ?? null, 'struktur_rangka' => $data['struktur_rangka'] ?? null, 'palka' => $data['palka'] ?? null, 'pondasi_mesin' => $data['pondasi_mesin'] ?? null, 'area_mesin' => $data['area_mesin'] ?? null, 'cat_dan_korosi' => $data['cat_dan_korosi'] ?? null, 'sistem_pengelasan' => $data['sistem_pengelasan'] ?? null, 'deskripsi_struktur' => $data['deskripsi_struktur'] ?? null, 'sekoci' => $data['sekoci'] ?? null, 'jaket_pelampung' => $data['jaket_pelampung'] ?? null, 'alat_pemadaman' => $data['alat_pemadaman'] ?? null, 'rambu_darurat' => $data['rambu_darurat'] ?? null, 'sistem_alarm' => $data['sistem_alarm'] ?? null, 'sistem_pencegah' => $data['sistem_pencegah'] ?? null, 'kebakaran' => $data['kebakaran'] ?? null, 'lampu_darurat' => $data['lampu_darurat'] ?? null, 'deskripsi_peralatan' => $data['deskripsi_peralatan'] ?? null, 'gps' => $data['gps'] ?? null, 'radar' => $data['radar'] ?? null, 'radio_komunikasi' => $data['radio_komunikasi'] ?? null, 'lampu_navigasi' => $data['lampu_navigasi'] ?? null, 'sistem_kendali_otomatis' => $data['sistem_kendali_otomatis'] ?? null, 'kompas' => $data['kompas'] ?? null, 'deskripsi_navigasi' => $data['deskripsi_navigasi'] ?? null, 'mesin_utama' => $data['mesin_utama'] ?? null, 'mesin_bantu' => $data['mesin_bantu'] ?? null, 'pompa_pendingin' => $data['pompa_pendingin'] ?? null, 'sistem_pelumasan' => $data['sistem_pelumasan'] ?? null, 'propeller' => $data['propeller'] ?? null, 'sistem_kelistrikan' => $data['sistem_kelistrikan'] ?? null, 'deskripsi_mesin_penggerak' => $data['deskripsi_mesin_penggerak'] ?? null, 'lampu_navigasi' => $data['lampu_navigasi'] ?? null, 'sistem_penerangan' => $data['sistem_penerangan'] ?? null, 'sistem_panel_distribusi' => $data['sistem_panel_distribusi'] ?? null, 'kabel_perangkat' => $data['kabel_perangkat'] ?? null, 'deskripsi_kelistrikan' => $data['deskripsi_kelistrikan'] ?? null, 'kebersihan_dek_luar' => $data['kebersihan_dek_luar'] ?? null, 'tangki_limbah' => $data['tangki_limbah'] ?? null, 'sistem_pengelolaan_limbah' => $data['sistem_pengelolaan_limbah'] ?? null, 'pengelolaan_air_ballast' => $data['pengelolaan_air_ballast'] ?? null, 'deskripsi_kebersihan' => $data['deskripsi_kebersihan'] ?? null, 'fakta_positif' => $data['fakta_positif'] ?? null, 'fakta_negatif' => $data['fakta_negatif'] ?? null, 'analisa_makro' => $data['analisa_makro'] ?? null, 'kesimpulan' => $data['kesimpulan'] ?? null, 'catatan' => $data['catatan'] ?? null, ]; } public function getKendaraanData($data, $request): array { $alamatData = [ 'village_code' => $data['village_code'] ?? null, 'district_code' => $data['district_code'] ?? null, 'city_code' => $data['city_code'] ?? null, 'province_code' => $data['province_code'] ?? null, ]; return [ 'action' => $data['action'] ?? null, 'tanggal_survey' => $data['tanggal_survey'] ?? null, 'nama_wakil' => $data['nama_wakil'] ?? null, 'hub_calon_debitur' => $data['hub_calon_debitur'] ?? null, 'nama_jalan' => $data['nama_jalan'] ?? null, 'perumahan_gang' => $data['perumahan_gang'] ?? null, 'blok_nomor' => $data['blok_nomor'] ?? null, 'alamat' => [ 'sesuai' => $alamatData ], 'masa_stnk' => $data['masa_stnk'] ?? null, 'masa_pajak' => $data['masa_pajak'] ?? null, 'kendaraan' => $data['kendaraan'] ?? null, 'kendaraan_input' => $data['kendaraan_input'] ?? null, 'kondisi' => $data['kondisi'] ?? null, 'nomor_polisi' => $data['nomor_polisi'] ?? null, 'nomor_polis_tidak_sesuai' => $data['nomor_polis_tidak_sesuai'] ?? null, 'merek' => $data['merek'] ?? null, 'merek_tidak_sesuai' => $data['merek_tidak_sesuai'] ?? null, 'warna' => $data['warna'] ?? null, 'warna_tidak_sesuai' => $data['warna_tidak_sesuai'] ?? null, 'nomor_rangka' => $data['nomor_rangka'] ?? null, 'nomor_rangka_tidak_sesuai' => $data['nomor_rangka_tidak_sesuai'] ?? null, 'nomor_mesin' => $data['nomor_mesin'] ?? null, 'nomor_mesin_tidak_sesuai' => $data['nomor_mesin_tidak_sesuai'] ?? null, 'posisi_kilometer' => $data['posisi_kilometer'] ?? null, 'transmisi' => $data['transmisi'] ?? null, 'transmisi_input' => $data['transmisi_input'] ?? null, 'mesin_panel_instrument' => $data['mesin_panel_instrument'] ?? null, 'mesin_panel_instrument_input' => $data['mesin_panel_instrument_input'] ?? null, 'fungsi_mesin_panel_instrument' => $data['fungsi_mesin_panel_instrument'] ?? null, 'fungsi_mesin_panel_instrument_input' => $data['fungsi_mesin_panel_instrument_input'] ?? null, 'interior' => $data['interior'] ?? null, 'interior_input' => $data['interior_input'] ?? null, 'jumlah_pintu' => $data['jumlah_pintu'] ?? null, 'jumlah_pintu_input' => $data['jumlah_pintu_input'] ?? null, 'rangka_karoseri' => $data['rangka_karoseri'] ?? null, 'rangka_karoseri_input' => $data['rangka_karoseri_input'] ?? null, 'ban' => $data['ban'] ?? null, 'ban_input' => $data['ban_input'] ?? null, 'velg' => $data['velg'] ?? null, 'velg_input' => $data['velg_input'] ?? null, 'bamper_depan' => $data['bamper_depan'] ?? null, 'bamper_depan_input' => $data['bamper_depan_input'] ?? null, 'bamper_belakang' => $data['bamper_belakang'] ?? null, 'bamper_belakang_input' => $data['bamper_belakang_input'] ?? null, 'lampu_depan' => $data['lampu_depan'] ?? null, 'lampu_depan_input' => $data['lampu_depan_input'] ?? null, 'lampu_belakang' => $data['lampu_belakang'] ?? null, 'lampu_belakang_input' => $data['lampu_belakang_input'] ?? null, 'kaca_kendaraan' => $data['kaca_kendaraan'] ?? null, 'kaca_kendaraan_input' => $data['kaca_kendaraan_input'] ?? null, 'air_conditioner' => $data['air_conditioner'] ?? null, 'air_conditioner_input' => $data['air_conditioner_input'] ?? null, 'tape_radio_cd' => $data['tape_radio_cd'] ?? null, 'tape_radio_cd_input' => $data['tape_radio_cd_input'] ?? null, 'sensor_parkir' => $data['sensor_parkir'] ?? null, 'sensor_parkir_input' => $data['sensor_parkir_input'] ?? null, 'sensor_camera_recorder' => $data['sensor_camera_recorder'] ?? null, 'sensor_camera_recorder_input' => $data['sensor_camera_recorder_input'] ?? null, 'lcd' => $data['lcd'] ?? null, 'lcd_input' => $data['lcd_input'] ?? null, 'sabuk_keselamatan' => $data['sabuk_keselamatan'] ?? null, 'sabuk_keselamatan_input' => $data['sabuk_keselamatan_input'] ?? null, 'airbag' => $data['airbag'] ?? null, 'airbag_input' => $data['airbag_input'] ?? null, 'asuransi' => $data['asuransi'] ?? null, 'asuransi_input' => $data['asuransi_input'] ?? null, 'perusahaan_asuransi' => $data['perusahaan_asuransi'] ?? null, 'tahun_berakhir' => $data['tahun_berakhir'] ?? null, 'fakta_positif' => $data['fakta_positif'] ?? null, 'fakta_negatif' => $data['fakta_negatif'] ?? null, 'analisa_makro' => $data['analisa_makro'] ?? null, 'kesimpulan' => $data['kesimpulan'] ?? null, 'catatan' => $data['catatan'] ?? null, ]; } public function getMesinData($data, $request): array { return [ 'action' => $data['action'] ?? null, 'nama_wakil' => $data['nama_wakil'] ?? null, 'nama_jalan' => $data['nama_jalan'] ?? null, 'perumahan_gang' => $data['perumahan_gang'] ?? null, 'blok' => $data['blok'] ?? null, 'desa_kelurahan' => $data['desa_kelurahan'] ?? null, 'kecamatan' => $data['kecamatan'] ?? null, 'kota_madya' => $data['kota_madya'] ?? null, 'provinsi' => $data['provinsi'] ?? null, 'hub_calon_debitur' => $data['hub_calon_debitur'] ?? null, 'tipe_model' => $data['tipe_model'] ?? null, 'merek' => $data['merek'] ?? null, 'tahun_pembuatan' => $data['tahun_pembuatan'] ?? null, 'negara_pembuat' => $data['negara_pembuat'] ?? null, 'kondisi_mesin' => $data['kondisi_mesin'] ?? null, 'faktor_positif' => $data['faktor_positif'] ?? null, 'faktor_negatif' => $data['faktor_negatif'] ?? null, 'kesimpulan' => $data['kesimpulan'] ?? null, 'catatan' => $data['catatan'] ?? null, ]; } public function getAlatBeratData($data, $request): array { $alamatData = [ 'village_code' => $data['village_code'] ?? null, 'district_code' => $data['district_code'] ?? null, 'city_code' => $data['city_code'] ?? null, 'province_code' => $data['province_code'] ?? null, ]; return [ 'action' => $data['action'] ?? null, 'tanggal_survey' => $data['tanggal_survey'] ?? null, 'nama_wakil' => $data['nama_wakil'] ?? null, 'hub_calon_debitur' => $data['hub_calon_debitur'] ?? null, 'dengan_wadeb' => $data['dengan_wadeb'] ?? null, 'nama_jalan' => $data['nama_jalan'] ?? null, 'perumahan_gang' => $data['perumahan_gang'] ?? null, 'blok_nomor' => $data['blok_nomor'] ?? null, 'alamat' => [ 'sesuai' => $alamatData ], 'jenis_model' => $data['jenis_model'] ?? null, 'nomor_lambung' => $data['nomor_lambung'] ?? null, 'model_unit' => $data['model_unit'] ?? null, 'tahun_pembuatan' => $data['tahun_pembuatan'] ?? null, 'merk' => $data['merk'] ?? null, 'negara_pembuat' => $data['negara_pembuat'] ?? null, 'tahun_pembelian' => $data['tahun_pembelian'] ?? null, 'nomor_faktur' => $data['nomor_faktur'] ?? null, 'nomor_kontrak' => $data['nomor_kontrak'] ?? null, 'nama_pemilik' => $data['nama_pemilik'] ?? null, 'alamat_pemilik' => $data['alamat_pemilik'] ?? null, 'nomor_asuransi' => $data['nomor_asuransi'] ?? null, 'nomor_rangka' => $data['nomor_rangka'] ?? null, 'nomor_mesin' => $data['nomor_mesin'] ?? null, 'hour_mesters' => $data['hour_mesters'] ?? null, 'overhaul_mesin' => $data['overhaul_mesin'] ?? null, 'mesin_panel' => $data['mesin_panel'] ?? null, 'mesin_panel_input' => $data['mesin_panel_input'] ?? null, 'fungsi_panel' => $data['fungsi_panel'] ?? null, 'fungsi_panel_input' => $data['fungsi_panel_input'] ?? null, 'interior' => $data['interior'] ?? null, 'interior_input' => $data['interior_input'] ?? null, 'rangka_Karoseri' => $data['rangka_Karoseri'] ?? null, 'rangka_Karoseri_input' => $data['rangka_Karoseri_input'] ?? null, 'ban' => $data['ban'] ?? null, 'ban_input' => $data['ban_input'] ?? null, 'velg' => $data['velg'] ?? null, 'velg_input' => $data['velg_input'] ?? null, 'air_conditioner' => $data['air_conditioner'] ?? null, 'air_conditioner_input' => $data['air_conditioner_input'] ?? null, 'aksesoris' => $data['aksesoris'] ?? null, 'aksesoris_input' => $data['aksesoris_input'] ?? null, 'lcd' => $data['lcd'] ?? null, 'lcd_input' => $data['lcd_input'] ?? null, 'perlengkapan' => $data['perlengkapan'] ?? null, 'perlengkapan_input' => $data['perlengkapan_input'] ?? null, 'asuransi' => $data['asuransi'] ?? null, 'asuransi_input' => $data['asuransi_input'] ?? null, 'perusahaan_asuransi' => $data['perusahaan_asuransi'] ?? null, 'tahun_berakhir' => $data['tahun_berakhir'] ?? null, 'sensor_kamera' => $data['sensor_kamera'] ?? null, 'sabuk_keselamatan' => $data['sabuk_keselamatan'] ?? null, 'air_bag' => $data['air_bag'] ?? null, 'fakta_positif' => $data['fakta_positif'] ?? null, 'fakta_negatif' => $data['fakta_negatif'] ?? null, 'kesimpulan' => $data['kesimpulan'] ?? null, 'catatan' => $data['catatan'] ?? null, ]; } private function getPesawatData($data, $request): array { $alamatData = [ 'village_code' => $data['village_code'] ?? null, 'district_code' => $data['district_code'] ?? null, 'city_code' => $data['city_code'] ?? null, 'province_code' => $data['province_code'] ?? null, ]; return [ 'action' => $data['action'] ?? null, 'tanggal_survey' => $data['tanggal_survey'] ?? null, 'nama_wakil' => $data['nama_wakil'] ?? null, 'hub_calon_debitur' => $data['hub_calon_debitur'] ?? null, 'nama_jalan' => $data['nama_jalan'] ?? null, 'perumahan_gang' => $data['perumahan_gang'] ?? null, 'blok_nomor' => $data['blok_nomor'] ?? null, 'bandara' => $data['bandara'] ?? null, 'alamat' => [ 'sesuai' => $alamatData ], 'jenis_pesawat' => $data['jenis_pesawat'] ?? null, 'jenis_pesawat_lainnya' => $data['jenis_pesawat_lainnya'] ?? null, 'size' => $data['size'] ?? null, 'kondisi' => $data['kondisi'] ?? null, 'nama_pesawat' => $data['nama_pesawat'] ?? null, 'model' => $data['model'] ?? null, 'nomor_registrasi' => $data['nomor_registrasi'] ?? null, 'tahun_pembuatan' => $data['tahun_pembuatan'] ?? null, 'certificate_of_airworthines' => $data['certificate_of_airworthines'] ?? null, 'certificate_of_registration' => $data['certificate_of_registration'] ?? null, 'total_service_hours' => $data['total_service_hours'] ?? null, 'total_service_cycles' => $data['total_service_cycles'] ?? null, 'last_a_check' => $data['last_a_check'] ?? null, 'next_a_check' => $data['next_a_check'] ?? null, 'last_b_check' => $data['last_b_check'] ?? null, 'next_b_check' => $data['next_b_check'] ?? null, 'last_c_check' => $data['last_c_check'] ?? null, 'next_c_check' => $data['next_c_check'] ?? null, 'next_d_check' => $data['next_d_check'] ?? null, 'last_d_check' => $data['last_d_check'] ?? null, 'deskripsi_maintenence' => $data['deskripsi_maintenence'] ?? null, 'instrument_landing_system' => $data['instrument_landing_system'] ?? null, 'traffic_collision_avoidance_system' => $data['traffic_collision_avoidance_system'] ?? null, 'windshear' => $data['windshear'] ?? null, 'electronic_flight' => $data['electronic_flight'] ?? null, 'winglets' => $data['winglets'] ?? null, 'deskripsi_konfigurasi' => $data['deskripsi_konfigurasi'] ?? null, 'maksimal_penumpang' => $data['maksimal_penumpang'] ?? null, 'jumlah_kursi' => $data['jumlah_kursi'] ?? null, 'kursi_pramugari_pramugara' => $data['kursi_pramugari_pramugara'] ?? null, 'kartu_fitur_keselamatan' => $data['kartu_fitur_keselamatan'] ?? null, 'sabuk_pengaman' => $data['sabuk_pengaman'] ?? null, 'lampu_kabin' => $data['lampu_kabin'] ?? null, 'lampu_pintu_keluar' => $data['lampu_pintu_keluar'] ?? null, 'intercom_kabin' => $data['intercom_kabin'] ?? null, 'deskripsi_kabin' => $data['deskripsi_kabin'] ?? null, 'badan_pesawat' => $data['badan_pesawat'] ?? null, 'sayap_pesawat' => $data['sayap_pesawat'] ?? null, 'ekor_pesawat' => $data['ekor_pesawat'] ?? null, 'landing_gear' => $data['landing_gear'] ?? null, 'sistem_pengelasan' => $data['sistem_pengelasan'] ?? null, 'deskripsi_struktur' => $data['deskripsi_struktur'] ?? null, 'gps' => $data['gps'] ?? null, 'radar' => $data['radar'] ?? null, 'radio_komunikasi' => $data['radio_komunikasi'] ?? null, 'lampu_navigasi' => $data['lampu_navigasi'] ?? null, 'sistem_autopilot' => $data['sistem_autopilot'] ?? null, 'deskripsi_navigasi' => $data['deskripsi_navigasi'] ?? null, 'tangki_bahan_bakar' => $data['tangki_bahan_bakar'] ?? null, 'saluran_pipa_bahan_bakar' => $data['saluran_pipa_bahan_bakar'] ?? null, 'pompa_bahan_bakar' => $data['pompa_bahan_bakar'] ?? null, 'sistem_hidrolik_utama' => $data['sistem_hidrolik_utama'] ?? null, 'sistem_pendigin_hidrolik' => $data['sistem_pendigin_hidrolik'] ?? null, 'deskripsi_hidrolik' => $data['deskripsi_hidrolik'] ?? null, 'mesin_utama' => $data['mesin_utama'] ?? null, 'sistem_pendorong' => $data['sistem_pendorong'] ?? null, 'sistem_pendigin_mesin' => $data['sistem_pendigin_mesin'] ?? null, 'sistem_pelumasan' => $data['sistem_pelumasan'] ?? null, 'filter_dan_perangkat_pendukung' => $data['filter_dan_perangkat_pendukung'] ?? null, 'deskripsi_kondisi_mesin' => $data['deskripsi_kondisi_mesin'] ?? null, 'jaket_pelampung' => $data['jaket_pelampung'] ?? null, 'pintu_darurat' => $data['pintu_darurat'] ?? null, 'alat_pemadaman_kebakaran' => $data['alat_pemadaman_kebakaran'] ?? null, 'sistem_alaram_darurat' => $data['sistem_alaram_darurat'] ?? null, 'sekoci' => $data['sekoci'] ?? null, 'masker_oxigen' => $data['masker_oxigen'] ?? null, 'sabuk_pengaman' => $data['sabuk_pengaman'] ?? null, 'deskripsi_fungsi_keselamatan' => $data['deskripsi_fungsi_keselamatan'] ?? null, 'sistem_ventilasi_ac' => $data['sistem_ventilasi_ac'] ?? null, 'sistem_penerangan_kabin' => $data['sistem_penerangan_kabin'] ?? null, 'panel_informasi_penumpang' => $data['panel_informasi_penumpang'] ?? null, 'sistem_hiburan_kabin' => $data['sistem_hiburan_kabin'] ?? null, 'deskripsi_Interior' => $data['deskripsi_Interior'] ?? null, // Validasi untuk faktor dan kesimpulan 'fakta_positif' => $data['fakta_positif'] ?? null, 'fakta_negatif' => $data['fakta_negatif'] ?? null, 'kesimpulan' => $data['kesimpulan'] ?? null, 'catatan' => $data['catatan'] ?? null, ]; } private function getUnitData($data, $request): array { $luas_unit_key = ($data['luas_unit'] ?? null) === 'sesuai' ? 'sesuai' : 'tidak sesuai'; $luas_unit = []; $hasil_luas_unit = $luas_unit_key === 'sesuai' ? ($data['luas_unit_sesuai'] ?? null) : ($data['luas_unit_tidak_sesuai'] ?? null); // Masukkan key baru yang sesuai $luas_luas_unit[$luas_luas_unit_key] = preg_replace('/[^0-9.,]/', '', $hasil_luas_unit); return [ 'action' => $data['action'] ?? null, 'luas_unit' => $luas_luas_unit, 'kondisi_unit' => $data['kondisi_unit'] ?? null, 'posisi_unit' => $data['posisi_unit'] ?? null, 'lantai' => $data['lantai'] ?? null, 'view' => $data['view'] ?? null, 'bentuk_unit' => $data['bentuk_unit'] ?? null, ]; } /** * Helper untuk upload file * * @param $file * @param $type * @return path name */ public function uploadFile($file, $type) { if (!$file->isValid()) { throw new Exception("Invalid file upload for {$type}"); } $fileName = time() . '_' . $file->getClientOriginalName(); $path = $file->storeAs("public/surveyor/{$type}", $fileName); if ($path === false) { throw new Exception("Failed to store file for {$type}"); } return str_replace('public/', '', $path); } /** * Helper untuk memetakan array dengan inputannya * * @param array $keys Array kunci * @param array $values Array nilai/input * @return array */ private function mapArrayWithInputs(array $keys, array $values): array { $result = []; foreach ($keys as $key) { // Jika checkbox dicentang, ambil nilai input yang sesuai // Gunakan nilai dari $values berdasarkan nama checkbox $result[$key] = $values[$key] ?? null; } return $result; } /** * Helper method generic untuk mengambil data field * * @param array $data Array sumber data * @param string $fieldName Nama field * @param bool $checkKesesuaian Apakah perlu cek kesesuaian * @param string|null $extraField Field tambahan (misal 'lainnya') * @return array */ private function getFieldData( array $data, string $fieldName, bool $checkKesesuaian = false, ?string $extraField = null ): array { $result = []; if ($checkKesesuaian) { $isSesuai = ($data[$fieldName] ?? '') === 'sesuai'; $fieldKey = $isSesuai ? "{$fieldName}_sesuai" : "{$fieldName}_tidak_sesuai"; // Hanya simpan key yang dipilih if ($isSesuai) { $result['sesuai'] = $data[$fieldKey] ?? null; } else { $result['tidak sesuai'] = $data[$fieldKey] ?? null; } } else { $result[$fieldName] = $data[$fieldName] ?? null; if ($extraField) { $result[$extraField] = $data["{$fieldName}_{$extraField}"] ?? null; } } // Hapus key dengan nilai null untuk memastikan hanya key yang valid yang disimpan return array_filter($result, fn ($value) => $value !== null); } public function export(string $type) { $modelClass = $this->getModelClass($type); if (!$modelClass) { return response()->json([ 'message' => 'Invalid type provided.', 'available_types' => array_keys($this->modelClasses), ], 400); } // Return Excel download return Excel::download(new BasicDataSurveyorExport($modelClass), $type . '.xlsx'); } public function signatureStore(Request $request) { $validator = Validator::make($request->all(), [ 'signature' => 'required', 'type' => 'required|in:penilai,cabang,debitur,kjjp', 'name' => 'nullable|string', 'document_id' => 'nullable|string' ]); if ($validator->fails()) { return response()->json([ 'success' => false, 'message' => $validator->errors()->first() ], 422); } try { $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id')) ->where('dokument_id', $request->input('document_id')) ->first(); if (!$inspeksi) { $inspeksi = new Inspeksi(); $inspeksi->permohonan_id = $request->input('permohonan_id'); $inspeksi->dokument_id = $request->input('document_id'); $inspeksi->data_form = json_encode([]); // Inisialisasi data_form kosong $inspeksi->save(); } // Decode data form yang ada $dataForm = json_decode($inspeksi->data_form, true) ?: []; // Inisialisasi array signature jika belum ada if (!isset($dataForm['signature'])) { $dataForm['signature'] = []; } // Simpan atau update signature berdasarkan type $dataForm['signature'][$request->type] = [ 'image' => $request->signature, 'name' => $request->name, 'created_at' => now()->toDateTimeString(), 'updated_at' => now()->toDateTimeString() ]; // Update data form di database $inspeksi->data_form = json_encode($dataForm); $inspeksi->save(); return response()->json([ 'success' => true, 'message' => 'Tanda tangan berhasil disimpan' ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Terjadi kesalahan: ' . $e->getMessage() ], 500); } } public function signatureShow($type) { try { $inspeksi = Inspeksi::where('permohonan_id', request()->input('permohonan_id')) ->where('dokument_id', request()->input('document_id')) ->first(); if (!$inspeksi) { return response()->json([ 'success' => false, 'message' => 'Data inspeksi tidak ditemukan', 'error_code' => '404' ], 404); } $dataForm = json_decode($inspeksi->data_form, true) ?: []; if (isset($dataForm['signature'][$type])) { return response()->json([ 'success' => true, 'data' => [ 'signature' => $dataForm['signature'][$type]['image'], 'type' => $type, 'name' => $dataForm['signature'][$type]['name'] ?? '', 'created_at' => $dataForm['signature'][$type]['created_at'], 'updated_at' => $dataForm['signature'][$type]['updated_at'] ] ]); } return response()->json([ 'success' => false, 'message' => 'Tanda tangan tidak ditemukan', 'error_code' => '404' ], 404); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Terjadi kesalahan: ' . $e->getMessage(), 'error_code' => '500' ], 500); } } public function signatureDestroy(Request $request) { try { $validator = Validator::make($request->all(), [ 'type' => 'required|in:penilai,cabang,debitur,kjjp' ]); if ($validator->fails()) { return response()->json([ 'success' => false, 'message' => 'Validation error', 'errors' => $validator->errors() ], 422); } $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id')) ->where('dokument_id', $request->input('document_id')) ->first(); if (!$inspeksi) { return response()->json([ 'success' => false, 'message' => 'Data inspeksi tidak ditemukan', 'error_code' => '404' ], 404); } $dataForm = json_decode($inspeksi->data_form, true) ?: []; if (isset($dataForm['signature'][$request->type])) { unset($dataForm['signature'][$request->type]); $inspeksi->data_form = json_encode($dataForm); $inspeksi->save(); return response()->json([ 'success' => true, 'message' => 'Tanda tangan berhasil dihapus', 'data' => [ 'type' => $request->type, 'deleted_at' => now()->toDateTimeString() ] ]); } return response()->json([ 'success' => false, 'message' => 'Tanda tangan tidak ditemukan', 'error_code' => '404' ], 404); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Terjadi kesalahan: ' . $e->getMessage(), 'error_code' => '500' ], 500); } } private function arrayMergeRecursive($arr1, $arr2) { foreach ($arr2 as $key => $value) { if ($key === 'signature' && isset($arr1['signature'])) { // Jika key adalah signature, gabungkan secara spesifik $arr1['signature'] = array_merge($arr1['signature'], $value); } elseif (is_array($value) && isset($arr1[$key]) && is_array($arr1[$key])) { // Rekursif untuk key lainnya $arr1[$key] = $this->arrayMergeRecursive($arr1[$key], $value); } else { // Ganti nilai lama dengan nilai baru $arr1[$key] = $value; } } // Bersihkan key lama yang tidak ada di array baru foreach ($arr1 as $key => $value) { if (!array_key_exists($key, $arr2) && $key !== 'signature') { unset($arr1[$key]); } } return $arr1; } public function print_out_inspeksi($permohonan_id, $dokument_id, $jenis_jaminan_id) { // Ambil data permohonan dan data umum $permohonan = $this->getPermohonanJaminanId($permohonan_id, $dokument_id, $jenis_jaminan_id); $basicData = $this->getCommonData(); // Ambil data inspeksi $inspeksi = Inspeksi::where('permohonan_id', $permohonan_id) ->where('dokument_id', $dokument_id) ->first(); if (!$inspeksi) { // Redirect jika inspeksi tidak ditemukan return redirect()->back()->with('error', 'Data inspeksi tidak ditemukan.'); } $forminspeksi = json_decode($inspeksi->data_form, true); if (!$forminspeksi) { // Redirect jika data form inspeksi kosong return redirect()->back()->with('error', 'Silahkan isi terlebih dahulu form inspeksi.'); } $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') ]; // Decode data form inspeksi $forminspeksi = json_decode($inspeksi->data_form, true); if (!$forminspeksi) { // Redirect jika data form inspeksi kosong return redirect()->back()->with('error', 'Silahkan isi terlebih dahulu form inspeksi.'); } // Pilih template PDF berdasarkan nama inspeksi $templateView = strtolower($inspeksi->name) === 'rap' ? 'lpj::surveyor.components.print-out.main' : 'lpj::surveyor.components.print-out.main'; // Generate PDF $pdf = PDF::loadView($templateView, compact('permohonan', 'basicData', 'forminspeksi', 'alamat')); // Tentukan nama file PDF $namaDebiture = $permohonan->debiture->name . '-' . $permohonan->nomor_registrasi; $fileName = 'inspeksi-' . $namaDebiture . '-data.pdf'; return $pdf->download($fileName); } public function approveReschedule(Request $request, $id) { try { // Validasi data yang diterima $validatedData = $request->validate([ 'permohonan_id' => 'required|exists:permohonan,id', 'nomor_registrasi' => 'required' ]); // Memulai transaksi DB::beginTransaction(); // Update status permohonan menjadi "reschedule" $permohonan = Permohonan::findOrFail($validatedData['permohonan_id']); $permohonan->update([ 'status' => 'approved-reschedule', ]); // Update data penilaian dengan waktu reschedule $penilaian = Penilaian::findOrFail($id); $penilaian->update([ 'waktu_penilaian' => $penilaian->reschedule_date, ]); // Commit transaksi DB::commit(); return response()->json([ 'status' => 'success', 'message' => 'Reschedule jadwal dengan nomor registrasi ' . $validatedData['nomor_registrasi'] . ' berhasil disetujui.', ]); } catch (\Exception $e) { // Rollback jika ada error DB::rollBack(); return response()->json([ 'status' => 'error', 'message' => 'Gagal menyetujui reschedule: ' . $e->getMessage(), ], 500); } } /** * Reject reschedule request. */ public function rejectReschedule(Request $request, $id) { try { // Validasi data yang diterima $validatedData = $request->validate([ 'permohonan_id' => 'required|exists:permohonan,id', 'rejected_note' => 'required|string|max:255', 'nomor_registrasi' => 'required|string', 'keterangan' => 'required|string', ]); // Memulai transaksi DB::beginTransaction(); // Update status permohonan menjadi "rejected-reschedule" $permohonan = Permohonan::findOrFail($validatedData['permohonan_id']); $permohonan->update([ 'status' => 'rejected-reschedule', ]); // Update data penilaian dengan catatan penolakan $penilaian = Penilaian::findOrFail($id); $penilaian->update([ 'rejected_note' => $validatedData['rejected_note'], ]); // Commit transaksi DB::commit(); return response()->json([ 'status' => 'success', 'message' => 'Reschedule jadwal dengan nomor registrasi ' . $validatedData['nomor_registrasi'] . ' berhasil dengan alasan: ' . $validatedData['rejected_note'], ]); } catch (\Exception $e) { // Rollback jika ada error DB::rollBack(); return response()->json([ 'status' => 'error', 'message' => 'Gagal menolak reschedule: ' . $e->getMessage(), ], 500); } } public function storeProsesSurvey(Request $request, $id) { try { $validated = $request->validate([ 'permohonan_id' => 'required|integer|exists:permohonan,id', ]); $permohonan = Permohonan::findOrFail($id); $permohonan->status = 'survey'; $permohonan->save(); // Berikan respons JSON return response()->json([ 'status' => 'success', 'message' => 'Status permohonan berhasil diubah menjadi "survey".', ]); } catch (\Exception $e) { // Tangani error return response()->json([ 'status' => 'error', 'message' => $e->getMessage(), ], 500); } } }