{% extends "v2/base.html" %} {% from "v2/components/score_hero.html" import score_hero %} {% from "v2/components/matrix_mini.html" import matrix_mini %} {% from "v2/components/quote_card.html" import quote_card %} {% from "v2/components/kasten.html" import kasten %} {% from "v2/components/redline.html" import redline %} {% block title %} {% if antrag is defined and antrag %}{{ antrag.title }} — {% endif %}GWÖ-Antragsprüfer {% endblock %} {% block head_extra %} {% if antrag is defined and antrag %} {# ── Open-Graph / Twitter-Card-Meta (#141) ────────────────────────── #} {% set _og_img = "/api/og/" ~ (antrag.drucksache | urlencode) ~ ".png" %} {% if antrag.updated_at_raw %} {% endif %} {% endif %} {% endblock %} {% set v2_active_nav = "durchsuchen" %} {% block main %} {# ── Fehlerfall ──────────────────────────────────────────────────── #} {% if error is defined and error %}

Antrag nicht gefunden

{{ error }}

← Zurück zur Übersicht

{% elif antrag is not defined or not antrag %} {# ── Demo-Daten wenn kein echtes Antrag-Objekt übergeben ────────── #} {% set antrag = { "drucksache": "18/4412", "bundesland": "BW", "parlament": "Landtag", "typ": "Antrag", "datum": "12.04.2026", "analysiert": "14.04.2026", "modell": "qwen-plus", "parteien": ["GRÜNE", "SPD"], "zitate_count": 3, "title": "Kommunale Wärmeplanung bis 2028 verpflichtend machen", "score": 9.1, "verdict_title": "Vorbildlich", "verdict_body": "Starker Beitrag zur ökologischen Nachhaltigkeit und Transparenz auf kommunaler Ebene.", "zusammenfassung": "Der Antrag verpflichtet Kommunen ab 10 000 Einwohner:innen zur Erstellung einer kommunalen Wärmeplanung bis Ende 2028.", "staerkster_wert": { "titel": "Ökologische Nachhaltigkeit", "text": "Verpflichtende Wärmeplanung führt zu messbaren Klimazielen. E3 = ++, D3 = ++." }, "schwaechster_wert": { "titel": "Soziale Gerechtigkeit", "text": "Kostenverteilung auf Mieter:innen versus Eigentümer:innen ist im Antrag nicht geregelt." }, "redline": { "segments": [ {"type": "ctx", "text": "§ 3 Abs. 2 "}, {"type": "del", "text": "auf Antrag"}, {"type": "ins", "text": "verpflichtend"}, {"type": "ctx", "text": " eine sozialverträgliche Umlage"} ] }, "matrix": { "A1": {"rating": 0, "symbol": "○"}, "A2": {"rating": 1, "symbol": "+"}, "A3": {"rating": 2, "symbol": "++"}, "A4": {"rating": 0, "symbol": "○"}, "A5": {"rating": 1, "symbol": "+"}, "B1": {"rating": 0, "symbol": "○"}, "B2": {"rating": 1, "symbol": "+"}, "B3": {"rating": 2, "symbol": "++"}, "B4": {"rating": -1, "symbol": "−"}, "B5": {"rating": 1, "symbol": "+"}, "C1": {"rating": 0, "symbol": "○"}, "C2": {"rating": 1, "symbol": "+"}, "C3": {"rating": 1, "symbol": "+"}, "C4": {"rating": 0, "symbol": "○"}, "C5": {"rating": 2, "symbol": "++"}, "D1": {"rating": 1, "symbol": "+"}, "D2": {"rating": 1, "symbol": "+"}, "D3": {"rating": 2, "symbol": "++"}, "D4": {"rating": 1, "symbol": "+"}, "D5": {"rating": 2, "symbol": "++"}, "E1": {"rating": 1, "symbol": "+"}, "E2": {"rating": 2, "symbol": "++"}, "E3": {"rating": 2, "symbol": "++"}, "E4": {"rating": 1, "symbol": "+"}, "E5": {"rating": 1, "symbol": "+"} }, "zitate": [ { "text": "Wir verpflichten alle Kommunen zu einer verbindlichen kommunalen Wärmeplanung bis 2028.", "source": "Wahlprogramm GRÜNE 2022 · S. 84", "partei": "GRÜNE", "verified": True, "contra": False, "pdf_href": "/api/wahlprogramm-cite?pid=gruene-nrw-2022&seite=84&q=Wärmeplanung" } ], "verbesserungen": [], "staerken": [], "schwaechen": [] } %} {# Fallthrough: Demo-Daten rendern wie echte Daten #} {% set _render = True %} {% else %} {% set _render = True %} {% endif %} {# ── Eigentlicher Detail-Inhalt ──────────────────────────────────── #} {% if _render is defined and _render and antrag is defined and antrag %} {# ── Zurück-Link ─────────────────────────────────────────────────── #}

← Zurück zur Übersicht

{# ── Split-Layout ────────────────────────────────────────────────── #}
{# ── Linke Spalte: Redaktionelle Analyse ── #}
{{ antrag.bundesland | default("") }} {% if antrag.drucksache %} · Drs. {{ antrag.drucksache }}{% endif %} {% if antrag.typ %} · {{ antrag.typ }}{% endif %} {% if antrag.datum %} · eingebracht {{ antrag.datum }}{% endif %}

{{ antrag.title | default("Antrag") }}

{% if antrag.parteien or antrag.analysiert %} {% endif %} {% if antrag.zusammenfassung %}

Zusammenfassung

{{ antrag.zusammenfassung }}

{% endif %} {# Stärkster Wert #} {% if antrag.staerkster_wert and antrag.staerkster_wert.text %}

Stärkster Wert{% if antrag.staerkster_wert.titel %} — {{ antrag.staerkster_wert.titel }}{% endif %}

{{ antrag.staerkster_wert.text }}

{% elif antrag.staerken %}

Stärken

    {% for s in antrag.staerken %}
  • {{ s }}
  • {% endfor %}
{% endif %} {# Schwächster Wert #} {% if antrag.schwaechster_wert and antrag.schwaechster_wert.text %}

Schwächster Wert{% if antrag.schwaechster_wert.titel %} — {{ antrag.schwaechster_wert.titel }}{% endif %}

{{ antrag.schwaechster_wert.text }}

{% elif antrag.schwaechen %}

Schwächen

    {% for s in antrag.schwaechen %}
  • {{ s }}
  • {% endfor %}
{% endif %} {# Redline-Vorschläge: alle verbesserungen rendern wenn vorhanden #} {% if antrag.verbesserungen %}

Redline-Vorschläge

{% for v in antrag.verbesserungen %}
{% if antrag.verbesserungen | length > 1 %}
Vorschlag {{ loop.index }} von {{ antrag.verbesserungen | length }}
{% endif %} {% from "v2/components/redline.html" import redline %} {% if v.segments %} {{ redline(original=v.original | default(""), segments=v.segments) }} {% else %} {{ redline(original=v.original | default(""), vorschlag=v.vorschlag | default("")) }} {% endif %} {% if v.begruendung %}

{{ v.begruendung }}

{% endif %}
{% endfor %} {% elif antrag.redline and antrag.redline.segments %}

Redline-Vorschlag

{% from "v2/components/redline.html" import redline %} {{ redline(segments=antrag.redline.segments) }} {% endif %}
{# .left #} {# ── Rechte Spalte: Bewertungs-Panel ── #}
Bewertung
{{ score_hero(antrag.score | default(0), antrag.verdict_title | default(""), antrag.verdict_body | default("")) }} {# ── Merkliste-Stern (#140) ── #}
{# ── Namentliche Abstimmung (#106 Phase 1) ── #} {% if antrag.abstimmungsverhalten %} {% set aw = antrag.abstimmungsverhalten %}

Namentliche Abstimmung

{% if aw.datum %}{{ aw.datum }} · {% endif %} {% if aw.accepted %}Angenommen{% else %}Abgelehnt{% endif %}
{% for f in aw.fraktionen %} {% set total = (f.yes + f.no + f.abstain + f.no_show) | int %} {% if total > 0 %}
{{ f.partei }} {{ f.yes }}✓ {{ f.abstain }}○ {{ f.no }}✗
{% if f.yes > 0 %}
{% endif %} {% if f.abstain > 0 %}
{% endif %} {% if f.no > 0 %}
{% endif %}
{% endif %} {% endfor %} {% endif %}{# abstimmungsverhalten #} {# ── Fraktions-aggregierte Plenum-Abstimmung aus Plenarprotokoll (#106) ── #} {% if antrag.plenum_votes %}

Abstimmungsergebnis

{% set ergebnis_color = { "angenommen": "#2da44e", "abgelehnt": "#cf222e", "überwiesen": "#0969da", "zurückgezogen": "#8250df", "bestätigt": "#2da44e", "sammel": "#0969da", } %} {% for v in antrag.plenum_votes %}
{{ v.ergebnis | capitalize }}{% if v.einstimmig %} · einstimmig{% endif %} {{ v.quelle_protokoll }}{% if v.quelle_url %} ↗{% endif %}
{% if v.fraktionen_ja or v.fraktionen_nein or v.fraktionen_enthaltung %}
{% if v.fraktionen_ja %}
Ja: {% for f in v.fraktionen_ja %}{{ f }}{% endfor %}
{% endif %} {% if v.fraktionen_nein %}
Nein: {% for f in v.fraktionen_nein %}{{ f }}{% endfor %}
{% endif %} {% if v.fraktionen_enthaltung %}
Enth.: {% for f in v.fraktionen_enthaltung %}{{ f }}{% endfor %}
{% endif %}
{% endif %}
{% endfor %}
Quelle: Plenarprotokoll · automatisch extrahiert
{% endif %}{# plenum_votes #} {% if antrag.matrix %}

Matrix 2.0 · 25 Felder

{{ matrix_mini(antrag.matrix) }} {% endif %} {# Fraktions-Score-Tabelle (Fix 2+3): auch Fraktionen ohne Zitate sichtbar #} {% if antrag.fraktions_scores %}

Programm-Treue pro Fraktion

{% for fs in antrag.fraktions_scores %}
{{ fs.fraktion }} {% if fs.ist_antragsteller %}A{% endif %} {% if fs.ist_regierung %}R{% endif %}
{% set wp_score = fs.wahlprogramm.score | float %} {% set pp_score = fs.parteiprogramm.score | float %} WP {{ "%.0f"|format(wp_score) }}/10 PP {{ "%.0f"|format(pp_score) }}/10
{% endfor %}
{% endif %} {# Zitate nach Partei gruppiert; Fraktion ohne Zitate erhält Hinweis via fraktions_scores-Block oben #} {% if antrag.zitate %} {% set current_partei = namespace(value="") %} {% for z in antrag.zitate %} {% if z.partei != current_partei.value %} {% set current_partei.value = z.partei %}

Belege — {{ z.partei }}

{% endif %} {{ quote_card(z.text, z.source, z.verified | default(True), z.contra | default(False), z.pdf_href | default("")) }} {% endfor %} {% endif %} {# Aktions-Links #}
PDF-Bericht JSON-Export Permalink
{# ── Voting-Block ─────────────────────────────────────────────── #}
Bewertung treffend?
{# ── Share-Block (analog v1) ───────────────────────────────────── #}
Teilen
{# ── Re-Analyze-Block ─────────────────────────────────────────── #}
{# ── Bewertungs-Historie ───────────────────────────────────────── #}
Bewertungs-Historie
Lade…
{# .right #}
{# .v2-detail #} {# ── Kommentare ───────────────────────────────────────────────────────── #}

Kommentare

Lade…
{# Kommentar-Formular — wird per JS eingeblendet wenn angemeldet #}
{# ── Matrix-Feld-Info-Modal ───────────────────────────────────────────── #} {% endif %}{# _render #} {% endblock %} {% block body_scripts %} {# Matrix-Erklärungen als JSON in den Browser übertragen #} {% if matrix_explanations is defined %} {% endif %} {% if antrag is defined and antrag and antrag.drucksache %} {% endif %} {% endblock %}