MERGE_UAT_BUG_FIXES

This commit is contained in:
Ubuntu 2026-06-30 17:52:24 +05:30
commit e24ed45971
7 changed files with 331 additions and 30 deletions

View File

@ -9021,9 +9021,10 @@ class ClientController extends AdminController
// Now process any remaining HRs that didn't have access records
foreach ($hrMap as $hr) {
$temp_arr_key = $hr['hr_mobile'] . $hr['hr_mail'];
$post_hr_id = $hr['post_hr_id'];
$pre_hr_id = $hr['pre_hr_id'];
// Keep each HR entry unique; mobile/email can repeat across branches.
$temp_arr_key = $hr['hr_mobile'] . $hr['hr_mail'] . '_' . ($post_hr_id ?? 'null') . '_' . ($pre_hr_id ?? 'null');
if (empty($post_hr_id) && !empty($pre_hr_id)) {
$type_of_access_data = "PRE";
@ -9057,8 +9058,14 @@ class ClientController extends AdminController
}
}
// Sort by HR name for consistent display order.
$resultList = array_values($result);
usort($resultList, function ($a, $b) {
return strcasecmp((string)($a['hr_name'] ?? ''), (string)($b['hr_name'] ?? ''));
});
// dd($result);
$resultData['hr_access_data'] = array_values($result);
$resultData['hr_access_data'] = $resultList;
$resultData['pre_policy_data'] = $data['pre_policy_data'];
$resultData['post_policy_data'] = $data['post_policy_data'];
$resultData['post_cd_data'] = $data['post_cd_data'];

View File

@ -2586,8 +2586,8 @@ class EmployeeRestController extends AdminController
}
$claim_type = $this->ticketController->claimType;
unset($claim_type[1][2]);
unset($claim_type[1][4]);
// unset($claim_type[1][2]);
// unset($claim_type[1][4]);
$data['claim_type'] = $claim_type;
return $this->respond(['status' => (count($data) ? 'success' : 'failed'), 'code' => (count($data) ? 200 : 404), 'data' => $data], 200);
@ -4109,8 +4109,8 @@ class EmployeeRestController extends AdminController
$ticket_type = $this->ticketController->ticketType;
$claim_type = $this->ticketController->claimType;
unset($claim_type[1][2]);
unset($claim_type[1][4]);
// unset($claim_type[1][2]);
// unset($claim_type[1][4]);
$ticket_type = array_map(fn($value, $key) => (object) ['id' => $key, 'name' => $value], array_values($ticket_type), array_keys($ticket_type));
return $this->response->setJSON(['ticket_type' => $ticket_type, 'claim_type' => $claim_type])->setStatusCode(200);
@ -4143,8 +4143,8 @@ class EmployeeRestController extends AdminController
$ticket_type = $this->ticketController->ticketType;
$claim_type = $this->ticketController->claimType;
unset($claim_type[1][2]);
unset($claim_type[1][4]);
// unset($claim_type[1][2]);
// unset($claim_type[1][4]);
$filtered = [];

View File

@ -822,7 +822,7 @@ class TicketController extends BaseController
$data['extra_fields'] = $this->getExtraFields($data['claim_status']);
$data['extra_fields_array_for_validate'] = $this->getExtraFields($data['claim_status'], 1);
if ($ticket_type == 1) {
if ($ticket_type == 1 || $ticket_type == 72) {
$data['claim_type'] = $this->claimType[1];
} else {
$data['claim_type'] = $this->claimType[2];

View File

@ -144,8 +144,8 @@ SQL;
return $this->runKpiQuery($sql, $policyId);
}
/** Metabase #185: PREMIUM AS ON DATE */
public function premium_as_on_date(int $policyId): array
/** Metabase #185: PREMIUM AS ON DATE (legacy — not in KPI_MAP; kept for reference) */
public function premium_as_on_date_legacy(int $policyId): array
{
$sql = <<<'SQL'
SELECT
@ -165,7 +165,7 @@ SELECT
END
), 0)
, 0)) AS premium_as_on_date
FROM employee_polices ep
JOIN employees e ON e.id = ep.employee_id
WHERE ep.client_policy_id = :policy_id:
@ -174,6 +174,43 @@ SQL;
return $this->runKpiQuery($sql, $policyId);
}
/** Metabase #185: PREMIUM AS ON DATE */
public function premium_as_on_date(int $policyId): array
{
$sql = <<<'SQL'
SELECT
CONCAT('💰 ', FORMAT(
COALESCE(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)
AND ep.date_coverage IS NOT NULL
AND ep.date_coverage != ''
AND ep.policy_end_date IS NOT NULL
AND ep.policy_end_date != ''
THEN (ep.rata_premimum + COALESCE(ep.gst, 0))
* (
(DATEDIFF(ep.policy_end_date, ep.date_coverage) + 1)
- (DATEDIFF(ep.policy_end_date, ep.date_of_exit) - 1)
)
/ NULLIF(DATEDIFF(ep.policy_end_date, ep.date_coverage) + 1, 0)
ELSE (ep.rata_premimum + COALESCE(ep.gst, 0))
END
), 0)
, 0)) AS premium_as_on_date
FROM employee_polices ep
JOIN employees e ON e.id = ep.employee_id
WHERE ep.client_policy_id = :policy_id:
AND ep.is_active = 1
AND ep.status = 'active'
AND e.is_active = 1
AND e.emp_status = 'active';
SQL;
return $this->runKpiQuery($sql, $policyId);
}
/** Metabase #186: CLAIMS EXPERIENCE SUMMARY */
public function claims_experience_summary(int $policyId): array
{
@ -183,15 +220,15 @@ SELECT
DATEDIFF(
MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)),
cp.policy_start_date
) AS run_days,
) + 1 AS run_days,
/* 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
)
) + 1)
, 0) AS earned_premium,
/* claims reported */
@ -687,15 +724,15 @@ SELECT
DATEDIFF(
MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)),
cp.policy_start_date
) AS run_days,
) + 1 AS run_days,
/* 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
)
) + 1)
, 0) AS earned_premium,
/* claims reported */
@ -852,15 +889,15 @@ SELECT
DATEDIFF(
MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)),
cp.policy_start_date
) AS run_days,
) + 1 AS run_days,
/* 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
)
) + 1)
, 0) AS earned_premium,
/* claims reported */
@ -1017,15 +1054,15 @@ SELECT
DATEDIFF(
MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)),
cp.policy_start_date
) AS run_days,
) + 1 AS run_days,
/* 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
)
) + 1)
, 0) AS earned_premium,
/* claims reported */
@ -1182,15 +1219,15 @@ SELECT
DATEDIFF(
MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)),
cp.policy_start_date
) AS run_days,
) + 1 AS run_days,
/* 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
)
) + 1)
, 0) AS earned_premium,
/* claims reported */
@ -1348,15 +1385,15 @@ SELECT
DATEDIFF(
MAX(COALESCE(tm.claim_dump_date, cp.policy_end_date)),
cp.policy_start_date
) AS run_days,
) + 1 AS run_days,
/* 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
)
) + 1)
, 0) AS earned_premium,
/* claims reported */

View File

@ -0,0 +1,208 @@
<?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;
}

View File

@ -0,0 +1,31 @@
<?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, '\\/ ') . '/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;
$db = Config\Database::connect();
$row = $db->query(<<<'SQL'
SELECT ep.id, ep.rata_premimum, ep.gst, ep.policy_end_date, ep.date_of_exit, ep.date_coverage,
ep.claim_status, ep.status,
(ep.rata_premimum + COALESCE(ep.gst,0)) AS gross,
(DATEDIFF(ep.policy_end_date, ep.date_of_exit) - 1) AS unused_days,
(DATEDIFF(ep.policy_end_date, ep.date_coverage) + 1) AS total_coverage_days,
(ep.rata_premimum + COALESCE(ep.gst,0))
* ((DATEDIFF(ep.policy_end_date, ep.date_coverage) + 1) - (DATEDIFF(ep.policy_end_date, ep.date_of_exit) - 1))
/ NULLIF(DATEDIFF(ep.policy_end_date, ep.date_coverage) + 1, 0) AS net_member
FROM employee_polices ep
JOIN employees e ON e.id = ep.employee_id
WHERE ep.client_policy_id = 5889
AND 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 != ''
LIMIT 3
SQL)->getResultArray();
echo json_encode($row, JSON_PRETTY_PRINT);

View File

@ -76,6 +76,21 @@ try {
ok('model getKpi(incurred_ratio)', false, $e->getMessage());
}
try {
$rows = $model->getKpi('premium_as_on_date', $policyId);
$val = is_array($rows) && isset($rows[0]['premium_as_on_date']) ? (string) $rows[0]['premium_as_on_date'] : '';
ok('model premium_as_on_date (#185)', count($rows) === 1 && str_starts_with($val, '💰'), $val ?: 'empty');
} catch (Throwable $e) {
ok('model premium_as_on_date (#185)', false, $e->getMessage());
}
try {
$rows = $model->premium_as_on_date_legacy($policyId);
ok('model premium_as_on_date_legacy callable', is_array($rows), 'rows=' . count($rows));
} catch (Throwable $e) {
ok('model premium_as_on_date_legacy callable', false, $e->getMessage());
}
$request = Services::request(null, false);
$response = Services::response();
$request->setGlobal('get', ['client_policy' => (string) $policyId]);
@ -89,6 +104,9 @@ ok('controller kpi by slug', ($slugResp['status'] ?? false) === true && ($slugRe
$idResp = json_decode($controller->kpi('207')->getJSON(), true);
ok('controller kpi by id 207', ($idResp['status'] ?? false) === true && ($idResp['kpi_id'] ?? 0) === 207);
$premResp = json_decode($controller->kpi('185')->getJSON(), true);
ok('controller kpi by id 185', ($premResp['status'] ?? false) === true && ($premResp['kpi'] ?? '') === 'premium_as_on_date' && ! empty($premResp['rows'][0]['premium_as_on_date'] ?? ''));
$badResp = json_decode($controller->kpi('not_a_kpi')->getJSON(), true);
ok('controller unknown kpi 404', ($badResp['status'] ?? true) === false);