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.
This commit is contained in:
Daeng Deni Mardaeni
2024-11-05 19:51:59 +07:00
parent 43e6573bf2
commit be96bad5ae
2 changed files with 77 additions and 44 deletions

View File

@@ -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,

View File

@@ -167,8 +167,16 @@
</div>
@if(isset($detail->dokumen_jaminan))
<a href="{{ route('debitur.jaminan.download',['id'=>$debitur->id,'dokumen'=>$detail->id]) }}" class="badge badge-sm badge-outline mt-2">{{ basename($detail->dokumen_jaminan) }}
<i class="ki-filled ki-cloud-download"></i></a>
@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)
<a href="{{ route('debitur.jaminan.download', ['id' => $debitur->id, 'dokumen' => $detail->id, 'index' => $index]) }}"
class="badge badge-sm badge-outline mt-2 mr-2">
{{ basename($dokumen) }}
<i class="ki-filled ki-cloud-download"></i>
</a>
@endforeach
@endif
</div>
</div>
@@ -527,6 +535,25 @@
.catch(error => console.error('Error:', error));
}
function renderExistingFiles(dokumenJaminan, debiturId, itemId) {
if (typeof dokumenJaminan === 'string') {
return `
<a href="/debitur/${debiturId}/jaminan/download?dokumen=${itemId}" class="badge badge-sm badge-outline mt-2 mr-2">
${dokumenJaminan.split('/').pop()}
<i class="ki-filled ki-cloud-download"></i>
</a>
`;
} else if (Array.isArray(dokumenJaminan)) {
return dokumenJaminan.map(file => `
<a href="/debitur/${debiturId}/jaminan/download?dokumen=${itemId}&file=${encodeURIComponent(file)}" class="badge badge-sm badge-outline mt-2 mr-2">
${file.split('/').pop()}
<i class="ki-filled ki-cloud-download"></i>
</a>
`).join('');
}
return '';
}
function addFileInput(index) {
const container = document.getElementById(`file-container-${index}`);
const newInput = document.createElement('div');