Commit 044de3a2 authored by Mahmoud Aglan's avatar Mahmoud Aglan

fix(subscriptions): skip renewal for dependents added after FY start

Children, spouses, and temporary members added on or after July 1st of
the financial year already have their annual subscription included in
the addition fee. The generator now excludes them from batch renewal
generation for that year to avoid double-charging.
Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent 0cc510ee
......@@ -60,6 +60,10 @@ final class SubscriptionGenerator
$members = $db->select("SELECT m.id, m.full_name_ar, m.membership_number FROM members m WHERE {$memberWhere}", $memberParams);
// FY start date: dependents added on/after this date already paid their subscription via addition fee
$fyStartYear = (int) ($yearParts[0] ?? date('Y'));
$fyStartDate = $fyStartYear . '-07-01';
$created = 0;
$skipped = 0;
......@@ -97,9 +101,9 @@ final class SubscriptionGenerator
if (str_contains($e->getMessage(), 'Duplicate entry')) { $skipped++; continue; } else { throw $e; }
}
// Spouses — NO dev fee
// Spouses — NO dev fee; skip if added on/after FY start (subscription included in addition fee)
if ($db->tableExists('spouses')) {
$spouses = $db->select("SELECT id, full_name_ar FROM spouses WHERE member_id = ? AND is_archived = 0 AND status = 'active'", [$memberId]);
$spouses = $db->select("SELECT id, full_name_ar FROM spouses WHERE member_id = ? AND is_archived = 0 AND status = 'active' AND created_at < ?", [$memberId, $fyStartDate]);
foreach ($spouses as $sp) {
$existingSp = $db->selectOne(
"SELECT id FROM subscriptions WHERE member_id = ? AND financial_year = ? AND person_type = 'spouse' AND person_id = ?",
......@@ -131,9 +135,9 @@ final class SubscriptionGenerator
}
}
// Children — NO dev fee
// Children — NO dev fee; skip if added on/after FY start (subscription included in addition fee)
if ($db->tableExists('children')) {
$children = $db->select("SELECT id, full_name_ar FROM children WHERE member_id = ? AND is_archived = 0 AND status = 'active'", [$memberId]);
$children = $db->select("SELECT id, full_name_ar FROM children WHERE member_id = ? AND is_archived = 0 AND status = 'active' AND created_at < ?", [$memberId, $fyStartDate]);
foreach ($children as $ch) {
$existingCh = $db->selectOne(
"SELECT id FROM subscriptions WHERE member_id = ? AND financial_year = ? AND person_type = 'child' AND person_id = ?",
......@@ -165,9 +169,9 @@ final class SubscriptionGenerator
}
}
// Temporary members — NO dev fee
// Temporary members — NO dev fee; skip if added on/after FY start (subscription included in addition fee)
if ($db->tableExists('temporary_members')) {
$temps = $db->select("SELECT id, full_name_ar FROM temporary_members WHERE member_id = ? AND is_archived = 0 AND status = 'active'", [$memberId]);
$temps = $db->select("SELECT id, full_name_ar FROM temporary_members WHERE member_id = ? AND is_archived = 0 AND status = 'active' AND created_at < ?", [$memberId, $fyStartDate]);
foreach ($temps as $t) {
$existingTmp = $db->selectOne(
"SELECT id FROM subscriptions WHERE member_id = ? AND financial_year = ? AND person_type = 'temporary' AND person_id = ?",
......
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