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 = ""; $statusBinds = []; if (! empty($policy_type)) { $ticket_type_data_1 = "AND ticket_type = :policy_type:"; $ticket_type_data_2 = "AND master.ticket_type_id = :policy_type:"; $statusBinds['policy_type'] = $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, $statusBinds)->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 $binds = ["start_date" => $start_date, "end_date" => $end_date]; // Merge policy_type binds if present if (! empty($statusBinds)) { $binds = array_merge($binds, $statusBinds); } $result = $this->db->query($sql, $binds)->getResultArray(); // print_rr(count(($result))); // print_rr($this->db->lastQuery);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 = ""; $statusBinds = []; if (! empty($policy_type)) { $ticket_type_data_1 = "AND ticket_type = :policy_type:"; $ticket_type_data_2 = "AND master.ticket_type_id = :policy_type:"; $statusBinds['policy_type'] = $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, $statusBinds)->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; "; $binds = ["start_date" => $start_date, "end_date" => $end_date]; // Merge policy_type binds if present if (! empty($statusBinds)) { $binds = array_merge($binds, $statusBinds); } $result = $this->db->query($sql, $binds)->getResultArray(); // print_rr(count(($result))); // print_rr($this->db->lastQuery);die(); return $result; } else { $ticket_type_data_1 = ""; $ticket_type_data_2 = ""; $statusBinds = []; if (! empty($policy_type)) { $ticket_type_data_1 = "AND ticket_type = :policy_type:"; $ticket_type_data_2 = "AND master.ticket_type_id = :policy_type:"; $statusBinds['policy_type'] = $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, $statusBinds)->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; "; $binds = ["start_date" => $start_date, "end_date" => $end_date]; // Execute the query // Merge policy_type binds if present if (! empty($statusBinds)) { $binds = array_merge($binds, $statusBinds); } $result = $this->db->query($sql, $binds)->getResultArray(); // print_rr($this->db->lastQuery);die(); return $result; } } //api public function get_ticket_data($emp_id, $returnType, $ticket_type = null, $ticket_id = null) { $query = $this->select(" ticket_master.*, tms.mail_subject as subject, tms.id as ticket_message_id, ( SELECT th1.old_value FROM ticket_history th1 JOIN ticket_claim_status tcs ON th1.old_value = tcs.id WHERE th1.field_name = 'claim_status_id' AND th1.ticket_id = ticket_master.id AND th1.id = ( SELECT MAX(th2.id) FROM ticket_history th2 WHERE th2.ticket_id = th1.ticket_id AND th2.field_name = 'claim_status_id' ) ) AS old_status_id ") ->join('ticket_messages tms', 'ticket_master.id = tms.ticket_id', 'left') ->where('ticket_master.is_active', 1); $query->whereIn('sender', ['staff', 'user']); $query->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); } $query->groupBy('ticket_master.id'); $data = $query->findAll(); // dd($data, db_connect()->getLastQuery()); // print_r($this->db->getLastQuery());die; 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 = :ticket_id: AND tm.is_active = 1 AND cp.is_active = 1 "; $binds = ["ticket_id" => $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]); } // ---------- CLAIM DUMP UPLOAD------------------------------------------------------------------------------------------- public function getPolicyData($params) { $client_name = $params['client_name'] ?? null; $insurer_short_name = $params['insurer_short_name'] ?? null; $tpa_short_name = $params['tpa_short_name'] ?? null; $policy_no = $params['policy_no'] ?? null; $builder = $this->db->table('client_policy'); $builder->select('client_policy.*'); $builder->join('clients c', 'client_policy.client_id = c.id'); $builder->join('insurers i', 'client_policy.insurer_id = i.id'); $builder->join('tpa', 'client_policy.tpa_id = tpa.id and tpa.is_active = 1', 'left'); $builder->where('c.is_active', 1); $builder->where('client_policy.is_active', 1); $builder->where('i.is_active', 1); $builder->where('c.client_name', trim($client_name)); $builder->where('i.short_name', trim($insurer_short_name)); if (! empty($tpa_short_name)) { $builder->where('tpa.short_name', trim($tpa_short_name)); } $builder->where('client_policy.policy_no', trim($policy_no)); $query = $builder->get(); $result = $query->getResultArray(); // dd($this->db->getLastQuery()); return $result; } public function getTheClaimDetails($params) { $client_name = $params['client_name'] ?? null; $policy_no = $params['policy_no'] ?? null; $insurer_short_name = $params['insurer_short_name'] ?? null; $tpa_short_name = $params['tpa_short_name'] ?? null; $emp_code = $params['emp_code'] ?? null; $emp_name = $params['emp_name'] ?? null; $insured_name = $params['insured_name'] ?? null; $claim_no = $params['claim_no'] ?? null; $tpa_no = $params['tpa_no'] ?? null; $relationship = $params['relationship'] ?? null; $builder = $this->table('ticket_master'); $builder->select('ticket_master.*'); $builder->join('clients c', 'ticket_master.client_id = c.id'); $builder->join('insurers i', 'ticket_master.insurer_id = i.id'); $builder->join('tpa', 'ticket_master.tpa_id = tpa.id', 'left'); $builder->where('c.is_active', 1); $builder->where('i.is_active', 1); $builder->where('tpa.is_active', 1); $builder->where('ticket_master.is_active', 1); $builder->where('c.client_name', trim($client_name)); $builder->where('i.short_name', trim($insurer_short_name)); $builder->where('ticket_master.policy_no', trim($policy_no)); $builder->where('ticket_master.emp_code', trim($emp_code)); $builder->where('ticket_master.emp_name', trim($emp_name)); $builder->where('ticket_master.insured_name', trim($insured_name)); $builder->where('ticket_master.tpa_no', trim($tpa_no)); $builder->where('ticket_master.claim_number', trim($claim_no)); $builder->where('ticket_master.relationship', trim($relationship)); if (! empty($tpa_short_name)) { $builder->where('tpa.short_name', trim($tpa_short_name)); } $query = $builder->get(); $result = $query->getResultArray(); return $result; } public function getEmployeeAndEmployeePolicyDetails($params) { $client_name = $params['client_name'] ?? null; $emp_code = $params['emp_code'] ?? null; $emp_name = $params['emp_name'] ?? null; $policy_no = $params['policy_no'] ?? null; $relationship = $params['relationship'] ?? null; $insured_name = $params['insured_name'] ?? null; // $client_name = "6-Eleven"; // $emp_code = "EMP0020K12"; // $emp_name = "Lokesh"; // $policy_no = "GMC-1999/2000/2021/2022"; $builder = $this->db->table('employees e'); $builder->select(" e.id as emp_id, e.client_id, e.client_branch_id, e.emp_code, e.name as emp_name, e.mobile as emp_mobile, e.email_corporate as emp_mail, e.email_personal as emp_mail_personal, ep.id as emp_policy_id, ep.tpa_id as tpa_no, cp.id as client_policy_id, cp.insurer_id, cp.tpa_id, cp.policy_no, CASE WHEN cp.policy_type_id = 2 THEN 1 WHEN cp.policy_type_id = 1 THEN 2 WHEN cp.policy_type_id = 6 THEN 3 WHEN cp.policy_type_id = 7 THEN 4 ELSE NULL END AS ticket_type_id ", false); $builder->join('employee_polices ep', 'e.id = ep.employee_id'); $builder->join('clients c', 'e.client_id = c.id'); $builder->join('client_policy cp', 'ep.client_policy_id = cp.id'); $builder->where('e.is_active', 1); $builder->where('ep.is_active', 1); $builder->where('c.is_active', 1); $builder->where('cp.is_active', 1); $builder->where('e.emp_code', trim($emp_code)); $builder->where('e.name', trim($emp_name)); $builder->where('c.client_name', trim($client_name)); $builder->where('cp.policy_no', trim($policy_no)); $builder->where('LOWER(e.relationship)', strtolower('self')); $query = $builder->get(); $result = $query->getRowArray(); return $result; } public function getAcmUserDetails($params) { $acm_name = $params['acm_name'] ?? null; $acm_mobile = $params['acm_mobile'] ?? null; if ($acm_mobile != null) { $builder = $this->db->table('user_profiles'); $builder->select("user_profiles.*"); $builder->where('user_profiles.is_active', 1); $builder->where('user_profiles.mobile', trim($acm_mobile)); $query = $builder->get(); $result = $query->getRowArray(); return $result; } return []; } public function getInsuredDetails($params) { $client_id = $params['client_id'] ?? null; $emp_code = $params['emp_code'] ?? null; $policy_id = $params['client_policy_id'] ?? null; $insured_name = $params['insured_name'] ?? null; $builder = $this->db->table('employees e'); $builder->select(" e.id as emp_id, e.client_id, e.client_branch_id, e.emp_code, e.name as emp_name, e.mobile as emp_mobile, e.email_corporate as emp_mail, e.email_personal as emp_mail_personal, ep.id as emp_policy_id, ep.tpa_id as tpa_no, "); $builder->join('employee_polices ep', 'e.id = ep.employee_id'); $builder->where('e.is_active', 1); $builder->where('ep.is_active', 1); $builder->where('e.emp_code', trim($emp_code)); $builder->where('e.name', trim($insured_name)); $builder->where('e.client_id', trim($client_id)); $builder->where('ep.client_policy_id', trim($policy_id)); $query = $builder->get(); $result = $query->getRowArray(); // dd($this->db->getLastQuery()); return $result; } public function isTpaApiServiceEnabled($ticket_id) { $result = $this->db->table('ticket_master tm') ->select('tas.*') ->join('client_policy cp', 'tm.client_policy_id = cp.id') ->join('tpa_api_services tas', 'cp.tpa_id = tas.tpa_id') ->where('tm.id', $ticket_id) ->where('tm.is_active', 1) ->where('cp.is_active', 1) ->where('tas.is_active', 1) ->get()->getRowArray(); return count($result ?? []) > 0 ? true : false; // true if any API service is enabled, false if no API service is enabled } // ----------------------------------------------------------------------------------------------------- }