mirror of
https://git.hiabuto.net/C3MA/CCMA.git
synced 2026-08-24 22:45:18 +02:00
feat: add per-member payment frequencies
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import json
|
||||
import shutil
|
||||
from datetime import date
|
||||
from decimal import Decimal
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -96,6 +97,43 @@ def test_housekeeper_claim_actions_are_idempotent(tmp_path) -> None:
|
||||
assert state["last_completed_run"] == "2026-04-15:000002"
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("frequency", "expected_suffixes", "expected_amount"),
|
||||
[
|
||||
("monthly", [f"month-{month:02d}" for month in range(1, 13)], "12.50"),
|
||||
("quarterly", [f"quarter-{quarter}" for quarter in range(1, 5)], "37.50"),
|
||||
("semiannual", ["first-half", "second-half"], "75.00"),
|
||||
("annual", ["annual"], "150.00"),
|
||||
],
|
||||
)
|
||||
def test_housekeeper_creates_claims_for_each_payment_frequency(
|
||||
tmp_path, frequency, expected_suffixes, expected_amount
|
||||
) -> None:
|
||||
repository = MemberRepository(tmp_path)
|
||||
repository.initialize()
|
||||
member = repository.create_member(
|
||||
first_name=frequency,
|
||||
last_name="Frequency",
|
||||
birth_date="1990-01-01",
|
||||
)
|
||||
member.status = "active"
|
||||
member.accepted_at = "2026-01-01"
|
||||
member.membership_started_at = "2026-01-01"
|
||||
member.payment_frequency = frequency
|
||||
repository.save_member(member)
|
||||
|
||||
Housekeeper(repository).run(today=date(2026, 12, 31))
|
||||
|
||||
membership_claims = [
|
||||
claim
|
||||
for claim in repository.get_contributions(member.member_id).claims
|
||||
if claim.get("type") == "membership_fee"
|
||||
]
|
||||
assert [claim["claim_key"].rsplit(":", 1)[-1] for claim in membership_claims] == expected_suffixes
|
||||
assert {claim["amount"] for claim in membership_claims} == {expected_amount}
|
||||
assert sum(Decimal(claim["amount"]) for claim in membership_claims) == Decimal("150.00")
|
||||
|
||||
|
||||
def test_housekeeper_creates_membership_claims_retroactively_since_entry(tmp_path) -> None:
|
||||
repository = MemberRepository(tmp_path)
|
||||
repository.initialize()
|
||||
@@ -103,6 +141,7 @@ def test_housekeeper_creates_membership_claims_retroactively_since_entry(tmp_pat
|
||||
member.status = "active"
|
||||
member.accepted_at = "2024-04-15"
|
||||
member.membership_started_at = "2024-04-15"
|
||||
member.payment_frequency = "annual"
|
||||
repository.save_member(member)
|
||||
|
||||
settings = housekeeper_module.HousekeeperSettings.from_values(
|
||||
@@ -138,6 +177,7 @@ def test_housekeeper_uses_pre_2022_contribution_amounts_for_legacy_years(tmp_pat
|
||||
member.status = "active"
|
||||
member.accepted_at = "2021-04-15"
|
||||
member.membership_started_at = "2021-04-15"
|
||||
member.payment_frequency = "annual"
|
||||
repository.save_member(member)
|
||||
|
||||
settings = housekeeper_module.HousekeeperSettings.from_values(
|
||||
@@ -165,6 +205,7 @@ def test_housekeeper_does_not_create_retroactive_membership_claims_by_default(tm
|
||||
member.status = "active"
|
||||
member.accepted_at = "2024-04-15"
|
||||
member.membership_started_at = "2024-04-15"
|
||||
member.payment_frequency = "annual"
|
||||
repository.save_member(member)
|
||||
|
||||
Housekeeper(repository).run(today=date(2026, 6, 21))
|
||||
@@ -185,6 +226,7 @@ def test_housekeeper_does_not_create_claims_due_after_membership_end(tmp_path) -
|
||||
member.accepted_at = "2024-01-01"
|
||||
member.membership_started_at = "2024-01-01"
|
||||
member.membership_ended_at = "2026-12-31"
|
||||
member.payment_frequency = "annual"
|
||||
repository.save_member(member)
|
||||
|
||||
Housekeeper(repository).run(today=date(2026, 6, 21))
|
||||
|
||||
Reference in New Issue
Block a user