feat: add member address and SEPA data

This commit is contained in:
Marcel Peterkau
2026-06-21 22:14:45 +02:00
parent 0622a22794
commit 6c7bf63280
12 changed files with 362 additions and 10 deletions
+66
View File
@@ -168,3 +168,69 @@ def test_invalid_member_number_patterns_are_rejected(pattern) -> None:
def test_member_number_formatter_supports_padding_and_year() -> None:
assert format_member_number("CCMA-{year}-{number:05d}", 42, year=2026) == "CCMA-2026-00042"
def test_member_address_and_sepa_data_are_structured_and_audited_without_values(tmp_path) -> None:
repository = MemberRepository(tmp_path)
repository.initialize()
member = repository.create_member(first_name="Bank", last_name="Member", phone="0621 12345")
member.street = "Teststraße 23"
member.postal_code = "68159"
member.city = "Mannheim"
member.account_holder = "Bank Member"
member.iban = "DE89 3704 0044 0532 0130 00"
member.bic = "COBADEFFXXX"
member.mandate_reference = "CCMA-M-42"
member.mandate_signed_at = "21.06.2026"
member.mandate_active = True
repository.save_member(member)
loaded = repository.get_member(member.member_id)
assert loaded.iban == "DE89370400440532013000"
assert loaded.mandate_signed_at == "2026-06-21"
raw = json.loads((repository.members_root / member.member_id / "member.json").read_text())
assert raw["address"]["city"] == "Mannheim"
assert raw["banking"]["mandate_active"] is True
event = repository.get_events(member.member_id)[-1]
assert "IBAN" in event.summary
assert loaded.iban not in event.summary
assert loaded.street not in event.summary
def test_active_sepa_mandate_requires_valid_complete_data(tmp_path) -> None:
repository = MemberRepository(tmp_path)
repository.initialize()
member = repository.create_member(first_name="Invalid", last_name="Mandate")
member.iban = "DE001234"
with pytest.raises(RepositoryError, match="IBAN"):
repository.save_member(member)
member.iban = "DE89370400440532013000"
member.mandate_active = True
with pytest.raises(RepositoryError, match="aktives Lastschriftmandat"):
repository.save_member(member)
def test_organization_sender_data_is_stored_centrally(tmp_path) -> None:
repository = MemberRepository(tmp_path)
repository.initialize()
repository.save_organization(
{
"name": "Chaos Computer Club Mannheim e.V.",
"street": "Testweg 1",
"postal_code": "68159",
"city": "Mannheim",
"country": "Deutschland",
"email": "vorstand@example.org",
"phone": "",
"website": "https://example.org",
"iban": "DE89370400440532013000",
"bic": "COBADEFFXXX",
"creditor_id": "DE98ZZZ09999999999",
}
)
organization = repository.get_configuration()["organization"]
assert organization["street"] == "Testweg 1"
assert organization["iban"] == "DE89370400440532013000"