Summenfelder berechnen: Anwesenheitstage, Pauschale 8,60-Summe, Gesamtpauschale
This commit is contained in:
1 parent
ebd67c7be1
commit
4001bb78f5
2 files changed
+47
No files matched your search
@@ -59,6 +59,8 @@ def build_field_dict(
|
|||||||
datum_field: creation_date.strftime("%d.%m.%Y"),
|
datum_field: creation_date.strftime("%d.%m.%Y"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pauschale_5_count: int = 0
|
||||||
|
|
||||||
for idx, entry in enumerate(attendance.entries):
|
for idx, entry in enumerate(attendance.entries):
|
||||||
fields[f"datum.{idx}"] = entry.date_german()
|
fields[f"datum.{idx}"] = entry.date_german()
|
||||||
fields[f"anwesend.{idx}"] = entry.status
|
fields[f"anwesend.{idx}"] = entry.status
|
||||||
@@ -69,6 +71,7 @@ def build_field_dict(
|
|||||||
# Pauschale only if actual hours >= planned threshold
|
# Pauschale only if actual hours >= planned threshold
|
||||||
if entry.hours is not None and entry.hours >= plan_threshold:
|
if entry.hours is not None and entry.hours >= plan_threshold:
|
||||||
fields[f"{pauschale_prefix}.{idx}"] = pauschale_present_value
|
fields[f"{pauschale_prefix}.{idx}"] = pauschale_present_value
|
||||||
|
pauschale_5_count += 1
|
||||||
else:
|
else:
|
||||||
fields[f"{pauschale_prefix}.{idx}"] = "0"
|
fields[f"{pauschale_prefix}.{idx}"] = "0"
|
||||||
else:
|
else:
|
||||||
@@ -76,6 +79,13 @@ def build_field_dict(
|
|||||||
fields[f"plan.{idx}"] = ""
|
fields[f"plan.{idx}"] = ""
|
||||||
fields[f"{pauschale_prefix}.{idx}"] = "0"
|
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
|
return fields
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -165,6 +165,43 @@ class TestMultiRow:
|
|||||||
assert "datum.23" not in fields
|
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
|
# Hours formatting
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in new issue
Block a user