Enhancements
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Query script to get active primary members who did NOT pay in 2026
|
||||
"""
|
||||
|
||||
import sys
|
||||
from datetime import datetime
|
||||
sys.path.insert(0, '/var/git/SUST/sustApp')
|
||||
|
||||
from sqlalchemy import text
|
||||
from models.database import SessionLocal
|
||||
|
||||
def get_non_paying_active_primary_2026():
|
||||
"""Get active primary members who did not pay in 2026"""
|
||||
session = SessionLocal()
|
||||
try:
|
||||
query = text("""
|
||||
SELECT m.id, m.member_firstname, m.member_surname, m.member_email,
|
||||
m.member_membership_start, m.member_count,
|
||||
MAX(p.payment_date) as last_payment_date,
|
||||
MAX(EXTRACT(YEAR FROM p.payment_year)) as last_payment_year
|
||||
FROM members m
|
||||
LEFT JOIN payments p ON m.id = p.member_id
|
||||
WHERE m.member_active = true
|
||||
AND m.member_died IS NULL
|
||||
AND m.member_primary = true
|
||||
AND m.id NOT IN (
|
||||
SELECT DISTINCT member_id
|
||||
FROM payments
|
||||
WHERE EXTRACT(YEAR FROM payment_year) = 2026
|
||||
)
|
||||
GROUP BY m.id, m.member_firstname, m.member_surname, m.member_email,
|
||||
m.member_membership_start, m.member_count
|
||||
ORDER BY m.member_count DESC, m.member_surname, m.member_firstname
|
||||
""")
|
||||
result = session.execute(query).fetchall()
|
||||
return result
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
def print_non_paying_members(data):
|
||||
"""Print active primary members who did not pay in 2026"""
|
||||
if not data:
|
||||
print("No non-paying members found.")
|
||||
return
|
||||
|
||||
print("\n" + "="*150)
|
||||
print(f"ACTIVE PRIMARY MEMBERS WHO DID NOT PAY IN 2026")
|
||||
print(f"Total: {len(data)} members")
|
||||
print("="*150)
|
||||
print(f"{'#':<4} {'Member Cnt':<12} {'First Name':<20} {'Surname':<25} {'Email':<40} {'Member Since':<15} {'Last Payment':<15} {'Last Yr':<10}")
|
||||
print("-"*150)
|
||||
|
||||
total_people = 0
|
||||
count_by_member_count = {}
|
||||
|
||||
for idx, row in enumerate(data, 1):
|
||||
firstname = row[1] or ""
|
||||
surname = row[2] or ""
|
||||
email = row[3] or "N/A"
|
||||
member_since = row[4].strftime("%Y-%m-%d") if row[4] else "N/A"
|
||||
member_count = row[5] or 1
|
||||
last_payment = row[6].strftime("%Y-%m-%d") if row[6] else "Never"
|
||||
last_year = int(row[7]) if row[7] else 0
|
||||
|
||||
total_people += member_count
|
||||
count_by_member_count[member_count] = count_by_member_count.get(member_count, 0) + 1
|
||||
|
||||
print(f"{idx:<4} {member_count:<12} {firstname:<20} {surname:<25} {email:<40} {member_since:<15} {last_payment:<15} {last_year:<10}")
|
||||
|
||||
print("-"*150)
|
||||
print(f"Total non-paying active primary members: {len(data)}")
|
||||
print(f"Total people represented: {total_people}")
|
||||
print(f"\nBreakdown by member count:")
|
||||
for count in sorted(count_by_member_count.keys(), reverse=True):
|
||||
num_households = count_by_member_count[count]
|
||||
num_people = count * num_households
|
||||
print(f" - Member count {count}: {num_households} household(s) representing {num_people} people")
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("Querying SUST database for active primary members who did not pay in 2026...")
|
||||
|
||||
non_paying = get_non_paying_active_primary_2026()
|
||||
print_non_paying_members(non_paying)
|
||||
|
||||
print("\n" + "="*140 + "\n")
|
||||
Reference in New Issue
Block a user