From 276e18a9c8bc05a88b8afea6a7a3e41509502606 Mon Sep 17 00:00:00 2001 From: Jan Novak Date: Tue, 24 Mar 2026 10:41:45 +0100 Subject: [PATCH] feat: Show attendance breakdown for single-visit junior fees When a junior attended only once in a month (fee = "?"), the dashboard cells now display the attendance details (e.g., "? (1:1J)") instead of a bare "?". Applied to both /juniors and /reconcile-juniors routes. Co-Authored-By: Claude Opus 4.6 --- app.py | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/app.py b/app.py index 18541ad..1a99d31 100644 --- a/app.py +++ b/app.py @@ -582,7 +582,7 @@ def juniors_view(): if expected == "?" or (isinstance(expected, int) and expected > 0): if expected == "?": status = "empty" - cell_text = "?" + cell_text = f"?{count_str}" elif paid >= expected: status = "ok" cell_text = f"{paid}/{fee_display}" @@ -705,6 +705,8 @@ def reconcile_juniors_view(): # Filter to juniors for the main table junior_names = sorted([name for name, tier, _ in adapted_members]) + junior_members_dict_rc = {name: fees_dict for name, _, fees_dict in junior_members} + formatted_results = [] for name in junior_names: data = result["members"][name] @@ -714,15 +716,32 @@ def reconcile_juniors_view(): mdata = data["months"].get(m, {"expected": 0, "original_expected": 0, "paid": 0}) expected = mdata["expected"] paid = int(mdata["paid"]) - + + orig_fee_data = junior_members_dict_rc.get(name, {}).get(m) + adult_count = 0 + junior_count = 0 + att_count = 0 + if orig_fee_data and len(orig_fee_data) == 4: + _, att_count, adult_count, junior_count = orig_fee_data + + breakdown = "" + if adult_count > 0 and junior_count > 0: + breakdown = f":{junior_count}J,{adult_count}A" + elif junior_count > 0: + breakdown = f":{junior_count}J" + elif adult_count > 0: + breakdown = f":{adult_count}A" + + count_str = f" ({att_count}{breakdown})" if att_count > 0 else "" + status = "empty" cell_text = "-" amount_to_pay = 0 - + if expected == "?" or (isinstance(expected, int) and expected > 0): if expected == "?": status = "empty" - cell_text = "?" + cell_text = f"?{count_str}" elif paid >= expected: status = "ok" cell_text = "OK"