Commit 39cb5800 authored by Mahmoud Aglan's avatar Mahmoud Aglan

fix(members): fix root cause of orphaned person_ids in retroactive wizard

The fallback `$sub['person_id'] ?? $memberId` silently assigned member's
own ID to spouse/child/temporary subscription rows when person_index
didn't map. Now resolves by name from the dependent table, or skips the
row entirely if no match is found.
Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent 98f2d9ec
......@@ -382,9 +382,15 @@ final class RetroactiveMembershipService
$personType = $sub['person_type'] ?? 'member';
$personIndex = (int) ($sub['person_index'] ?? 0);
if ($personType === 'member') {
$personId = $memberId;
if ($personType !== 'member' && isset($personIdMap[$personType][$personIndex])) {
} elseif (isset($personIdMap[$personType][$personIndex])) {
$personId = $personIdMap[$personType][$personIndex];
} else {
$personId = self::resolveDependentId($db, $memberId, $personType, $sub['person_name'] ?? '');
if ($personId === null) {
continue;
}
}
$sub['person_id'] = $personId;
......@@ -711,7 +717,7 @@ final class RetroactiveMembershipService
'member_id' => $memberId,
'financial_year' => $financialYear,
'person_type' => $personType,
'person_id' => $sub['person_id'] ?? $memberId,
'person_id' => (int) $sub['person_id'],
'person_name' => $sub['person_name'] ?? '',
'base_amount' => $baseAmount,
'development_fee' => $devFee,
......@@ -730,6 +736,22 @@ final class RetroactiveMembershipService
return $subId;
}
private static function resolveDependentId(\App\Core\Database $db, int $memberId, string $personType, string $personName): ?int
{
$tableMap = ['spouse' => 'spouses', 'child' => 'children', 'temporary' => 'temporary_members'];
$table = $tableMap[$personType] ?? null;
if (!$table) {
return null;
}
$row = $db->selectOne(
"SELECT id FROM `{$table}` WHERE member_id = ? AND name = ? LIMIT 1",
[$memberId, $personName]
);
return $row ? (int) $row['id'] : null;
}
private static function createRetroactiveViolation(int $memberId, array $violation): array
{
$db = App::getInstance()->db();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment