diff --git a/app/Controllers/ClaimController.php b/app/Controllers/ClaimController.php index d80baac..6335164 100644 --- a/app/Controllers/ClaimController.php +++ b/app/Controllers/ClaimController.php @@ -327,7 +327,20 @@ class ClaimController extends ResourceController return $this->respond(['status' => 'failed', 'code' => 422, 'data' => $this->ClaimModel->errors()], 422); } - $fileResult = $this->saveClaimFiles((int) $claimId, $reqData['updated_by'] ?? $reqData['created_by'] ?? null); + $updatedBy = $reqData['updated_by'] ?? $reqData['created_by'] ?? null; + + // Soft-delete active files whose ids are not sent in claim_file_ids. + // When claim_file_ids is present (even empty), missing ids are soft-deleted. + $deletedFileIds = []; + if (array_key_exists('claim_file_ids', $reqData)) { + $deletedFileIds = $this->softDeleteMissingClaimFiles( + (int) $claimId, + $reqData['claim_file_ids'], + $updatedBy + ); + } + + $fileResult = $this->saveClaimFiles((int) $claimId, $updatedBy); if ($fileResult['attempted'] > 0 && empty($fileResult['saved'])) { return $this->respond([ @@ -341,9 +354,10 @@ class ClaimController extends ResourceController 'status' => 'success', 'code' => 200, 'data' => [ - 'claim_id' => (int) $claimId, - 'uploaded_files' => $fileResult['saved'], - 'files' => $this->decorateFilesWithUrls($this->getClaimFiles((int) $claimId)), + 'claim_id' => (int) $claimId, + 'uploaded_files' => $fileResult['saved'], + 'deleted_file_ids' => $deletedFileIds, + 'files' => $this->decorateFilesWithUrls($this->getClaimFiles((int) $claimId)), ], ], 200); } catch (\Exception $e) { @@ -535,6 +549,58 @@ class ClaimController extends ResourceController ->findAll(); } + /** + * Soft-delete active claim files whose ids are not in the keep list. + * Accepts array, comma-separated string, or single id. + * + * @return int[] Soft-deleted file ids + */ + private function softDeleteMissingClaimFiles(int $claimId, $keepFileIds, $updatedBy = null): array + { + $keepIds = []; + + if (is_string($keepFileIds)) { + $keepFileIds = array_filter(array_map('trim', explode(',', $keepFileIds)), 'strlen'); + } + + if (!is_array($keepFileIds)) { + $keepFileIds = [$keepFileIds]; + } + + foreach ($keepFileIds as $id) { + if ($id !== null && $id !== '' && is_numeric($id)) { + $keepIds[] = (int) $id; + } + } + $keepIds = array_values(array_unique($keepIds)); + + $query = $this->ClaimFilesModel + ->where('claim_id', $claimId) + ->where('is_active', 1); + + if (!empty($keepIds)) { + $query->whereNotIn('id', $keepIds); + } + + $filesToDelete = $query->findAll(); + + if (empty($filesToDelete)) { + return []; + } + + $deletedIds = array_map('intval', array_column($filesToDelete, 'id')); + + $this->ClaimFilesModel + ->whereIn('id', $deletedIds) + ->set([ + 'is_active' => 0, + 'updated_by' => $updatedBy, + ]) + ->update(); + + return $deletedIds; + } + /** * Add preview_url and download_url to each claim file row. */