myLogger = \Config\Services::mylogger(); $this->ticketMasterModel = new TicketMasterModel(); $this->ticketType = [1 => "Claim-GMC", 2 => "Claim-GPA", 3 => "EDLI", 4 => "GTLI"]; $this->priorityType = [ 1 => "Low", 2 => "Medium", 3 => "High", 4 => "Urgent", 5 => "Emergency", 6 => "Critical" ]; $this->relationshipType = [ "self" => "Self", "spouse" => "Spouse", "son" => "Son", "daughter" => "Daughter", "father" => "Father", "mother" => "Mother", "father-in-law" => "Father-in-Law", "mother-in-law" => "Mother-in-Law" ]; $this->modeOFIntimate = [ 1 => "In Person", 2 => "Courier", 3 => "Online Mode - Email", 4 => "Online Mode - To TPA" ]; $this->claimType = [ 1 => [ 1 => "Main", 2 => "OPD", 3 => "Pre ReOpen", 4 => "Post ReOpen", ], 2 => [ 1 => "TTD", 2 => "PTD", 3 => "PPD", 4 => "Death", ] ]; $this->triggerType = [ 1 => "Trigger 1", 2 => "Trigger 2", 3 => "Trigger 3", 4 => "Trigger 4", 5 => "Trigger 5", 6 => "Trigger 6", 7 => "Trigger 7" ]; $this->placeHolders = [ '((ACM))' => 'acm', '((ACM_CONTACT))' => 'acm_mobile', '((EMPLOYEE_NAME))' => 'emp_name', '((EMPLOYEE_ID))' => 'emp_code', '((CORPORATE_NAME))' => 'client_name', '((INSURED_NAME))' => 'insured_name', '((CLAIM_NO))' => 'claim_number', '((RELATIONSHIP))' => 'relationship', ]; $this->ticketMasterModel = new TicketMasterModel(); $this->claimStatus = new TicketClaimStatusModel(); $this->clientModel = new ClientModel(); $this->ticketHistoryModel = new TicketHistoryModel(); $this->ticketMailTemplateModel = new TicketMailTemplateModel(); $this->ticketNoteModel = new TicketNoteModel(); $this->ticketMessageModel = new TicketMessageModel(); $this->userModel = new UserModel(); $this->employeeModel = new EmployeeModel(); } public function ticketList() { if ($this->request->is('get')) { $data['page_name'] = "Claims"; $data['ticket_type'] = $this->ticketType; $data['claim_status'] = $this->claimStatus->select('id,ticket_type,claim_status')->where('is_active', 1)->findAll(); $data['client_list'] = $this->clientModel->select('id,client_name')->where('is_active', 1)->findAll(); $data['ticket_data'] = $this->ticketSearch(1); return $this->loadLayout('ticket_search', $data); } else { $data['ticket_data'] = $this->ticketSearch(); $html = view('ticket_list', $data); return $this->respond(['status' => true, 'html' => $html], 200); } } public function ticketSearch($action = null) { //action 1 get last 100 rows, action 2 filter and get all rows related to that if ($action == 1) { $data = $this->ticketMasterModel ->select('ticket_master.id, ticket_claim_status.claim_status as status, ticket_master.claim_number as claim_no,ticket_master.tpa_id,ticket_master.emp_name, insurers.name as insurer_name, clients.client_name, DATE_FORMAT(ticket_master.created_at, "%d-%m-%Y") as tat') ->join('insurers', 'insurers.id = ticket_master.insurer_id and insurers.is_active = 1', 'left') ->join('clients', 'clients.id = ticket_master.client_id and clients.is_active = 1', 'left') ->join('ticket_claim_status', 'ticket_claim_status.id = ticket_master.claim_status_id and ticket_claim_status.is_active = 1', 'left') ->where('ticket_master.is_active', 1) ->orderBy('ticket_master.id', 'DESC') ->limit(100) ->findAll(); return $data; } else { $search_data = $this->request->getPost(); // print_r($search_data); $where = []; foreach ($search_data as $search_objects => $key) { if ($key != null && $key != '' && $key != 0) { $where[$search_objects] = $key; } } // print_rr($where); $data = $this->ticketMasterModel ->select('ticket_master.id, ticket_claim_status.claim_status as status, ticket_master.claim_number as claim_no,ticket_master.tpa_id,ticket_master.emp_name, insurers.name as insurer_name, clients.client_name, DATE_FORMAT(ticket_master.created_at, "%d-%m-%Y") as tat') ->join('insurers', 'insurers.id = ticket_master.insurer_id and insurers.is_active = 1', 'left') ->join('clients', 'clients.id = ticket_master.client_id and clients.is_active = 1', 'left') ->join('ticket_claim_status', 'ticket_claim_status.id = ticket_master.claim_status_id and ticket_claim_status.is_active = 1', 'left') ->where('ticket_master.is_active', 1) ->where($where) ->findAll(); // print_rr($data); // log_message('error',' Claims Master Data '.json_encode($data));die(); // print_rr($data);die(); return $data; } } public function ticket_form($ticket_type) { $data = $this->ticket_form_data($ticket_type); // dd($data); return $this->loadLayout('ticket_form_handler', $data); } public function ticket_form_data($ticket_type) { $this->myLogger->logme('error', "Fetching ticket form data for Ticket Type: $ticket_type"); $data = [ 'ticket_form' => 1, 'selected_ticket_type' => $ticket_type, 'ticket_type' => $this->ticketType, 'priorityType' => $this->priorityType, 'relationshipType' => $this->relationshipType, 'modeOFIntimate' => $this->modeOFIntimate ]; switch ($ticket_type) { case 2: $data['ticket_form'] = 'GPA'; break; case 3: $data['ticket_form'] = 'EDLI'; break; case 4: $data['ticket_form'] = 'GTLI'; break; } // Fetch ACM Users $db = db_connect(); $data['acms'] = $db->table('user_profiles') ->select('id, first_name') ->where(['is_active' => 1, 'role' => 3]) ->get() ->getResultArray(); // Fetch Claim Status $data['claim_status'] = $this->claimStatus ->select('*') ->where(['is_active' => 1, 'ticket_type' => $ticket_type]) ->get() ->getResultArray(); if ($ticket_type == 1) { $data['claim_type'] = $this->claimType[1]; } else { $data['claim_type'] = $this->claimType[2]; } $this->myLogger->logme('error', "Ticket form data fetched successfully for Ticket Type: $ticket_type"); return $data; } public function view_ticket($ticket_id) { // $ticket_data = $this->ticketMasterModel->where('id', $ticket_id)->where('is_active', 1)->first(); $ticket_data = $this->ticketMasterModel->getTicketDataByTicketID($ticket_id); $ticket_data = $this->formatDateForClaim($ticket_data, 'd/m/Y'); // dd($ticket_data); $template_data = $this->ticketMasterModel->getTemplateDataByTicketID($ticket_id); if(!empty($template_data)){ $template_data['mail_content'] = $this->replacePlaceholders($template_data['mail_content'], $ticket_data); $template_data['subject'] = $this->replacePlaceholders($template_data['subject'], $ticket_data); } $data = $this->ticket_form_data($ticket_data['ticket_type_id']); $data['ticket_data'] = $ticket_data; $data['reply_data'] = $template_data; $data['placeHolders'] = $this->placeHolders; $data['message_data'] = $this->getTicketMessage($ticket_id); $data['view_ticket_page'] = []; $data['member_data'] = $this->employeeModel->getEmployeeByEmployeeCode($ticket_data['emp_code']); $data['ticket_history'] = $this->ticketHistory($ticket_id); // dd($data); return $this->loadLayout('ticket_edit_onbording', $data); } public function formatDateForClaim($ticket_data, $out_put_format = 'Y-m-d') { if (empty($ticket_data['doa'])) { $ticket_data['doa'] = null; } else { $ticket_data['doa'] = change_date_format($ticket_data['doa'], null, $out_put_format); } if (empty($ticket_data['dod'])) { $ticket_data['dod'] = null; } else { $ticket_data['dod'] = change_date_format($ticket_data['dod'], null, $out_put_format); } if (empty($ticket_data['dob'])) { $ticket_data['dob'] = null; } else { $ticket_data['dob'] = change_date_format($ticket_data['dob'], null, $out_put_format); } if (empty($ticket_data['date_of_join'])) { $ticket_data['date_of_join'] = null; } else { $ticket_data['date_of_join'] = change_date_format($ticket_data['date_of_join'], null, $out_put_format); } if (empty($ticket_data['date_of_incep'])) { $ticket_data['date_of_incep'] = null; } else { $ticket_data['date_of_incep'] = change_date_format($ticket_data['date_of_incep'], null, $out_put_format); } if (empty($ticket_data['date_of_accident'])) { $ticket_data['date_of_accident'] = null; } else { $ticket_data['date_of_accident'] = change_date_format($ticket_data['date_of_accident'], null, $out_put_format); } if (empty($ticket_data['date_of_death'])) { $ticket_data['date_of_death'] = null; } else { $ticket_data['date_of_death'] = change_date_format($ticket_data['date_of_death'], null, $out_put_format); } if (empty($ticket_data['date_of_intimat'])) { $ticket_data['date_of_intimat'] = null; } else { $ticket_data['date_of_intimat'] = change_date_format($ticket_data['date_of_intimat'], null, $out_put_format); } return $ticket_data; } public function createTicket() { $ticket_data = $this->request->getPost(); $ticket_data = $this->formatDateForClaim($ticket_data); // print_rr($ticket_data); die; if ($ticket_data) { $return_value = $this->ticketMasterModel->insert($ticket_data); if ($return_value) { //mail trigger part $mail_responce = $this->sendAutoMailTrigger($return_value); return $this->respond(['status' => true, 'code' => 200, 'data' => $ticket_data, "message" => "Claim created successfully", 'mail_responce' => $mail_responce], 200); } else { return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to create claim'], 200); } } else { return $this->respond(['status' => false, 'code' => 404, 'message' => 'claim data not found'], 200); } } public function updateTicket() { $ticket_id = $this->request->getPost('ticket_master_id'); $ticket_data = $this->request->getPost(); $ticket_data = $this->formatDateForClaim($ticket_data); // print_rr($ticket_data); die; $old_ticket_data = $this->ticketMasterModel->where('id', $ticket_id)->where('is_active', 1)->first(); if ($ticket_data) { $return_value = $this->ticketMasterModel->where('id', $ticket_id)->set($ticket_data)->update(); if ($return_value) { //mail trigger part $mail_responce = $this->sendAutoMailTrigger($ticket_id); return $this->respond(['status' => true, 'code' => 200, 'data' => $ticket_data, "message" => "Claim updated successfully", 'mail_responce' => $mail_responce], 200); } else { return $this->respond(['status' => false, 'code' => 404, 'message' => 'Failed to update claim'], 200); } } else { return $this->respond(['status' => false, 'code' => 404, 'message' => 'claim data not found'], 200); } } public function mailTemplate() { $data = []; $data['trigger_type'] = $this->triggerType; $data['policy_type'] = $this->ticketType; $data['placeHolders'] = $this->placeHolders; $data['ticket_data'] = $this->ticketMailTemplateModel->where('is_active', 1)->findAll(); $data['ticket_type'] = $this->ticketType; $data['trigger_type'] = $this->triggerType; return $this->loadLayout('ticket_mail_template', $data); } public function crudTemplate($action) { //action 1 is create. action 2 is edit and action 3 is delete if ($action == 1) { $received_data = $this->request->getPost(); if (isset($received_data['id']) && $received_data['id'] != '') { $status = $this->ticketMailTemplateModel->save($received_data); if ($status) { return $this->respond(['status' => true], 200); } else { return $this->respond(['status' => false], 200); } } else { $status = $this->ticketMailTemplateModel->save($received_data); if ($status) { return $this->respond(['status' => true], 200); } else { return $this->respond(['status' => false], 200); } } } elseif ($action == 2) { $table_id = (int)$this->request->getPost('id'); $data = $this->ticketMailTemplateModel->where('id', $table_id)->where('is_active', 1)->first(); if ($data) { return $this->respond(['status' => true, 'data' => $data], 200); } else { return $this->respond(['status' => false], 404); } } elseif ($action == 3) { $table_id = (int)$this->request->getPost('id'); $sql = "update ticket_mail_template set is_active = 0 where id = $table_id "; $status = $this->ticketMailTemplateModel->query($sql); if ($status) { return $this->respond(['status' => true], 200); } else { return $this->respond(['status' => false], 404); } } } public function crudNote($action) { // action = 1 is read, action 2 is insert/update if ($action == 1) { $ticket_master_id = $this->request->getPost('id'); if (isset($ticket_master_id) && $ticket_master_id != '') { $data = $this->ticketNoteModel->where('is_active', 1)->where('ticket_id', $ticket_master_id)->first(); if ($data) { return $this->respond(['status' => true, 'data' => $data], 200); } else { return $this->respond(['status' => false], 200); } } } elseif ($action == 2) { $data = $this->request->getPost(); // if (isset($data['id']) && $data['id'] != ''){ $status = $this->ticketNoteModel->save($data); // } if ($status) { return $this->respond(['status' => true], 200); } else { return $this->respond(['status' => false], 200); } } } public function saveReply() { $received_data = $this->request->getPost(); // print_r($received_data); die; $received_data['sender'] = 'staff'; $status = $this->ticketMessageModel->insert($received_data); if ($status) { $return = $this->sendReplyMessage($received_data); return $this->respond(['status' => true, 'code' => 200, 'return' => $return], 200); } else { return $this->respond(['status' => false, 'code' => 404], 404); } } public function getTicketMessage($ticket_master_id) { // log_message('error','Function called');die(); // $ticket_master_id = $this->request->getPost('id'); $user_id = get_session_userid(); $logged_user = $this->userModel->select('first_name,last_name,profile')->where('id', $user_id)->first(); $dataToSend = []; $dataToSend['user_name'] = $logged_user['first_name'] . ' ' . $logged_user['last_name']; $dataToSend['messages'] = $this->ticketMessageModel->where('is_active', 1) ->where('ticket_id', $ticket_master_id)->orderBy('created_at', 'DESC') ->findAll(); foreach ($dataToSend['messages'] as $message) { $mail_content_converted = $this->convertHtmlToText($message['mail_content']); $message['mail_content'] = $mail_content_converted; } $dataToSend['emp_name'] = $this->ticketMasterModel->select('emp_name') ->where('id', $ticket_master_id)->where('is_active', 1) ->first()['emp_name']; // dd($dataToSend); if ($dataToSend) { return $dataToSend; } else { $data = []; return $data; } } public function convertHtmlToText($html) { $dom = new DOMDocument(); @$dom->loadHTML($html); return strip_tags($dom->saveHTML()); } //---- Email Trigger Part---------------------------------------------------------------------------------------------- public function constructMailContent($ticket_id) { $this->myLogger->logme('error', "Constructing mail content for Ticket ID: $ticket_id"); try { // Fetch Ticket Data $ticket_data = $this->ticketMasterModel->getTicketDataByTicketID($ticket_id); if (!$ticket_data) { $this->myLogger->logme('ERROR', "No ticket data found for Ticket ID: $ticket_id"); return null; } $this->myLogger->logme('error', "Fetched ticket data: " . json_encode($ticket_data)); // Fetch Email Template Data $template_data = $this->ticketMasterModel->getTemplateDataByTicketID($ticket_id); if (!$template_data) { $this->myLogger->logme('ERROR', "No email template found for Claim Status ID: " . $ticket_data['claim_status_id']); return null; } $this->myLogger->logme('error', "Fetched email template: " . json_encode($template_data)); // Generate Email Content $subject = $this->replacePlaceholders($template_data['subject'], $ticket_data); $message = $this->replacePlaceholders($template_data['mail_content'], $ticket_data); // Validate Essential Fields if (empty($ticket_data['emp_mail'])) { $this->myLogger->logme('ERROR', "Employee email is missing for Ticket ID: $ticket_id"); return null; } if (empty($subject) || empty($message)) { $this->myLogger->logme('ERROR', "Generated email content is empty for Ticket ID: $ticket_id"); return null; } // Construct Mail Data $mailData = [ 'mail' => $ticket_data['emp_mail'], 'subject' => $subject, 'message' => $message, 'cc' => $ticket_data['common_mails'] ?? '', 'attachments' => [] ]; $this->myLogger->logme('error', "Final Email Data"); return $mailData; } catch (\Exception $e) { $this->myLogger->logme('ERROR', "Exception in constructMailContent: " . $e->getMessage()); return null; } } public function replacePlaceholders($content, $ticket_data) { $this->myLogger->logme('error', "Replacing placeholders in content"); if (!empty($ticket_data) && !empty($content)) { foreach ($this->placeHolders as $key => $value) { $replaceData = strtoupper($ticket_data[$value]) ?? ''; if ($value == "emp_code") { $replaceData = $ticket_data[$value] ?? ''; } $content = str_replace($key, $replaceData, $content); } } $this->myLogger->logme('error', "Final content after placeholder replacement"); return $content; } //mail send function public function sendTrigger($mail_content) { $this->myLogger->logme('error', "Sending email with content"); $response = MailHelper::send_email($mail_content); $this->myLogger->logme('error', "Email sent response: " . json_encode($response)); return $response; } //reply mail part public function sendReplyMessage($mail_data) { $this->myLogger->logme('error', "Preparing reply email for Ticket ID: " . $mail_data['ticket_id']); $acm_mails = $this->ticketMasterModel->getTicketDataByTicketID($mail_data['ticket_id']); if (!$acm_mails) { $this->myLogger->logme('ERROR', "No ACM mails found for Ticket ID: " . $mail_data['ticket_id']); return false; } $this->myLogger->logme('error', "Fetched ACM emails"); $emailData = [ 'mail' => $mail_data['emp_mail'], 'subject' => $mail_data['mail_subject'], 'message' => $mail_data['mail_content'], 'common' => [], 'cc' => $acm_mails['common_mails'], 'attachments' => [] ]; $this->myLogger->logme('error', "Final Reply Email Data"); return $this->sendTrigger($emailData); } //auto mail part public function sendAutoMailTrigger($ticket_id) { $auto_mail_enable = $this->ticketMasterModel->getTemplateDataByTicketID($ticket_id); $mail_responce = []; if ($auto_mail_enable['is_auto_mail'] == 1) { $mail_content = $this->constructMailContent($ticket_id); $mail_responce = $this->sendTrigger($mail_content); } return $mail_responce; } //---- End Email Trigger Part---------------------------------------------------------------------------------------------- public function ticketHistory($ticket_id) { $sql = "SELECT th.id, th.field_name, th.display_name, th.old_value, th.new_value, th.created_at, CONCAT(creator.first_name, ' ', creator.last_name) as modified_by, -- Claim Status old_status.claim_status as old_status_value, new_status.claim_status as new_status_value, -- Account Manager CONCAT(old_account_manager.first_name, ' ', old_account_manager.last_name) as old_account_manager, CONCAT(new_account_manager.first_name, ' ', new_account_manager.last_name) as new_account_manager, -- Insured Employee ID Change old_insured_emp.name as old_insured_id_name, new_insured_emp.name as new_insured_id_name, ticket_master.ticket_type_id FROM ticket_history th -- Join for the user who made the change LEFT JOIN user_profiles creator ON th.created_by = creator.id -- Status value lookups LEFT JOIN ticket_claim_status old_status ON th.field_name = 'claim_status_id' AND th.old_value = old_status.id AND old_status.is_active = 1 LEFT JOIN ticket_claim_status new_status ON th.field_name = 'claim_status_id' AND th.new_value = new_status.id LEFT JOIN user_profiles as old_account_manager ON th.field_name = 'acm_id' AND th.old_value = old_account_manager.id LEFT JOIN user_profiles as new_account_manager ON th.field_name = 'acm_id' AND th.new_value = new_account_manager.id LEFT JOIN employees as old_insured_emp ON th.field_name = 'insured_emp_id' AND th.old_value = old_insured_emp.id LEFT JOIN employees as new_insured_emp ON th.field_name = 'insured_emp_id' AND th.new_value = new_insured_emp.id LEFT JOIN ticket_master as ticket_master on th.field_name = 'claim_type' AND th.ticket_id = ticket_master.id WHERE th.ticket_id = $ticket_id AND th.is_active = 1 ORDER BY th.created_at DESC"; $data = $this->ticketHistoryModel->query($sql)->getResultArray(); $priorityType = $this->priorityType; $relationshipType = $this->relationshipType; $modeOFIntimate = $this->modeOFIntimate; $claim_type = $this->claimType; foreach ($data as &$row) { if ($row['field_name'] == 'claim_status_id') { $new_old_value = isset($row['old_status_value']) ? $row['old_status_value'] : '-'; $new_new_value = $row['new_status_value']; $row['old_value'] = $new_old_value; $row['new_value'] = $new_new_value; } elseif ($row['field_name'] == 'acm_id') { $new_old_value = isset($row['old_account_manager']) ? $row['old_account_manager'] : '-'; $new_new_value = $row['new_account_manager']; $row['old_value'] = $new_old_value; $row['new_value'] = $new_new_value; } elseif ($row['field_name'] == 'insured_emp_id') { $new_old_value = isset($row['old_insured_id_name']) ? $row['old_insured_id_name'] : '-'; $new_new_value = $row['new_insured_id_name']; $row['old_value'] = $new_old_value; $row['new_value'] = $new_new_value; } elseif ($row['field_name'] == 'priority') { $new_old_value = isset($priorityType[$row['old_value']]) ? $priorityType[$row['old_value']] : '-'; $new_new_value = isset($priorityType[$row['new_value']]) ? $priorityType[$row['new_value']] : '-'; $row['old_value'] = $new_old_value; $row['new_value'] = $new_new_value; } elseif ($row['field_name'] == 'relationship') { $new_old_value = isset($relationshipType[$row['old_value']]) ? $relationshipType[$row['old_value']] : '-'; $new_new_value = isset($relationshipType[$row['new_value']]) ? $relationshipType[$row['new_value']] : '-'; $row['old_value'] = $new_old_value; $row['new_value'] = $new_new_value; } elseif ($row['field_name'] == 'mode_of_intimation') { $new_old_value = isset($modeOFIntimate[$row['old_value']]) ? $modeOFIntimate[$row['old_value']] : "-"; $new_new_value = isset($modeOFIntimate[$row['old_value']]) ? $modeOFIntimate[$row['old_value']] : "-"; $row['old_value'] = $new_old_value; $row['new_value'] = $new_new_value; } elseif ($row['field_name'] == 'claim_type') { $new_old_value = isset($claim_type[$row['ticket_type_id']][$row['old_value']]) ? $claim_type[$row['ticket_type_id']][$row['old_value']] : '-'; $new_new_value = isset($claim_type[$row['ticket_type_id']][$row['new_value']])?$claim_type[$row['ticket_type_id']][$row['new_value']]:'-'; $row['old_value'] = $new_old_value; $row['new_value'] = $new_new_value; } elseif ($row['field_name'] == 'claim_type') { $new_old_value = isset($claim_type[$row['old_value']]) ? $claim_type[$row['old_value']] : '-'; $new_new_value = isset($claim_type[$row['new_value']]) ? $claim_type[$row['new_value']] : '-'; $row['old_value'] = $new_old_value; $row['new_value'] = $new_new_value; } else { $new_old_value = isset($row['old_value']) ? $row['old_value'] : '-'; $new_new_value = isset($row['new_value']) ? $row['new_value'] : '-'; $row['old_value'] = $new_old_value; $row['new_value'] = $new_new_value; } } return ($data); } }