From be96bad5ae91f53fdc9f5805b464639c46745d14 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 5 Nov 2024 19:51:59 +0700 Subject: [PATCH] Update document handling to support multiple files per entry This update enhances the `DokumenJaminan` model to support multiple files for each document entry. It modifies both the backend logic to store multiple files and the frontend view to display and handle these files correctly. Additionally, it includes functionality to delete old document files if they are no longer associated with any detail document entry. --- .../Controllers/DokumenJaminanController.php | 90 ++++++++++--------- .../debitur/components/dokumen.blade.php | 31 ++++++- 2 files changed, 77 insertions(+), 44 deletions(-) diff --git a/app/Http/Controllers/DokumenJaminanController.php b/app/Http/Controllers/DokumenJaminanController.php index 90c8000..e46dcec 100644 --- a/app/Http/Controllers/DokumenJaminanController.php +++ b/app/Http/Controllers/DokumenJaminanController.php @@ -225,58 +225,64 @@ $document = DokumenJaminan::find($jaminan); $document->update($validate); + // Get existing detail documents + $existingDetails = DetailDokumenJaminan::where('dokumen_jaminan_id', $document->id)->get()->keyBy('id'); + if($request->jenis_legalitas_jaminan_id){ foreach($request->jenis_legalitas_jaminan_id as $key => $value){ - if (isset($request->dokumen_jaminan[$key])) { - $file = $request->dokumen_jaminan[$key]; - if ($file) { - $file_name = $file->getClientOriginalName(); - } + $detailData = [ + 'dokumen_jaminan_id' => $document->id, + 'jenis_legalitas_jaminan_id' => $value, + 'name' => $request->name[$key], + 'keterangan' => $request->keterangan[$key], + ]; - if (isset($file_name)) { - $file->storeAs( - 'public/jaminan/' . $debitur->id . '/' . $document->id . '/', - $file_name, - ); - - $detail = [ - 'dokumen_jaminan_id' => $document->id, - 'jenis_legalitas_jaminan_id' => $request->jenis_legalitas_jaminan_id[$key], - 'dokumen_jaminan' => 'jaminan/' . $debitur->id . '/' . $document->id . '/' . $file_name, - 'name' => $request->name[$key], - 'keterangan' => $request->keterangan[$key], - ]; - - if (isset($request->detail_dokumen_jaminan_id[$key])) { - $detailDocument = DetailDokumenJaminan::find( - $request->detail_dokumen_jaminan_id[$key], + $dokumenJaminan = []; + if (isset($request->dokumen_jaminan[$key]) && is_array($request->dokumen_jaminan[$key])) { + foreach($request->dokumen_jaminan[$key] as $file) { + if ($file) { + $file_name = $file->getClientOriginalName(); + $file->storeAs( + 'public/jaminan/' . $debitur->id . '/' . $document->id . '/', + $file_name ); - - $detailDocument->update($detail); - $detailDocument->save(); - } else { - $detailDocument = DetailDokumenJaminan::create($detail); - $detailDocument->save(); + $dokumenJaminan[] = 'jaminan/' . $debitur->id . '/' . $document->id . '/' . $file_name; } } - } else { - $detail = [ - 'dokumen_jaminan_id' => $document->id, - 'jenis_legalitas_jaminan_id' => $request->jenis_legalitas_jaminan_id[$key], - 'name' => $request->name[$key], - 'keterangan' => $request->keterangan[$key], - ]; + } - if (isset($request->detail_dokumen_jaminan_id[$key])) { - $detailDocument = DetailDokumenJaminan::find( - $request->detail_dokumen_jaminan_id[$key], - ); - $detailDocument->update($detail); + if (!empty($dokumenJaminan)) { + $detailData['dokumen_jaminan'] = json_encode($dokumenJaminan); + } + + if (isset($request->detail_dokumen_jaminan_id[$key])) { + $detailId = $request->detail_dokumen_jaminan_id[$key]; + $detailDocument = $existingDetails->get($detailId); + if ($detailDocument) { + // Merge new files with existing ones + if (!empty($dokumenJaminan)) { + $existingFiles = json_decode($detailDocument->dokumen_jaminan, true) ?: []; + $mergedFiles = array_merge($existingFiles, $dokumenJaminan); + $detailData['dokumen_jaminan'] = json_encode($mergedFiles); + } + $detailDocument->update($detailData); + $existingDetails->forget($detailId); } + } else { + DetailDokumenJaminan::create($detailData); } } } + // Delete any remaining existing details that weren't updated + foreach ($existingDetails as $detail) { + $files = json_decode($detail->dokumen_jaminan, true) ?: []; + foreach ($files as $file) { + Storage::delete('public/' . $file); + } + $detail->delete(); + } + DB::commit(); return redirect()->route('debitur.jaminan.index', $id)->with( 'success', @@ -436,8 +442,8 @@ $existingLegalitas[] = [ 'id' => $detail->id, 'jenis_legalitas_jaminan_id' => $detail->jenis_legalitas_jaminan_id, - 'name' => $detail->name, - 'dokumen_jaminan' => $detail->dokumen_jaminan, + 'name' => $detail->jenisLegalitasJaminan->name, + 'dokumen_jaminan' => json_decode($detail->dokumen_jaminan) ?? $detail->dokumen_jaminan, 'custom_field' => $detail->jenisLegalitasJaminan->custom_field, 'custom_field_type' => $detail->jenisLegalitasJaminan->custom_field_type, 'details' => $detail->details, diff --git a/resources/views/debitur/components/dokumen.blade.php b/resources/views/debitur/components/dokumen.blade.php index be5c1c0..7e649a0 100644 --- a/resources/views/debitur/components/dokumen.blade.php +++ b/resources/views/debitur/components/dokumen.blade.php @@ -167,8 +167,16 @@ @if(isset($detail->dokumen_jaminan)) - {{ basename($detail->dokumen_jaminan) }} - + @php + $dokumen_jaminan = is_array(json_decode($detail->dokumen_jaminan)) ? json_decode($detail->dokumen_jaminan) : [$detail->dokumen_jaminan]; + @endphp + @foreach($dokumen_jaminan as $index => $dokumen) + + {{ basename($dokumen) }} + + + @endforeach @endif @@ -527,6 +535,25 @@ .catch(error => console.error('Error:', error)); } + function renderExistingFiles(dokumenJaminan, debiturId, itemId) { + if (typeof dokumenJaminan === 'string') { + return ` + + ${dokumenJaminan.split('/').pop()} + + + `; + } else if (Array.isArray(dokumenJaminan)) { + return dokumenJaminan.map(file => ` + + ${file.split('/').pop()} + + + `).join(''); + } + return ''; + } + function addFileInput(index) { const container = document.getElementById(`file-container-${index}`); const newInput = document.createElement('div');