From 6adedc71c5d1fbeff65a601cc43703bb5e6dc35c Mon Sep 17 00:00:00 2001 From: Jan Remmer Siebels Date: Wed, 1 Oct 2025 12:36:47 +0200 Subject: [PATCH] Fix semester system: 2x yearly docs, 4x yearly payments with Q4 on Sep 15 Document Submission (twice yearly): - Q1 & Q2 documents: Due March 15 (Spring semester) - Q3 & Q4 documents: Due September 15 (Fall semester) Payment Schedule (quarterly): - Q1 payments: Due March 15 - Q2 payments: Due June 15 - Q3 payments: Due September 15 - Q4 payments: Due September 15 (aligned with Fall semester docs) This gives the desired Q4 payment due date of 15.09.2025 while maintaining quarterly payment frequency and semester-based document submissions. --- .../commands/fix_advance_payment_dates.py | 22 +++++++++---------- app/stiftung/models.py | 8 +++---- app/stiftung/views.py | 18 ++++++--------- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/app/stiftung/management/commands/fix_advance_payment_dates.py b/app/stiftung/management/commands/fix_advance_payment_dates.py index c298e94..ed73504 100644 --- a/app/stiftung/management/commands/fix_advance_payment_dates.py +++ b/app/stiftung/management/commands/fix_advance_payment_dates.py @@ -29,17 +29,17 @@ class Command(BaseCommand): self.stdout.write(f'Checking quarterly payments for {year} using advance payment schedule...') - # Define correct advance payment schedule - advance_schedule = { - f'Q1/{year}': date(year - 1, 12, 15), # Q1 paid in December of previous year - f'Q2/{year}': date(year, 3, 15), # Q2 paid in March of same year - f'Q3/{year}': date(year, 6, 15), # Q3 paid in June of same year - f'Q4/{year}': date(year, 9, 15), # Q4 paid in September of same year + # Define correct quarterly payment schedule + quarterly_schedule = { + f'Q1/{year}': date(year, 3, 15), # Q1 payment due March 15 + f'Q2/{year}': date(year, 6, 15), # Q2 payment due June 15 + f'Q3/{year}': date(year, 9, 15), # Q3 payment due September 15 + f'Q4/{year}': date(year, 9, 15), # Q4 payment due September 15 (semester alignment) } total_fixed = 0 - for quarter_desc, correct_date in advance_schedule.items(): + for quarter_desc, correct_date in quarterly_schedule.items(): # Find payments for this quarter that have wrong dates wrong_payments = DestinataerUnterstuetzung.objects.filter( beschreibung__icontains=quarter_desc @@ -81,9 +81,9 @@ class Command(BaseCommand): self.style.SUCCESS(f'\n✅ Successfully fixed {total_fixed} payment due dates') ) - # Show the advance payment schedule - self.stdout.write(f'\nAdvance Payment Schedule for {year}:') - for quarter_desc, due_date in advance_schedule.items(): + # Show the quarterly payment schedule + self.stdout.write(f'\nQuarterly Payment Schedule for {year}:') + for quarter_desc, due_date in quarterly_schedule.items(): self.stdout.write(f' {quarter_desc}: Due {due_date.strftime("%B %d, %Y")}') # Check for other years that might need fixing @@ -91,7 +91,7 @@ class Command(BaseCommand): other_year_payments = DestinataerUnterstuetzung.objects.filter( beschreibung__regex=r'Q[1-4]/202[6-9]' ).exclude( - faellig_am__in=[date(2024, 12, 15), date(2026, 3, 15), date(2026, 6, 15), date(2026, 9, 15)] + faellig_am__in=[date(2026, 3, 15), date(2026, 6, 15), date(2026, 9, 15), date(2026, 9, 15)] ).count() if other_year_payments > 0: diff --git a/app/stiftung/models.py b/app/stiftung/models.py index 93b4a57..341e85b 100644 --- a/app/stiftung/models.py +++ b/app/stiftung/models.py @@ -2752,10 +2752,10 @@ class VierteljahresNachweis(models.Model): if not self.faelligkeitsdatum: from datetime import date quarter_deadlines = { - 1: date(self.jahr, 3, 15), # Q1 deadline: March 15 (covers Q1+Q2 semester) - 2: date(self.jahr, 6, 15), # Q2 deadline: June 15 (auto-approved if Q1 complete) - 3: date(self.jahr, 9, 15), # Q3 deadline: September 15 (covers Q3+Q4 semester) - 4: date(self.jahr, 12, 15), # Q4 deadline: December 15 (auto-approved if Q3 complete) + 1: date(self.jahr, 3, 15), # Q1 deadline: March 15 (Spring semester) + 2: date(self.jahr, 3, 15), # Q2 deadline: March 15 (Spring semester, same as Q1) + 3: date(self.jahr, 9, 15), # Q3 deadline: September 15 (Fall semester) + 4: date(self.jahr, 9, 15), # Q4 deadline: September 15 (Fall semester, same as Q3) } self.faelligkeitsdatum = quarter_deadlines.get(self.quartal) diff --git a/app/stiftung/views.py b/app/stiftung/views.py index 4f19317..0799b5a 100644 --- a/app/stiftung/views.py +++ b/app/stiftung/views.py @@ -7533,20 +7533,16 @@ def create_quarterly_support_payment(nachweis): if not default_konto: return None - # Calculate payment due date (advance payment schedule) - # Payments are made in advance according to semester schedule: - # September 15: Payment for Q4 of current year - # December 15: Payment for Q1 of next year - # March 15: Payment for Q2 of current year - # June 15: Payment for Q3 of current year + # Calculate payment due date (quarterly payments with Q4 aligned to semester) + # Q1: March 15, Q2: June 15, Q3: September 15, Q4: September 15 - if nachweis.quartal == 1: # Q1 payment due December 15 of previous year - payment_due_date = date(nachweis.jahr - 1, 12, 15) - elif nachweis.quartal == 2: # Q2 payment due March 15 of same year + if nachweis.quartal == 1: # Q1 payment due March 15 payment_due_date = date(nachweis.jahr, 3, 15) - elif nachweis.quartal == 3: # Q3 payment due June 15 of same year + elif nachweis.quartal == 2: # Q2 payment due June 15 payment_due_date = date(nachweis.jahr, 6, 15) - else: # Q4 payment due September 15 of same year + elif nachweis.quartal == 3: # Q3 payment due September 15 + payment_due_date = date(nachweis.jahr, 9, 15) + else: # Q4 payment due September 15 (same as Q3 for semester alignment) payment_due_date = date(nachweis.jahr, 9, 15) # Create the support payment