nhance/tests/debug_premium_as_on_date.php
2026-06-30 14:37:09 +05:30

209 lines
8.6 KiB
PHP

<?php
declare(strict_types=1);
define('FCPATH', __DIR__ . '/../public/');
chdir(FCPATH);
require FCPATH . '../app/Config/Paths.php';
$paths = new Config\Paths();
require rtrim($paths->systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstrap.php';
require_once SYSTEMPATH . 'Config/DotEnv.php';
(new CodeIgniter\Config\DotEnv(ROOTPATH))->load();
defined('ENVIRONMENT') || define('ENVIRONMENT', env('CI_ENVIRONMENT', 'development'));
$boot = APPPATH . 'Config/Boot/' . ENVIRONMENT . '.php';
if (is_file($boot)) {
require_once $boot;
}
use App\Models\ClaimsCollectionV2DashboardModel;
use Config\Database;
$policyId = isset($argv[1]) ? (int) $argv[1] : 4687;
$model = new ClaimsCollectionV2DashboardModel();
$db = Database::connect();
echo "=== premium_as_on_date debug (policy_id={$policyId}) ===" . PHP_EOL . PHP_EOL;
try {
$new = $model->premium_as_on_date($policyId);
echo 'NEW premium_as_on_date: ' . json_encode($new, JSON_UNESCAPED_UNICODE) . PHP_EOL;
} catch (Throwable $e) {
echo 'NEW ERROR: ' . $e->getMessage() . PHP_EOL;
}
try {
$old = $model->premium_as_on_date_legacy($policyId);
echo 'LEGACY premium_as_on_date: ' . json_encode($old, JSON_UNESCAPED_UNICODE) . PHP_EOL;
} catch (Throwable $e) {
echo 'LEGACY ERROR: ' . $e->getMessage() . PHP_EOL;
}
echo PHP_EOL . '=== Active filter counts ===' . PHP_EOL;
$checks = [
'all is_active ep' => "SELECT COUNT(*) c FROM employee_polices ep WHERE ep.client_policy_id = ? AND ep.is_active = 1",
"ep.status = 'active'" => "SELECT COUNT(*) c FROM employee_polices ep JOIN employees e ON e.id = ep.employee_id WHERE ep.client_policy_id = ? AND ep.is_active = 1 AND ep.status = 'active' AND e.is_active = 1 AND e.emp_status = 'active'",
"ep.status = 'Active'" => "SELECT COUNT(*) c FROM employee_polices ep JOIN employees e ON e.id = ep.employee_id WHERE ep.client_policy_id = ? AND ep.is_active = 1 AND ep.status = 'Active' AND e.is_active = 1 AND e.emp_status = 'Active'",
'distinct ep.status' => "SELECT DISTINCT ep.status FROM employee_polices ep WHERE ep.client_policy_id = ? AND ep.is_active = 1 LIMIT 10",
'distinct e.emp_status' => "SELECT DISTINCT e.emp_status FROM employee_polices ep JOIN employees e ON e.id = ep.employee_id WHERE ep.client_policy_id = ? AND ep.is_active = 1 LIMIT 10",
'with date_of_exit' => "SELECT COUNT(*) c FROM employee_polices ep JOIN employees e ON e.id = ep.employee_id WHERE ep.client_policy_id = ? AND ep.is_active = 1 AND ep.date_of_exit IS NOT NULL AND ep.date_of_exit != ''",
];
foreach ($checks as $label => $sql) {
try {
$q = $db->query($sql, [$policyId]);
$rows = $q->getResultArray();
if (count($rows) === 1 && isset($rows[0]['c'])) {
echo "{$label}: {$rows[0]['c']}" . PHP_EOL;
} else {
echo "{$label}: " . json_encode($rows) . PHP_EOL;
}
} catch (Throwable $e) {
echo "{$label}: ERROR " . $e->getMessage() . PHP_EOL;
}
}
echo PHP_EOL . '=== Sum breakdown (new logic parts) ===' . PHP_EOL;
$breakdown = <<<'SQL'
SELECT
COUNT(*) AS member_rows,
SUM(ep.rata_premimum + COALESCE(ep.gst, 0)) AS gross_sum,
SUM(
CASE
WHEN ep.date_of_exit IS NOT NULL
AND ep.date_of_exit != ''
AND (ep.claim_status = 0 OR ep.claim_status IS NULL)
THEN (ep.rata_premimum + COALESCE(ep.gst, 0))
* (DATEDIFF(ep.policy_end_date, ep.date_of_exit) + 1) / 365
ELSE 0
END
) AS remaining_deducted,
SUM(
CASE
WHEN ep.date_of_exit IS NOT NULL
AND ep.date_of_exit != ''
AND (ep.claim_status = 0 OR ep.claim_status IS NULL)
THEN (ep.rata_premimum + COALESCE(ep.gst, 0))
- ((ep.rata_premimum + COALESCE(ep.gst, 0))
* (DATEDIFF(ep.policy_end_date, ep.date_of_exit) + 1) / 365)
ELSE (ep.rata_premimum + COALESCE(ep.gst, 0))
END
) AS net_sum
FROM employee_polices ep
JOIN employees e ON e.id = ep.employee_id
WHERE ep.client_policy_id = ?
AND ep.is_active = 1
AND ep.status = 'active'
AND e.is_active = 1
AND e.emp_status = 'active'
SQL;
try {
$row = $db->query($breakdown, [$policyId])->getRowArray();
echo json_encode($row, JSON_PRETTY_PRINT) . PHP_EOL;
} catch (Throwable $e) {
echo 'BREAKDOWN ERROR: ' . $e->getMessage() . PHP_EOL;
}
// Same breakdown with Active casing
$breakdownActive = str_replace(["ep.status = 'active'", "e.emp_status = 'active'"], ["ep.status = 'Active'", "e.emp_status = 'Active'"], $breakdown);
try {
$row = $db->query($breakdownActive, [$policyId])->getRowArray();
echo PHP_EOL . 'With Active casing:' . PHP_EOL;
echo json_encode($row, JSON_PRETTY_PRINT) . PHP_EOL;
} catch (Throwable $e) {
echo 'ACTIVE CASING ERROR: ' . $e->getMessage() . PHP_EOL;
}
echo PHP_EOL . '=== Exited members (any active flag) ===' . PHP_EOL;
$exitSql = <<<'SQL'
SELECT
ep.is_active,
ep.status,
e.emp_status,
COUNT(*) AS c,
SUM(ep.rata_premimum + COALESCE(ep.gst, 0)) AS premium_sum
FROM employee_polices ep
JOIN employees e ON e.id = ep.employee_id
WHERE ep.client_policy_id = ?
AND ep.date_of_exit IS NOT NULL
AND ep.date_of_exit != ''
GROUP BY ep.is_active, ep.status, e.emp_status
SQL;
try {
foreach ($db->query($exitSql, [$policyId])->getResultArray() as $row) {
echo json_encode($row) . PHP_EOL;
}
} catch (Throwable $e) {
echo 'EXIT ERROR: ' . $e->getMessage() . PHP_EOL;
}
echo PHP_EOL . '=== Compare enrollment net_premium ===' . PHP_EOL;
try {
$enroll = new \App\Models\EnrollmentCollectionV1DashboardModel();
echo json_encode($enroll->net_premium($policyId), JSON_UNESCAPED_UNICODE) . PHP_EOL;
} catch (Throwable $e) {
echo 'ENROLL ERROR: ' . $e->getMessage() . PHP_EOL;
}
echo PHP_EOL . '=== earned_premium (#203) uses old premium subquery ===' . PHP_EOL;
try {
echo json_encode($model->earned_premium($policyId), JSON_UNESCAPED_UNICODE) . PHP_EOL;
$oldPrem = $db->query(<<<'SQL'
SELECT 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 old_subquery_premium
FROM employee_polices ep2
JOIN employees e2 ON e2.id = ep2.employee_id
WHERE ep2.client_policy_id = ?
AND ep2.is_active = 1
SQL, [$policyId])->getRowArray();
echo 'old subquery base (rata only, no gst): ' . json_encode($oldPrem) . PHP_EOL;
} catch (Throwable $e) {
echo 'EARNED ERROR: ' . $e->getMessage() . PHP_EOL;
}
echo PHP_EOL . '=== Find policy with exits for exit-logic test ===' . PHP_EOL;
$findExit = <<<'SQL'
SELECT ep.client_policy_id,
SUM(CASE WHEN ep.is_active=1 AND ep.status='active' AND e.is_active=1 AND e.emp_status='active' THEN 1 ELSE 0 END) AS active_both,
SUM(CASE WHEN ep.is_active=1 AND ep.status='active' AND e.is_active=1 AND e.emp_status='active'
AND ep.date_of_exit IS NOT NULL AND ep.date_of_exit != '' THEN 1 ELSE 0 END) AS active_with_exit
FROM employee_polices ep
JOIN employees e ON e.id = ep.employee_id
GROUP BY ep.client_policy_id
HAVING active_with_exit > 0
ORDER BY active_with_exit DESC
LIMIT 5
SQL;
try {
$policies = $db->query($findExit)->getResultArray();
echo json_encode($policies, JSON_PRETTY_PRINT) . PHP_EOL;
if (! empty($policies[0]['client_policy_id'])) {
$testPid = (int) $policies[0]['client_policy_id'];
echo PHP_EOL . "Testing policy {$testPid} with exits..." . PHP_EOL;
echo 'NEW: ' . json_encode($model->premium_as_on_date($testPid), JSON_UNESCAPED_UNICODE) . PHP_EOL;
echo 'net_premium: ' . json_encode((new \App\Models\EnrollmentCollectionV1DashboardModel())->net_premium($testPid), JSON_UNESCAPED_UNICODE) . PHP_EOL;
$diag = $db->query(<<<'SQL'
SELECT
COUNT(*) AS total_ep,
SUM(CASE WHEN ep.is_active=1 AND ep.status='active' AND e.is_active=1 AND e.emp_status='active' THEN 1 ELSE 0 END) AS active_both,
SUM(CASE WHEN ep.date_of_exit IS NOT NULL AND ep.date_of_exit != '' THEN 1 ELSE 0 END) AS has_exit,
SUM(CASE WHEN ep.is_active=1 AND ep.status='active' AND e.is_active=1 AND e.emp_status='active'
AND ep.date_of_exit IS NOT NULL AND ep.date_of_exit != '' THEN 1 ELSE 0 END) AS active_with_exit
FROM employee_polices ep
JOIN employees e ON e.id = ep.employee_id
WHERE ep.client_policy_id = ?
SQL, [$testPid])->getRowArray();
echo 'policy diag: ' . json_encode($diag) . PHP_EOL;
}
} catch (Throwable $e) {
echo 'FIND EXIT ERROR: ' . $e->getMessage() . PHP_EOL;
}