Commit 42f8a499 authored by Mahmoud Aglan's avatar Mahmoud Aglan

fix(transfers): use original membership date for separation fee calculation

When membership transfers via death/waiver, the fee calculator now uses
the original membership creation date instead of the transfer date.
Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent 3bea96d1
...@@ -862,6 +862,7 @@ class DeathController extends Controller ...@@ -862,6 +862,7 @@ class DeathController extends Controller
'transferred_from_death_id' => $caseId, 'transferred_from_death_id' => $caseId,
'original_membership_number' => $inheritedNumber, 'original_membership_number' => $inheritedNumber,
'ownership_transfer_date' => date('Y-m-d'), 'ownership_transfer_date' => date('Y-m-d'),
'membership_origin_date' => $member['membership_origin_date'] ?? $member['form_date'] ?? substr($member['created_at'], 0, 10),
'form_number' => $formData['form_number'] ?? null, 'form_number' => $formData['form_number'] ?? null,
'deceased_member_name' => $member['full_name_ar'], 'deceased_member_name' => $member['full_name_ar'],
'created_at' => date('Y-m-d H:i:s'), 'created_at' => date('Y-m-d H:i:s'),
......
...@@ -57,7 +57,7 @@ final class SeparationFeeCalculator ...@@ -57,7 +57,7 @@ final class SeparationFeeCalculator
} }
// Calculate years since acquisition // Calculate years since acquisition
$acquisitionDate = $member['created_at'] ?? $member['form_date'] ?? date('Y-m-d'); $acquisitionDate = $member['membership_origin_date'] ?? $member['form_date'] ?? $member['created_at'] ?? date('Y-m-d');
$yearsSince = self::calculateYearsSince($acquisitionDate); $yearsSince = self::calculateYearsSince($acquisitionDate);
// Get fee percentage based on years // Get fee percentage based on years
...@@ -257,7 +257,7 @@ final class SeparationFeeCalculator ...@@ -257,7 +257,7 @@ final class SeparationFeeCalculator
} }
// Elapsed years: floor from father's membership creation to effective_transfer_date // Elapsed years: floor from father's membership creation to effective_transfer_date
$acquisitionDate = $member['created_at'] ?? $member['form_date'] ?? date('Y-m-d'); $acquisitionDate = $member['membership_origin_date'] ?? $member['form_date'] ?? $member['created_at'] ?? date('Y-m-d');
$yearsSince = self::calculateYearsFloor($acquisitionDate, $effectiveTransferDate); $yearsSince = self::calculateYearsFloor($acquisitionDate, $effectiveTransferDate);
$feePercentage = self::getFeePercentageByYear($yearsSince); $feePercentage = self::getFeePercentageByYear($yearsSince);
......
...@@ -74,6 +74,7 @@ final class WaiverProcessor ...@@ -74,6 +74,7 @@ final class WaiverProcessor
'activated_at' => date('Y-m-d H:i:s'), 'activated_at' => date('Y-m-d H:i:s'),
'transferred_from_waiver_id' => $waiverId, 'transferred_from_waiver_id' => $waiverId,
'ownership_transfer_date' => date('Y-m-d'), 'ownership_transfer_date' => date('Y-m-d'),
'membership_origin_date' => $sourceMember['membership_origin_date'] ?? $sourceMember['form_date'] ?? substr($sourceMember['created_at'], 0, 10),
'waived_from_member_name' => $sourceMember['full_name_ar'] ?? null, 'waived_from_member_name' => $sourceMember['full_name_ar'] ?? null,
'updated_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'),
], '`id` = ?', [(int) $waiver['target_member_id']]); ], '`id` = ?', [(int) $waiver['target_member_id']]);
......
<?php
declare(strict_types=1);
use App\Core\Database;
return function (Database $db): void {
// Add column
$exists = $db->selectOne(
"SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'members' AND column_name = 'membership_origin_date'"
);
if (!$exists) {
$db->raw("ALTER TABLE members ADD COLUMN membership_origin_date DATE NULL COMMENT 'Original membership creation date — survives death/waiver transfers' AFTER ownership_transfer_date");
}
// Backfill: death-transferred members
$db->raw("
UPDATE members m
INNER JOIN death_cases dc ON dc.id = m.transferred_from_death_id
INNER JOIN members deceased ON deceased.id = dc.member_id
SET m.membership_origin_date = COALESCE(deceased.membership_origin_date, deceased.form_date, DATE(deceased.created_at))
WHERE m.transferred_from_death_id IS NOT NULL
AND m.membership_origin_date IS NULL
");
// Backfill: waiver-transferred members
$db->raw("
UPDATE members m
INNER JOIN waiver_requests wr ON wr.id = m.transferred_from_waiver_id
INNER JOIN members source ON source.id = wr.source_member_id
SET m.membership_origin_date = COALESCE(source.membership_origin_date, source.form_date, DATE(source.created_at))
WHERE m.transferred_from_waiver_id IS NOT NULL
AND m.membership_origin_date IS NULL
");
};
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