nhance/app/Models/ClaimReportDashboardModel.php
2026-07-29 17:19:56 +05:30

110 lines
3.7 KiB
PHP

<?php
namespace App\Models;
/**
* Claims Collection dashboard backed by claim_report.
* Falls back to ticket_master only for non-dump TPAs when env flag is true.
* Reuses V2 KPI SQL; claim fact tables are rewritten at query time.
*/
class ClaimReportDashboardModel extends ClaimsCollectionV2DashboardModel
{
/** @var array<int, string> */
protected array $claimsTableCache = [];
/**
* Resolve claim fact table for a policy.
*
* - TPA dump table exists → always claim_report (even if empty; never ticket_master).
* - Dump table missing / TPA unmapped → ticket_master only when
* CLAIM_REPORT_FALLBACK_TO_TICKET_MASTER=true; otherwise claim_report.
*/
public function resolveClaimsTable(int $policyId): string
{
if (isset($this->claimsTableCache[$policyId])) {
return $this->claimsTableCache[$policyId];
}
$db = \Config\Database::connect($this->DBGroup);
$fallbackEnabled = $this->isTicketMasterFallbackEnabled();
if ($policyId <= 0) {
return $this->claimsTableCache[$policyId] = $fallbackEnabled
? 'ticket_master'
: 'claim_report';
}
// Table missing — cannot query claim_report; ticket_master is the only option.
if (!$db->tableExists('claim_report')) {
return $this->claimsTableCache[$policyId] = 'ticket_master';
}
$policy = $db->table('client_policy')
->select('tpa_id')
->where('id', $policyId)
->get()
->getRowArray();
$tpaId = (int) ($policy['tpa_id'] ?? 0);
$dumpTable = $this->getTpaDumpTableMap()[$tpaId] ?? null;
// Mapped dump TPA with existing dump table → claim_report only.
if ($dumpTable !== null && $db->tableExists($dumpTable)) {
return $this->claimsTableCache[$policyId] = 'claim_report';
}
// Non-dump / missing dump table → env-gated ticket_master fallback.
return $this->claimsTableCache[$policyId] = $fallbackEnabled
? 'ticket_master'
: 'claim_report';
}
protected function isTicketMasterFallbackEnabled(): bool
{
return filter_var(
env('CLAIM_REPORT_FALLBACK_TO_TICKET_MASTER', false),
FILTER_VALIDATE_BOOLEAN
);
}
/**
* @return array<int, string>
*/
protected function getTpaDumpTableMap(): array
{
return [
(int) env('VIDAL_PRIMARY_KEY_CONSTANT') => 'claims_dump_vidal',
(int) env('ABHI_PRIMARY_KEY_CONSTANT') => 'claims_dump_abhi',
(int) env('MEDI_ASSIST_PRIMARY_KEY_CONSTANT') => 'claims_dump_medi_assist',
(int) env('FHPL_PRIMARY_KEY_CONSTANT') => 'claims_dump_fhpl',
(int) env('R_CARE_PRIMARY_KEY_CONSTANT') => 'claims_dump_reliance',
(int) env('ICICI_PRIMARY_KEY_CONSTANT') => 'claims_dump_icici',
];
}
protected function runKpiQuery(string $sql, int $policyId): array
{
$sql = str_replace(['\\t', '\\n', '\\r'], ["\t", "\n", "\r"], $sql);
$claimsTable = $this->resolveClaimsTable($policyId);
if ($claimsTable !== 'ticket_master') {
$sql = preg_replace('/\bticket_master\b/', $claimsTable, $sql) ?? $sql;
}
$db = \Config\Database::connect($this->DBGroup);
$query = $db->query($sql, ['policy_id' => $policyId]);
return $query->getResultArray();
}
public function getAllKpis(int $policyId): array
{
$out = parent::getAllKpis($policyId);
$out['_meta'] = [
'claims_source' => $this->resolveClaimsTable($policyId),
];
return $out;
}
}