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:
parent
0e7aa065e5
commit
1c35e494d0
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user