feat: extend inventory and administration workflows

This commit is contained in:
Marcel Peterkau
2026-07-22 22:26:02 +02:00
parent aeaaca1459
commit 070684d9bc
17 changed files with 1342 additions and 69 deletions
+6
View File
@@ -117,18 +117,24 @@ def validate_member_dates(
birth_date: str,
accepted_at: str = "",
membership_started_at: str = "",
membership_ended_at: str = "",
today: date | None = None,
) -> None:
reference = today or date.today()
birth = validate_birth_date(birth_date, today=reference)
accepted = _validate_not_future(accepted_at, "Aufnahmebeschluss", reference)
started = _validate_not_future(membership_started_at, "Mitglied seit", reference)
ended = parse_iso_date(membership_ended_at, "Austrittsdatum")
if birth and accepted and accepted < birth:
raise DateValidationError("Aufnahmebeschluss darf nicht vor dem Geburtsdatum liegen.")
if birth and started and started < birth:
raise DateValidationError("Mitgliedschaft darf nicht vor dem Geburtsdatum beginnen.")
if accepted and started and started < accepted:
raise DateValidationError("Mitgliedschaft darf nicht vor dem Aufnahmebeschluss beginnen.")
if started and ended and ended < started:
raise DateValidationError("Austrittsdatum darf nicht vor dem Mitgliedschaftsbeginn liegen.")
if accepted and ended and ended < accepted:
raise DateValidationError("Austrittsdatum darf nicht vor dem Aufnahmebeschluss liegen.")
def calculate_age(birth_date: date, on_date: date | None = None) -> int:
+45
View File
@@ -27,6 +27,19 @@ ASSET_STATUS_LABELS = {
"retired": "AUSGEMUSTERT",
}
ASSET_OWNER_TYPE_LABELS = {
"club": "VEREIN",
"member": "MITGLIED",
"external": "EXTERN",
}
ASSET_CUSTODY_TYPE_LABELS = {
"club": "VEREIN",
"member": "MITGLIED",
"external": "EXTERN",
"unknown": "UNBEKANNT",
}
HOUSEKEEPER_MEMBER_FIELD_LABELS = {
"nickname": "Nickname",
"email": "E-Mail-Adresse",
@@ -77,6 +90,7 @@ class Member:
status: str = "application"
accepted_at: str = ""
membership_started_at: str = ""
membership_ended_at: str = ""
payment_frequency: str = "annual"
contribution_rule_id: str = "standard-2022"
honorary: bool = False
@@ -122,6 +136,7 @@ class Member:
"status": self.status,
"accepted_at": self.accepted_at,
"started_at": self.membership_started_at,
"ended_at": self.membership_ended_at,
"honorary": self.honorary,
},
"contribution_profile": {
@@ -165,6 +180,7 @@ class Member:
status=str(membership.get("status", "application")),
accepted_at=str(membership.get("accepted_at", "")),
membership_started_at=str(membership.get("started_at", "")),
membership_ended_at=str(membership.get("ended_at", "")),
honorary=bool(membership.get("honorary", False)),
contribution_rule_id=str(contribution.get("rule_id", "standard-2022")),
payment_frequency=str(contribution.get("payment_frequency", "annual")),
@@ -183,6 +199,14 @@ class Asset:
serial_number: str = ""
status: str = "available"
current_holder_member_id: str = ""
owner_type: str = "club"
owner_member_id: str = ""
owner_name: str = ""
custody_type: str = "club"
location: str = ""
handed_over_at: str = ""
condition: str = ""
estimated_value: str = ""
deposit_amount_default: str = "0.00"
notes: str = ""
created_at: str = field(default_factory=_iso_now)
@@ -199,6 +223,14 @@ class Asset:
"serial_number": self.serial_number,
"status": self.status,
"current_holder_member_id": self.current_holder_member_id,
"owner_type": self.owner_type,
"owner_member_id": self.owner_member_id,
"owner_name": self.owner_name,
"custody_type": self.custody_type,
"location": self.location,
"handed_over_at": self.handed_over_at,
"condition": self.condition,
"estimated_value": self.estimated_value,
"deposit_amount_default": self.deposit_amount_default,
"notes": self.notes,
"created_at": self.created_at,
@@ -216,6 +248,19 @@ class Asset:
serial_number=str(data.get("serial_number", "")),
status=str(data.get("status", "available")),
current_holder_member_id=str(data.get("current_holder_member_id", "")),
owner_type=str(data.get("owner_type", "club")),
owner_member_id=str(data.get("owner_member_id", "")),
owner_name=str(data.get("owner_name", "")),
custody_type=str(
data.get(
"custody_type",
"member" if data.get("current_holder_member_id") else "club",
)
),
location=str(data.get("location", "")),
handed_over_at=str(data.get("handed_over_at", "")),
condition=str(data.get("condition", "")),
estimated_value=str(data.get("estimated_value", "")),
deposit_amount_default=str(data.get("deposit_amount_default", "0.00")),
notes=str(data.get("notes", "")),
created_at=str(data.get("created_at", _iso_now())),