update data pembading surveyor

This commit is contained in:
majid
2024-12-03 15:00:18 +07:00
parent 9502329fef
commit 280ed97a50
15 changed files with 1185 additions and 1034 deletions

View File

@@ -5,6 +5,7 @@ namespace Modules\Lpj\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;
use Modules\Lpj\Exports\BasicDataSurveyorExport;
use Illuminate\Support\Facades\DB;
@@ -97,12 +98,12 @@ class SurveyorController extends Controller
'penilaian',
'documents.jenisJaminan',
])->findOrFail($id);
$surveyor = $id;
$branches = Branch::all();
$provinces = Province::all();
$bentukTanah = BentukTanah::all();
// Get all inspeksi data for this permohonan
$inspeksiData = Inspeksi::where('permohonan_id', $id)
->get()
@@ -115,7 +116,8 @@ class SurveyorController extends Controller
'data_pembanding' => json_decode($item->data_pembanding, true),
];
});
return view('lpj::surveyor.detail', compact(
'permohonan',
'surveyor',
@@ -125,7 +127,7 @@ class SurveyorController extends Controller
'inspeksiData'
));
}
/**
* Store form inspeksi.
*/
@@ -134,10 +136,10 @@ class SurveyorController extends Controller
try {
// Validate request data
$validatedData = $request->validated();
// Get action specific rules and process data
$processedData = $this->getActionSpecificRules(
$validatedData,
$validatedData,
$request->input('type'),
$request
);
@@ -264,19 +266,19 @@ class SurveyorController extends Controller
'foto_lantai_lainnya' => ['foto_lantai_lainnya', 'name_lantai_lainnya'],
'foto_rute_lainnya' => ['foto_rute_lainnya', 'name_rute_lainnya'],
];
$inspeksi = Inspeksi::firstOrNew([
'permohonan_id' => $request->input('permohonan_id'),
'jenis_jaminan_id' => $request->input('jenis_jaminan_id')
]);
// Get existing foto_form data if it exists
$existingData = $inspeksi->exists && $inspeksi->foto_form
? json_decode($inspeksi->foto_form, true)
$existingData = $inspeksi->exists && $inspeksi->foto_form
? json_decode($inspeksi->foto_form, true)
: [];
$formatFotojson = $existingData; // Start with existing data
// Process each photo category
foreach ($photoCategories as $category => $fields) {
// Only update if new files are provided
@@ -288,7 +290,7 @@ class SurveyorController extends Controller
$formatFotojson[$category] = $this->processPhotoCategory($request, $fields);
}
}
// Process single files
$singleFiles = ['foto_basement', 'foto_gerbang', 'pendamping'];
foreach ($singleFiles as $file) {
@@ -300,7 +302,7 @@ class SurveyorController extends Controller
$formatFotojson[$file] = $this->uploadFile($request->file($file), $file);
}
}
// Update record
$inspeksi->foto_form = json_encode($formatFotojson);
$inspeksi->save();
@@ -340,34 +342,34 @@ class SurveyorController extends Controller
}
private function categoryHasNewFiles(Request $request, array $fields): bool
{
$photoField = $fields[0]; // First element is usually the photo field
return $request->hasFile($photoField) ||
(is_array($request->file($photoField)) && count($request->file($photoField)) > 0);
}
private function deleteFilesForCategory($categoryData)
{
if (!is_array($categoryData)) {
return;
{
$photoField = $fields[0]; // First element is usually the photo field
return $request->hasFile($photoField) ||
(is_array($request->file($photoField)) && count($request->file($photoField)) > 0);
}
foreach ($categoryData as $item) {
if (isset($item['foto'])) {
$this->deleteOfFile($item['foto']);
private function deleteFilesForCategory($categoryData)
{
if (!is_array($categoryData)) {
return;
}
foreach ($categoryData as $item) {
if (isset($item['foto'])) {
$this->deleteOfFile($item['foto']);
}
}
}
}
private function deleteOfFile($filePath)
{
if ($filePath && Storage::exists($filePath)) {
Storage::delete($filePath);
private function deleteOfFile($filePath)
{
if ($filePath && Storage::exists($filePath)) {
Storage::delete($filePath);
}
}
}
/**
* Custom validation request for foto
@@ -377,7 +379,7 @@ private function deleteOfFile($filePath)
return $request->validate([
'permohonan_id' => 'required',
'jenis_jaminan_id' => 'required',
'pendamping' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
'pendamping' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
'foto_objek.*' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
'name_objek.*' => 'required|string|max:255',
'foto_lingkungan.*' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
@@ -399,40 +401,40 @@ private function deleteOfFile($filePath)
}
public function submitSurveyor($id)
{
try {
// Get button status check result
$buttonStatusCheck = $this->checkButtonStatus($id);
$buttonStatus = json_decode($buttonStatusCheck->getContent(), true);
{
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']) {
// 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);
}
// If validation passes, update permohonan status
// $permohonan = Permohonan::findOrFail($id);
// $permohonan->update([
// 'status' => 'done',
// 'submitted_at' => now()
// ]);
return response()->json([
'success' => true,
'message' => 'Form surveyor berhasil disubmit'
], 200);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Form belum lengkap. Pastikan semua data telah diisi dengan benar.',
], 422);
'message' => 'Terjadi kesalahan',
'error' => $e->getMessage()
], 500);
}
// If validation passes, update permohonan status
// $permohonan = Permohonan::findOrFail($id);
// $permohonan->update([
// 'status' => 'done',
// '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);
}
}
@@ -442,41 +444,41 @@ private function deleteOfFile($filePath)
try {
// Get all inspeksi records for this permohonan
$inspeksiRecords = Inspeksi::where('permohonan_id', $id)->get();
if ($inspeksiRecords->isEmpty()) {
return response()->json(['buttonDisable' => true]);
}
foreach ($inspeksiRecords as $inspeksi) {
$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);
// Get jenis jaminan to check if it needs denah
$jenisJaminan = JenisJaminan::find($inspeksi->jenis_jaminan_id);
$isTanahBangunan = !in_array(
strtoupper($jenisJaminan->name ?? ''),
strtoupper($jenisJaminan->name ?? ''),
['KAPAL', 'PESAWAT', 'KENDARAAN', 'ALAT BERAT']
);
// Check if required forms are empty or incomplete
if (empty($dataForm) || empty($fotoForm)) {
return response()->json(['buttonDisable' => true]);
}
if ($isTanahBangunan && empty($denahForm)) {
return response()->json(['buttonDisable' => true]);
}
if (empty($dataPembanding)) {
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',
@@ -485,7 +487,7 @@ private function deleteOfFile($filePath)
], 500);
}
}
@@ -548,41 +550,141 @@ private function deleteOfFile($filePath)
}
public function storeDataPembanding(Request $request)
private function formatDataPembanding($request)
{
$data = $request->all();
if (!$data) {
return response()->json(['success' => false, 'message' => 'Invalid data'], 400);
$dataPembanding = [];
$pembandingCount = count($request->input('alamat_pembanding', []));
for ($i = 0; $i < $pembandingCount; $i++) {
$pembanding = $this->formatSinglePembanding($request, $i);
// Perbaikan penanganan foto pembanding
$fotoKey = "foto_objek_pembanding_{$i}"; // Sesuaikan dengan nama field di form
if ($request->hasFile($fotoKey)) {
$pembanding['foto_objek'] = $this->handleFileUpload(
$request->file($fotoKey),
'pembanding',
"pembanding_{$i}"
);
}
$dataPembanding[] = $pembanding;
}
return $dataPembanding;
}
private function handleFileUpload($file, $folder, $prefix)
{
if (!$file) {
return null;
}
try {
// Buat nama file yang unik
$extension = $file->getClientOriginalExtension();
$fileName = $prefix . '_' . time() . '_' . uniqid() . '.' . $extension;
// Pastikan folder exists
$path = storage_path("app/public/{$folder}");
if (!File::exists($path)) {
File::makeDirectory($path, 0777, true);
}
// Simpan file
$file->storeAs("public/{$folder}", $fileName);
// Log untuk debugging
\Log::info("File berhasil disimpan: {$folder}/{$fileName}");
return $fileName;
} catch (\Exception $e) {
\Log::error("Error saat upload file: " . $e->getMessage());
throw $e;
}
}
private function formatSinglePembanding($request, $index)
{
$fields = [
'alamat', 'desa', 'kecamatan', 'kabupaten', 'provinsi',
'tahun', 'luas_tanah', 'luas_bangunan', 'tahun_bangunan',
'status_nara_sumber', 'harga', 'nama_nara_sumber',
'peruntukan', 'penawaran_transaksi', 'nomor_tlp',
'kordinat_lat', 'kordinat_lng', 'jenis_aset',
];
$pembanding = [];
foreach ($fields as $field) {
$inputName = "{$field}_pembanding";
$pembanding[$field] = $request->input($inputName)[$index] ?? null;
}
// Inisialisasi foto_objek sebagai null
$pembanding['foto_objek'] = null;
return $pembanding;
}
public function storeDataPembanding(Request $request)
{
try {
DB::beginTransaction();
// $action = $request->input('type');
// $rules = $this->getActionSpecificRules($data, $action, $request);
$validator = $request->validate([
'permohonan_id' => 'required|exists:permohonan,id',
'type' => 'required|string',
'jenis_jaminan_id' => 'required',
'foto_objek' => 'nullable|image|max:2048',
'foto_objek_pembanding_*' => 'nullable|image|max:2048',
]);
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))->where('jenis_jaminan_id', $request->input('jenis_jaminan_id'))->first();
if (!$inspeksi) {
Inspeksi::create([
'permohonan_id' => $request->input('permohonan_id'),
'data_pembanding' => json_encode($data),
'name' => $request->input('type'),
'jenis_jaminan_id' => $request->input('jenis_jaminan_id'),
]);
} else {
$inspeksi->update(['data_pembanding' => json_encode($data)]);
if ($validator->fails()) {
return response()->json([
'success' => false,
'message' => 'Validasi gagal',
'errors' => $validator->errors()
], 422);
}
$objekPenilaian = $this->formatObjekPenilaian($request);
if ($request->hasFile('foto_objek')) {
$objekPenilaian['foto_objek'] = $this->handleFileUpload(
$request->file('foto_objek'),
'pembanding',
'objek_penilaian'
);
}
$formattedData = [
'permohonan_id' => $request->input('permohonan_id'),
'type' => $request->input('type'),
'jenis_jaminan_id' => $request->input('jenis_jaminan_id'),
'objek_penilaian' => $objekPenilaian,
'data_pembanding' => $this->formatDataPembanding($request)
];
$inspeksi = $this->saveInspeksi($formattedData);
DB::commit();
return response()->json(['success' => true, 'message' => 'Data saved successfully', 'data' => json_encode($data)], 200);
} catch (Exception $e) {
return response()->json([
'success' => true,
'message' => 'Data berhasil disimpan',
'data' => $formattedData
], 200);
} catch (\Exception $e) {
DB::rollBack();
return response()->json(['success' => false, 'message' => 'Failed to save data: ' . $e->getMessage()], 500);
return response()->json([
'success' => false,
'message' => 'Gagal menyimpan data: ' . $e->getMessage()
], 500);
}
}
/**
* Form inspeksi.
*/
@@ -737,8 +839,9 @@ private function deleteOfFile($filePath)
public function dataPembanding($id, $jaminanId)
{
$permohonan = Permohonan::with(
[
try {
// Ambil data permohonan dengan eager loading
$permohonan = Permohonan::with([
'user',
'debiture.province',
'debiture.city',
@@ -747,28 +850,65 @@ private function deleteOfFile($filePath)
'branch',
'tujuanPenilaian',
'penilaian'
],
)->findOrFail($id);
$surveyor = $id;
$branches = Branch::all();
$provinces = Province::all();
])->findOrFail($id);
$data = $this->getCommonData();
// Ambil data inspeksi
$inspeksi = Inspeksi::where([
'permohonan_id' => $id,
'jenis_jaminan_id' => $jaminanId
])->first();
$inpeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first();
$forminspeksi = null;
if ($inpeksi) {
$forminspeksi = $inpeksi;
// $forminspeksi = json_decode($inpeksi->data_form, true);
// 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('Error decoding inspection data: ' . json_last_error_msg());
}
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();
$branches = Branch::all();
$provinces = Province::all();
return view('lpj::surveyor.components.data-pembanding', compact(
'permohonan',
'id',
'branches',
'provinces',
'inspectionData',
'comparisons',
'data',
'jaminanId',
'fotoForm'
));
} catch (\Exception $e) {
return redirect()
->back()
->with('error', 'Terjadi kesalahan saat memuat data: ' . $e->getMessage());
}
// return response()->json($forminspeksi);
return view('lpj::surveyor.components.data-pembanding', compact('permohonan', 'surveyor', 'branches', 'provinces', 'forminspeksi', 'data'));
}
private function getHeader(string $type): array
{
return self::HEADERS[$type] ?? [];
@@ -1338,14 +1478,14 @@ private function deleteOfFile($filePath)
$data,
'hub_cadeb',
true
)
)
],
'hub_cadeb_penghuni' => [
$data['hub_cadeb_penghuni'] => $this->getFieldData(
$data,
'hub_cadeb_penghuni',
true
)
)
],
'kordinat_lng' => $data['kordinat_lng'] ?? null,
@@ -1407,23 +1547,23 @@ private function deleteOfFile($filePath)
$data = $request->all();
$result = [];
foreach ($data['nama_bagunan'] as $index => $bangunan) {
$bangunanData = [
'bangunan' => $bangunan,
'kategori' => []
];
// foreach ($data['nama_bangunan'] as $index => $bangunan) {
// $bangunanData = [
// 'bangunan' => $bangunan,
// 'kategori' => []
// ];
foreach ($data['spek_kategori_bangunan'] as $kategoriIndex => $kategori) {
if (isset($data['spek_bangunan'][$kategori])) {
$bangunanData['kategori'][] = [
'kategori' => $kategori,
'spesifikasi' => $data['spek_bangunan'][$kategori]
];
}
}
// foreach ($data['spek_kategori_bangunan'] as $kategoriIndex => $kategori) {
// if (isset($data['spek_bangunan'][$kategori])) {
// $bangunanData['kategori'][] = [
// 'kategori' => $kategori,
// 'spesifikasi' => $data['spek_bangunan'][$kategori]
// ];
// }
// }
$result[] = $bangunanData;
}
// $result[] = $bangunanData;
// }
return [
'bangunan' => [
@@ -1459,7 +1599,10 @@ private function deleteOfFile($filePath)
'gol_mas_sekitar' => $data['gol_mas_sekitar'] ?? null,
'tingkat_keramaian' => $data['tingkat_keramaian'] ?? null,
'terletak_diarea' => $data['terletak_diarea'] ?? null,
'disekitar_lokasi' => $data['disekitar_lokasi'] ?? null,
'disekitar_lokasi' => $data['disekitar_lokasi'] === 'yes' ? [
'kondisi' => $data['kondisi_bagunan_disekitar_lokasi'] ?? null,
'sifat' => $data['sifat_bagunan_disekitar_lokasi'] ?? null,
] : $data['disekitar_lokasi'],
'kondisi_bangunan_sekitar' => $data['kondisi_bangunan_sekitar'] ?? null,
'sifat_bangunan_sekitar' => $data['sifat_bangunan_sekitar'] ?? null,
'dekat_makam' => $data['dekat_makam'] ?? null,
@@ -1917,7 +2060,6 @@ private function deleteOfFile($filePath)
'luas_unit',
true
),
'jenis_unit' => $data['jenis_unit'] ?? null,
'kondisi_unit' => $data['kondisi_unit'] ?? null,
'posisi_unit' => $data['posisi_unit'] ?? null,
'lantai' => $data['lantai'] ?? null,