fix: Status-Engine berücksichtigt Abstimmungsergebnisse

- Neue Funktion _get_beschluss_from_abstimmungen() als Fallback
- Wenn beratungen.ergebnis leer, wird abstimmungen.ergebnis geprüft
- Betrifft Anträge (beschlossen/abgelehnt) + Anfragen (Kenntnisnahme)
- Löst Problem: 2.008 Ketten waren in_beratung obwohl Abstimmung beschlossen zeigte
This commit is contained in:
Dotty Dotter 2026-04-02 15:14:50 +02:00
parent 0e7aa065e5
commit 1c35e494d0

View File

@ -65,6 +65,12 @@ def _status_anfrage(
for b in beratungen for b in beratungen
) )
# Fallback: Check abstimmungen for Kenntnisnahme
if not has_kenntnisnahme:
abst = _get_beschluss_from_abstimmungen(conn, member_ids)
if abst:
has_kenntnisnahme = True
# Check KI-Match score for Antwort # Check KI-Match score for Antwort
ki_score = _get_ki_score(conn, ursprung_id, "antwort_match") ki_score = _get_ki_score(conn, ursprung_id, "antwort_match")
@ -138,10 +144,18 @@ def _status_antrag(
berichte = [m for m in members if m["typ"] == "bericht"] berichte = [m for m in members if m["typ"] == "bericht"]
has_bericht = len(berichte) > 0 has_bericht = len(berichte) > 0
# Determine beschluss from beratungen # Determine beschluss from beratungen + abstimmungen
beschluss = _get_beschluss(beratungen) beschluss = _get_beschluss(beratungen)
beschluss_details = _get_beschluss_details(beratungen) beschluss_details = _get_beschluss_details(beratungen)
# Fallback: Check abstimmungen if beratungen don't show a decision
if not beschluss or beschluss not in ("angenommen", "abgelehnt", "verwiesen"):
abst_beschluss = _get_beschluss_from_abstimmungen(conn, member_ids)
if abst_beschluss:
beschluss = abst_beschluss["beschluss"]
if not beschluss_details:
beschluss_details = abst_beschluss["details"]
if beschluss == "abgelehnt": if beschluss == "abgelehnt":
return {"status": "abgelehnt", "status_seit": _latest_date(beratungen), "vertagungen_count": vertagungen, return {"status": "abgelehnt", "status_seit": _latest_date(beratungen), "vertagungen_count": vertagungen,
"begruendung": f"In Beratung abgelehnt. {beschluss_details}"} "begruendung": f"In Beratung abgelehnt. {beschluss_details}"}
@ -293,3 +307,31 @@ def _get_beschluss(beratungen: list[sqlite3.Row]) -> str | None:
return "angenommen" return "angenommen"
return None return None
def _get_beschluss_from_abstimmungen(conn: sqlite3.Connection, member_ids: list[int]) -> dict | None:
"""Check abstimmungen table for a decision when beratungen don't have one."""
if not member_ids:
return None
placeholders = ",".join("?" * len(member_ids))
rows = conn.execute(
f"""SELECT ergebnis, sitzung_datum FROM abstimmungen
WHERE vorlage_id IN ({placeholders}) AND ergebnis IS NOT NULL
ORDER BY sitzung_datum DESC NULLS LAST""",
member_ids,
).fetchall()
for r in rows:
ergebnis = (r["ergebnis"] or "").lower()
datum = r["sitzung_datum"] or "?"
if "abgelehnt" in ergebnis:
return {"beschluss": "abgelehnt", "details": f"Abstimmung: abgelehnt ({datum})"}
if any(kw in ergebnis for kw in ("beschlossen", "angenommen", "zugestimmt")):
return {"beschluss": "angenommen", "details": f"Abstimmung: {r['ergebnis']} ({datum})"}
if "kenntnis" in ergebnis:
return {"beschluss": "angenommen", "details": f"Abstimmung: {r['ergebnis']} ({datum})"}
if "vertagt" in ergebnis:
continue
if "verwiesen" in ergebnis:
return {"beschluss": "verwiesen", "details": f"Abstimmung: verwiesen ({datum})"}
return None