diff --git a/src/pdf_filler.py b/src/pdf_filler.py index a4499d8..627afc5 100644 --- a/src/pdf_filler.py +++ b/src/pdf_filler.py @@ -59,6 +59,8 @@ def build_field_dict( datum_field: creation_date.strftime("%d.%m.%Y"), } + pauschale_5_count: int = 0 + for idx, entry in enumerate(attendance.entries): fields[f"datum.{idx}"] = entry.date_german() fields[f"anwesend.{idx}"] = entry.status @@ -69,6 +71,7 @@ def build_field_dict( # Pauschale only if actual hours >= planned threshold if entry.hours is not None and entry.hours >= plan_threshold: fields[f"{pauschale_prefix}.{idx}"] = pauschale_present_value + pauschale_5_count += 1 else: fields[f"{pauschale_prefix}.{idx}"] = "0" else: @@ -76,6 +79,13 @@ def build_field_dict( fields[f"plan.{idx}"] = "" fields[f"{pauschale_prefix}.{idx}"] = "0" + # Summary fields (replicate PDF JavaScript calculations) + pauschale_5_euro = pauschale_5_count * 8.6 + fields["pauschale_5_sum"] = f"{pauschale_5_euro:.2f}".replace(".", ",") + fields["pauschale_25_sum"] = "0,00" + fields["pauschale_sum"] = f"{pauschale_5_euro:.2f}".replace(".", ",") + fields["anwesend_sum"] = str(pauschale_5_count) + return fields diff --git a/tests/test_pdf_filler.py b/tests/test_pdf_filler.py index 4dfef80..9c69d9d 100644 --- a/tests/test_pdf_filler.py +++ b/tests/test_pdf_filler.py @@ -165,6 +165,43 @@ class TestMultiRow: assert "datum.23" not in fields +# --------------------------------------------------------------------------- +# Summary fields +# --------------------------------------------------------------------------- + +class TestSummaryFields: + def test_anwesend_sum_counts_qualifying_days(self, cfg): + """anwesend_sum = number of days where hours >= plan threshold.""" + entries = [_present(1, 6.0), _present(2, 7.0), _present(3, 5.0)] + fields = build_field_dict(_make_attendance(*entries), cfg, date(2026, 2, 1)) + # Day 1 (6h) and day 2 (7h) qualify, day 3 (5h) does not + assert fields["anwesend_sum"] == "2" + + def test_pauschale_5_sum_euro(self, cfg): + """pauschale_5_sum = qualifying days * 8,60.""" + entries = [_present(1, 6.0), _present(2, 7.0), _present(3, 5.0)] + fields = build_field_dict(_make_attendance(*entries), cfg, date(2026, 2, 1)) + assert fields["pauschale_5_sum"] == "17,20" # 2 * 8.60 + + def test_pauschale_sum_equals_5_sum(self, cfg): + entries = [_present(1, 6.0)] + fields = build_field_dict(_make_attendance(*entries), cfg, date(2026, 2, 1)) + assert fields["pauschale_sum"] == "8,60" + assert fields["pauschale_25_sum"] == "0,00" + + def test_no_qualifying_days(self, cfg): + entries = [_absent(1, "K"), _present(2, 4.0)] + fields = build_field_dict(_make_attendance(*entries), cfg, date(2026, 2, 1)) + assert fields["anwesend_sum"] == "0" + assert fields["pauschale_5_sum"] == "0,00" + assert fields["pauschale_sum"] == "0,00" + + def test_empty_attendance(self, cfg): + fields = build_field_dict(_make_attendance(), cfg, date(2026, 2, 1)) + assert fields["anwesend_sum"] == "0" + assert fields["pauschale_5_sum"] == "0,00" + + # --------------------------------------------------------------------------- # Hours formatting # ---------------------------------------------------------------------------