table('ticket_claim_status') ->select('ticket_mail_template.*') ->join('ticket_mail_template', 'ticket_mail_template.trigger_type = ticket_claim_status.trigger_type') ->where('ticket_mail_template.is_active', 1) ->where('ticket_claim_status.is_active', 1) ->where('ticket_claim_status.id', $claim_status_id) ->get() ->getResultArray(); return $template_data; } public function getTemplateDataByTicketID($ticket_id) { $template_data = $this ->select("ticket_mail_template.*, CASE WHEN employees.email_corporate IS NULL OR employees.email_corporate = '' THEN ticket_master.emp_mail ELSE employees.email_corporate END as emp_mail, ,ticket_master.claim_status_id") ->join('ticket_claim_status', 'ticket_master.claim_status_id = ticket_claim_status.id and ticket_claim_status.is_active = 1') ->join('ticket_mail_template', ' ticket_claim_status.trigger_type = ticket_mail_template.trigger_type and ticket_claim_status.ticket_type = ticket_mail_template.ticket_type and ticket_mail_template.is_active = 1') ->join('employees', 'employees.id = ticket_master.emp_id', 'left') ->where('ticket_master.id', $ticket_id) ->where('ticket_master.is_active', 1) ->where('ticket_claim_status.is_active', 1) ->first(); return $template_data; } public function getTicketDataByTicketID($ticket_id) { $ticket_data = $this->select(" ticket_master.*, CASE WHEN employees.email_corporate IS NULL OR employees.email_corporate = '' THEN ticket_master.emp_mail ELSE employees.email_corporate END as emp_mail, user_profiles.first_name as acm, user_profiles.mobile as acm_mobile, user_profiles.email as acm_email, clients.common_mails, clients.client_name, insurers.name as insurer_name, tpa.name as tpa_name, ticket_notes.note as auto_query_content ") ->join('clients', 'ticket_master.client_id = clients.id', 'left') ->join('insurers', 'ticket_master.insurer_id = insurers.id', 'left') ->join('tpa', 'ticket_master.tpa_id = tpa.id', 'left') ->join('ticket_notes', 'ticket_master.id = ticket_notes.ticket_id and ticket_notes.is_active = 1 and ticket_notes.is_auto_query = 1', 'left') ->join('user_profiles', 'ticket_master.acm_id = user_profiles.id', 'left') ->join('employees', 'employees.id = ticket_master.emp_id', 'left') ->where('ticket_master.id', $ticket_id) ->where('ticket_master.is_active', 1) ->first(); return $ticket_data; } //get TAT report BAND wise Data // public function getTATReport($ticket_type = null, $start_date = null, $end_date = null) // { // //set default last 3 months data date // $fromDate = date('Y-m-d', strtotime('-90 days')); // $toDate = date('Y-m-d 23:59:59'); // if (!empty($start_date) && !empty($end_date)) { // $fromDate = change_date_format($start_date); // $toDate = change_date_format($end_date); // } // $ticket_type_data_1 = ""; // $ticket_type_data_2 = ""; // if(!empty($ticket_type)){ // $ticket_type_data_1 = "AND ticket_type = $ticket_type"; // $ticket_type_data_2 = "AND tm.ticket_type_id = $ticket_type"; // } // // Fetch claim statuses from the `ticket_claim_status` table // $statusQuery = " SELECT // id, claim_status, ticket_type // FROM ticket_claim_status // Where is_active = 1 // $ticket_type_data_1 // "; // $statusResult = $this->db->query($statusQuery)->getResultArray(); // // dd($statusResult); // // Initialize dynamic query parts // $dynamicSelect = ''; // // Loop through each claim status and generate the COALESCE and CASE statements for the SELECT // foreach ($statusResult as $status) { // $columnName = $status['claim_status']; // Default column name // if (empty($ticket_type)) { // // Append the insurance type prefix based on `ticket_type` // switch ($status['ticket_type']) { // case 1: // $columnName = "GMC - {$status['claim_status']}"; // break; // case 2: // $columnName = "GPA - {$status['claim_status']}"; // break; // case 3: // $columnName = "EDLI - {$status['claim_status']}"; // break; // case 4: // $columnName = "GTLI - {$status['claim_status']}"; // break; // } // } // $dynamicSelect .= " // COALESCE( // SUM( // CASE // WHEN subquery.status_id = {$status['id']} THEN 1 // ELSE 0 // END // ), // 0 // ) AS `$columnName`, "; // } // // Remove the trailing comma from the SELECT part // $dynamicSelect = rtrim($dynamicSelect, ', '); // // dd($dynamicSelect); // // Construct the full SQL query // $sql = " // SELECT // tc.TAT_Category, // $dynamicSelect // FROM // ( // SELECT 'Above 20 Days' AS TAT_Category // UNION ALL // SELECT '13-20 Days' // UNION ALL // SELECT '7-12 Days' // UNION ALL // SELECT '0-6 Days' // ) AS tc // LEFT JOIN ( // SELECT // tm.id AS ticket_id, // tcs.claim_status, // tcs.id AS status_id, // CASE // WHEN DATEDIFF( // COALESCE(th.created_at, tm.created_at), // COALESCE( // (SELECT MIN(created_at) FROM ticket_history th2 WHERE th2.ticket_id = tm.id), // tm.created_at // ) // ) BETWEEN 0 AND 6 THEN '0-6 Days' // WHEN DATEDIFF( // COALESCE(th.created_at, tm.created_at), // COALESCE( // (SELECT MIN(created_at) FROM ticket_history th2 WHERE th2.ticket_id = tm.id), // tm.created_at // ) // ) BETWEEN 7 AND 12 THEN '7-12 Days' // WHEN DATEDIFF( // COALESCE(th.created_at, tm.created_at), // COALESCE( // (SELECT MIN(created_at) FROM ticket_history th2 WHERE th2.ticket_id = tm.id), // tm.created_at // ) // ) BETWEEN 13 AND 20 THEN '13-20 Days' // ELSE 'Above 20 Days' // END AS TAT_Category // FROM // ticket_master tm // JOIN ticket_history th ON tm.id = th.ticket_id // JOIN ticket_claim_status tcs ON th.field_name = 'claim_status_id' // AND th.new_value = tcs.id // WHERE // tm.ticket_type_id = tcs.id // $ticket_type_data_2 // AND tm.created_at >= '$fromDate' // AND tm.created_at <= '$toDate' // AND tm.is_active = 1 // AND th.is_active = 1 // AND tcs.is_active = 1 // ) AS subquery ON tc.TAT_Category = subquery.TAT_Category // GROUP BY // tc.TAT_Category // ORDER BY // FIELD(tc.TAT_Category, 'Above 20 Days', '13-20 Days', '7-12 Days', '0-6 Days'); // "; // // Execute the query and return the result // $data = $this->db->query($sql)->getResultArray(); // // print_rr($this->db->getLastQuery(), $data); die; // // $tableData = []; // // if (!empty($data)) { // // // Extract table headers from the first row keys // // $headers = array_keys($data[0]); // // $tableData['headers'] = $headers; // // $tableData['body'] = $data; // // } // return $data; // } // public function getTATReport($ticket_type = null, $start_date = null, $end_date = null) // { // //set default last 3 months data date // $fromDate = date('Y-m-d', strtotime('-90 days')); // $toDate = date('Y-m-d 23:59:59'); // if (!empty($start_date) && !empty($end_date)) { // $fromDate = change_date_format($start_date); // $toDate = change_date_format($end_date); // } // $ticket_type_data_1 = ""; // $ticket_type_data_2 = ""; // if (!empty($ticket_type)) { // $ticket_type_data_1 = "AND ticket_type = $ticket_type"; // $ticket_type_data_2 = "WHERE tm.ticket_type_id = $ticket_type"; // } // // Fetch claim statuses from the `ticket_claim_status` table // $statusQuery = " SELECT // id, claim_status, ticket_type // FROM ticket_claim_status // Where is_active = 1 // $ticket_type_data_1 // "; // $statusResult = $this->db->query($statusQuery)->getResultArray(); // // dd($statusResult); // // Initialize dynamic query parts // $dynamicSelect = ''; // // Loop through each claim status and generate the COALESCE and CASE statements for the SELECT // foreach ($statusResult as $status) { // $columnName = $status['claim_status']; // Default column name // if (empty($ticket_type)) { // // Append the insurance type prefix based on `ticket_type` // switch ($status['ticket_type']) { // case 1: // $columnName = "GMC - {$status['claim_status']}"; // break; // case 2: // $columnName = "GPA - {$status['claim_status']}"; // break; // case 3: // $columnName = "EDLI - {$status['claim_status']}"; // break; // case 4: // $columnName = "GTLI - {$status['claim_status']}"; // break; // } // } // $dynamicSelect .= " // COALESCE( // SUM( // CASE // WHEN subquery.status_id = {$status['id']} THEN 1 // ELSE 0 // END // ), // 0 // ) AS `$columnName`, "; // } // // Remove the trailing comma from the SELECT part // $dynamicSelect = rtrim($dynamicSelect, ', '); // // dd($dynamicSelect); // // Construct the full SQL query // $sql = " // SELECT // tc.TAT_Category, // $dynamicSelect // FROM // ( // SELECT 'Above 20 Days' AS TAT_Category // UNION ALL // SELECT '13-20 Days' // UNION ALL // SELECT '7-12 Days' // UNION ALL // SELECT '0-6 Days' // ) AS tc // LEFT JOIN ( // SELECT // tm.id AS ticket_id, // latest_status.claim_status_id AS status_id, // CASE // WHEN DATEDIFF(CURDATE(), COALESCE(latest_status.change_date, tm.created_at)) BETWEEN 0 AND 6 THEN '0-6 Days' // WHEN DATEDIFF(CURDATE(), COALESCE(latest_status.change_date, tm.created_at)) BETWEEN 7 AND 12 THEN '7-12 Days' // WHEN DATEDIFF(CURDATE(), COALESCE(latest_status.change_date, tm.created_at)) BETWEEN 13 AND 20 THEN '13-20 Days' // ELSE 'Above 20 Days' // END AS TAT_Category // FROM // ticket_master tm // LEFT JOIN ( // SELECT // th.ticket_id, // th.new_value AS claim_status_id, // MAX(th.created_at) AS change_date // FROM // ticket_history th // WHERE // th.field_name = 'claim_status_id' // AND th.is_active = 1 // GROUP BY // th.ticket_id, th.new_value // ) AS latest_status ON latest_status.ticket_id = tm.id // WHERE tm.is_active = 1 // AND tm.created_at >= '$fromDate' // AND tm.created_at <= '$toDate' // " . (!empty($ticket_type) ? " AND tm.ticket_type_id = $ticket_type" : "") . " // GROUP BY tm.id, latest_status.claim_status_id, latest_status.change_date, tm.created_at // ) AS subquery ON tc.TAT_Category = subquery.TAT_Category // GROUP BY // tc.TAT_Category // ORDER BY // FIELD( // tc.TAT_Category, // 'Above 20 Days', // '13-20 Days', // '7-12 Days', // '0-6 Days' // ); // "; // // Execute the query and return the result // $data = $this->db->query($sql)->getResultArray(); // // dd($data); // print_rr($data);die(); // // print_rr($this->db->getLastQuery()->getQuery()); die; // return $data; // } public function getTATReport($ticket_type = null, $start_date = null, $end_date = null) { // Set default date range (last 90 days) $fromDate = date('Y-m-d', strtotime('-90 days')); $toDate = date('Y-m-d 23:59:59'); if (!empty($start_date) && !empty($end_date)) { $fromDate = change_date_format($start_date); $toDate = change_date_format($end_date); } // Get all active claim statuses $statusQuery = $this->db->table('ticket_claim_status') ->select('id, claim_status') ->where('is_active', 1) ->orderBy('id', 'ASC'); if (!empty($ticket_type)) { $statusQuery->where('ticket_type', $ticket_type); } $statusResult = $statusQuery->get()->getResultArray(); // Create a list of all TAT categories we want in the output $tatCategories = [ 'Above 20 Days', '13-20 Days', '7-12 Days', '0-6 Days' ]; // Initialize the result array with all TAT categories $result = []; foreach ($tatCategories as $category) { $row = ['TAT_Category' => $category]; foreach ($statusResult as $status) { $row[$status['claim_status']] = 0; } $result[] = $row; } // Get the base query for ticket counts by status and TAT category $query = $this->db->table('ticket_master tm') ->select([ 'tcs.claim_status', 'CASE WHEN DATEDIFF(CURDATE(), COALESCE( (SELECT MAX(th.created_at) FROM ticket_history th WHERE th.ticket_id = tm.id AND th.field_name = "claim_status_id" AND th.is_active = 1), tm.created_at )) BETWEEN 0 AND 6 THEN "0-6 Days" WHEN DATEDIFF(CURDATE(), COALESCE( (SELECT MAX(th.created_at) FROM ticket_history th WHERE th.ticket_id = tm.id AND th.field_name = "claim_status_id" AND th.is_active = 1), tm.created_at )) BETWEEN 7 AND 12 THEN "7-12 Days" WHEN DATEDIFF(CURDATE(), COALESCE( (SELECT MAX(th.created_at) FROM ticket_history th WHERE th.ticket_id = tm.id AND th.field_name = "claim_status_id" AND th.is_active = 1), tm.created_at )) BETWEEN 13 AND 20 THEN "13-20 Days" ELSE "Above 20 Days" END AS tat_category', 'COUNT(*) AS count' ]) ->join('ticket_claim_status tcs', 'tcs.id = tm.claim_status_id AND tcs.is_active = 1') ->where('tm.is_active', 1) ->where('tm.created_at >=', $fromDate) ->where('tm.created_at <=', $toDate) ->groupBy('tcs.claim_status, tat_category') ->orderBy('FIELD(tat_category, "Above 20 Days", "13-20 Days", "7-12 Days", "0-6 Days")'); if (!empty($ticket_type)) { $query->where('tm.ticket_type_id', $ticket_type); } $countResults = $query->get()->getResultArray(); // Populate the result array with actual counts foreach ($countResults as $row) { foreach ($result as &$categoryRow) { if ($categoryRow['TAT_Category'] === $row['tat_category']) { $categoryRow[$row['claim_status']] = (int)$row['count']; break; } } } return $result; } public function tpaWiseReport($policy_type = null, $start_date = null, $end_date = null) { $ticket_type_data_1 = ""; $ticket_type_data_2 = ""; if (!empty($policy_type)) { $ticket_type_data_1 = "AND ticket_type = $policy_type"; $ticket_type_data_2 = "AND master.ticket_type_id = $policy_type"; } // Fetch claim statuses dynamically $statusQuery = "SELECT id, claim_status FROM ticket_claim_status WHERE is_active = 1 $ticket_type_data_1"; $statusResult = $this->db->query($statusQuery)->getResultArray(); // Initialize dynamic query parts $dynamicSelect = ''; $dynamicTotal = ''; $dynamicClosedTotal = ''; // Loop through each claim status and generate the CASE statements foreach ($statusResult as $status) { $dynamicSelect .= " COUNT(CASE WHEN master.claim_status_id = {$status['id']} THEN master.id END) AS `{$status['claim_status']}`, "; if (in_array($status['claim_status'], [ 'ID NOT GENERATED', 'NON ID', 'CDA', 'INFORMATION REQUIRED', 'UNDER PROCESS - CLAIM NO. UPDATION', 'UNDER PROCESS - INVESTIGATION STATUS', 'UNDER PROCESS - QUERY DOCUMENT RECEIVED', 'APPROVED', 'PAYMENT INITIATED' ])) { $dynamicTotal .= "COUNT(CASE WHEN master.claim_status_id = {$status['id']} THEN master.id END) + "; } // Include in total count // $dynamicTotal .= "COUNT(CASE WHEN master.claim_status_id = {$status['id']} THEN master.id END) + "; // Include only closed-related statuses in total2 count if (in_array($status['claim_status'], ['CLOSED', 'SETTLED', 'RETURNED', 'REJECTED'])) { $dynamicClosedTotal .= "COUNT(CASE WHEN master.claim_status_id = {$status['id']} THEN master.id END) + "; } } // Remove the trailing commas and `+` signs $dynamicSelect = rtrim($dynamicSelect, ', '); $dynamicTotal = rtrim($dynamicTotal, ' +'); $dynamicClosedTotal = rtrim($dynamicClosedTotal, ' +'); // print_rr($dynamicSelect); // Construct the final SQL query $sql = " SELECT tpa.id as TPA_ID, tpa.name AS TPA_NAME, $dynamicSelect, ($dynamicTotal) AS TOTAL, ($dynamicClosedTotal) AS CLEARED_TOTAL FROM ticket_master master JOIN tpa ON master.tpa_id = tpa.id AND tpa.is_active = 1 WHERE master.created_at BETWEEN '$start_date' AND '$end_date' AND master.is_active = 1 $ticket_type_data_2 GROUP BY tpa.id; "; // Execute the query $result = $this->db->query($sql)->getResultArray(); // print_rr($result);die(); return $result; } public function accountManagerWiseReport($policy_type = null, $start_date = null, $end_date = null) { if ($policy_type == 1) { $ticket_type_data_1 = ""; $ticket_type_data_2 = ""; if (!empty($policy_type)) { $ticket_type_data_1 = "AND ticket_type = $policy_type"; $ticket_type_data_2 = "AND master.ticket_type_id = $policy_type"; } // Fetch claim statuses dynamically $statusQuery = "SELECT id, claim_status FROM ticket_claim_status WHERE is_active = 1 $ticket_type_data_1"; $statusResult = $this->db->query($statusQuery)->getResultArray(); // Initialize dynamic query parts $dynamicSelect = ''; $dynamicTotal = ''; // Loop through each claim status and generate the CASE statements foreach ($statusResult as $status) { $dynamicSelect .= " COUNT(CASE WHEN master.claim_status_id = {$status['id']} THEN master.id END) AS `{$status['claim_status']}`, "; // Include in total count $dynamicTotal .= "COUNT(CASE WHEN master.claim_status_id = {$status['id']} THEN master.id END) + "; // Include only closed-related statuses in total2 count } // Remove the trailing commas and `+` signs $dynamicSelect = rtrim($dynamicSelect, ', '); $dynamicTotal = rtrim($dynamicTotal, ' +'); // print_rr($dynamicSelect); // Construct the final SQL query $sql = " SELECT user_profiles.id as ACM_ID, user_profiles.first_name AS ACM_NAME, $dynamicSelect, ($dynamicTotal) AS TOTAL FROM ticket_master master JOIN user_profiles ON master.acm_id = user_profiles.id AND user_profiles.is_active = 1 WHERE master.created_at BETWEEN '$start_date' AND '$end_date' AND master.is_active = 1 $ticket_type_data_2 GROUP BY user_profiles.id; "; $result = $this->db->query($sql)->getResultArray(); return $result; } else { $ticket_type_data_1 = ""; $ticket_type_data_2 = ""; if (!empty($policy_type)) { $ticket_type_data_1 = "AND ticket_type = $policy_type"; $ticket_type_data_2 = "AND master.ticket_type_id = $policy_type"; } // Fetch claim statuses dynamically $statusQuery = "SELECT id, claim_status FROM ticket_claim_status WHERE is_active = 1 $ticket_type_data_1"; $statusResult = $this->db->query($statusQuery)->getResultArray(); // Initialize dynamic query parts $dynamicSelect = ''; $dynamicTotal = ''; $dynamicClosedTotal = ''; // Loop through each claim status and generate the CASE statements foreach ($statusResult as $status) { $dynamicSelect .= " COUNT(CASE WHEN master.claim_status_id = {$status['id']} THEN master.id END) AS `{$status['claim_status']}`, "; if (in_array($status['claim_status'], [ 'CLAIM INTIMATION', 'INTIMATION TO INSURER', 'CLIENT PENDING', 'INSURER PENDING', 'INVESTIGATION', 'APPROVED', 'ON HOLD' ])) { $dynamicTotal .= "COUNT(CASE WHEN master.claim_status_id = {$status['id']} THEN master.id END) + "; } // Include in total count // $dynamicTotal .= "COUNT(CASE WHEN master.claim_status_id = {$status['id']} THEN master.id END) + "; // Include only closed-related statuses in total2 count if (in_array($status['claim_status'], ['CLOSED', 'SETTLED', 'NOT COVERED'])) { $dynamicClosedTotal .= "COUNT(CASE WHEN master.claim_status_id = {$status['id']} THEN master.id END) + "; } } // Remove the trailing commas and `+` signs $dynamicSelect = rtrim($dynamicSelect, ', '); $dynamicTotal = rtrim($dynamicTotal, ' +'); $dynamicClosedTotal = rtrim($dynamicClosedTotal, ' +'); // print_rr($dynamicSelect); // Construct the final SQL query $sql = " SELECT user_profiles.id as ACM_ID, user_profiles.first_name AS ACM_NAME, $dynamicSelect, ($dynamicTotal) AS TOTAL, ($dynamicClosedTotal) AS CLEARED_TOTAL FROM ticket_master master JOIN user_profiles ON master.acm_id = user_profiles.id AND user_profiles.is_active = 1 WHERE master.created_at BETWEEN '$start_date' AND '$end_date' AND master.is_active = 1 $ticket_type_data_2 GROUP BY user_profiles.id; "; // Execute the query $result = $this->db->query($sql)->getResultArray(); return $result; } } //api public function get_ticket_data($emp_id, $ticket_type = null, $ticket_id = null) { $query = $this->select('ticket_master.*, tms.mail_subject as subject') ->join('ticket_messages tms', 'ticket_master.id = tms.ticket_id', 'left') ->where('ticket_master.is_active', 1) ->where('tms.sender', "user") ->where('ticket_master.emp_id', $emp_id); if (!empty($ticket_id)) { $query->where('ticket_master.id', $ticket_id); } if (!empty($ticket_type)) { $query->where('ticket_master.ticket_type_id', $ticket_type); } $data = $query->findAll(); // dd($data, db_connect()->getLastQuery()); return $data; } public function getDashData($claim_statuses, $limit) { $finalResults = []; foreach ($claim_statuses as $typeId => $statuses) { // Get all active, non-null claim status tickets for this type $builder = $this->db->table('ticket_master tm') ->select('tm.id, tm.ticket_type_id, tcs.claim_status, th.last_claim_status_change') ->join('ticket_claim_status tcs', 'tm.claim_status_id = tcs.id', 'left') ->join( '(SELECT ticket_id, MAX(created_at) AS last_claim_status_change FROM ticket_history WHERE field_name = \'claim_status_id\' GROUP BY ticket_id) th', 'tm.id = th.ticket_id', 'left' ) ->where('tm.ticket_type_id', $typeId) ->where('tm.is_active', 1) ->where('tm.claim_status_id IS NOT NULL'); $results = $builder->get()->getResultArray(); $summary = [ 'ticket_type_id' => $typeId, ]; $total = 0; foreach ($statuses as $status) { $alias = strtolower(str_replace(' ', '_', $status)); $summary[$alias] = 0; $summary[$alias . '_ids'] = ''; $dateLimit = $limit[$typeId][$status] ?? 3; $threshold = date('Y-m-d H:i:s', strtotime("-{$dateLimit} days")); $ticketIds = []; // dd($results); foreach ($results as $row) { if ( $row['claim_status'] === $status && ( !$row['last_claim_status_change'] || $row['last_claim_status_change'] <= $threshold ) ) { $summary[$alias]++; $ticketIds[] = $row['id']; if ($status == "APPROVED"|| $status == "SETTLED"|| $status == "CLOSED" ){ continue; } $total++; } } // Convert ticket IDs array to a comma-separated string $summary[$alias . '_ids'] = implode(',', $ticketIds); } $summary['total'] = $total; // Add approved but not settled IDs and count $approvedNotSettled = $this->getNotSettledbutApprovedCount($typeId); $summary['approved_not_settled'] = $approvedNotSettled['count']; $summary['approved_not_settled_ids'] = $approvedNotSettled['ticket_ids']; $finalResults[$typeId] = $summary; } // dd($finalResults); return $finalResults; } public function getNotSettledbutApprovedCount($ticket_type) { // Fetch the approved and settled claim_status IDs $builder = $this->db->table("ticket_claim_status approved") ->select("approved.id AS approved_id, settled.id AS settled_id") ->join("ticket_claim_status settled", "approved.ticket_type = settled.ticket_type") ->where("approved.claim_status", "APPROVED") ->where("settled.claim_status", "SETTLED") ->where("approved.ticket_type", $ticket_type) ->where("approved.is_active", 1) ->where("settled.is_active", 1); $ids = $builder->get()->getRowArray(); // If no matching status IDs are found, return empty if (!$ids) { return ['count' => 0, 'ticket_ids' => '']; } // Extract approved and settled status IDs $approved_id = $ids['approved_id']; $settled_id = $ids['settled_id']; // Subquery to get the latest approval time for each ticket $subquery = $this->db->table('ticket_history') ->select('ticket_id, MAX(created_at) AS approved_time') ->where('field_name', 'claim_status_id') ->where('new_value', $approved_id) ->groupBy('ticket_id'); // Main query to find tickets that are approved but not settled $builder = $this->db->table('ticket_master tm'); $builder->join("({$subquery->getCompiledSelect()}) latest_approval", 'tm.id = latest_approval.ticket_id', 'inner'); // Left join to find if there is a settled status for each ticket after approval $builder->join( 'ticket_history th_settled', "th_settled.ticket_id = tm.id AND th_settled.field_name = 'claim_status_id' AND th_settled.new_value = {$settled_id} AND th_settled.created_at > latest_approval.approved_time", 'left', false // Important for raw ON condition ); // Filtering conditions: not settled and approved time older than 12 days $builder->where('tm.claim_status_id !=', $settled_id); $builder->where('tm.is_active', 1); $builder->where("latest_approval.approved_time <= DATE_SUB(NOW(), INTERVAL 12 DAY)", null, false); $builder->where('th_settled.id IS NULL', null, false); // Final select to get ticket IDs of approved but not settled tickets $builder->select('tm.id'); // Execute the query $query = $builder->get(); $ticketIds = array_column($query->getResultArray(), 'id'); // Extract the IDs // Convert ticket IDs array to a comma-separated string $ticketIdsString = implode(',', $ticketIds); // Return the count and comma-separated ticket IDs return [ 'count' => count($ticketIds), 'ticket_ids' => $ticketIdsString ]; } public function getPolicyTermsJson($ticket_id) { $sql = " SELECT cp.policy_terms FROM ticket_master tm JOIN client_policy cp ON cp.id = tm.client_policy_id WHERE tm.id = ? AND tm.is_active = 1 AND cp.is_active = 1 "; $binds = [$ticket_id]; $query = $this->db->query($sql, $binds); if ($query && $query->getNumRows() > 0) { $row = $query->getRowArray(); return json_encode(['policy_terms' => $row['policy_terms']]); } return json_encode(['policy_terms' => null]); } }