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 */
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 */