nhance/app/Models/TicketMasterModel.php

710 lines
26 KiB
PHP

<?php
namespace App\Models;
use CodeIgniter\Model;
class TicketMasterModel extends Model
{
protected $table = 'ticket_master';
protected $primaryKey = 'id';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $useSoftDeletes = false;
protected $protectFields = true;
protected $allowedFields = [
'id',
'ticket_type_id',
'claim_status_id',
'acm_id',
'insurer_id',
'tpa_id',
'client_id',
'priority',
'policy_no',
'emp_code',
'tpa_no',
'emp_name',
'insured_name',
'relationship',
'emp_mobile',
'emp_mail',
'mode_of_intimation',
'claim_type',
'hospital_name',
'doa',
'dod',
'claim_amount',
'pod_no',
'created_by',
'updated_by',
'created_at',
'updated_at',
'date_of_join',
'date_of_incep',
'dob',
'date_of_accident',
'date_of_death',
'date_of_intimat',
'si_amt',
'is_active',
'claim_number',
'emp_id',
'insured_emp_id',
'raised_date',
'registration_date',
'query_received_date',
'denial_date',
'approved_date',
'settled_date',
'denial_reason',
'approved_letter',
'approved_amount',
'utr_details',
'settle_letter',
'is_head_approved',
'return_remark',
'cancel_remark',
'awb_no_courier_name',
'non_id_reason',
'head_rejection_reason',
'pay_initiate_date',
'emp_personal_mail',
'client_policy_id'
];
// Callbacks
protected $allowCallbacks = true;
protected $beforeInsert = ["checkAndADDCreatedByValue"];
protected $afterInsert = [];
protected $beforeUpdate = ["checkAndUpdateUpdatedByValue"];
protected $afterUpdate = [];
protected $beforeFind = [];
protected $afterFind = [];
protected $beforeDelete = [];
protected $afterDelete = [];
protected function checkAndADDCreatedByValue(array $data)
{
// Check if 'updated_by' value is null or empty
if (empty($data['data']['created_by'])) {
// Set 'updated_by' value to the current session user ID
$data['data']['created_by'] = get_session_userid();
}
return $data;
}
protected function checkAndUpdateUpdatedByValue(array $data)
{
// Check if 'updated_by' value is null or empty
if (empty($data['data']['updated_by'])) {
// Set 'updated_by' value to the current session user ID
$data['data']['updated_by'] = get_session_userid();
}
return $data;
}
public function getTemplateDataByStatusID($claim_status_id)
{
$template_data = $this->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
th.ticket_id,
tcs.claim_status,
tcs.id AS status_id,
CASE
WHEN DATEDIFF(
th.created_at,
COALESCE(
(SELECT MIN(created_at) FROM ticket_history th2 WHERE th2.ticket_id = th.ticket_id),
tm.created_at
)
) BETWEEN 0 AND 6 THEN '0-6 Days'
WHEN DATEDIFF(
th.created_at,
COALESCE(
(SELECT MIN(created_at) FROM ticket_history th2 WHERE th2.ticket_id = th.ticket_id),
tm.created_at
)
) BETWEEN 7 AND 12 THEN '7-12 Days'
WHEN DATEDIFF(
th.created_at,
COALESCE(
(SELECT MIN(created_at) FROM ticket_history th2 WHERE th2.ticket_id = th.ticket_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
$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 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.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.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();
// dd($result);
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.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();
// print_rr($result);die();
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;
}
}