MERGE_TEST_BUG_FIXES
This commit is contained in:
commit
8174ccfcfa
413
app/Commands/TestIciciStatusUpdate.php
Normal file
413
app/Commands/TestIciciStatusUpdate.php
Normal file
@ -0,0 +1,413 @@
|
||||
<?php
|
||||
|
||||
namespace App\Commands;
|
||||
|
||||
use App\Libraries\TPAClaimsImportServices\IciciClaimImportService;
|
||||
use CodeIgniter\CLI\BaseCommand;
|
||||
use CodeIgniter\CLI\CLI;
|
||||
|
||||
/**
|
||||
* Temporary dry-run helper for ICICI existing-ticket status update logic.
|
||||
*
|
||||
* Usage:
|
||||
* php spark tpa:test-icici-status --scenario
|
||||
* php spark tpa:test-icici-status --scenario --apply
|
||||
* php spark tpa:test-icici-status 68
|
||||
* php spark tpa:test-icici-status 68 --apply
|
||||
*/
|
||||
class TestIciciStatusUpdate extends BaseCommand
|
||||
{
|
||||
protected $group = 'TPA';
|
||||
protected $name = 'tpa:test-icici-status';
|
||||
protected $description = 'Dry-run / apply ICICI existing ticket status update logic';
|
||||
protected $usage = 'tpa:test-icici-status [file_id] [--scenario] [--apply] [--new-status STATUS]';
|
||||
protected $arguments = [
|
||||
'file_id' => 'Optional claim_dump_files.id to process',
|
||||
];
|
||||
protected $options = [
|
||||
'--scenario' => 'Seed a controlled pending dump row for one existing ICICI ticket and test status update',
|
||||
'--apply' => 'Actually run runTicketMasterInsert (default is map-only dry-run)',
|
||||
'--new-status' => 'Dump status string to use in scenario (default: REJECTED)',
|
||||
];
|
||||
|
||||
public function run(array $params)
|
||||
{
|
||||
helper('utility_helper');
|
||||
|
||||
$db = db_connect();
|
||||
$iciciTpaId = (int) env('ICICI_PRIMARY_KEY_CONSTANT');
|
||||
$fileId = $this->resolveFileId($params);
|
||||
$apply = $this->hasFlag('apply');
|
||||
$scenario = $this->hasFlag('scenario');
|
||||
$newStatus = $this->resolveOptionValue('new-status', 'REJECTED');
|
||||
|
||||
CLI::write("ICICI_PRIMARY_KEY_CONSTANT = {$iciciTpaId}", 'yellow');
|
||||
CLI::write('Parsed args: file_id=' . $fileId . ', apply=' . ($apply ? 'yes' : 'no') . ', scenario=' . ($scenario ? 'yes' : 'no') . ', new_status=' . $newStatus, 'yellow');
|
||||
|
||||
if ($scenario) {
|
||||
$fileId = $this->seedScenario($db, $iciciTpaId, $newStatus);
|
||||
if ($fileId <= 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ($fileId <= 0) {
|
||||
$recent = $db->table('claim_dump_files')
|
||||
->select('id, tpa_id, client_id, client_policy_id, file_name, status, created_at')
|
||||
->where('tpa_id', $iciciTpaId)
|
||||
->orderBy('id', 'DESC')
|
||||
->limit(10)
|
||||
->get()
|
||||
->getResultArray();
|
||||
|
||||
CLI::write('No --file_id provided. Recent ICICI claim_dump_files:', 'cyan');
|
||||
if (empty($recent)) {
|
||||
CLI::error('No ICICI claim dump files found.');
|
||||
$this->printMatchPreview($db, $iciciTpaId);
|
||||
return;
|
||||
}
|
||||
|
||||
foreach ($recent as $row) {
|
||||
CLI::write(json_encode($row));
|
||||
}
|
||||
|
||||
CLI::newLine();
|
||||
CLI::write('Controlled scenario test:', 'green');
|
||||
CLI::write(' php spark tpa:test-icici-status --scenario');
|
||||
CLI::write(' php spark tpa:test-icici-status --scenario --apply');
|
||||
CLI::write('Existing file (use positional file_id):');
|
||||
CLI::write(' php spark tpa:test-icici-status 68');
|
||||
CLI::write(' php spark tpa:test-icici-status 68 --apply');
|
||||
$this->printMatchPreview($db, $iciciTpaId);
|
||||
return;
|
||||
}
|
||||
|
||||
$file = $db->table('claim_dump_files')->where('id', $fileId)->get()->getRowArray();
|
||||
if (empty($file)) {
|
||||
CLI::error("claim_dump_files id={$fileId} not found");
|
||||
return;
|
||||
}
|
||||
|
||||
CLI::write('File: ' . json_encode([
|
||||
'id' => $file['id'],
|
||||
'tpa_id' => $file['tpa_id'],
|
||||
'status' => $file['status'],
|
||||
'file_name' => $file['file_name'],
|
||||
'client_policy_id' => $file['client_policy_id'],
|
||||
]), 'cyan');
|
||||
|
||||
if ((int) $file['tpa_id'] !== $iciciTpaId) {
|
||||
CLI::error("File tpa_id={$file['tpa_id']} is not ICICI ({$iciciTpaId}). Aborting.");
|
||||
return;
|
||||
}
|
||||
|
||||
$pendingDump = $db->table('claims_dump_icici')
|
||||
->where('file_id', $fileId)
|
||||
->where('is_active', 1)
|
||||
->where('ticket_id IS NULL', null, false)
|
||||
->where('master_reject_reason IS NULL', null, false)
|
||||
->countAllResults();
|
||||
|
||||
CLI::write("Pending dump rows for mapClaimMasterData: {$pendingDump}", 'yellow');
|
||||
|
||||
$service = new IciciClaimImportService();
|
||||
|
||||
if ($apply) {
|
||||
CLI::write('APPLY mode: running runTicketMasterInsert...', 'light_red');
|
||||
|
||||
$pendingBefore = $db->table('claims_dump_icici')
|
||||
->select('id, ticket_id, master_reject_reason, updated_status, employee_member_id, uhid, claimed_amount, doa')
|
||||
->where('file_id', $fileId)
|
||||
->where('is_active', 1)
|
||||
->get()
|
||||
->getResultArray();
|
||||
CLI::write('Dump rows BEFORE: ' . json_encode($pendingBefore, JSON_PRETTY_PRINT));
|
||||
|
||||
$result = $service->runTicketMasterInsert(['file_id' => $fileId]);
|
||||
CLI::write('Result: ' . json_encode($result, JSON_PRETTY_PRINT));
|
||||
|
||||
$pendingAfter = $db->table('claims_dump_icici')
|
||||
->select('id, ticket_id, master_reject_reason, updated_status, employee_member_id, uhid, claimed_amount, doa')
|
||||
->where('file_id', $fileId)
|
||||
->where('is_active', 1)
|
||||
->get()
|
||||
->getResultArray();
|
||||
CLI::write('Dump rows AFTER: ' . json_encode($pendingAfter, JSON_PRETTY_PRINT));
|
||||
|
||||
$ticketIds = array_values(array_filter(array_column($pendingAfter, 'ticket_id')));
|
||||
if (!empty($ticketIds)) {
|
||||
$ticketsAfter = $db->table('ticket_master')
|
||||
->select('id, claim_status_id, claim_dump_ref_id, emp_code, tpa_no, claim_amount, doa')
|
||||
->whereIn('id', $ticketIds)
|
||||
->get()
|
||||
->getResultArray();
|
||||
CLI::write('Linked tickets AFTER: ' . json_encode($ticketsAfter, JSON_PRETTY_PRINT));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
CLI::write('DRY-RUN mode: calling mapClaimMasterData only (no DB writes)...', 'green');
|
||||
|
||||
$ref = new \ReflectionClass($service);
|
||||
$method = $ref->getMethod('mapClaimMasterData');
|
||||
$method->setAccessible(true);
|
||||
$mapped = $method->invoke($service, $fileId);
|
||||
|
||||
if (empty($mapped['status'])) {
|
||||
CLI::error('mapClaimMasterData failed: ' . ($mapped['message'] ?? 'unknown'));
|
||||
if (!empty($mapped['error_data'])) {
|
||||
CLI::write(json_encode($mapped['error_data'], JSON_PRETTY_PRINT));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
$inserts = $mapped['mapped_array'] ?? [];
|
||||
$rejects = $mapped['rejected_reason_array'] ?? [];
|
||||
$updates = $mapped['status_update_array'] ?? [];
|
||||
|
||||
CLI::newLine();
|
||||
CLI::write('=== RESULT COUNTS ===', 'yellow');
|
||||
CLI::write('New tickets to insert : ' . count($inserts));
|
||||
CLI::write('Status updates (existing) : ' . count($updates));
|
||||
CLI::write('Rejected / skipped rows : ' . count($rejects));
|
||||
|
||||
CLI::newLine();
|
||||
CLI::write('=== STATUS UPDATE ARRAY ===', 'cyan');
|
||||
CLI::write(empty($updates) ? '(none)' : json_encode($updates, JSON_PRETTY_PRINT));
|
||||
|
||||
CLI::newLine();
|
||||
CLI::write('=== REJECT / SKIP REASONS (first 20) ===', 'cyan');
|
||||
CLI::write(json_encode(array_slice($rejects, 0, 20), JSON_PRETTY_PRINT));
|
||||
|
||||
if (!empty($updates)) {
|
||||
CLI::newLine();
|
||||
CLI::write('Ticket fields BEFORE update:', 'yellow');
|
||||
$ids = array_column($updates, 'id');
|
||||
$before = $db->table('ticket_master')
|
||||
->select('id, emp_code, tpa_no, claim_amount, doa, claim_status_id, claim_dump_ref_id, file_id')
|
||||
->whereIn('id', $ids)
|
||||
->get()
|
||||
->getResultArray();
|
||||
CLI::write(json_encode($before, JSON_PRETTY_PRINT));
|
||||
}
|
||||
|
||||
CLI::newLine();
|
||||
CLI::write('To apply for real:', 'green');
|
||||
CLI::write(" php spark tpa:test-icici-status {$fileId} --apply");
|
||||
}
|
||||
|
||||
private function resolveFileId(array $params): int
|
||||
{
|
||||
if (!empty($params['file_id'])) {
|
||||
return (int) $params['file_id'];
|
||||
}
|
||||
if (!empty($params[0]) && is_numeric($params[0])) {
|
||||
return (int) $params[0];
|
||||
}
|
||||
|
||||
// Fallback for --file_id=68 / --file_id 68 (CI option parsing can miss these)
|
||||
$argv = $_SERVER['argv'] ?? [];
|
||||
foreach ($argv as $i => $arg) {
|
||||
if (preg_match('/^--file[_-]id=(.+)$/', (string) $arg, $m)) {
|
||||
return (int) $m[1];
|
||||
}
|
||||
if (in_array($arg, ['--file_id', '--file-id'], true) && isset($argv[$i + 1])) {
|
||||
return (int) $argv[$i + 1];
|
||||
}
|
||||
}
|
||||
|
||||
$opt = CLI::getOption('file_id') ?? CLI::getOption('file-id');
|
||||
return (int) ($opt ?? 0);
|
||||
}
|
||||
|
||||
private function hasFlag(string $name): bool
|
||||
{
|
||||
if (CLI::getOption($name) !== null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$argv = $_SERVER['argv'] ?? [];
|
||||
return in_array('--' . $name, $argv, true);
|
||||
}
|
||||
|
||||
private function resolveOptionValue(string $name, string $default): string
|
||||
{
|
||||
$opt = CLI::getOption($name);
|
||||
if (is_string($opt) && $opt !== '') {
|
||||
return $opt;
|
||||
}
|
||||
|
||||
$argv = $_SERVER['argv'] ?? [];
|
||||
foreach ($argv as $i => $arg) {
|
||||
if (preg_match('/^--' . preg_quote($name, '/') . '=(.+)$/', (string) $arg, $m)) {
|
||||
return trim($m[1]);
|
||||
}
|
||||
if ($arg === '--' . $name && isset($argv[$i + 1]) && strpos((string) $argv[$i + 1], '--') !== 0) {
|
||||
return (string) $argv[$i + 1];
|
||||
}
|
||||
}
|
||||
|
||||
return $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a temporary claim_dump_files + one pending claims_dump_icici row
|
||||
* matching an existing ticket, with a different dump status.
|
||||
*/
|
||||
private function seedScenario($db, int $iciciTpaId, string $newStatus): int
|
||||
{
|
||||
CLI::write("Seeding controlled ICICI status-update scenario (new_status={$newStatus})...", 'cyan');
|
||||
|
||||
$ticket = $db->table('ticket_master')
|
||||
->select('id, client_id, client_policy_id, emp_code, tpa_no, claim_amount, doa, claim_status_id, claim_dump_ref_id, tpa_id')
|
||||
->where('tpa_id', $iciciTpaId)
|
||||
->where('is_active', 1)
|
||||
->where('emp_code IS NOT NULL', null, false)
|
||||
->where('tpa_no IS NOT NULL', null, false)
|
||||
->where('claim_amount IS NOT NULL', null, false)
|
||||
->where('doa IS NOT NULL', null, false)
|
||||
->orderBy('id', 'DESC')
|
||||
->get()
|
||||
->getRowArray();
|
||||
|
||||
if (empty($ticket)) {
|
||||
// Fall back to any ticket, then override tpa matching by using that ticket's keys
|
||||
$ticket = $db->table('ticket_master')
|
||||
->select('id, client_id, client_policy_id, emp_code, tpa_no, claim_amount, doa, claim_status_id, claim_dump_ref_id, tpa_id')
|
||||
->where('is_active', 1)
|
||||
->where('claim_created_by', 'DUMP_TPA')
|
||||
->where('emp_code IS NOT NULL', null, false)
|
||||
->where('tpa_no IS NOT NULL', null, false)
|
||||
->where('claim_amount IS NOT NULL', null, false)
|
||||
->where('doa IS NOT NULL', null, false)
|
||||
->orderBy('id', 'DESC')
|
||||
->get()
|
||||
->getRowArray();
|
||||
}
|
||||
|
||||
if (empty($ticket)) {
|
||||
CLI::error('No suitable existing ticket found to seed a status-update scenario.');
|
||||
return 0;
|
||||
}
|
||||
|
||||
CLI::write('Using existing ticket: ' . json_encode([
|
||||
'id' => $ticket['id'],
|
||||
'emp_code' => $ticket['emp_code'],
|
||||
'tpa_no' => $ticket['tpa_no'],
|
||||
'claim_amount' => $ticket['claim_amount'],
|
||||
'doa' => $ticket['doa'],
|
||||
'claim_status_id' => $ticket['claim_status_id'],
|
||||
'claim_dump_ref_id' => $ticket['claim_dump_ref_id'] ?? null,
|
||||
'tpa_id' => $ticket['tpa_id'],
|
||||
]), 'yellow');
|
||||
|
||||
// Clear stale claim_dump_ref_id so the scenario can re-test link backfill.
|
||||
if (!empty($ticket['claim_dump_ref_id'])) {
|
||||
$db->table('ticket_master')->where('id', $ticket['id'])->update([
|
||||
'claim_dump_ref_id' => null,
|
||||
]);
|
||||
$ticket['claim_dump_ref_id'] = null;
|
||||
CLI::write('Cleared stale ticket.claim_dump_ref_id for retest.', 'yellow');
|
||||
}
|
||||
|
||||
// Ensure a physical file exists for resolveTpaClaimDumpFile if --apply uses controller later
|
||||
$uploadDir = WRITEPATH . 'uploads' . DIRECTORY_SEPARATOR . 'claim_dump_excel' . DIRECTORY_SEPARATOR;
|
||||
if (!is_dir($uploadDir)) {
|
||||
mkdir($uploadDir, 0775, true);
|
||||
}
|
||||
$fileName = 'icici_status_test_' . date('Ymd_His') . '.xlsx';
|
||||
$filePath = $uploadDir . $fileName;
|
||||
if (!is_file($filePath)) {
|
||||
file_put_contents($filePath, 'placeholder');
|
||||
}
|
||||
|
||||
$fileInsert = [
|
||||
'tpa_id' => $iciciTpaId,
|
||||
'client_id' => $ticket['client_id'],
|
||||
'client_policy_id' => $ticket['client_policy_id'],
|
||||
'file_name' => $fileName,
|
||||
'status' => 'pending',
|
||||
'created_by' => 1,
|
||||
'created_at' => date('Y-m-d H:i:s'),
|
||||
'is_active' => 1,
|
||||
];
|
||||
|
||||
// claim_dump_files may have different nullable columns; insert only known-safe ones
|
||||
$fileCols = array_column($db->query('SHOW COLUMNS FROM claim_dump_files')->getResultArray(), 'Field');
|
||||
$fileInsert = array_intersect_key($fileInsert, array_flip($fileCols));
|
||||
|
||||
$db->table('claim_dump_files')->insert($fileInsert);
|
||||
$fileId = (int) $db->insertID();
|
||||
if ($fileId <= 0) {
|
||||
CLI::error('Failed to create claim_dump_files row for scenario.');
|
||||
return 0;
|
||||
}
|
||||
|
||||
$dumpInsert = [
|
||||
'client_id' => $ticket['client_id'],
|
||||
'client_policy_id' => $ticket['client_policy_id'],
|
||||
'file_id' => $fileId,
|
||||
'employee_member_id' => $ticket['emp_code'],
|
||||
'uhid' => $ticket['tpa_no'],
|
||||
'claimed_amount' => $ticket['claim_amount'],
|
||||
'doa' => $ticket['doa'],
|
||||
'updated_status' => $newStatus,
|
||||
'relation' => 'SELF',
|
||||
'is_active' => 1,
|
||||
'created_by' => 1,
|
||||
'created_at' => date('Y-m-d H:i:s'),
|
||||
'ticket_id' => null,
|
||||
'master_reject_reason' => null,
|
||||
];
|
||||
|
||||
$dumpCols = array_column($db->query('SHOW COLUMNS FROM claims_dump_icici')->getResultArray(), 'Field');
|
||||
$dumpInsert = array_intersect_key($dumpInsert, array_flip($dumpCols));
|
||||
|
||||
$db->table('claims_dump_icici')->insert($dumpInsert);
|
||||
$dumpId = (int) $db->insertID();
|
||||
|
||||
CLI::write("Seeded file_id={$fileId}, dump_id={$dumpId}", 'green');
|
||||
CLI::write("Expected: if ticket claim_status_id ({$ticket['claim_status_id']}) != mapped REJECTED(8)/chosen status, status_update_array should contain ticket {$ticket['id']}", 'green');
|
||||
|
||||
return $fileId;
|
||||
}
|
||||
|
||||
private function printMatchPreview($db, int $iciciTpaId): void
|
||||
{
|
||||
CLI::newLine();
|
||||
CLI::write('Preview: dump rows that match existing tickets (possible status updates)', 'cyan');
|
||||
|
||||
$sql = "
|
||||
SELECT
|
||||
cd.id AS dump_id,
|
||||
cd.file_id,
|
||||
cd.employee_member_id,
|
||||
cd.uhid,
|
||||
cd.claimed_amount,
|
||||
cd.doa,
|
||||
cd.updated_status AS dump_status,
|
||||
tm.id AS ticket_id,
|
||||
tm.claim_status_id AS current_status_id
|
||||
FROM claims_dump_icici cd
|
||||
INNER JOIN ticket_master tm
|
||||
ON tm.is_active = 1
|
||||
AND tm.emp_code = cd.employee_member_id
|
||||
AND tm.tpa_no = cd.uhid
|
||||
AND tm.claim_amount = cd.claimed_amount
|
||||
AND tm.doa = cd.doa
|
||||
WHERE cd.is_active = 1
|
||||
AND tm.tpa_id = ?
|
||||
ORDER BY cd.id DESC
|
||||
LIMIT 10
|
||||
";
|
||||
|
||||
$rows = $db->query($sql, [$iciciTpaId])->getResultArray();
|
||||
if (empty($rows)) {
|
||||
CLI::write('No overlapping dump/ticket pairs found.');
|
||||
return;
|
||||
}
|
||||
|
||||
CLI::write(json_encode($rows, JSON_PRETTY_PRINT));
|
||||
}
|
||||
}
|
||||
524
app/Commands/TestTpaStatusUpdate.php
Normal file
524
app/Commands/TestTpaStatusUpdate.php
Normal file
@ -0,0 +1,524 @@
|
||||
<?php
|
||||
|
||||
namespace App\Commands;
|
||||
|
||||
use App\Libraries\TpaClaimsImportFactory;
|
||||
use CodeIgniter\CLI\BaseCommand;
|
||||
use CodeIgniter\CLI\CLI;
|
||||
|
||||
/**
|
||||
* Dry-run / apply existing-ticket status+link update logic for any TPA.
|
||||
*
|
||||
* Usage:
|
||||
* php spark tpa:test-status
|
||||
* php spark tpa:test-status --tpa=all
|
||||
* php spark tpa:test-status --tpa=abhi --scenario
|
||||
* php spark tpa:test-status --tpa=fhpl --scenario --apply
|
||||
* php spark tpa:test-status --tpa=icici 69 --apply
|
||||
*/
|
||||
class TestTpaStatusUpdate extends BaseCommand
|
||||
{
|
||||
protected $group = 'TPA';
|
||||
protected $name = 'tpa:test-status';
|
||||
protected $description = 'Dry-run / apply existing ticket status+link updates for TPA claim dumps';
|
||||
protected $usage = 'tpa:test-status [file_id] [--tpa=NAME|all] [--scenario] [--apply] [--new-status=STATUS]';
|
||||
protected $arguments = [
|
||||
'file_id' => 'Optional claim_dump_files.id to process',
|
||||
];
|
||||
protected $options = [
|
||||
'--tpa' => 'TPA key: icici|abhi|mediassist|fhpl|rcare|vidal|all (default: all for --scenario)',
|
||||
'--scenario' => 'Seed one pending dump row matching an existing ticket',
|
||||
'--apply' => 'Actually run runTicketMasterInsert (default is map-only dry-run)',
|
||||
'--new-status' => 'Dump status string for scenario (defaults per TPA)',
|
||||
];
|
||||
|
||||
/**
|
||||
* Per-TPA dump column mapping used to seed scenario rows.
|
||||
*/
|
||||
private function tpaConfigs(): array
|
||||
{
|
||||
return [
|
||||
'icici' => [
|
||||
'env' => 'ICICI_PRIMARY_KEY_CONSTANT',
|
||||
'table' => 'claims_dump_icici',
|
||||
'status_column' => 'updated_status',
|
||||
'default_status'=> 'REJECTED',
|
||||
'same_status' => 'PAID',
|
||||
'dump_to_ticket'=> [
|
||||
'employee_member_id' => 'emp_code',
|
||||
'uhid' => 'tpa_no',
|
||||
'claimed_amount' => 'claim_amount',
|
||||
'doa' => 'doa',
|
||||
],
|
||||
'extra_dump' => [
|
||||
'relation' => 'SELF',
|
||||
],
|
||||
],
|
||||
'abhi' => [
|
||||
'env' => 'ABHI_PRIMARY_KEY_CONSTANT',
|
||||
'table' => 'claims_dump_abhi',
|
||||
'status_column' => 'claim_status',
|
||||
'default_status'=> 'Rejected',
|
||||
'same_status' => 'Settled',
|
||||
'dump_to_ticket'=> [
|
||||
'member_code' => 'emp_code',
|
||||
'healthcard_id' => 'tpa_no',
|
||||
'claimed_amount' => 'claim_amount',
|
||||
'doa' => 'doa',
|
||||
],
|
||||
'extra_dump' => [
|
||||
'relation' => 'SELF',
|
||||
],
|
||||
],
|
||||
'mediassist' => [
|
||||
'env' => 'MEDI_ASSIST_PRIMARY_KEY_CONSTANT',
|
||||
'table' => 'claims_dump_medi_assist',
|
||||
'status_column' => 'claim_status',
|
||||
'default_status'=> 'Rejected',
|
||||
'same_status' => 'Settled',
|
||||
'dump_to_ticket'=> [
|
||||
'pribenef_employee_code' => 'emp_code',
|
||||
'event_id' => 'tpa_no',
|
||||
'claim_amount' => 'claim_amount',
|
||||
'date_of_admission' => 'doa',
|
||||
],
|
||||
'extra_dump' => [
|
||||
'benef_relation' => 'SELF',
|
||||
],
|
||||
],
|
||||
'fhpl' => [
|
||||
'env' => 'FHPL_PRIMARY_KEY_CONSTANT',
|
||||
'table' => 'claims_dump_fhpl',
|
||||
'status_column' => 'current_claim_status',
|
||||
'default_status'=> 'Rejected',
|
||||
'same_status' => 'Settled',
|
||||
'dump_to_ticket'=> [
|
||||
'employee_id' => 'emp_code',
|
||||
'uhid_no' => 'tpa_no',
|
||||
'claim_amount' => 'claim_amount',
|
||||
'admission_date' => 'doa',
|
||||
],
|
||||
'extra_dump' => [
|
||||
'relationship' => 'SELF',
|
||||
],
|
||||
],
|
||||
'rcare' => [
|
||||
'env' => 'R_CARE_PRIMARY_KEY_CONSTANT',
|
||||
'table' => 'claims_dump_reliance',
|
||||
'status_column' => 'final_status',
|
||||
'default_status'=> 'Rejected',
|
||||
'same_status' => 'Settled',
|
||||
'dump_to_ticket'=> [
|
||||
'employee_member_id' => 'emp_code',
|
||||
'uhid' => 'tpa_no',
|
||||
'claimed_amount' => 'claim_amount',
|
||||
'doa_opd_treatment_from' => 'doa',
|
||||
],
|
||||
'extra_dump' => [
|
||||
'relation' => 'SELF',
|
||||
],
|
||||
],
|
||||
'vidal' => [
|
||||
'env' => 'VIDAL_PRIMARY_KEY_CONSTANT',
|
||||
'table' => 'claims_dump_vidal',
|
||||
'status_column' => 'claim_status',
|
||||
'default_status'=> 'Rejected',
|
||||
'same_status' => 'Settled',
|
||||
'dump_to_ticket'=> [
|
||||
'employee_number' => 'emp_code',
|
||||
'primary_policy_holder_card_id' => 'tpa_no',
|
||||
'claim_amount' => 'claim_amount',
|
||||
'date_of_admission' => 'doa',
|
||||
],
|
||||
'extra_dump' => [
|
||||
'relation' => 'SELF',
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public function run(array $params)
|
||||
{
|
||||
helper('utility_helper');
|
||||
|
||||
$db = db_connect();
|
||||
$apply = $this->hasFlag('apply');
|
||||
$scenario = $this->hasFlag('scenario');
|
||||
$tpaOpt = strtolower((string) ($this->resolveOptionValue('tpa', '') ?: (CLI::getOption('tpa') ?? '')));
|
||||
$fileId = $this->resolveFileId($params);
|
||||
$newStatusOverride = $this->resolveOptionValue('new-status', '');
|
||||
|
||||
$configs = $this->tpaConfigs();
|
||||
|
||||
// Resolve which TPAs to run
|
||||
if ($tpaOpt === '' || $tpaOpt === 'all') {
|
||||
$selected = array_keys($configs);
|
||||
if (!$scenario && $fileId <= 0) {
|
||||
$this->printUsage($configs);
|
||||
return;
|
||||
}
|
||||
} elseif (isset($configs[$tpaOpt])) {
|
||||
$selected = [$tpaOpt];
|
||||
} else {
|
||||
CLI::error("Unknown --tpa={$tpaOpt}. Use: " . implode('|', array_keys($configs)) . '|all');
|
||||
return;
|
||||
}
|
||||
|
||||
foreach ($selected as $tpaKey) {
|
||||
CLI::newLine();
|
||||
CLI::write(str_repeat('=', 60), 'yellow');
|
||||
CLI::write('TPA: ' . strtoupper($tpaKey), 'yellow');
|
||||
CLI::write(str_repeat('=', 60), 'yellow');
|
||||
|
||||
try {
|
||||
$this->runForTpa(
|
||||
$db,
|
||||
$tpaKey,
|
||||
$configs[$tpaKey],
|
||||
$scenario,
|
||||
$apply,
|
||||
$fileId,
|
||||
$newStatusOverride
|
||||
);
|
||||
} catch (\Throwable $e) {
|
||||
CLI::error("[{$tpaKey}] " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function runForTpa(
|
||||
$db,
|
||||
string $tpaKey,
|
||||
array $cfg,
|
||||
bool $scenario,
|
||||
bool $apply,
|
||||
int $fileId,
|
||||
string $newStatusOverride
|
||||
): void {
|
||||
$tpaId = (int) env($cfg['env']);
|
||||
CLI::write("{$cfg['env']} = {$tpaId}", 'cyan');
|
||||
CLI::write("table={$cfg['table']}, status_column={$cfg['status_column']}", 'cyan');
|
||||
|
||||
if (!$this->tableExists($db, $cfg['table'])) {
|
||||
CLI::error("Table {$cfg['table']} does not exist. Skipping.");
|
||||
return;
|
||||
}
|
||||
|
||||
$newStatus = $newStatusOverride !== '' ? $newStatusOverride : $cfg['default_status'];
|
||||
$currentFileId = $fileId;
|
||||
|
||||
if ($scenario) {
|
||||
$currentFileId = $this->seedScenario($db, $tpaKey, $cfg, $tpaId, $newStatus);
|
||||
if ($currentFileId <= 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ($currentFileId <= 0) {
|
||||
$this->listRecentFiles($db, $tpaId, $tpaKey);
|
||||
return;
|
||||
}
|
||||
|
||||
$file = $db->table('claim_dump_files')->where('id', $currentFileId)->get()->getRowArray();
|
||||
if (empty($file)) {
|
||||
CLI::error("claim_dump_files id={$currentFileId} not found");
|
||||
return;
|
||||
}
|
||||
|
||||
CLI::write('File: ' . json_encode([
|
||||
'id' => $file['id'],
|
||||
'tpa_id' => $file['tpa_id'],
|
||||
'status' => $file['status'],
|
||||
'file_name' => $file['file_name'],
|
||||
'client_policy_id' => $file['client_policy_id'],
|
||||
]));
|
||||
|
||||
if ((int) $file['tpa_id'] !== $tpaId) {
|
||||
CLI::error("File tpa_id={$file['tpa_id']} does not match {$tpaKey} ({$tpaId}). Skipping.");
|
||||
return;
|
||||
}
|
||||
|
||||
$pending = $db->table($cfg['table'])
|
||||
->where('file_id', $currentFileId)
|
||||
->where('is_active', 1)
|
||||
->where('ticket_id IS NULL', null, false)
|
||||
->where('master_reject_reason IS NULL', null, false)
|
||||
->countAllResults();
|
||||
CLI::write("Pending dump rows: {$pending}");
|
||||
|
||||
$service = TpaClaimsImportFactory::make($tpaId);
|
||||
|
||||
if ($apply) {
|
||||
CLI::write('APPLY mode...', 'light_red');
|
||||
|
||||
$beforeDump = $db->table($cfg['table'])
|
||||
->select($this->dumpSelectColumns($cfg))
|
||||
->where('file_id', $currentFileId)
|
||||
->where('is_active', 1)
|
||||
->get()->getResultArray();
|
||||
CLI::write('Dump BEFORE: ' . json_encode($beforeDump, JSON_PRETTY_PRINT));
|
||||
|
||||
$result = $service->runTicketMasterInsert(['file_id' => $currentFileId]);
|
||||
CLI::write('Result: ' . json_encode($result, JSON_PRETTY_PRINT));
|
||||
|
||||
$afterDump = $db->table($cfg['table'])
|
||||
->select($this->dumpSelectColumns($cfg))
|
||||
->where('file_id', $currentFileId)
|
||||
->where('is_active', 1)
|
||||
->get()->getResultArray();
|
||||
CLI::write('Dump AFTER: ' . json_encode($afterDump, JSON_PRETTY_PRINT));
|
||||
|
||||
$ticketIds = array_values(array_filter(array_column($afterDump, 'ticket_id')));
|
||||
if (!empty($ticketIds)) {
|
||||
$tickets = $db->table('ticket_master')
|
||||
->select('id, claim_status_id, claim_dump_ref_id, emp_code, tpa_no, claim_amount, doa')
|
||||
->whereIn('id', $ticketIds)
|
||||
->get()->getResultArray();
|
||||
CLI::write('Tickets AFTER: ' . json_encode($tickets, JSON_PRETTY_PRINT));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
CLI::write('DRY-RUN mode (mapClaimMasterData only)...', 'green');
|
||||
$ref = new \ReflectionClass($service);
|
||||
$method = $ref->getMethod('mapClaimMasterData');
|
||||
$method->setAccessible(true);
|
||||
$mapped = $method->invoke($service, $currentFileId);
|
||||
|
||||
if (empty($mapped['status'])) {
|
||||
CLI::write('mapClaimMasterData: ' . ($mapped['message'] ?? 'failed'));
|
||||
if (!empty($mapped['already_processed'])) {
|
||||
CLI::write('(already processed — dump rows were NOT deleted)', 'green');
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
$inserts = $mapped['mapped_array'] ?? [];
|
||||
$rejects = $mapped['rejected_reason_array'] ?? [];
|
||||
$updates = $mapped['status_update_array'] ?? [];
|
||||
|
||||
CLI::write('inserts=' . count($inserts) . ' updates=' . count($updates) . ' rejects=' . count($rejects));
|
||||
CLI::write('status_update_array: ' . (empty($updates) ? '(none)' : json_encode($updates, JSON_PRETTY_PRINT)));
|
||||
CLI::write('rejected_reason_array: ' . json_encode(array_slice($rejects, 0, 10), JSON_PRETTY_PRINT));
|
||||
|
||||
if (!empty($updates)) {
|
||||
$ids = array_column($updates, 'id');
|
||||
$before = $db->table('ticket_master')
|
||||
->select('id, emp_code, tpa_no, claim_amount, doa, claim_status_id, claim_dump_ref_id')
|
||||
->whereIn('id', $ids)
|
||||
->get()->getResultArray();
|
||||
CLI::write('Tickets BEFORE: ' . json_encode($before, JSON_PRETTY_PRINT));
|
||||
}
|
||||
|
||||
CLI::write("To apply: php spark tpa:test-status --tpa={$tpaKey} {$currentFileId} --apply", 'green');
|
||||
}
|
||||
|
||||
private function seedScenario($db, string $tpaKey, array $cfg, int $tpaId, string $newStatus): int
|
||||
{
|
||||
CLI::write("Seeding scenario for {$tpaKey} (new_status={$newStatus})...", 'cyan');
|
||||
|
||||
$ticket = $db->table('ticket_master')
|
||||
->select('id, client_id, client_policy_id, emp_code, tpa_no, claim_amount, doa, claim_status_id, claim_dump_ref_id, tpa_id')
|
||||
->where('tpa_id', $tpaId)
|
||||
->where('is_active', 1)
|
||||
->where('emp_code IS NOT NULL', null, false)
|
||||
->where('tpa_no IS NOT NULL', null, false)
|
||||
->where('claim_amount IS NOT NULL', null, false)
|
||||
->where('doa IS NOT NULL', null, false)
|
||||
->orderBy('id', 'DESC')
|
||||
->get()->getRowArray();
|
||||
|
||||
if (empty($ticket)) {
|
||||
// Fall back: any ticket with identity keys (still allows match by doa/emp/amount/tpa_no)
|
||||
$ticket = $db->table('ticket_master')
|
||||
->select('id, client_id, client_policy_id, emp_code, tpa_no, claim_amount, doa, claim_status_id, claim_dump_ref_id, tpa_id')
|
||||
->where('is_active', 1)
|
||||
->where('emp_code IS NOT NULL', null, false)
|
||||
->where('tpa_no IS NOT NULL', null, false)
|
||||
->where('claim_amount IS NOT NULL', null, false)
|
||||
->where('doa IS NOT NULL', null, false)
|
||||
->orderBy('id', 'DESC')
|
||||
->get()->getRowArray();
|
||||
}
|
||||
|
||||
if (empty($ticket)) {
|
||||
CLI::error("[{$tpaKey}] No suitable existing ticket found to seed.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
CLI::write('Using ticket: ' . json_encode([
|
||||
'id' => $ticket['id'],
|
||||
'emp_code' => $ticket['emp_code'],
|
||||
'tpa_no' => $ticket['tpa_no'],
|
||||
'claim_amount' => $ticket['claim_amount'],
|
||||
'doa' => $ticket['doa'],
|
||||
'claim_status_id' => $ticket['claim_status_id'],
|
||||
'claim_dump_ref_id' => $ticket['claim_dump_ref_id'],
|
||||
'tpa_id' => $ticket['tpa_id'],
|
||||
]));
|
||||
|
||||
if (!empty($ticket['claim_dump_ref_id'])) {
|
||||
$db->table('ticket_master')->where('id', $ticket['id'])->update(['claim_dump_ref_id' => null]);
|
||||
CLI::write('Cleared stale ticket.claim_dump_ref_id for retest.', 'yellow');
|
||||
}
|
||||
|
||||
$uploadDir = WRITEPATH . 'uploads' . DIRECTORY_SEPARATOR . 'claim_dump_excel' . DIRECTORY_SEPARATOR;
|
||||
if (!is_dir($uploadDir)) {
|
||||
mkdir($uploadDir, 0775, true);
|
||||
}
|
||||
$fileName = "{$tpaKey}_status_test_" . date('Ymd_His') . '.xlsx';
|
||||
file_put_contents($uploadDir . $fileName, 'placeholder');
|
||||
|
||||
$fileInsert = [
|
||||
'tpa_id' => $tpaId,
|
||||
'client_id' => $ticket['client_id'],
|
||||
'client_policy_id' => $ticket['client_policy_id'],
|
||||
'file_name' => $fileName,
|
||||
'status' => 'pending',
|
||||
'created_by' => 1,
|
||||
'created_at' => date('Y-m-d H:i:s'),
|
||||
'is_active' => 1,
|
||||
];
|
||||
$fileCols = array_column($db->query('SHOW COLUMNS FROM claim_dump_files')->getResultArray(), 'Field');
|
||||
$fileInsert = array_intersect_key($fileInsert, array_flip($fileCols));
|
||||
$db->table('claim_dump_files')->insert($fileInsert);
|
||||
$fileId = (int) $db->insertID();
|
||||
if ($fileId <= 0) {
|
||||
CLI::error("[{$tpaKey}] Failed to create claim_dump_files row.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
$dumpInsert = [
|
||||
'client_id' => $ticket['client_id'],
|
||||
'client_policy_id' => $ticket['client_policy_id'],
|
||||
'file_id' => $fileId,
|
||||
'is_active' => 1,
|
||||
'created_by' => 1,
|
||||
'created_at' => date('Y-m-d H:i:s'),
|
||||
'ticket_id' => null,
|
||||
'master_reject_reason' => null,
|
||||
$cfg['status_column'] => $newStatus,
|
||||
];
|
||||
|
||||
foreach ($cfg['dump_to_ticket'] as $dumpCol => $ticketCol) {
|
||||
$dumpInsert[$dumpCol] = $ticket[$ticketCol] ?? null;
|
||||
}
|
||||
foreach ($cfg['extra_dump'] as $col => $val) {
|
||||
$dumpInsert[$col] = $val;
|
||||
}
|
||||
|
||||
$dumpCols = array_column($db->query('SHOW COLUMNS FROM ' . $cfg['table'])->getResultArray(), 'Field');
|
||||
$dumpInsert = array_intersect_key($dumpInsert, array_flip($dumpCols));
|
||||
|
||||
$db->table($cfg['table'])->insert($dumpInsert);
|
||||
$dumpId = (int) $db->insertID();
|
||||
|
||||
CLI::write("Seeded file_id={$fileId}, dump_id={$dumpId}", 'green');
|
||||
return $fileId;
|
||||
}
|
||||
|
||||
private function dumpSelectColumns(array $cfg): string
|
||||
{
|
||||
$cols = ['id', 'ticket_id', 'master_reject_reason', 'file_id', $cfg['status_column']];
|
||||
foreach (array_keys($cfg['dump_to_ticket']) as $col) {
|
||||
$cols[] = $col;
|
||||
}
|
||||
return implode(', ', array_unique($cols));
|
||||
}
|
||||
|
||||
private function listRecentFiles($db, int $tpaId, string $tpaKey): void
|
||||
{
|
||||
$recent = $db->table('claim_dump_files')
|
||||
->select('id, tpa_id, client_id, client_policy_id, file_name, status, created_at')
|
||||
->where('tpa_id', $tpaId)
|
||||
->orderBy('id', 'DESC')
|
||||
->limit(5)
|
||||
->get()->getResultArray();
|
||||
|
||||
CLI::write("Recent {$tpaKey} claim_dump_files:");
|
||||
if (empty($recent)) {
|
||||
CLI::write('(none)');
|
||||
} else {
|
||||
foreach ($recent as $row) {
|
||||
CLI::write(json_encode($row));
|
||||
}
|
||||
}
|
||||
CLI::write("Seed: php spark tpa:test-status --tpa={$tpaKey} --scenario", 'green');
|
||||
CLI::write("Apply: php spark tpa:test-status --tpa={$tpaKey} --scenario --apply", 'green');
|
||||
}
|
||||
|
||||
private function printUsage(array $configs): void
|
||||
{
|
||||
CLI::write('Test existing-ticket status/link update for TPA claim dumps.', 'cyan');
|
||||
CLI::newLine();
|
||||
CLI::write('Dry-run all TPAs (seed scenario, no DB ticket update):');
|
||||
CLI::write(' php spark tpa:test-status --tpa=all --scenario');
|
||||
CLI::newLine();
|
||||
CLI::write('Apply all TPAs (writes to DB):');
|
||||
CLI::write(' php spark tpa:test-status --tpa=all --scenario --apply');
|
||||
CLI::newLine();
|
||||
CLI::write('Single TPA:');
|
||||
foreach (array_keys($configs) as $key) {
|
||||
CLI::write(" php spark tpa:test-status --tpa={$key} --scenario");
|
||||
CLI::write(" php spark tpa:test-status --tpa={$key} --scenario --apply");
|
||||
}
|
||||
CLI::newLine();
|
||||
CLI::write('Same-status (no status change, only null-link fill):');
|
||||
CLI::write(' php spark tpa:test-status --tpa=abhi --scenario --new-status Settled');
|
||||
}
|
||||
|
||||
private function tableExists($db, string $table): bool
|
||||
{
|
||||
return !empty($db->query("SHOW TABLES LIKE " . $db->escape($table))->getResultArray());
|
||||
}
|
||||
|
||||
private function resolveFileId(array $params): int
|
||||
{
|
||||
if (!empty($params['file_id'])) {
|
||||
return (int) $params['file_id'];
|
||||
}
|
||||
if (!empty($params[0]) && is_numeric($params[0])) {
|
||||
return (int) $params[0];
|
||||
}
|
||||
|
||||
$argv = $_SERVER['argv'] ?? [];
|
||||
foreach ($argv as $i => $arg) {
|
||||
if (preg_match('/^--file[_-]id=(.+)$/', (string) $arg, $m)) {
|
||||
return (int) $m[1];
|
||||
}
|
||||
if (in_array($arg, ['--file_id', '--file-id'], true) && isset($argv[$i + 1])) {
|
||||
return (int) $argv[$i + 1];
|
||||
}
|
||||
}
|
||||
|
||||
return (int) (CLI::getOption('file_id') ?? CLI::getOption('file-id') ?? 0);
|
||||
}
|
||||
|
||||
private function hasFlag(string $name): bool
|
||||
{
|
||||
if (CLI::getOption($name) !== null) {
|
||||
return true;
|
||||
}
|
||||
return in_array('--' . $name, $_SERVER['argv'] ?? [], true);
|
||||
}
|
||||
|
||||
private function resolveOptionValue(string $name, string $default): string
|
||||
{
|
||||
$opt = CLI::getOption($name);
|
||||
if (is_string($opt) && $opt !== '') {
|
||||
return $opt;
|
||||
}
|
||||
|
||||
$argv = $_SERVER['argv'] ?? [];
|
||||
foreach ($argv as $i => $arg) {
|
||||
if (preg_match('/^--' . preg_quote($name, '/') . '=(.+)$/', (string) $arg, $m)) {
|
||||
return trim($m[1]);
|
||||
}
|
||||
if ($arg === '--' . $name && isset($argv[$i + 1]) && strpos((string) $argv[$i + 1], '--') !== 0) {
|
||||
return (string) $argv[$i + 1];
|
||||
}
|
||||
}
|
||||
|
||||
return $default;
|
||||
}
|
||||
}
|
||||
@ -242,20 +242,6 @@ class AbhiClaimImportService extends BaseTpaClaimImportService
|
||||
$item[$value] = change_date_format($item[$value] ?? null, 'm/d/Y h:i:s A', 'Y-m-d');
|
||||
}
|
||||
|
||||
$params = [
|
||||
'doa' => $item['doa'] ?? null,
|
||||
'member_code' => $item['member_code'] ?? null,
|
||||
'claimed_amount' => $item['claimed_amount'] ?? null,
|
||||
'healthcard_id' => $item['healthcard_id'] ?? null
|
||||
];
|
||||
|
||||
$is_duplicate = $this->checkDuplicateTpaClaim('claims_dump_abhi', $params);
|
||||
|
||||
if ($is_duplicate) {
|
||||
$item = [];
|
||||
continue;
|
||||
}
|
||||
|
||||
$item['file_id'] = $file_id ?? null;
|
||||
$item['client_id'] = $file_data['client_id'] ?? null;
|
||||
$item['client_policy_id'] = $file_data['client_policy_id'] ?? null;
|
||||
@ -276,7 +262,7 @@ class AbhiClaimImportService extends BaseTpaClaimImportService
|
||||
$tpaClaimDumpData = $this->getTpaClaimDumpData('claims_dump_abhi', ['file_id' => $file_id]);
|
||||
|
||||
if (empty($tpaClaimDumpData)) {
|
||||
return ['status' => false, 'message' => "No data to insert in TICKET MASTER"];
|
||||
return $this->emptyClaimMasterMappingResponse('claims_dump_abhi', (int) $file_id);
|
||||
}
|
||||
|
||||
|
||||
@ -302,6 +288,7 @@ class AbhiClaimImportService extends BaseTpaClaimImportService
|
||||
|
||||
$mapped = [];
|
||||
$rejecetd_reason = [];
|
||||
$status_update_array = [];
|
||||
|
||||
foreach ($tpaClaimDumpData as $row) {
|
||||
|
||||
@ -312,11 +299,16 @@ class AbhiClaimImportService extends BaseTpaClaimImportService
|
||||
'tpa_no' => $row['healthcard_id'] ?? null
|
||||
];
|
||||
|
||||
$isduplicate = $this->checkDublicateTicketMasterClaim($params);
|
||||
$newStatusId = $this->checkStatusMapping($this->statusMapping, $row['claim_status'] ?? '') ?? 61;
|
||||
$existingTicket = $this->getExistingTicketMasterClaim($params);
|
||||
|
||||
if ($isduplicate) {
|
||||
$reason = "This claim already exists in our system.";
|
||||
$rejecetd_reason[] = ["id" => $row['id'], "master_reject_reason" => $reason];
|
||||
if ($this->handleExistingTicketStatusUpdate(
|
||||
$existingTicket,
|
||||
$newStatusId,
|
||||
(int) $row['id'],
|
||||
$status_update_array,
|
||||
$rejecetd_reason
|
||||
)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -358,7 +350,7 @@ class AbhiClaimImportService extends BaseTpaClaimImportService
|
||||
}
|
||||
|
||||
// Meta fields
|
||||
$item['claim_status_id'] = $this->checkStatusMapping($this->statusMapping, $row['claim_status']);
|
||||
$item['claim_status_id'] = $newStatusId;
|
||||
$item['file_id'] = $file_id;
|
||||
$item['claim_dump_ref_id'] = $row['id'];
|
||||
$item['claim_dump_date'] = $file_data['claim_dump_date'] ?? null;
|
||||
@ -372,7 +364,12 @@ class AbhiClaimImportService extends BaseTpaClaimImportService
|
||||
$mapped[] = $item;
|
||||
}
|
||||
|
||||
return ['status' => true, 'mapped_array' => $mapped, 'rejected_reason_array' => $rejecetd_reason];
|
||||
return [
|
||||
'status' => true,
|
||||
'mapped_array' => $mapped,
|
||||
'rejected_reason_array' => $rejecetd_reason,
|
||||
'status_update_array' => $status_update_array,
|
||||
];
|
||||
} catch (\Throwable $th) {
|
||||
|
||||
$errorData = [
|
||||
|
||||
@ -116,16 +116,28 @@ abstract class BaseTpaClaimImportService
|
||||
|
||||
// Check if mapping failed
|
||||
if (!$ticketMasterData['status']) {
|
||||
// Already-processed dump rows (ticket_id linked) must not be deleted as a "failure".
|
||||
if (!empty($ticketMasterData['already_processed'])) {
|
||||
$this->db->transCommit();
|
||||
return [
|
||||
'status' => true,
|
||||
'message' => $ticketMasterData['message'] ?? 'Claim dump already processed for this file.',
|
||||
];
|
||||
}
|
||||
|
||||
$this->rollbackAndCleanupClaimDumpData($file_id);
|
||||
return $ticketMasterData;
|
||||
}
|
||||
|
||||
$message = '';
|
||||
$hasExecutedTask = false;
|
||||
$status = true;
|
||||
$hasInserts = !empty($ticketMasterData['mapped_array']);
|
||||
$hasExistingTicketUpdates = !empty($ticketMasterData['status_update_array']);
|
||||
$hasRejectedReasons = !empty($ticketMasterData['rejected_reason_array']);
|
||||
$hasExistingTicketLinks = $this->hasExistingTicketLinkUpdates($ticketMasterData['rejected_reason_array'] ?? []);
|
||||
|
||||
// Process Mapped Data
|
||||
if (!empty($ticketMasterData['mapped_array'])) {
|
||||
if ($hasInserts) {
|
||||
$insert_res = $this->importClaimMaster($ticketMasterData['mapped_array']);
|
||||
if (!$insert_res) {
|
||||
return $this->failTicketMasterInsert($file_id, 'Ticket Master Claim bulk insert failed');
|
||||
@ -137,20 +149,33 @@ abstract class BaseTpaClaimImportService
|
||||
|
||||
$message .= 'Ticket Master Claim bulk insert success. ';
|
||||
$hasExecutedTask = true;
|
||||
}else{
|
||||
$status = false;
|
||||
}
|
||||
|
||||
// Process Rejected Reasons
|
||||
if (!empty($ticketMasterData['rejected_reason_array'])) {
|
||||
// Update existing tickets: status and/or missing claim_dump_ref_id
|
||||
if ($hasExistingTicketUpdates) {
|
||||
$update_status_res = $this->updateExistingTicketStatuses($ticketMasterData['status_update_array']);
|
||||
if (!$update_status_res) {
|
||||
return $this->failTicketMasterInsert($file_id, 'Updating existing tickets failed');
|
||||
}
|
||||
|
||||
$message .= 'Existing ticket updated successfully. ';
|
||||
$hasExecutedTask = true;
|
||||
}
|
||||
|
||||
// Process Rejected Reasons (also writes ticket_id onto TPA dump rows for existing tickets)
|
||||
if ($hasRejectedReasons) {
|
||||
$update_res = $this->updateTicketMasterRejectedReasonInTPATable($ticketMasterData['rejected_reason_array']);
|
||||
if (!$update_res) {
|
||||
return $this->failTicketMasterInsert($file_id, 'Updating rejected reasons failed');
|
||||
}
|
||||
|
||||
$message .= empty($ticketMasterData['mapped_array'])
|
||||
? 'Those employee or dependent not in our system. '
|
||||
: 'Ticket Master Claim rejected reason updated successfully. ';
|
||||
|
||||
if ($hasExistingTicketLinks) {
|
||||
$message .= 'Existing claim dump ticket_id linked successfully. ';
|
||||
} elseif (!$hasInserts && !$hasExistingTicketUpdates) {
|
||||
$message .= 'Those employee or dependent not in our system. ';
|
||||
} else {
|
||||
$message .= 'Ticket Master Claim rejected reason updated successfully. ';
|
||||
}
|
||||
$hasExecutedTask = true;
|
||||
}
|
||||
|
||||
@ -162,6 +187,7 @@ abstract class BaseTpaClaimImportService
|
||||
// 2. Commit the transaction
|
||||
$this->db->transCommit();
|
||||
|
||||
$status = $hasInserts || $hasExistingTicketUpdates || $hasExistingTicketLinks;
|
||||
if (!$status) {
|
||||
$this->cleanupClaimDumpData($file_id);
|
||||
}
|
||||
@ -323,22 +349,110 @@ abstract class BaseTpaClaimImportService
|
||||
*/
|
||||
protected function checkDublicateTicketMasterClaim(array $param): bool
|
||||
{
|
||||
$ticketMaster = new TicketMasterModel();
|
||||
$ticket_master_data = $ticketMaster
|
||||
->where('doa', $param['doa'])
|
||||
->where('tpa_no', $param['tpa_no'])
|
||||
->where('claim_amount', $param['claim_amount'])
|
||||
->where('emp_code', $param['emp_code'])
|
||||
->where('is_active', 1)
|
||||
->findAll();
|
||||
return $this->getExistingTicketMasterClaim($param) !== null;
|
||||
}
|
||||
|
||||
if(count($ticket_master_data) > 0){
|
||||
/**
|
||||
* Fetch existing ticket_master record matching claim identity keys.
|
||||
*/
|
||||
protected function getExistingTicketMasterClaim(array $param): ?array
|
||||
{
|
||||
$ticketMaster = new TicketMasterModel();
|
||||
$ticket = $ticketMaster
|
||||
->where('doa', $param['doa'])
|
||||
->where('tpa_no', $param['tpa_no'])
|
||||
->where('claim_amount', $param['claim_amount'])
|
||||
->where('emp_code', $param['emp_code'])
|
||||
->where('is_active', 1)
|
||||
->first();
|
||||
|
||||
return $ticket ?: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update existing ticket_master rows (status and/or claim_dump_ref_id).
|
||||
*/
|
||||
protected function updateExistingTicketStatuses(array $statusUpdates): bool
|
||||
{
|
||||
if (empty($statusUpdates)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$ticketMasterModel = new TicketMasterModel();
|
||||
return $ticketMasterModel->updateBatch($statusUpdates, 'id') !== false;
|
||||
}
|
||||
|
||||
/**
|
||||
* True when rejected_reason rows include ticket_id links for existing tickets.
|
||||
*/
|
||||
protected function hasExistingTicketLinkUpdates(array $rejectedReasonArray): bool
|
||||
{
|
||||
foreach ($rejectedReasonArray as $row) {
|
||||
if (!empty($row['ticket_id'])) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* If ticket already exists:
|
||||
* - update claim_status_id when changed
|
||||
* - set claim_dump_ref_id on ticket_master when null
|
||||
* - set ticket_id on TPA dump row when null (via rejected_reason_array)
|
||||
*
|
||||
* Returns true when the row was handled as an existing ticket (caller should continue).
|
||||
*/
|
||||
protected function handleExistingTicketStatusUpdate(
|
||||
?array $existingTicket,
|
||||
int $newStatusId,
|
||||
int $dumpRowId,
|
||||
array &$statusUpdateArray,
|
||||
array &$rejectedReasonArray
|
||||
): bool {
|
||||
if (empty($existingTicket)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$ticketId = $existingTicket['id'];
|
||||
$currentStatusId = (int) ($existingTicket['claim_status_id'] ?? 0);
|
||||
$statusChanged = $currentStatusId !== (int) $newStatusId;
|
||||
$claimDumpRefIdMissing = empty($existingTicket['claim_dump_ref_id']);
|
||||
|
||||
$ticketUpdate = ['id' => $ticketId];
|
||||
$reasons = [];
|
||||
|
||||
if ($statusChanged) {
|
||||
$ticketUpdate['claim_status_id'] = $newStatusId;
|
||||
$reasons[] = 'status updated';
|
||||
}
|
||||
|
||||
if ($claimDumpRefIdMissing) {
|
||||
$ticketUpdate['claim_dump_ref_id'] = $dumpRowId;
|
||||
$reasons[] = 'claim_dump_ref_id linked';
|
||||
}
|
||||
|
||||
if (count($ticketUpdate) > 1) {
|
||||
$statusUpdateArray[] = $ticketUpdate;
|
||||
}
|
||||
|
||||
if ($statusChanged || $claimDumpRefIdMissing) {
|
||||
$reason = 'Existing claim ' . implode(' and ', $reasons) . '.';
|
||||
} else {
|
||||
$reason = 'This claim already exists in our system.';
|
||||
}
|
||||
|
||||
// Dump rows reaching here already have ticket_id NULL; link them to the existing ticket.
|
||||
$rejectedReasonArray[] = [
|
||||
'id' => $dumpRowId,
|
||||
'master_reject_reason' => $reason,
|
||||
'ticket_id' => $ticketId,
|
||||
];
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dublicate check in the TPA specific table records
|
||||
*/
|
||||
@ -365,6 +479,32 @@ abstract class BaseTpaClaimImportService
|
||||
->getResultArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Response when no pending dump rows are left for ticket_master mapping.
|
||||
* Marks already-processed files so cleanup does not delete linked dump rows.
|
||||
*/
|
||||
protected function emptyClaimMasterMappingResponse(string $table, int $fileId): array
|
||||
{
|
||||
$alreadyProcessed = $this->db->table($table)
|
||||
->where('file_id', $fileId)
|
||||
->where('is_active', 1)
|
||||
->groupStart()
|
||||
->where('ticket_id IS NOT NULL', null, false)
|
||||
->orWhere('master_reject_reason IS NOT NULL', null, false)
|
||||
->groupEnd()
|
||||
->countAllResults() > 0;
|
||||
|
||||
if ($alreadyProcessed) {
|
||||
return [
|
||||
'status' => false,
|
||||
'already_processed' => true,
|
||||
'message' => 'Claim dump already processed for this file.',
|
||||
];
|
||||
}
|
||||
|
||||
return ['status' => false, 'message' => 'No data to insert in TICKET MASTER'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Dublicate check in the TPA specific table records
|
||||
*/
|
||||
|
||||
@ -308,20 +308,6 @@ class FhplClaimImportService extends BaseTpaClaimImportService
|
||||
$item[$value] = change_date_format($item[$value] ?? null, 'd-M-y', 'Y-m-d');
|
||||
}
|
||||
|
||||
$params = [
|
||||
'admission_date' => $item['admission_date'] ?? null,
|
||||
'employee_id' => $item['employee_id'] ?? null,
|
||||
'claim_amount' => $item['claim_amount'] ?? null,
|
||||
'uhid_no' => $item['uhid_no'] ?? null
|
||||
];
|
||||
|
||||
$is_duplicate = $this->checkDuplicateTpaClaim('claims_dump_fhpl', $params);
|
||||
|
||||
if ($is_duplicate) {
|
||||
$item = [];
|
||||
continue;
|
||||
}
|
||||
|
||||
$item['file_id'] = $file_id ?? null;
|
||||
$item['client_id'] = $file_data['client_id'] ?? null;
|
||||
$item['client_policy_id'] = $file_data['client_policy_id'] ?? null;
|
||||
@ -342,7 +328,7 @@ class FhplClaimImportService extends BaseTpaClaimImportService
|
||||
$tpaClaimDumpData = $this->getTpaClaimDumpData('claims_dump_fhpl', ['file_id' => $file_id]);
|
||||
|
||||
if (empty($tpaClaimDumpData)) {
|
||||
return ['status' => false, 'message' => "No data to insert in TICKET MASTER"];
|
||||
return $this->emptyClaimMasterMappingResponse('claims_dump_fhpl', (int) $file_id);
|
||||
}
|
||||
|
||||
|
||||
@ -368,6 +354,7 @@ class FhplClaimImportService extends BaseTpaClaimImportService
|
||||
|
||||
$mapped = [];
|
||||
$rejecetd_reason = [];
|
||||
$status_update_array = [];
|
||||
|
||||
foreach ($tpaClaimDumpData as $row) {
|
||||
|
||||
@ -378,11 +365,16 @@ class FhplClaimImportService extends BaseTpaClaimImportService
|
||||
'tpa_no' => $row['uhid_no'] ?? null
|
||||
];
|
||||
|
||||
$isduplicate = $this->checkDublicateTicketMasterClaim($params);
|
||||
$newStatusId = $this->checkStatusMapping($this->statusMapping, $row['current_claim_status'] ?? '') ?? 61;
|
||||
$existingTicket = $this->getExistingTicketMasterClaim($params);
|
||||
|
||||
if ($isduplicate) {
|
||||
$reason = "This claim already exists in our system.";
|
||||
$rejecetd_reason[] = ["id" => $row['id'], "master_reject_reason" => $reason];
|
||||
if ($this->handleExistingTicketStatusUpdate(
|
||||
$existingTicket,
|
||||
$newStatusId,
|
||||
(int) $row['id'],
|
||||
$status_update_array,
|
||||
$rejecetd_reason
|
||||
)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -424,7 +416,7 @@ class FhplClaimImportService extends BaseTpaClaimImportService
|
||||
}
|
||||
|
||||
// Meta fields
|
||||
$item['claim_status_id'] = $this->checkStatusMapping($this->statusMapping, $row['current_claim_status']) ?? 61;
|
||||
$item['claim_status_id'] = $newStatusId;
|
||||
$item['file_id'] = $file_id;
|
||||
$item['claim_dump_ref_id'] = $row['id'];
|
||||
$item['claim_dump_date'] = $file_data['claim_dump_date'] ?? null;
|
||||
@ -438,7 +430,12 @@ class FhplClaimImportService extends BaseTpaClaimImportService
|
||||
$mapped[] = $item;
|
||||
}
|
||||
|
||||
return ['status' => true, 'mapped_array' => $mapped, 'rejected_reason_array' => $rejecetd_reason];
|
||||
return [
|
||||
'status' => true,
|
||||
'mapped_array' => $mapped,
|
||||
'rejected_reason_array' => $rejecetd_reason,
|
||||
'status_update_array' => $status_update_array,
|
||||
];
|
||||
|
||||
} catch (\Throwable $th) {
|
||||
|
||||
|
||||
@ -223,20 +223,6 @@ class IciciClaimImportService extends BaseTpaClaimImportService
|
||||
$item[$value] = change_date_format($item[$value] ?? null);
|
||||
}
|
||||
|
||||
$params = [
|
||||
'doa' => change_date_format($item['doa'] ?? '') ?? null,
|
||||
'employee_member_id' => $item['employee_member_id'] ?? null,
|
||||
'claimed_amount' => $item['claimed_amount'] ?? null,
|
||||
'uhid' => $item['uhid'] ?? null
|
||||
];
|
||||
|
||||
$is_duplicate = $this->checkDuplicateTpaClaim('claims_dump_icici', $params);
|
||||
|
||||
if ($is_duplicate) {
|
||||
$item = [];
|
||||
continue;
|
||||
}
|
||||
|
||||
$item['file_id'] = $file_id ?? null;
|
||||
$item['client_id'] = $file_data['client_id'] ?? null;
|
||||
$item['client_policy_id'] = $file_data['client_policy_id'] ?? null;
|
||||
@ -257,7 +243,7 @@ class IciciClaimImportService extends BaseTpaClaimImportService
|
||||
$tpaClaimDumpData = $this->getTpaClaimDumpData('claims_dump_icici', ['file_id' => $file_id]);
|
||||
|
||||
if (empty($tpaClaimDumpData)) {
|
||||
return ['status' => false, 'message' => "No data to insert in TICKET MASTER"];
|
||||
return $this->emptyClaimMasterMappingResponse('claims_dump_icici', (int) $file_id);
|
||||
}
|
||||
|
||||
|
||||
@ -283,21 +269,27 @@ class IciciClaimImportService extends BaseTpaClaimImportService
|
||||
|
||||
$mapped = [];
|
||||
$rejecetd_reason = [];
|
||||
$status_update_array = [];
|
||||
|
||||
foreach ($tpaClaimDumpData as $row) {
|
||||
|
||||
$params = [
|
||||
'doa' => change_date_format($row['doa'] ?? '') ?? null,
|
||||
'emp_code' => $row['employee_member_id'] ?? null,
|
||||
'claim_amount' => $row['claim_amount'] ?? null,
|
||||
'claim_amount' => $row['claimed_amount'] ?? null,
|
||||
'tpa_no' => $row['uhid'] ?? null
|
||||
];
|
||||
|
||||
$isduplicate = $this->checkDublicateTicketMasterClaim($params);
|
||||
$newStatusId = $this->checkStatusMapping($this->statusMapping, $row['updated_status'] ?? '') ?? 61;
|
||||
$existingTicket = $this->getExistingTicketMasterClaim($params);
|
||||
|
||||
if ($isduplicate) {
|
||||
$reason = "This claim already exists in our system.";
|
||||
$rejecetd_reason[] = ["id" => $row['id'], "master_reject_reason" => $reason];
|
||||
if ($this->handleExistingTicketStatusUpdate(
|
||||
$existingTicket,
|
||||
$newStatusId,
|
||||
(int) $row['id'],
|
||||
$status_update_array,
|
||||
$rejecetd_reason
|
||||
)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -339,7 +331,7 @@ class IciciClaimImportService extends BaseTpaClaimImportService
|
||||
}
|
||||
|
||||
// Meta fields
|
||||
$item['claim_status_id'] = $this->checkStatusMapping($this->statusMapping, $row['updated_status']) ?? 61;
|
||||
$item['claim_status_id'] = $newStatusId;
|
||||
$item['claim_dump_ref_id'] = $row['id'];
|
||||
$item['file_id'] = $file_id;
|
||||
$item['claim_dump_date'] = $file_data['claim_dump_date'] ?? null;
|
||||
@ -353,7 +345,12 @@ class IciciClaimImportService extends BaseTpaClaimImportService
|
||||
$mapped[] = $item;
|
||||
}
|
||||
|
||||
return ['status' => true, 'mapped_array' => $mapped, 'rejected_reason_array' => $rejecetd_reason];
|
||||
return [
|
||||
'status' => true,
|
||||
'mapped_array' => $mapped,
|
||||
'rejected_reason_array' => $rejecetd_reason,
|
||||
'status_update_array' => $status_update_array,
|
||||
];
|
||||
|
||||
} catch (\Throwable $th) {
|
||||
|
||||
|
||||
@ -256,20 +256,6 @@ class MediAssistClaimImportService extends BaseTpaClaimImportService
|
||||
$item[$dbColumn] = $value;
|
||||
}
|
||||
|
||||
$params = [
|
||||
'date_of_admission' => change_date_format($item['date_of_admission'] ?? '') ?? null,
|
||||
'pribenef_employee_code' => $item['pribenef_employee_code'] ?? null,
|
||||
'claim_amount' => $item['claim_amount'] ?? null,
|
||||
'event_id' => $item['event_id'] ?? null
|
||||
];
|
||||
|
||||
$is_duplicate = $this->checkDuplicateTpaClaim('claims_dump_medi_assist', $params);
|
||||
|
||||
if ($is_duplicate) {
|
||||
$item = [];
|
||||
continue;
|
||||
}
|
||||
|
||||
$item['file_id'] = $file_id ?? null;
|
||||
$item['client_id'] = $file_data['client_id'] ?? null;
|
||||
$item['client_policy_id'] = $file_data['client_policy_id'] ?? null;
|
||||
@ -290,7 +276,7 @@ class MediAssistClaimImportService extends BaseTpaClaimImportService
|
||||
$tpaClaimDumpData = $this->getTpaClaimDumpData('claims_dump_medi_assist', ['file_id' => $file_id]);
|
||||
|
||||
if (empty($tpaClaimDumpData)) {
|
||||
return ['status' => false, 'message' => "No data to insert in TICKET MASTER"];
|
||||
return $this->emptyClaimMasterMappingResponse('claims_dump_medi_assist', (int) $file_id);
|
||||
}
|
||||
|
||||
|
||||
@ -316,6 +302,7 @@ class MediAssistClaimImportService extends BaseTpaClaimImportService
|
||||
|
||||
$mapped = [];
|
||||
$rejecetd_reason = [];
|
||||
$status_update_array = [];
|
||||
|
||||
foreach ($tpaClaimDumpData as $row) {
|
||||
|
||||
@ -326,11 +313,16 @@ class MediAssistClaimImportService extends BaseTpaClaimImportService
|
||||
'tpa_no' => $row['event_id'] ?? null
|
||||
];
|
||||
|
||||
$isduplicate = $this->checkDublicateTicketMasterClaim($params);
|
||||
$newStatusId = $this->checkStatusMapping($this->statusMapping, $row['claim_status'] ?? '') ?? 61;
|
||||
$existingTicket = $this->getExistingTicketMasterClaim($params);
|
||||
|
||||
if ($isduplicate) {
|
||||
$reason = "This claim already exists in our system.";
|
||||
$rejecetd_reason[] = ["id" => $row['id'], "master_reject_reason" => $reason];
|
||||
if ($this->handleExistingTicketStatusUpdate(
|
||||
$existingTicket,
|
||||
$newStatusId,
|
||||
(int) $row['id'],
|
||||
$status_update_array,
|
||||
$rejecetd_reason
|
||||
)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -374,7 +366,7 @@ class MediAssistClaimImportService extends BaseTpaClaimImportService
|
||||
// Meta fields
|
||||
$item['claim_dump_ref_id'] = $row['id'];
|
||||
$item['file_id'] = $file_id;
|
||||
$item['claim_status_id'] = $this->checkStatusMapping($this->statusMapping, $row['claim_status']) ?? 61;
|
||||
$item['claim_status_id'] = $newStatusId;
|
||||
$item['claim_dump_date'] = $file_data['claim_dump_date'] ?? null;
|
||||
$item['created_by'] = $file_data['created_by'] ?? null;
|
||||
$item['claim_type'] = 1;
|
||||
@ -386,7 +378,12 @@ class MediAssistClaimImportService extends BaseTpaClaimImportService
|
||||
$mapped[] = $item;
|
||||
}
|
||||
|
||||
return ['status' => true, 'mapped_array' => $mapped, 'rejected_reason_array' => $rejecetd_reason];
|
||||
return [
|
||||
'status' => true,
|
||||
'mapped_array' => $mapped,
|
||||
'rejected_reason_array' => $rejecetd_reason,
|
||||
'status_update_array' => $status_update_array,
|
||||
];
|
||||
|
||||
} catch (\Throwable $th) {
|
||||
|
||||
|
||||
@ -208,20 +208,6 @@ class RcareClaimImportService extends BaseTpaClaimImportService
|
||||
$item[$value] = change_date_format($item[$value] ?? null, 'd-M-y', 'Y-m-d');
|
||||
}
|
||||
|
||||
$params = [
|
||||
'doa_opd_treatment_from' => $item['doa_opd_treatment_from'] ?? null,
|
||||
'employee_member_id' => $item['employee_member_id'] ?? null,
|
||||
'claimed_amount' => $item['claimed_amount'] ?? null,
|
||||
'uhid' => $item['uhid'] ?? null
|
||||
];
|
||||
|
||||
$is_duplicate = $this->checkDuplicateTpaClaim('claims_dump_reliance', $params);
|
||||
|
||||
if ($is_duplicate) {
|
||||
$item = [];
|
||||
continue;
|
||||
}
|
||||
|
||||
$item['file_id'] = $file_id ?? null;
|
||||
$item['client_id'] = $file_data['client_id'] ?? null;
|
||||
$item['client_policy_id'] = $file_data['client_policy_id'] ?? null;
|
||||
@ -242,7 +228,7 @@ class RcareClaimImportService extends BaseTpaClaimImportService
|
||||
$tpaClaimDumpData = $this->getTpaClaimDumpData('claims_dump_reliance', ['file_id' => $file_id]);
|
||||
|
||||
if (empty($tpaClaimDumpData)) {
|
||||
return ['status' => false, 'message' => "No data to insert in TICKET MASTER"];
|
||||
return $this->emptyClaimMasterMappingResponse('claims_dump_reliance', (int) $file_id);
|
||||
}
|
||||
|
||||
|
||||
@ -268,6 +254,7 @@ class RcareClaimImportService extends BaseTpaClaimImportService
|
||||
|
||||
$mapped = [];
|
||||
$rejecetd_reason = [];
|
||||
$status_update_array = [];
|
||||
|
||||
foreach ($tpaClaimDumpData as $row) {
|
||||
|
||||
@ -278,11 +265,16 @@ class RcareClaimImportService extends BaseTpaClaimImportService
|
||||
'tpa_no' => $row['uhid'] ?? null
|
||||
];
|
||||
|
||||
$isduplicate = $this->checkDublicateTicketMasterClaim($params);
|
||||
$newStatusId = $this->checkStatusMapping($this->statusMapping, $row['final_status'] ?? '') ?? 61;
|
||||
$existingTicket = $this->getExistingTicketMasterClaim($params);
|
||||
|
||||
if ($isduplicate) {
|
||||
$reason = "This claim already exists in our system.";
|
||||
$rejecetd_reason[] = ["id" => $row['id'], "master_reject_reason" => $reason];
|
||||
if ($this->handleExistingTicketStatusUpdate(
|
||||
$existingTicket,
|
||||
$newStatusId,
|
||||
(int) $row['id'],
|
||||
$status_update_array,
|
||||
$rejecetd_reason
|
||||
)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -324,7 +316,7 @@ class RcareClaimImportService extends BaseTpaClaimImportService
|
||||
}
|
||||
|
||||
// Meta fields
|
||||
$item['claim_status_id'] = $this->checkStatusMapping($this->statusMapping, $row['final_status']) ?? 61;
|
||||
$item['claim_status_id'] = $newStatusId;
|
||||
$item['file_id'] = $file_id;
|
||||
$item['created_by'] = $file_data['created_by'] ?? null;
|
||||
$item['claim_dump_ref_id'] = $row['id'];
|
||||
@ -338,7 +330,12 @@ class RcareClaimImportService extends BaseTpaClaimImportService
|
||||
$mapped[] = $item;
|
||||
}
|
||||
|
||||
return ['status' => true, 'mapped_array' => $mapped, 'rejected_reason_array' => $rejecetd_reason];
|
||||
return [
|
||||
'status' => true,
|
||||
'mapped_array' => $mapped,
|
||||
'rejected_reason_array' => $rejecetd_reason,
|
||||
'status_update_array' => $status_update_array,
|
||||
];
|
||||
|
||||
} catch (\Throwable $th) {
|
||||
|
||||
|
||||
@ -455,20 +455,6 @@ class VidalClaimImportService extends BaseTpaClaimImportService
|
||||
$item[$dbColumn] = $value;
|
||||
}
|
||||
|
||||
$params = [
|
||||
'date_of_admission' => change_date_format($item['date_of_admission'] ?? '') ?? null,
|
||||
'employee_number' => $item['employee_number'] ?? null,
|
||||
'claim_amount' => $item['claim_amount'] ?? null,
|
||||
'primary_policy_holder_card_id' => $item['primary_policy_holder_card_id'] ?? null
|
||||
];
|
||||
|
||||
$is_duplicate = $this->checkDuplicateTpaClaim('claims_dump_vidal', $params);
|
||||
|
||||
if ($is_duplicate) {
|
||||
$item = [];
|
||||
continue;
|
||||
}
|
||||
|
||||
$item['file_id'] = $file_id ?? null;
|
||||
$item['client_id'] = $file_data['client_id'] ?? null;
|
||||
$item['client_policy_id'] = $file_data['client_policy_id'] ?? null;
|
||||
@ -489,7 +475,7 @@ class VidalClaimImportService extends BaseTpaClaimImportService
|
||||
$tpaClaimDumpData = $this->getTpaClaimDumpData('claims_dump_vidal', ['file_id' => $file_id]);
|
||||
|
||||
if (empty($tpaClaimDumpData)) {
|
||||
return ['status' => false, 'message' => "No data to insert in TICKET MASTER"];
|
||||
return $this->emptyClaimMasterMappingResponse('claims_dump_vidal', (int) $file_id);
|
||||
}
|
||||
|
||||
|
||||
@ -515,6 +501,7 @@ class VidalClaimImportService extends BaseTpaClaimImportService
|
||||
|
||||
$mapped = [];
|
||||
$rejecetd_reason = [];
|
||||
$status_update_array = [];
|
||||
|
||||
foreach ($tpaClaimDumpData as $row) {
|
||||
|
||||
@ -525,11 +512,16 @@ class VidalClaimImportService extends BaseTpaClaimImportService
|
||||
'tpa_no' => $row['primary_policy_holder_card_id'] ?? null
|
||||
];
|
||||
|
||||
$isduplicate = $this->checkDublicateTicketMasterClaim($params);
|
||||
$newStatusId = $this->checkStatusMapping($this->statusMapping, $row['claim_status'] ?? '') ?? 61;
|
||||
$existingTicket = $this->getExistingTicketMasterClaim($params);
|
||||
|
||||
if ($isduplicate) {
|
||||
$reason = "This claim already exists in our system.";
|
||||
$rejecetd_reason[] = ["id" => $row['id'], "master_reject_reason" => $reason];
|
||||
if ($this->handleExistingTicketStatusUpdate(
|
||||
$existingTicket,
|
||||
$newStatusId,
|
||||
(int) $row['id'],
|
||||
$status_update_array,
|
||||
$rejecetd_reason
|
||||
)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -565,7 +557,7 @@ class VidalClaimImportService extends BaseTpaClaimImportService
|
||||
}
|
||||
|
||||
// Meta fields
|
||||
$item['claim_status_id'] = $this->checkStatusMapping($this->statusMapping, $row['claim_status']) ?? 61;
|
||||
$item['claim_status_id'] = $newStatusId;
|
||||
$item['file_id'] = $file_id;
|
||||
$item['claim_dump_ref_id'] = $row['id'];
|
||||
$item['claim_dump_date'] = $file_data['claim_dump_date'] ?? null;
|
||||
@ -579,7 +571,12 @@ class VidalClaimImportService extends BaseTpaClaimImportService
|
||||
$mapped[] = $item;
|
||||
}
|
||||
|
||||
return ['status' => true, 'mapped_array' => $mapped, 'rejected_reason_array' => $rejecetd_reason];
|
||||
return [
|
||||
'status' => true,
|
||||
'mapped_array' => $mapped,
|
||||
'rejected_reason_array' => $rejecetd_reason,
|
||||
'status_update_array' => $status_update_array,
|
||||
];
|
||||
|
||||
} catch (\Throwable $th) {
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user