From 3df39378e88e95646f9db72e5f02b70f84dce2b9 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Thu, 2 Jul 2026 11:59:12 +0530 Subject: [PATCH] GWM : earned premium calculation correction for hr dashboard --- .../ClaimsCollectionV2DashboardModel.php | 288 ++++++++++-------- 1 file changed, 153 insertions(+), 135 deletions(-) diff --git a/app/Models/ClaimsCollectionV2DashboardModel.php b/app/Models/ClaimsCollectionV2DashboardModel.php index 8178a5f5..88baf6ce 100644 --- a/app/Models/ClaimsCollectionV2DashboardModel.php +++ b/app/Models/ClaimsCollectionV2DashboardModel.php @@ -214,111 +214,105 @@ SQL; /** Metabase #186: CLAIMS EXPERIENCE SUMMARY */ public function claims_experience_summary(int $policyId): array { - $sql = <<<'SQL' -SELECT - /* run days */ - /* - DATEDIFF( - MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)), - cp.policy_start_date - ) + 1 AS run_days, - */ - DATEDIFF( - LEAST(CURDATE(), cp.policy_end_date), - cp.policy_start_date - ) + 1 AS run_days, + $sql = <<<'SQL' + SELECT + /* run days */ + /* + DATEDIFF( + MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)), + cp.policy_start_date + ) + 1 AS run_days, - /* earned premium */ - FORMAT( - (prem.premium_as_on_date / 365) - * (DATEDIFF( - MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)), - cp.policy_start_date - ) + 1) - , 0) AS earned_premium, - - /* claims reported */ - FORMAT(COUNT(tm.id), 0) AS claims_reported, -\t\t/* incurred claims count */ -\tFORMAT( -\t SUM( -\t CASE -\t WHEN tcs.claim_status IN ('Settled', 'Paid') THEN 1 -\t WHEN tcs.claim_status NOT IN ('Settled', 'Paid', 'Rejected', 'Denied') THEN 1 -\t ELSE 0 -\t END -\t ) -, 0) AS incurred_claims, - - /* incurred amount */ - FORMAT( - COALESCE(SUM( - CASE - WHEN tcs.claim_status IN ('Settled', 'Paid') - THEN CAST(NULLIF(tm.approved_amount, '') AS DECIMAL(15,2)) - WHEN tcs.claim_status NOT IN ('Settled', 'Paid', 'Rejected', 'Denied') - THEN CAST(NULLIF(tm.claim_amount, '') AS DECIMAL(15,2)) - ELSE 0 - END - ), 0) - , 0) AS incurred_amount, - - /* incurred ratio */ - CONCAT( - ROUND( - COALESCE(SUM( - CASE - WHEN tcs.claim_status IN ('Settled', 'Paid') - THEN CAST(NULLIF(tm.approved_amount, '') AS DECIMAL(15,2)) - WHEN tcs.claim_status NOT IN ('Settled', 'Paid', 'Rejected', 'Denied') - THEN CAST(NULLIF(tm.claim_amount, '') AS DECIMAL(15,2)) - ELSE 0 - END - ), 0) - / NULLIF( + /* earned premium */ + FORMAT( (prem.premium_as_on_date / 365) - * DATEDIFF( + * (DATEDIFF( MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)), cp.policy_start_date - ) - , 0) * 100 - , 2) - , '%') AS incurred_ratio, + ) + 1) + , 0) AS earned_premium, + */ - /* rejection rate */ - CONCAT( - ROUND( - SUM(CASE WHEN tcs.claim_status IN ('Rejected', 'Denied') THEN 1 ELSE 0 END) - / NULLIF(COUNT(tm.id), 0) * 100 - , 2) - , '%') AS rejection_rate, + prem.premium_as_on_date, - /* projected claims */ - FORMAT( - ( - COALESCE(SUM( - CASE - WHEN tcs.claim_status IN ('Settled', 'Paid') - THEN CAST(NULLIF(tm.approved_amount, '') AS DECIMAL(15,2)) - WHEN tcs.claim_status NOT IN ('Settled', 'Paid', 'Rejected', 'Denied') - THEN CAST(NULLIF(tm.claim_amount, '') AS DECIMAL(15,2)) - ELSE 0 - END - ), 0) - / NULLIF( - DATEDIFF( - MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)), - cp.policy_start_date - ), 0 - ) - * 365 - ) * 1.10 - , 0) AS projected_claims, + DATEDIFF( + LEAST(CURDATE(), cp.policy_end_date), + cp.policy_start_date + ) + 1 AS run_days, - /* projected ratio */ - CONCAT( - ROUND( - ( + FORMAT( + (prem.premium_as_on_date / 365) * + ( + DATEDIFF( + LEAST(CURDATE(), cp.policy_end_date), + cp.policy_start_date + ) + 1 + ), + 2 + ) AS earned_premium, + + + + + + /* claims reported */ + FORMAT(COUNT(tm.id), 0) AS claims_reported, + \t\t/* incurred claims count */ + \tFORMAT( + \t SUM( + \t CASE + \t WHEN tcs.claim_status IN ('Settled', 'Paid') THEN 1 + \t WHEN tcs.claim_status NOT IN ('Settled', 'Paid', 'Rejected', 'Denied') THEN 1 + \t ELSE 0 + \t END + \t ) + , 0) AS incurred_claims, + + /* incurred amount */ + FORMAT( + COALESCE(SUM( + CASE + WHEN tcs.claim_status IN ('Settled', 'Paid') + THEN CAST(NULLIF(tm.approved_amount, '') AS DECIMAL(15,2)) + WHEN tcs.claim_status NOT IN ('Settled', 'Paid', 'Rejected', 'Denied') + THEN CAST(NULLIF(tm.claim_amount, '') AS DECIMAL(15,2)) + ELSE 0 + END + ), 0) + , 0) AS incurred_amount, + + /* incurred ratio */ + CONCAT( + ROUND( + COALESCE(SUM( + CASE + WHEN tcs.claim_status IN ('Settled', 'Paid') + THEN CAST(NULLIF(tm.approved_amount, '') AS DECIMAL(15,2)) + WHEN tcs.claim_status NOT IN ('Settled', 'Paid', 'Rejected', 'Denied') + THEN CAST(NULLIF(tm.claim_amount, '') AS DECIMAL(15,2)) + ELSE 0 + END + ), 0) + / NULLIF( + (prem.premium_as_on_date / 365) + * DATEDIFF( + MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)), + cp.policy_start_date + ) + , 0) * 100 + , 2) + , '%') AS incurred_ratio, + + /* rejection rate */ + CONCAT( + ROUND( + SUM(CASE WHEN tcs.claim_status IN ('Rejected', 'Denied') THEN 1 ELSE 0 END) + / NULLIF(COUNT(tm.id), 0) * 100 + , 2) + , '%') AS rejection_rate, + + /* projected claims */ + FORMAT( ( COALESCE(SUM( CASE @@ -337,49 +331,73 @@ SELECT ) * 365 ) * 1.10 - ) - / NULLIF(prem.premium_as_on_date, 0) * 100 - , 2) - , '%') AS projected_ratio + , 0) AS projected_claims, -FROM client_policy cp + /* projected ratio */ + CONCAT( + ROUND( + ( + ( + COALESCE(SUM( + CASE + WHEN tcs.claim_status IN ('Settled', 'Paid') + THEN CAST(NULLIF(tm.approved_amount, '') AS DECIMAL(15,2)) + WHEN tcs.claim_status NOT IN ('Settled', 'Paid', 'Rejected', 'Denied') + THEN CAST(NULLIF(tm.claim_amount, '') AS DECIMAL(15,2)) + ELSE 0 + END + ), 0) + / NULLIF( + DATEDIFF( + MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)), + cp.policy_start_date + ), 0 + ) + * 365 + ) * 1.10 + ) + / NULLIF(prem.premium_as_on_date, 0) * 100 + , 2) + , '%') AS projected_ratio -JOIN ( - SELECT - ep2.client_policy_id, - COALESCE(SUM( - CASE - WHEN e2.change_event = 'inception' - THEN ep2.rata_premimum - WHEN e2.change_event != 'inception' - AND (ep2.date_of_exit IS NULL OR ep2.date_of_exit = '') - THEN ep2.rata_premimum - WHEN ep2.date_of_exit IS NOT NULL - AND ep2.date_of_exit != '' - AND ep2.claim_status = 0 - THEN -ep2.rata_premimum - ELSE 0 - END - ), 0) AS premium_as_on_date - FROM employee_polices ep2 - JOIN employees e2 ON e2.id = ep2.employee_id - WHERE ep2.client_policy_id = :policy_id: - AND ep2.is_active = 1 - GROUP BY ep2.client_policy_id -) prem ON prem.client_policy_id = cp.id + FROM client_policy cp -JOIN ticket_master tm - ON tm.client_policy_id = cp.id - AND tm.is_active = 1 + JOIN ( + SELECT + ep2.client_policy_id, + COALESCE(SUM( + CASE + WHEN e2.change_event = 'inception' + THEN ep2.rata_premimum + WHEN e2.change_event != 'inception' + AND (ep2.date_of_exit IS NULL OR ep2.date_of_exit = '') + THEN ep2.rata_premimum + WHEN ep2.date_of_exit IS NOT NULL + AND ep2.date_of_exit != '' + AND ep2.claim_status = 0 + THEN -ep2.rata_premimum + ELSE 0 + END + ), 0) AS premium_as_on_date + FROM employee_polices ep2 + JOIN employees e2 ON e2.id = ep2.employee_id + WHERE ep2.client_policy_id = :policy_id: + AND ep2.is_active = 1 + GROUP BY ep2.client_policy_id + ) prem ON prem.client_policy_id = cp.id -JOIN ticket_claim_status tcs - ON tcs.id = tm.claim_status_id + JOIN ticket_master tm + ON tm.client_policy_id = cp.id + AND tm.is_active = 1 -WHERE cp.id = :policy_id: + JOIN ticket_claim_status tcs + ON tcs.id = tm.claim_status_id -GROUP BY cp.id, cp.policy_start_date, prem.premium_as_on_date; -SQL; - return $this->runKpiQuery($sql, $policyId); + WHERE cp.id = :policy_id: + + GROUP BY cp.id, cp.policy_start_date, prem.premium_as_on_date; + SQL; + return $this->runKpiQuery($sql, $policyId); } /** Metabase #190: Claim Amount by Gender */