110 lines
3.7 KiB
PHP
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;
|
|
}
|
|
}
|