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\Controllers\PolicyTransactionController; use App\Models\PolicyTransactionModel; $pass = 0; $fail = 0; $results = []; function ok(string $label, bool $cond, string $detail = ''): void { global $pass, $fail, $results; if ($cond) { $pass++; $results[] = '[PASS] ' . $label . ($detail ? " — {$detail}" : ''); } else { $fail++; $results[] = '[FAIL] ' . $label . ($detail ? " — {$detail}" : ''); } } function invokePolicyNoSync(PolicyTransactionController $controller, int $inceptionPtId, string $oldPolicyNo, string $newPolicyNo): array { $method = new ReflectionMethod($controller, 'updateRelatedPolicyTransactionPolicyNo'); $method->setAccessible(true); return $method->invoke($controller, $inceptionPtId, $oldPolicyNo, $newPolicyNo); } $db = db_connect('default'); $ptModel = new PolicyTransactionModel(); $controller = new PolicyTransactionController(); $inceptionPtId = isset($argv[1]) ? (int) $argv[1] : 0; if ($inceptionPtId <= 0) { $seed = $db->query( "SELECT pt.id FROM policy_transaction pt WHERE pt.is_active = 1 AND pt.action_type = 'inception' AND pt.policy_no IS NOT NULL AND pt.policy_no <> '' AND EXISTS ( SELECT 1 FROM policy_transaction other WHERE other.is_active = 1 AND other.policy_no = pt.policy_no AND other.id <> pt.id ) ORDER BY pt.id ASC LIMIT 1" )->getRowArray(); $inceptionPtId = (int) ($seed['id'] ?? 0); } ok('seed inception row found', $inceptionPtId > 0, "pt_id={$inceptionPtId}"); $inception = $ptModel->where('is_active', 1)->where('id', $inceptionPtId)->first(); ok('inception row loaded', !empty($inception), 'id=' . ($inception['id'] ?? 'n/a')); $oldPolicyNo = trim((string) ($inception['policy_no'] ?? '')); ok('inception has policy_no', $oldPolicyNo !== '', $oldPolicyNo); $relatedBefore = $ptModel ->where('is_active', 1) ->where('id !=', $inceptionPtId) ->where('policy_no', $oldPolicyNo) ->findAll(); ok('related rows exist before sync', count($relatedBefore) > 0, 'count=' . count($relatedBefore)); $newPolicyNo = $oldPolicyNo . '_SMOKE_' . time(); $relatedIds = array_map(static fn(array $row): int => (int) $row['id'], $relatedBefore); // No-op cases $noChange = invokePolicyNoSync($controller, $inceptionPtId, $oldPolicyNo, $oldPolicyNo); ok('no-op when policy_no unchanged', ($noChange['status'] ?? null) === false); $emptyOld = invokePolicyNoSync($controller, $inceptionPtId, '', $newPolicyNo); ok('no-op when old policy_no empty', ($emptyOld['status'] ?? null) === false); // Apply sync on related rows only (inception row still has old policy_no for this call) $result = invokePolicyNoSync($controller, $inceptionPtId, $oldPolicyNo, $newPolicyNo); ok('sync returns success', ($result['status'] ?? null) === true, json_encode($result)); ok('sync updated expected row count', count($result['updated_ids'] ?? []) === count($relatedIds), 'updated=' . count($result['updated_ids'] ?? [])); foreach ($relatedIds as $relatedId) { $row = $ptModel->where('id', $relatedId)->first(); ok("related row {$relatedId} has new policy_no", ($row['policy_no'] ?? '') === $newPolicyNo, $row['policy_no'] ?? 'missing'); } $inceptionAfter = $ptModel->where('id', $inceptionPtId)->first(); ok('inception row unchanged by sync helper', ($inceptionAfter['policy_no'] ?? '') === $oldPolicyNo, $inceptionAfter['policy_no'] ?? 'missing'); $stillOld = $ptModel ->where('is_active', 1) ->where('id !=', $inceptionPtId) ->where('policy_no', $oldPolicyNo) ->countAllResults(); ok('no related rows left with old policy_no', $stillOld === 0, "remaining={$stillOld}"); // Restore test data foreach ($relatedIds as $relatedId) { $ptModel->where('id', $relatedId)->set(['policy_no' => $oldPolicyNo])->update(); } $restored = $ptModel ->where('is_active', 1) ->where('id !=', $inceptionPtId) ->where('policy_no', $oldPolicyNo) ->countAllResults(); ok('related rows restored', $restored === count($relatedIds), "restored={$restored}"); echo PHP_EOL . '=== smoke_inception_policy_no_sync ===' . PHP_EOL; echo 'inception_pt_id: ' . $inceptionPtId . PHP_EOL; echo 'policy_no: ' . $oldPolicyNo . PHP_EOL; echo 'related_rows: ' . count($relatedIds) . PHP_EOL; echo PHP_EOL; foreach ($results as $line) { echo $line . PHP_EOL; } echo PHP_EOL . "Summary: {$pass} passed, {$fail} failed" . PHP_EOL; exit($fail > 0 ? 1 : 0);