From badd42b565588a865132991ef23cac178fe68501 Mon Sep 17 00:00:00 2001 From: Venkatesh Date: Mon, 20 Apr 2026 12:42:59 +0530 Subject: [PATCH 1/7] FEAT_ENABLE_PDF_UPLOAD_OPTION_FOR_APPREOVE_AND_SETTLED_LETTER --- app/Controllers/MediAssistApiController.php | 1 + app/Controllers/TicketController.php | 261 ++++++++++++++++++++ app/Controllers/VidalApiController.php | 1 + app/Views/ticket_form_gmc.php | 151 ++++++++++- 4 files changed, 406 insertions(+), 8 deletions(-) diff --git a/app/Controllers/MediAssistApiController.php b/app/Controllers/MediAssistApiController.php index f4ceaff6..327531cb 100644 --- a/app/Controllers/MediAssistApiController.php +++ b/app/Controllers/MediAssistApiController.php @@ -695,6 +695,7 @@ class MediAssistApiController extends BaseController $fileData = $this->db->table('claim_files f') ->where('f.ticket_id', $claimId) ->where('f.docs_for_ir', 1) + ->where('f.file_type', 2) // PDF ->get() ->getResultArray(); diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php index 32a3eeb9..d46306d4 100644 --- a/app/Controllers/TicketController.php +++ b/app/Controllers/TicketController.php @@ -1140,6 +1140,8 @@ class TicketController extends BaseController public function createTicket() { $request_data = $this->request->getPost(); + $approvedLetterFile = $this->request->getFile('approved_letter_file'); + $settleLetterFile = $this->request->getFile('settle_letter_file'); $selected_ticket_type = $this->request->getPost('ticket_type_id'); // 1. Initialize an empty rules array @@ -1455,6 +1457,84 @@ class TicketController extends BaseController $request_data = $this->request->getPost(); $sanitized_data = sanitizeInputArrayAdvanced($request_data); $ticket_data = $this->formatDateForClaim($sanitized_data); + $approvedLetterUrl = trim((string) ($ticket_data['approved_letter'] ?? '')); + $settleLetterUrl = trim((string) ($ticket_data['settle_letter'] ?? '')); + $hasApprovedLetterFile = $approvedLetterFile !== null + && $approvedLetterFile->isValid() + && $approvedLetterFile->getError() !== UPLOAD_ERR_NO_FILE; + $hasSettleLetterFile = $settleLetterFile !== null + && $settleLetterFile->isValid() + && $settleLetterFile->getError() !== UPLOAD_ERR_NO_FILE; + + if ($approvedLetterUrl !== '' && $hasApprovedLetterFile) { + return $this->response->setStatusCode(400)->setJSON([ + 'status' => false, + 'message' => 'Input validation failed', + 'code' => 400, + 'errors' => ['approved_letter' => 'Provide either Approved Letter URL or Approved Letter PDF file, not both.'], + ]); + } + + if ($approvedLetterUrl !== '' && ! $this->isClaimUploadUrl($approvedLetterUrl)) { + return $this->response->setStatusCode(400)->setJSON([ + 'status' => false, + 'message' => 'Input validation failed', + 'code' => 400, + 'errors' => ['approved_letter' => 'Approved Letter URL format is invalid.'], + ]); + } + + if ($settleLetterUrl !== '' && $hasSettleLetterFile) { + return $this->response->setStatusCode(400)->setJSON([ + 'status' => false, + 'message' => 'Input validation failed', + 'code' => 400, + 'errors' => ['settle_letter' => 'Provide either Settle Letter URL or Settle Letter PDF file, not both.'], + ]); + } + + if ($settleLetterUrl !== '' && ! $this->isClaimUploadUrl($settleLetterUrl)) { + return $this->response->setStatusCode(400)->setJSON([ + 'status' => false, + 'message' => 'Input validation failed', + 'code' => 400, + 'errors' => ['settle_letter' => 'Settle Letter URL format is invalid.'], + ]); + } + + $uploadedApprovedLetter = null; + if ($hasApprovedLetterFile) { + $uploadResult = $this->uploadApprovedLetterPdf($approvedLetterFile, 'Approved Letter'); + if (! ($uploadResult['status'] ?? false)) { + return $this->response->setStatusCode(400)->setJSON([ + 'status' => false, + 'message' => 'Input validation failed', + 'code' => 400, + 'errors' => ['approved_letter_file' => $uploadResult['message'] ?? 'Invalid Approved Letter file.'], + ]); + } + $uploadedApprovedLetter = $uploadResult['data']; + $ticket_data['approved_letter'] = ''; + } else { + $ticket_data['approved_letter'] = $approvedLetterUrl; + } + + $uploadedSettleLetter = null; + if ($hasSettleLetterFile) { + $uploadResult = $this->uploadApprovedLetterPdf($settleLetterFile, 'Settle Letter'); + if (! ($uploadResult['status'] ?? false)) { + return $this->response->setStatusCode(400)->setJSON([ + 'status' => false, + 'message' => 'Input validation failed', + 'code' => 400, + 'errors' => ['settle_letter_file' => $uploadResult['message'] ?? 'Invalid Settle Letter file.'], + ]); + } + $uploadedSettleLetter = $uploadResult['data']; + $ticket_data['settle_letter'] = ''; + } else { + $ticket_data['settle_letter'] = $settleLetterUrl; + } // $ticket_data = $this->getLastMatchedStatus($ticket_data, ); // print_rr($ticket_data); die; @@ -1499,6 +1579,37 @@ class TicketController extends BaseController $ticket_data['claim_created_by'] = "CRM"; $return_value = $this->ticketMasterModel->insert($ticket_data); if ($return_value) { + if ($uploadedApprovedLetter !== null) { + $approvedLetterDownloadUrl = $this->createApprovedLetterFileUrl( + (int) $return_value, + (int) ($ticket_data['ticket_type_id'] ?? 1), + $uploadedApprovedLetter, + 'APPROVED_LETTER_PDF' + ); + $ticket_data['approved_letter'] = $approvedLetterDownloadUrl; + } + + if ($uploadedSettleLetter !== null) { + $settleLetterDownloadUrl = $this->createApprovedLetterFileUrl( + (int) $return_value, + (int) ($ticket_data['ticket_type_id'] ?? 1), + $uploadedSettleLetter, + 'SETTLE_LETTER_PDF' + ); + $ticket_data['settle_letter'] = $settleLetterDownloadUrl; + } + + if ($uploadedApprovedLetter !== null || $uploadedSettleLetter !== null) { + $updateUploadedLetterData = []; + if (isset($ticket_data['approved_letter'])) { + $updateUploadedLetterData['approved_letter'] = $ticket_data['approved_letter']; + } + if (isset($ticket_data['settle_letter'])) { + $updateUploadedLetterData['settle_letter'] = $ticket_data['settle_letter']; + } + $this->ticketMasterModel->where('id', $return_value)->set($updateUploadedLetterData)->update(); + } + //mail trigger part $this->putHistoryAfterInsert($ticket_data, $return_value); $mail_responce = $this->sendAutoMailTrigger($return_value); @@ -1517,6 +1628,8 @@ class TicketController extends BaseController { $request_data = $this->request->getPost(); + $approvedLetterFile = $this->request->getFile('approved_letter_file'); + $settleLetterFile = $this->request->getFile('settle_letter_file'); $selected_ticket_type = $this->request->getPost('ticket_type_id'); // 1. Initialize an empty rules array @@ -1832,6 +1945,85 @@ class TicketController extends BaseController $sanitized_data = sanitizeInputArrayAdvanced($request_data); $ticket_data = $this->formatDateForClaim($sanitized_data); $ticket_id = $this->request->getPost('ticket_master_id'); + $approvedLetterUrl = trim((string) ($ticket_data['approved_letter'] ?? '')); + $settleLetterUrl = trim((string) ($ticket_data['settle_letter'] ?? '')); + $hasApprovedLetterFile = $approvedLetterFile !== null + && $approvedLetterFile->isValid() + && $approvedLetterFile->getError() !== UPLOAD_ERR_NO_FILE; + $hasSettleLetterFile = $settleLetterFile !== null + && $settleLetterFile->isValid() + && $settleLetterFile->getError() !== UPLOAD_ERR_NO_FILE; + + if ($approvedLetterUrl !== '' && $hasApprovedLetterFile) { + return $this->response->setStatusCode(400)->setJSON([ + 'status' => false, + 'message' => 'Input validation failed', + 'code' => 400, + 'errors' => ['approved_letter' => 'Provide either Approved Letter URL or Approved Letter PDF file, not both.'], + ]); + } + + if ($approvedLetterUrl !== '' && ! $this->isClaimUploadUrl($approvedLetterUrl)) { + return $this->response->setStatusCode(400)->setJSON([ + 'status' => false, + 'message' => 'Input validation failed', + 'code' => 400, + 'errors' => ['approved_letter' => 'Approved Letter URL format is invalid.'], + ]); + } + + if ($settleLetterUrl !== '' && $hasSettleLetterFile) { + return $this->response->setStatusCode(400)->setJSON([ + 'status' => false, + 'message' => 'Input validation failed', + 'code' => 400, + 'errors' => ['settle_letter' => 'Provide either Settle Letter URL or Settle Letter PDF file, not both.'], + ]); + } + + if ($settleLetterUrl !== '' && ! $this->isClaimUploadUrl($settleLetterUrl)) { + return $this->response->setStatusCode(400)->setJSON([ + 'status' => false, + 'message' => 'Input validation failed', + 'code' => 400, + 'errors' => ['settle_letter' => 'Settle Letter URL format is invalid.'], + ]); + } + + $uploadedApprovedLetter = null; + if ($hasApprovedLetterFile) { + $uploadResult = $this->uploadApprovedLetterPdf($approvedLetterFile, 'Approved Letter'); + if (! ($uploadResult['status'] ?? false)) { + return $this->response->setStatusCode(400)->setJSON([ + 'status' => false, + 'message' => 'Input validation failed', + 'code' => 400, + 'errors' => ['approved_letter_file' => $uploadResult['message'] ?? 'Invalid Approved Letter file.'], + ]); + } + $uploadedApprovedLetter = $uploadResult['data']; + $ticket_data['approved_letter'] = ''; + } else { + $ticket_data['approved_letter'] = $approvedLetterUrl; + } + + $uploadedSettleLetter = null; + if ($hasSettleLetterFile) { + $uploadResult = $this->uploadApprovedLetterPdf($settleLetterFile, 'Settle Letter'); + if (! ($uploadResult['status'] ?? false)) { + return $this->response->setStatusCode(400)->setJSON([ + 'status' => false, + 'message' => 'Input validation failed', + 'code' => 400, + 'errors' => ['settle_letter_file' => $uploadResult['message'] ?? 'Invalid Settle Letter file.'], + ]); + } + $uploadedSettleLetter = $uploadResult['data']; + $ticket_data['settle_letter'] = ''; + } else { + $ticket_data['settle_letter'] = $settleLetterUrl; + } + $old_ticket_data = $this->ticketMasterModel->where('id', $ticket_id)->where('is_active', 1)->first(); $ticket_data['claim_status_id'] = $this->getLastMatchedStatus($ticket_data, $old_ticket_data); $ticket_data['last_updated_by'] = 'USER'; @@ -1842,6 +2034,24 @@ class TicketController extends BaseController $this->myLogger->logme('error', "[UPDATE_CLAIM] New Ticket Data: {data}", ['data' => json_encode($ticket_data, JSON_PRETTY_PRINT)]); if ($ticket_data) { + if ($uploadedApprovedLetter !== null) { + $ticket_data['approved_letter'] = $this->createApprovedLetterFileUrl( + (int) $ticket_id, + (int) ($ticket_data['ticket_type_id'] ?? 1), + $uploadedApprovedLetter, + 'APPROVED_LETTER_PDF' + ); + } + + if ($uploadedSettleLetter !== null) { + $ticket_data['settle_letter'] = $this->createApprovedLetterFileUrl( + (int) $ticket_id, + (int) ($ticket_data['ticket_type_id'] ?? 1), + $uploadedSettleLetter, + 'SETTLE_LETTER_PDF' + ); + } + $return_value = $this->ticketMasterModel->where('id', $ticket_id)->set($ticket_data)->update(); if ($return_value) { @@ -3264,6 +3474,55 @@ class TicketController extends BaseController return strpos($host, '.') !== false; } + private function uploadApprovedLetterPdf($file, string $documentLabel = 'Approved Letter'): array + { + if ($file === null || ! $file->isValid() || $file->getError() === UPLOAD_ERR_NO_FILE) { + return ['status' => false, 'message' => $documentLabel . ' file is missing.']; + } + + $ext = strtolower((string) $file->getClientExtension()); + $mime = strtolower((string) $file->getMimeType()); + $allowedMime = ['application/pdf', 'application/x-pdf']; + + if ($ext !== 'pdf' || (! empty($mime) && ! in_array($mime, $allowedMime, true))) { + return ['status' => false, 'message' => 'Only PDF files are allowed for ' . $documentLabel . ' upload.']; + } + + $uploadPath = WRITEPATH . 'uploads/claim_files/'; + if (! is_dir($uploadPath)) { + mkdir($uploadPath, 0755, true); + } + + $diskFileName = file_Upload_for_lead($file, $uploadPath, ['pdf']); + if (empty($diskFileName)) { + return ['status' => false, 'message' => 'Failed to upload ' . $documentLabel . ' file.']; + } + + return [ + 'status' => true, + 'data' => [ + 'file_name' => $diskFileName, + 'mime_type' => $mime ?: 'application/pdf', + ], + ]; + } + + private function createApprovedLetterFileUrl(int $ticketId, int $ticketTypeId, array $uploadedFile, string $docName = 'APPROVED_LETTER_PDF'): string + { + $fileId = $this->claimFilesModel->insert([ + 'ticket_id' => $ticketId, + 'ticket_type' => $ticketTypeId, + 'file_type' => 3, + 'doc_name' => $docName, + 'file_name' => $uploadedFile['file_name'], + 'url' => $uploadedFile['file_name'], + 'mime_type' => $uploadedFile['mime_type'] ?? 'application/pdf', + 'is_active' => 1, + ]); + + return base_url('downloadClaimFile/' . $fileId); + } + public function upload_url() { @@ -3379,6 +3638,7 @@ class TicketController extends BaseController } } + //get the claim file list data against the ticket id public function getUrlDataByTicketId() { $ticket_id = $this->request->getPost('ticket_id'); @@ -3401,6 +3661,7 @@ class TicketController extends BaseController END AS url ") ->where('ticket_id', $ticket_id) + ->where('file_type !=', 3) // Assuming you want to fetch both URL and file uploads ->where('is_active', 1) ->findAll(); diff --git a/app/Controllers/VidalApiController.php b/app/Controllers/VidalApiController.php index 06a78a57..82fd5db4 100644 --- a/app/Controllers/VidalApiController.php +++ b/app/Controllers/VidalApiController.php @@ -1664,6 +1664,7 @@ class VidalApiController extends BaseController $fileData = $this->db->table('claim_files f') ->where('f.ticket_id', $claimId) ->where('f.docs_for_ir', 1) + ->where('f.file_type', 2) // PDF ->get() ->getResultArray(); diff --git a/app/Views/ticket_form_gmc.php b/app/Views/ticket_form_gmc.php index 4db28f7d..003e4c3b 100644 --- a/app/Views/ticket_form_gmc.php +++ b/app/Views/ticket_form_gmc.php @@ -429,10 +429,26 @@ value="" name="approved_date"> -