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