fix: preflight member records before rules

This commit is contained in:
Marcel Peterkau
2026-06-21 17:54:09 +02:00
parent 55bc3b666e
commit 7596e47981
10 changed files with 163 additions and 44 deletions
+44 -7
View File
@@ -10,7 +10,7 @@ from pathlib import Path
from typing import Any
from uuid import uuid4
from ccma.domain.models import ContributionData, HousekeeperFinding
from ccma.domain.models import HousekeeperFinding
from ccma.rules.api import RuleAction, RuleContext
from ccma.rules.loader import LoadedRule, load_rules
from ccma.services.intervals import AnniversaryInterval, parse_anniversary_intervals
@@ -67,13 +67,14 @@ class Housekeeper:
rules = load_rules(self.repository.root)
repository_config = self.repository.get_configuration()
for member in self.repository.list_members():
for member_id in self.repository.list_member_ids():
try:
contributions = self.repository.get_contributions(member.member_id)
contributions_error = None
member, contributions = self.repository.preflight_member_record(member_id)
except RepositoryError as exc:
contributions = ContributionData()
contributions_error = str(exc)
self._refresh_record_integrity_task(items, member_id, str(exc), run_id, now)
successful_scopes.add(("member-record-check", member_id))
continue
successful_scopes.add(("member-record-check", member_id))
for rule in rules:
scope = (rule.rule_id, member.member_id)
try:
@@ -83,7 +84,6 @@ class Housekeeper:
today=current_date,
settings=self.settings,
repository_config=repository_config,
contributions_error=contributions_error,
)
actions = rule.evaluate(context)
if not isinstance(actions, list):
@@ -126,6 +126,43 @@ class Housekeeper:
write_json_atomic(self.state_path, working)
return _open_findings(working["items"])
@staticmethod
def _refresh_record_integrity_task(
items: dict[str, dict[str, Any]],
member_id: str,
detail: str,
run_id: str,
now: str,
) -> None:
key = f"member-record-check:{member_id}:invalid-record"
item = items.get(key, {})
was_resolved = item.get("status") == "resolved"
item.update(
{
"key": key,
"rule_id": "member-record-check",
"rule_file": "<preflight>",
"rule_source": "housekeeper",
"member_id": member_id,
"action": "task",
"status": "open",
"severity": "error",
"code": "invalid_member_record",
"title": f"Mitgliederakte {member_id}: Daten beschädigt",
"detail": f"{detail}. Für diese Akte wurden keine Regeln ausgeführt.",
"due_date": None,
"first_seen_run": item.get("first_seen_run", run_id),
"first_seen_at": item.get("first_seen_at", now),
"last_seen_run": run_id,
"last_seen_at": now,
"seen_count": int(item.get("seen_count", 0)) + 1,
"reopened_count": int(item.get("reopened_count", 0)) + (1 if was_resolved else 0),
"resolved_run": None,
"resolved_at": None,
}
)
items[key] = item
def _apply_action(
self,
items: dict[str, dict[str, Any]],