From 98b2583ccdda488029012de48928ba895ef1e52d Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Fri, 8 May 2026 14:29:42 +0530 Subject: [PATCH] GWM : Merge multiple file for claims --- app/Controllers/EmployeeRestController.php | 10 ++ app/Controllers/TicketController.php | 10 ++ app/Helpers/merge_pdf_helper.php | 194 +++++++++++++++++++++ 3 files changed, 214 insertions(+) create mode 100644 app/Helpers/merge_pdf_helper.php diff --git a/app/Controllers/EmployeeRestController.php b/app/Controllers/EmployeeRestController.php index fd4a3419..193762d9 100755 --- a/app/Controllers/EmployeeRestController.php +++ b/app/Controllers/EmployeeRestController.php @@ -3923,6 +3923,16 @@ class EmployeeRestController extends AdminController } } + // Merge all uploaded PDFs for this ticket into a single combined PDF + if ($pdf_exist_in_the_file) { + try { + helper('merge_pdf'); + merge_ticket_pdfs((int) $ticket_id); + } catch (\Throwable $e) { + log_message('error', 'EmployeeRestController::handleCliamFiles | merge_ticket_pdfs failed | ticket_id=' . $ticket_id . ' | ' . $e->getMessage()); + } + } + $count = $this->ticketMaster->where('id', $ticket_id)->where('is_active', 1)->where('tpa_claim_push_reference_no IS NULL')->countAllResults(); log_message('error', 'Ticket validation | Ticket ID: ' . $ticket_id . ' | Matching active tickets with NULL TPA reference: ' . $count); if ($count > 0 && $pdf_exist_in_the_file && $tpa_claim_push == true) { diff --git a/app/Controllers/TicketController.php b/app/Controllers/TicketController.php index 5691c819..5fee206e 100644 --- a/app/Controllers/TicketController.php +++ b/app/Controllers/TicketController.php @@ -1621,6 +1621,16 @@ class TicketController extends BaseController $this->ticketMasterModel->where('id', $return_value)->set($updateUploadedLetterData)->update(); } + // Merge all uploaded PDFs for this ticket into a single combined PDF + try { + helper('merge_pdf'); + merge_ticket_pdfs((int) $return_value, [ + 'ticket_type' => (int) ($ticket_data['ticket_type_id'] ?? 1), + ]); + } catch (\Throwable $e) { + log_message('error', 'TicketController::createTicket | merge_ticket_pdfs failed | ticket_id=' . $return_value . ' | ' . $e->getMessage()); + } + //mail trigger part $this->putHistoryAfterInsert($ticket_data, $return_value); $mail_responce = $this->sendAutoMailTrigger($return_value); diff --git a/app/Helpers/merge_pdf_helper.php b/app/Helpers/merge_pdf_helper.php new file mode 100644 index 00000000..9316017f --- /dev/null +++ b/app/Helpers/merge_pdf_helper.php @@ -0,0 +1,194 @@ + true, + 'created_by' => null, + 'ticket_type' => 1, + 'include_file_types' => [2, 3], + ]; + + $result = [ + 'status' => false, + 'merged_file_id' => null, + 'file_name' => null, + 'pages' => 0, + 'source_count' => 0, + 'message' => '', + ]; + + if ($ticket_master_id <= 0) { + $result['message'] = 'Invalid ticket_master_id'; + return $result; + } + + $claimFiles = new ClaimFilesModel(); + + $rows = $claimFiles + ->where('ticket_id', $ticket_master_id) + ->where('is_active', 1) + ->where('mime_type', 'application/pdf') + ->whereIn('file_type', $opts['include_file_types']) + ->orderBy('id', 'ASC') + ->findAll(); + + if (empty($rows)) { + $result['status'] = true; + $result['message'] = 'No PDF files to merge'; + return $result; + } + + $uploadDir = rtrim(WRITEPATH, '/\\') . DIRECTORY_SEPARATOR + . 'uploads' . DIRECTORY_SEPARATOR + . 'claim_files' . DIRECTORY_SEPARATOR; + + $sourcePaths = []; + foreach ($rows as $row) { + $name = ! empty($row['url']) ? $row['url'] : ($row['file_name'] ?? ''); + if (empty($name)) { + continue; + } + // url column may sometimes hold a full URL; we only care about the file basename on disk. + $full = $uploadDir . basename($name); + if (is_file($full) && is_readable($full)) { + $sourcePaths[] = $full; + } else { + log_message('error', "merge_ticket_pdfs | missing PDF on disk | claim_file_id={$row['id']} | path={$full}"); + } + } + + if (empty($sourcePaths)) { + $result['message'] = 'No readable PDF files on disk'; + return $result; + } + + $result['source_count'] = count($sourcePaths); + + $tempDir = rtrim(WRITEPATH, '/\\') . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . 'mpdf'; + if (! is_dir($tempDir)) { + @mkdir($tempDir, 0775, true); + } + + $mergedName = 'merged_' . $ticket_master_id . '_' . time() . '_' . bin2hex(random_bytes(5)) . '.pdf'; + $mergedPath = $uploadDir . $mergedName; + + try { + $mpdf = new Mpdf([ + 'tempDir' => $tempDir, + 'mode' => 'utf-8', + ]); + + $totalPages = 0; + foreach ($sourcePaths as $src) { + try { + $pageCount = $mpdf->setSourceFile($src); + for ($p = 1; $p <= $pageCount; $p++) { + $tplId = $mpdf->importPage($p); + $size = $mpdf->getTemplateSize($tplId); + $mpdf->AddPageByArray([ + 'orientation' => ($size['width'] > $size['height']) ? 'L' : 'P', + 'sheet-size' => [$size['width'], $size['height']], + ]); + $mpdf->useTemplate($tplId); + $totalPages++; + } + } catch (\Throwable $e) { + log_message('error', "merge_ticket_pdfs | failed to import {$src} | " . $e->getMessage()); + } + } + + if ($totalPages === 0) { + $result['message'] = 'All source PDFs failed to import'; + return $result; + } + + $mpdf->Output($mergedPath, Destination::FILE); + } catch (\Throwable $e) { + log_message('error', 'merge_ticket_pdfs | mpdf failure | ticket_id=' . $ticket_master_id . ' | ' . $e->getMessage()); + $result['message'] = 'Merge failed: ' . $e->getMessage(); + return $result; + } + + if (! is_file($mergedPath)) { + $result['message'] = 'Merged file was not created'; + return $result; + } + + if ($opts['replace']) { + $claimFiles + ->where('ticket_id', $ticket_master_id) + ->where('file_type', MERGED_CLAIM_FILE_TYPE) + ->where('is_active', 1) + ->set(['is_active' => 0]) + ->update(); + } + + $insertData = [ + 'ticket_id' => $ticket_master_id, + 'ticket_type' => $opts['ticket_type'], + 'file_type' => MERGED_CLAIM_FILE_TYPE, + 'doc_name' => 'MERGED_CLAIM_DOCS_PDF', + 'file_name' => $mergedName, + 'url' => $mergedName, + 'mime_type' => 'application/pdf', + 'is_active' => 1, + ]; + if (! empty($opts['created_by'])) { + $insertData['created_by'] = $opts['created_by']; + } + + $insertedId = $claimFiles->insert($insertData); + + if (! $insertedId) { + log_message('error', 'merge_ticket_pdfs | DB insert failed for merged file | ticket_id=' . $ticket_master_id); + @unlink($mergedPath); + $result['message'] = 'Failed to register merged file in claim_files'; + return $result; + } + + log_message( + 'info', + "merge_ticket_pdfs | OK | ticket_id={$ticket_master_id} | sources={$result['source_count']} | pages={$totalPages} | claim_file_id={$insertedId}" + ); + + $result['status'] = true; + $result['merged_file_id'] = (int) $insertedId; + $result['file_name'] = $mergedName; + $result['pages'] = $totalPages; + $result['message'] = 'Merged successfully'; + return $result; + } +}