GWM : earned premium calculation correction for hr dashboard

This commit is contained in:
Gowtham M 2026-07-02 11:59:12 +05:30
parent 928f12519e
commit 3df39378e8

View File

@ -214,111 +214,105 @@ SQL;
/** Metabase #186: CLAIMS EXPERIENCE SUMMARY */ /** Metabase #186: CLAIMS EXPERIENCE SUMMARY */
public function claims_experience_summary(int $policyId): array public function claims_experience_summary(int $policyId): array
{ {
$sql = <<<'SQL' $sql = <<<'SQL'
SELECT SELECT
/* run days */ /* run days */
/* /*
DATEDIFF( DATEDIFF(
MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)), MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)),
cp.policy_start_date cp.policy_start_date
) + 1 AS run_days, ) + 1 AS run_days,
*/
DATEDIFF(
LEAST(CURDATE(), cp.policy_end_date),
cp.policy_start_date
) + 1 AS run_days,
/* earned premium */ /* earned premium */
FORMAT( 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(
(prem.premium_as_on_date / 365) (prem.premium_as_on_date / 365)
* DATEDIFF( * (DATEDIFF(
MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)), MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)),
cp.policy_start_date cp.policy_start_date
) ) + 1)
, 0) * 100 , 0) AS earned_premium,
, 2) */
, '%') AS incurred_ratio,
/* rejection rate */ prem.premium_as_on_date,
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 */ DATEDIFF(
FORMAT( LEAST(CURDATE(), cp.policy_end_date),
( cp.policy_start_date
COALESCE(SUM( ) + 1 AS run_days,
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,
/* projected ratio */ FORMAT(
CONCAT( (prem.premium_as_on_date / 365) *
ROUND( (
( 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( COALESCE(SUM(
CASE CASE
@ -337,49 +331,73 @@ SELECT
) )
* 365 * 365
) * 1.10 ) * 1.10
) , 0) AS projected_claims,
/ NULLIF(prem.premium_as_on_date, 0) * 100
, 2)
, '%') AS projected_ratio
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 ( FROM client_policy cp
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_master tm JOIN (
ON tm.client_policy_id = cp.id SELECT
AND tm.is_active = 1 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 JOIN ticket_master tm
ON tcs.id = tm.claim_status_id 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; WHERE cp.id = :policy_id:
SQL;
return $this->runKpiQuery($sql, $policyId); 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 */ /** Metabase #190: Claim Amount by Gender */