{"id":1893,"date":"2026-05-22T21:32:30","date_gmt":"2026-05-22T21:32:30","guid":{"rendered":"https:\/\/manuel360finanz.de\/?page_id=1893"},"modified":"2026-05-25T11:04:55","modified_gmt":"2026-05-25T11:04:55","slug":"iab-rechner","status":"publish","type":"page","link":"https:\/\/manuel360finanz.de\/de\/iab-rechner\/","title":{"rendered":"Investitionsabzugsbetrag"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"de\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>IAB-Rechner Batteriespeicher \u2013 Rendite &amp; Steuerersparnis<\/title>\n\n<!-- PDF-Bibliotheken -->\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf-autotable\/3.8.2\/jspdf.plugin.autotable.min.js\"><\/script>\n\n<style>\n  :root {\n    --green: #16a34a;\n    --green-dark: #15803d;\n    --green-light: #dcfce7;\n    --green-bg: #f0fdf4;\n    --ink: #1f2937;\n    --muted: #6b7280;\n    --border: #e5e7eb;\n    --bg: #f8fafc;\n    --card: #ffffff;\n    --warn: #b91c1c;\n    --warn-bg: #fef2f2;\n    --accent: #0ea5e9;\n    --shadow: 0 1px 3px rgba(0,0,0,.08), 0 1px 2px rgba(0,0,0,.04);\n  }\n  * { box-sizing: border-box; margin: 0; padding: 0; }\n  body {\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n    background: var(--bg);\n    color: var(--ink);\n    line-height: 1.5;\n    -webkit-font-smoothing: antialiased;\n  }\n  .wrap { max-width: 1100px; margin: 0 auto; padding: 24px 16px 64px; }\n\n  \/* Header *\/\n  header {\n    background: linear-gradient(135deg, var(--green) 0%, var(--green-dark) 100%);\n    color: #fff;\n    border-radius: 16px;\n    padding: 32px 28px;\n    margin-bottom: 24px;\n  }\n  header .badge {\n    display: inline-block;\n    background: rgba(255,255,255,.2);\n    border: 1px solid rgba(255,255,255,.3);\n    padding: 4px 12px;\n    border-radius: 999px;\n    font-size: 12px;\n    font-weight: 600;\n    letter-spacing: .03em;\n    margin-bottom: 12px;\n  }\n  header h1 { font-size: 28px; font-weight: 700; margin-bottom: 8px; }\n  header p { font-size: 15px; opacity: .92; max-width: 640px; }\n\n  \/* Layout *\/\n  .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\n  @media (max-width: 820px) { .grid { grid-template-columns: 1fr; } }\n\n  .card {\n    background: var(--card);\n    border: 1px solid var(--border);\n    border-radius: 14px;\n    padding: 20px;\n    box-shadow: var(--shadow);\n  }\n  .card h2 {\n    font-size: 15px;\n    font-weight: 700;\n    color: var(--green-dark);\n    margin-bottom: 16px;\n    display: flex;\n    align-items: center;\n    gap: 8px;\n  }\n  .card h2 .dot {\n    width: 22px; height: 22px;\n    background: var(--green-light);\n    border-radius: 6px;\n    display: inline-flex; align-items: center; justify-content: center;\n    font-size: 13px;\n  }\n\n  \/* Inputs *\/\n  .field { margin-bottom: 14px; }\n  .field:last-child { margin-bottom: 0; }\n  .field label {\n    display: block;\n    font-size: 13px;\n    font-weight: 600;\n    margin-bottom: 5px;\n    color: var(--ink);\n  }\n  .field .hint { font-size: 11.5px; color: var(--muted); font-weight: 400; margin-top: 3px; }\n  .input-row { position: relative; display: flex; align-items: center; }\n  input[type=\"number\"], input[type=\"text\"], select {\n    width: 100%;\n    padding: 9px 11px;\n    border: 1px solid var(--border);\n    border-radius: 8px;\n    font-size: 14px;\n    font-family: inherit;\n    color: var(--ink);\n    background: #fff;\n    transition: border-color .15s, box-shadow .15s;\n  }\n  input[type=\"number\"]:focus, input[type=\"text\"]:focus, select:focus {\n    outline: none;\n    border-color: var(--green);\n    box-shadow: 0 0 0 3px var(--green-light);\n  }\n  .input-row .unit {\n    position: absolute;\n    right: 11px;\n    font-size: 13px;\n    color: var(--muted);\n    pointer-events: none;\n  }\n  .input-row.has-unit input { padding-right: 38px; }\n  .seg {\n    display: flex; gap: 0;\n    border: 1px solid var(--border);\n    border-radius: 8px;\n    overflow: hidden;\n  }\n  .seg button {\n    flex: 1;\n    padding: 9px 8px;\n    border: none;\n    background: #fff;\n    font-size: 13px;\n    font-weight: 600;\n    font-family: inherit;\n    color: var(--muted);\n    cursor: pointer;\n    transition: background .15s, color .15s;\n  }\n  .seg button.active { background: var(--green); color: #fff; }\n  .seg button:not(:last-child) { border-right: 1px solid var(--border); }\n\n  \/* Results *\/\n  .results { margin-top: 24px; }\n  .kpi-grid {\n    display: grid;\n    grid-template-columns: repeat(4, 1fr);\n    gap: 14px;\n    margin-bottom: 18px;\n  }\n  @media (max-width: 820px) { .kpi-grid { grid-template-columns: repeat(2, 1fr); } }\n  .kpi {\n    background: var(--card);\n    border: 1px solid var(--border);\n    border-radius: 12px;\n    padding: 16px;\n    box-shadow: var(--shadow);\n  }\n  .kpi.hero {\n    background: linear-gradient(135deg, var(--green-bg) 0%, var(--green-light) 100%);\n    border-color: var(--green);\n  }\n  .kpi .label { font-size: 12px; color: var(--muted); font-weight: 600; margin-bottom: 6px; }\n  .kpi .value { font-size: 24px; font-weight: 700; color: var(--ink); letter-spacing: -.02em; }\n  .kpi .value.green { color: var(--green-dark); }\n  .kpi .sub { font-size: 11.5px; color: var(--muted); margin-top: 3px; }\n\n  \/* Table *\/\n  .table-card { margin-bottom: 18px; }\n  table { width: 100%; border-collapse: collapse; font-size: 13.5px; }\n  thead th {\n    background: var(--green-dark);\n    color: #fff;\n    padding: 10px 12px;\n    text-align: right;\n    font-weight: 600;\n    font-size: 12.5px;\n  }\n  thead th:first-child { text-align: left; border-radius: 8px 0 0 0; }\n  thead th:last-child { border-radius: 0 8px 0 0; }\n  tbody td { padding: 10px 12px; text-align: right; border-bottom: 1px solid var(--border); }\n  tbody td:first-child { text-align: left; font-weight: 600; }\n  tbody tr:hover { background: var(--green-bg); }\n  tbody tr.highlight { background: var(--green-light); font-weight: 700; }\n  tbody tr.highlight:hover { background: var(--green-light); }\n  .pos { color: var(--green-dark); font-weight: 600; }\n  .neg { color: var(--warn); font-weight: 600; }\n\n  \/* Chart *\/\n  .chart-card { margin-bottom: 18px; }\n  .chart { width: 100%; height: 240px; }\n  .chart-legend { display: flex; gap: 18px; margin-top: 10px; font-size: 12px; color: var(--muted); }\n  .chart-legend span { display: flex; align-items: center; gap: 6px; }\n  .chart-legend .swatch { width: 12px; height: 12px; border-radius: 3px; }\n\n  \/* Disclaimer *\/\n  .disclaimer {\n    background: var(--warn-bg);\n    border: 1px solid #fecaca;\n    border-radius: 12px;\n    padding: 16px 18px;\n    font-size: 12.5px;\n    color: #7f1d1d;\n    margin-top: 18px;\n  }\n  .disclaimer strong { display: block; margin-bottom: 6px; color: var(--warn); font-size: 13px; }\n  .disclaimer ul { margin: 0; padding-left: 18px; }\n  .disclaimer li { margin-bottom: 3px; }\n\n  .section-title {\n    font-size: 18px;\n    font-weight: 700;\n    margin: 28px 0 14px;\n    color: var(--ink);\n  }\n  footer {\n    text-align: center;\n    font-size: 12px;\n    color: var(--muted);\n    margin-top: 32px;\n    padding-top: 16px;\n    border-top: 1px solid var(--border);\n  }\n  .info-line {\n    background: var(--green-bg);\n    border-left: 3px solid var(--green);\n    padding: 10px 14px;\n    border-radius: 6px;\n    font-size: 12.5px;\n    color: var(--green-dark);\n    margin-bottom: 16px;\n  }\n\n  \/* ========== PDF Export Section ========== *\/\n  .pdf-card {\n    background: linear-gradient(135deg, #fff 0%, var(--green-bg) 100%);\n    border: 1px solid var(--green);\n    border-radius: 14px;\n    padding: 20px;\n    margin-top: 18px;\n    box-shadow: var(--shadow);\n  }\n  .pdf-grid {\n    display: grid;\n    grid-template-columns: 1fr 1fr 1fr;\n    gap: 12px;\n    margin-bottom: 14px;\n  }\n  @media (max-width: 820px) { .pdf-grid { grid-template-columns: 1fr; } }\n  .pdf-btn-row {\n    display: flex;\n    gap: 10px;\n    align-items: center;\n    flex-wrap: wrap;\n  }\n  .btn-pdf {\n    background: var(--green-dark);\n    color: #fff;\n    border: none;\n    padding: 12px 22px;\n    font-size: 14px;\n    font-weight: 700;\n    font-family: inherit;\n    border-radius: 10px;\n    cursor: pointer;\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    transition: background .15s, transform .1s, box-shadow .15s;\n    box-shadow: 0 2px 6px rgba(21,128,61,.25);\n  }\n  .btn-pdf:hover { background: #14532d; box-shadow: 0 4px 10px rgba(21,128,61,.35); }\n  .btn-pdf:active { transform: translateY(1px); }\n  .btn-pdf:disabled { opacity: .55; cursor: not-allowed; }\n  .btn-pdf svg { width: 16px; height: 16px; }\n  .btn-secondary {\n    background: #fff;\n    color: var(--green-dark);\n    border: 1px solid var(--green);\n    padding: 12px 18px;\n    font-size: 14px;\n    font-weight: 600;\n    font-family: inherit;\n    border-radius: 10px;\n    cursor: pointer;\n    transition: background .15s;\n  }\n  .btn-secondary:hover { background: var(--green-bg); }\n  .pdf-status {\n    font-size: 12.5px;\n    color: var(--muted);\n    margin-left: 4px;\n  }\n  .pdf-status.success { color: var(--green-dark); font-weight: 600; }\n  .pdf-status.error { color: var(--warn); font-weight: 600; }\n<\/style>\n<\/head>\n<body>\n\n<div class=\"wrap\">\n\n  <header>\n    <span class=\"badge\">IAB \u00b7 WACHSTUMSBOOSTER \u00b7 FINANZIERUNG<\/span>\n    <h1>IAB-Rechner f\u00fcr Batteriespeicher<\/h1>\n    <p>Berechnen Sie Steuerersparnis und Eigenkapitalrendite einer gewerblichen Batteriespeicher-Investition \u2013 inklusive Investitionsabzugsbetrag (\u00a7 7g EStG), degressiver AfA (Wachstumsbooster) und Fremdfinanzierung.<\/p>\n  <\/header>\n\n  <div class=\"info-line\">\n    Alle Eingaben aktualisieren das Ergebnis sofort. Standardwerte sind beispielhaft \u2013 bitte mit Ihren echten Projekt- und Steuerdaten ersetzen.\n  <\/div>\n\n  <!-- ============ EINGABEN ============ -->\n  <div class=\"grid\">\n\n    <div class=\"card\">\n      <h2><span class=\"dot\">1<\/span> Investition &amp; Ertrag<\/h2>\n      <div class=\"field\">\n        <label>Investitionssumme (netto)<\/label>\n        <div class=\"input-row has-unit\">\n          <input type=\"number\" id=\"investition\" value=\"100000\" step=\"1000\" min=\"0\">\n          <span class=\"unit\">\u20ac<\/span>\n        <\/div>\n      <\/div>\n      <div class=\"field\">\n        <label>J\u00e4hrlicher Bruttoertrag<\/label>\n        <div class=\"input-row has-unit\">\n          <input type=\"number\" id=\"bruttoertrag\" value=\"17000\" step=\"500\" min=\"0\">\n          <span class=\"unit\">\u20ac<\/span>\n        <\/div>\n        <div class=\"hint\">Pacht \/ Erl\u00f6se pro Jahr vor Kosten und Steuern<\/div>\n      <\/div>\n      <div class=\"field\">\n        <label>Wartung \/ Service \/ Versicherung pro Jahr<\/label>\n        <div class=\"input-row has-unit\">\n          <input type=\"number\" id=\"wartung\" value=\"2500\" step=\"250\" min=\"0\">\n          <span class=\"unit\">\u20ac<\/span>\n        <\/div>\n      <\/div>\n      <div class=\"field\">\n        <label>Pachtdauer \/ Betrachtungszeitraum<\/label>\n        <div class=\"input-row has-unit\">\n          <input type=\"number\" id=\"pachtdauer\" value=\"15\" step=\"1\" min=\"1\" max=\"30\">\n          <span class=\"unit\">Jahre<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <h2><span class=\"dot\">2<\/span> Steuerliche Situation<\/h2>\n      <div class=\"field\">\n        <label>Zu versteuerndes Einkommen (zvE) ohne Investition<\/label>\n        <div class=\"input-row has-unit\">\n          <input type=\"number\" id=\"zve\" value=\"80000\" step=\"1000\" min=\"0\">\n          <span class=\"unit\">\u20ac<\/span>\n        <\/div>\n        <div class=\"hint\">Aus Ihrem letzten Steuerbescheid<\/div>\n      <\/div>\n      <div class=\"field\">\n        <label>Veranlagung<\/label>\n        <div class=\"seg\" id=\"seg-veranlagung\">\n          <button data-val=\"splitting\" class=\"active\">Zusammen (Splitting)<\/button>\n          <button data-val=\"einzel\">Einzel<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"field\">\n        <label>Kirchensteuer<\/label>\n        <div class=\"seg\" id=\"seg-kist\">\n          <button data-val=\"0\" class=\"active\">keine<\/button>\n          <button data-val=\"0.08\">8 %<\/button>\n          <button data-val=\"0.09\">9 %<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"field\">\n        <label>Solidarit\u00e4tszuschlag ber\u00fccksichtigen<\/label>\n        <div class=\"seg\" id=\"seg-soli\">\n          <button data-val=\"1\" class=\"active\">ja<\/button>\n          <button data-val=\"0\">nein<\/button>\n        <\/div>\n        <div class=\"hint\">F\u00e4llt erst \u00fcber der Freigrenze an (Splitting 39.900 \u20ac \/ Einzel 19.950 \u20ac ESt)<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <h2><span class=\"dot\">3<\/span> IAB &amp; Abschreibung (Wachstumsbooster)<\/h2>\n      <div class=\"field\">\n        <label>IAB-Satz (\u00a7 7g Abs. 1 EStG)<\/label>\n        <div class=\"input-row has-unit\">\n          <input type=\"number\" id=\"iabSatz\" value=\"50\" step=\"5\" min=\"0\" max=\"50\">\n          <span class=\"unit\">%<\/span>\n        <\/div>\n        <div class=\"hint\">Maximal 50 % der voraussichtlichen Anschaffungskosten<\/div>\n      <\/div>\n      <div class=\"field\">\n        <label>Degressive AfA-Satz (Investitionssofortprogramm)<\/label>\n        <div class=\"input-row has-unit\">\n          <input type=\"number\" id=\"degSatz\" value=\"30\" step=\"5\" min=\"0\" max=\"30\">\n          <span class=\"unit\">%<\/span>\n        <\/div>\n        <div class=\"hint\">30 % f\u00fcr Anschaffung 01.07.2025 \u2013 31.12.2027<\/div>\n      <\/div>\n      <div class=\"field\">\n        <label>Sonder-AfA \u00a7 7g Abs. 5 EStG<\/label>\n        <div class=\"input-row has-unit\">\n          <input type=\"number\" id=\"sonderSatz\" value=\"40\" step=\"10\" min=\"0\" max=\"40\">\n          <span class=\"unit\">%<\/span>\n        <\/div>\n        <div class=\"hint\">Verteilbar auf bis zu 5 Jahre<\/div>\n      <\/div>\n      <div class=\"field\">\n        <label>Steuerliche Nutzungsdauer<\/label>\n        <div class=\"input-row has-unit\">\n          <input type=\"number\" id=\"nutzungsdauer\" value=\"10\" step=\"1\" min=\"3\" max=\"25\">\n          <span class=\"unit\">Jahre<\/span>\n        <\/div>\n        <div class=\"hint\">Batteriespeicher lt. AfA-Tabelle: typ. 10 Jahre<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <h2><span class=\"dot\">4<\/span> Finanzierung<\/h2>\n      <div class=\"field\">\n        <label>Eigenkapital-Strategie<\/label>\n        <div class=\"seg\" id=\"seg-ek\">\n          <button data-val=\"iab\" class=\"active\">EK = IAB-Erstattung<\/button>\n          <button data-val=\"custom\">eigener Betrag<\/button>\n        <\/div>\n        <div class=\"hint\">Standard: nur die Steuererstattung als Eigenkapital einsetzen<\/div>\n      <\/div>\n      <div class=\"field\" id=\"ekCustomField\" style=\"display:none;\">\n        <label>Eigenkapital (eigener Betrag)<\/label>\n        <div class=\"input-row has-unit\">\n          <input type=\"number\" id=\"ekCustom\" value=\"20000\" step=\"1000\" min=\"0\">\n          <span class=\"unit\">\u20ac<\/span>\n        <\/div>\n      <\/div>\n      <div class=\"field\">\n        <label>Zinssatz Fremdkapital<\/label>\n        <div class=\"input-row has-unit\">\n          <input type=\"number\" id=\"zinssatz\" value=\"5.5\" step=\"0.1\" min=\"0\" max=\"20\">\n          <span class=\"unit\">%<\/span>\n        <\/div>\n      <\/div>\n      <div class=\"field\">\n        <label>Finanzierungslaufzeit (Annuit\u00e4tendarlehen)<\/label>\n        <div class=\"input-row has-unit\">\n          <input type=\"number\" id=\"laufzeit\" value=\"15\" step=\"1\" min=\"1\" max=\"30\">\n          <span class=\"unit\">Jahre<\/span>\n        <\/div>\n      <\/div>\n      <div class=\"field\">\n        <label>Diskontsatz f\u00fcr Barwert (NPV)<\/label>\n        <div class=\"input-row has-unit\">\n          <input type=\"number\" id=\"diskont\" value=\"3\" step=\"0.5\" min=\"0\" max=\"15\">\n          <span class=\"unit\">%<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n\n  <\/div>\n\n  <!-- ============ ERGEBNISSE ============ -->\n  <div class=\"results\">\n    <div class=\"section-title\">Ergebnis<\/div>\n\n    <div class=\"kpi-grid\">\n      <div class=\"kpi hero\">\n        <div class=\"label\">Steuerersparnis durch IAB<\/div>\n        <div class=\"value green\" id=\"r-ersparnis\">\u2013<\/div>\n        <div class=\"sub\">im Jahr der IAB-Bildung<\/div>\n      <\/div>\n      <div class=\"kpi\">\n        <div class=\"label\">Eigenkapital<\/div>\n        <div class=\"value\" id=\"r-ek\">\u2013<\/div>\n        <div class=\"sub\" id=\"r-ekquote\">\u2013<\/div>\n      <\/div>\n      <div class=\"kpi\">\n        <div class=\"label\">Fremdkapital<\/div>\n        <div class=\"value\" id=\"r-fk\">\u2013<\/div>\n        <div class=\"sub\" id=\"r-annuitaet\">\u2013<\/div>\n      <\/div>\n      <div class=\"kpi hero\">\n        <div class=\"label\">EK-Rendite nach Pachtdauer<\/div>\n        <div class=\"value green\" id=\"r-roe\">\u2013<\/div>\n        <div class=\"sub\" id=\"r-cagr\">\u2013<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"card chart-card\">\n      <h2><span class=\"dot\">\ud83d\udcc8<\/span> Kumulierter Cashflow (Eigenkapital-Sicht)<\/h2>\n      <svg class=\"chart\" id=\"chart\" preserveAspectRatio=\"xMidYMid meet\"><\/svg>\n      <div class=\"chart-legend\">\n        <span><span class=\"swatch\" style=\"background:#16a34a\"><\/span>positiver kumulierter Cashflow<\/span>\n        <span><span class=\"swatch\" style=\"background:#dc2626\"><\/span>negativer kumulierter Cashflow<\/span>\n      <\/div>\n    <\/div>\n\n    <div class=\"card table-card\">\n      <h2><span class=\"dot\">\ud83d\udcca<\/span> Rendite \u00fcber die Zeit<\/h2>\n      <table>\n        <thead>\n          <tr>\n            <th>Zeitraum<\/th>\n            <th>Kum. Cashflow<\/th>\n            <th>Barwert (NPV)<\/th>\n            <th>EK-Rendite<\/th>\n            <th>Status<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody id=\"r-table\"><\/tbody>\n      <\/table>\n    <\/div>\n\n    <div class=\"card table-card\">\n      <h2><span class=\"dot\">\ud83d\uddd3\ufe0f<\/span> Jahres\u00fcbersicht<\/h2>\n      <table>\n        <thead>\n          <tr>\n            <th>Jahr<\/th>\n            <th>Ertr\u00e4ge \u2212 Wartung<\/th>\n            <th>Zins \/ Tilgung<\/th>\n            <th>AfA gesamt<\/th>\n            <th>Steuerwirkung<\/th>\n            <th>Cashflow<\/th>\n            <th>Kumuliert<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody id=\"r-yeartable\"><\/tbody>\n      <\/table>\n    <\/div>\n\n    <!-- ============ PDF EXPORT ============ -->\n    <div class=\"pdf-card\">\n      <h2 style=\"font-size:15px;font-weight:700;color:var(--green-dark);margin-bottom:14px;display:flex;align-items:center;gap:8px;\">\n        <span class=\"dot\" style=\"width:22px;height:22px;background:var(--green-light);border-radius:6px;display:inline-flex;align-items:center;justify-content:center;font-size:13px;\">\ud83d\udcc4<\/span>\n        Berechnung als PDF exportieren\n      <\/h2>\n      <div style=\"font-size:13px;color:var(--muted);margin-bottom:14px;\">\n        Erstellt eine professionelle, mehrseitige PDF-Datei mit allen Eingaben und Ergebnissen \u2013 ideal f\u00fcr Steuerberater, Bank oder Investor.\n      <\/div>\n\n      <div class=\"pdf-grid\">\n        <div class=\"field\" style=\"margin-bottom:0;\">\n          <label>Projektbezeichnung <span style=\"font-weight:400;color:var(--muted);\">(optional)<\/span><\/label>\n          <input type=\"text\" id=\"pdf-projekt\" placeholder=\"z. B. Batteriespeicher Hof M\u00fcller\">\n        <\/div>\n        <div class=\"field\" style=\"margin-bottom:0;\">\n          <label>Mandant \/ Investor <span style=\"font-weight:400;color:var(--muted);\">(optional)<\/span><\/label>\n          <input type=\"text\" id=\"pdf-mandant\" placeholder=\"Name oder Firmenbezeichnung\">\n        <\/div>\n        <div class=\"field\" style=\"margin-bottom:0;\">\n          <label>Erstellt von <span style=\"font-weight:400;color:var(--muted);\">(optional)<\/span><\/label>\n          <input type=\"text\" id=\"pdf-ersteller\" placeholder=\"Ihr Name \/ Beraterb\u00fcro\">\n        <\/div>\n      <\/div>\n\n      <div class=\"pdf-btn-row\">\n        <button class=\"btn-pdf\" id=\"btn-pdf\" type=\"button\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"\/>\n            <polyline points=\"7 10 12 15 17 10\"\/>\n            <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"\/>\n          <\/svg>\n          PDF erstellen &amp; herunterladen\n        <\/button>\n        <button class=\"btn-secondary\" id=\"btn-print\" type=\"button\">Drucken<\/button>\n        <span class=\"pdf-status\" id=\"pdf-status\"><\/span>\n      <\/div>\n    <\/div>\n\n    <div class=\"disclaimer\">\n      <strong>\u26a0 Wichtige Hinweise<\/strong>\n      <ul>\n        <li>Dieser Rechner liefert eine vereinfachte Modellrechnung und ersetzt <strong>keine Steuerberatung<\/strong>.<\/li>\n        <li>Voraussetzung f\u00fcr den IAB: gewerbliche\/selbst\u00e4ndige T\u00e4tigkeit, Gewinngrenze 200.000 \u20ac, mind. 90 % betriebliche Nutzung, Anschaffung innerhalb von 3 Jahren.<\/li>\n        <li>Die degressive AfA (30 %) gilt nur f\u00fcr Anschaffungen vom 01.07.2025 bis 31.12.2027 (Investitionssofortprogramm).<\/li>\n        <li>Steuerwirkung der Folgejahre wird mit dem Grenzsteuersatz angen\u00e4hert; das IAB-Jahr wird exakt nach \u00a7 32a EStG (Tarif 2025) berechnet.<\/li>\n        <li>Gewerbesteuer ist nicht ber\u00fccksichtigt. Wartungskosten und Ertr\u00e4ge bitte mit dem Anbieter verifizieren.<\/li>\n      <\/ul>\n    <\/div>\n  <\/div>\n\n  <footer>\n    IAB-Rechner Batteriespeicher \u00b7 Berechnungsgrundlage: \u00a7 7g EStG, \u00a7 7 Abs. 2 EStG, \u00a7 32a EStG (Tarif 2025), Investitionssofortprogramm 2025 \u00b7 Ohne Gew\u00e4hr\n  <\/footer>\n\n<\/div>\n\n<script>\n\"use strict\";\n\n\/\/ ---------- Steuer-Tariffunktion \u00a732a EStG 2025 ----------\nfunction estGrundtarif(zvE) {\n  zvE = Math.floor(zvE);\n  if (zvE <= 12096) return 0;\n  if (zvE <= 17443) {\n    const y = (zvE - 12096) \/ 10000;\n    return Math.floor((932.3 * y + 1400) * y);\n  }\n  if (zvE <= 68480) {\n    const z = (zvE - 17443) \/ 10000;\n    return Math.floor((176.64 * z + 2397) * z + 1015.13);\n  }\n  if (zvE <= 277825) return Math.floor(0.42 * zvE - 10911.92);\n  return Math.floor(0.45 * zvE - 19246.67);\n}\nfunction estTarif(zvE, splitting) {\n  if (zvE < 0) zvE = 0;\n  return splitting ? 2 * estGrundtarif(zvE \/ 2) : estGrundtarif(zvE);\n}\nfunction soli(est, splitting, soliAktiv) {\n  if (!soliAktiv) return 0;\n  const freigrenze = splitting ? 39900 : 19950;\n  if (est <= freigrenze) return 0;\n  const voll = 0.055 * est;\n  const mild = 0.119 * (est - freigrenze);\n  return Math.min(voll, mild);\n}\nfunction gesamtSteuer(zvE, splitting, kistSatz, soliAktiv) {\n  const est = estTarif(zvE, splitting);\n  return est + soli(est, splitting, soliAktiv) + est * kistSatz;\n}\nfunction grenzsteuersatz(zvE, splitting, kistSatz, soliAktiv) {\n  const s0 = gesamtSteuer(zvE, splitting, kistSatz, soliAktiv);\n  const s1 = gesamtSteuer(zvE + 1000, splitting, kistSatz, soliAktiv);\n  return (s1 - s0) \/ 1000;\n}\n\n\/\/ ---------- State ----------\nconst state = {\n  veranlagung: \"splitting\",\n  kist: 0,\n  soli: 1,\n  ek: \"iab\"\n};\n\n\/\/ ---------- Hilfsfunktionen ----------\nconst euro = v => Math.round(v).toLocaleString(\"de-DE\") + \" \u20ac\";\nconst pct = v => (v * 100).toLocaleString(\"de-DE\", {minimumFractionDigits:1, maximumFractionDigits:1}) + \" %\";\nconst num = id => parseFloat(document.getElementById(id).value) || 0;\n\n\/\/ ---------- Hauptberechnung ----------\nfunction berechne() {\n  const investition = num(\"investition\");\n  const bruttoertrag = num(\"bruttoertrag\");\n  const wartung = num(\"wartung\");\n  const pachtdauer = Math.max(1, Math.round(num(\"pachtdauer\")));\n  const zve = num(\"zve\");\n  const splitting = state.veranlagung === \"splitting\";\n  const kistSatz = state.kist;\n  const soliAktiv = state.soli === 1;\n  const iabSatz = num(\"iabSatz\") \/ 100;\n  const degSatz = num(\"degSatz\") \/ 100;\n  const sonderSatz = num(\"sonderSatz\") \/ 100;\n  const nutzungsdauer = Math.max(3, Math.round(num(\"nutzungsdauer\")));\n  const zinssatz = num(\"zinssatz\") \/ 100;\n  const laufzeit = Math.max(1, Math.round(num(\"laufzeit\")));\n  const diskont = num(\"diskont\") \/ 100;\n  const sonderJahre = 5;\n\n  const iabBetrag = investition * iabSatz;\n  const steuerOhne = gesamtSteuer(zve, splitting, kistSatz, soliAktiv);\n  const steuerMit = gesamtSteuer(Math.max(0, zve - iabBetrag), splitting, kistSatz, soliAktiv);\n  const ersparnis = steuerOhne - steuerMit;\n\n  const ek = state.ek === \"iab\" ? ersparnis : num(\"ekCustom\");\n  const fk = Math.max(0, investition - ek);\n  let annuitaet = 0;\n  if (fk > 0 && zinssatz > 0) {\n    annuitaet = fk * zinssatz * Math.pow(1 + zinssatz, laufzeit) \/ (Math.pow(1 + zinssatz, laufzeit) - 1);\n  } else if (fk > 0) {\n    annuitaet = fk \/ laufzeit;\n  }\n\n  const zinsPlan = [], tilgPlan = [];\n  let restschuld = fk;\n  for (let j = 0; j < laufzeit; j++) {\n    const z = restschuld * zinssatz;\n    let t = annuitaet - z;\n    if (j === laufzeit - 1) t = restschuld;\n    zinsPlan.push(z);\n    tilgPlan.push(t);\n    restschuld -= t;\n  }\n\n  const akRed = investition * (1 - iabSatz);\n  const sonderAfaProJahr = akRed * sonderSatz \/ sonderJahre;\n  const afaPlan = [], sonderPlan = [];\n  let bw = akRed;\n  for (let j = 0; j < nutzungsdauer; j++) {\n    const sa = j < sonderJahre ? sonderAfaProJahr : 0;\n    const bwNachSA = bw - sa;\n    const restND = nutzungsdauer - j;\n    const deg = bwNachSA * degSatz;\n    const lin = bwNachSA \/ restND;\n    const afa = Math.max(deg, lin);\n    sonderPlan.push(sa);\n    afaPlan.push(afa);\n    bw = bwNachSA - afa;\n  }\n\n  const grenz = grenzsteuersatz(zve, splitting, kistSatz, soliAktiv);\n\n  const cashflow = [], kumCashflow = [], jahresDaten = [];\n  const ebitda = bruttoertrag - wartung;\n\n  cashflow.push(ersparnis);\n  jahresDaten.push({periode:0, ops:0, zins:0, tilg:0, afa:0, steuer:ersparnis, cf:ersparnis});\n\n  for (let p = 1; p <= pachtdauer; p++) {\n    const idx = p - 1;\n    const zins = idx < laufzeit ? zinsPlan[idx] : 0;\n    const tilg = idx < laufzeit ? tilgPlan[idx] : 0;\n    const sonderAfa = idx < afaPlan.length ? sonderPlan[idx] : 0;\n    const afa = idx < afaPlan.length ? afaPlan[idx] : 0;\n    const afaGesamt = sonderAfa + afa;\n\n    const gewinn = ebitda - zins - afaGesamt;\n    const steuerwirkung = -gewinn * grenz;\n\n    let cf;\n    if (p === 1) {\n      cf = -investition + fk + ebitda - zins - tilg + steuerwirkung;\n    } else {\n      cf = ebitda - zins - tilg + steuerwirkung;\n    }\n    cashflow.push(cf);\n    jahresDaten.push({periode:p, ops:ebitda, zins:zins, tilg:tilg, afa:afaGesamt, steuer:steuerwirkung, cf:cf});\n  }\n\n  let kum = 0, npvKum = 0;\n  const npvReihe = [];\n  for (let i = 0; i < cashflow.length; i++) {\n    kum += cashflow[i];\n    kumCashflow.push(kum);\n    npvKum += cashflow[i] \/ Math.pow(1 + diskont, i);\n    npvReihe.push(npvKum);\n  }\n\n  return {\n    investition, iabBetrag, ersparnis, ek, fk, annuitaet,\n    cashflow, kumCashflow, npvReihe, jahresDaten, pachtdauer,\n    sonderAfaGesamt: akRed * sonderSatz, grenz,\n    \/\/ Eingaben geb\u00fcndelt f\u00fcr PDF\n    inputs: {\n      investition, bruttoertrag, wartung, pachtdauer, zve, splitting,\n      kistSatz, soliAktiv, iabSatz, degSatz, sonderSatz, nutzungsdauer,\n      zinssatz, laufzeit, diskont\n    }\n  };\n}\n\n\/\/ ---------- Rendering (UI) ----------\nfunction render() {\n  const r = berechne();\n\n  document.getElementById(\"r-ersparnis\").textContent = euro(r.ersparnis);\n  document.getElementById(\"r-ek\").textContent = euro(r.ek);\n  document.getElementById(\"r-ekquote\").textContent =\n    r.investition > 0 ? \"EK-Quote \" + pct(r.ek \/ r.investition) : \"\u2013\";\n  document.getElementById(\"r-fk\").textContent = euro(r.fk);\n  document.getElementById(\"r-annuitaet\").textContent =\n    r.annuitaet > 0 ? \"Annuit\u00e4t \" + euro(r.annuitaet) + \"\/Jahr\" : \"keine Finanzierung\";\n\n  const kumEnd = r.kumCashflow[r.kumCashflow.length - 1];\n  const roe = r.ek > 0 ? kumEnd \/ r.ek : 0;\n  document.getElementById(\"r-roe\").textContent = r.ek > 0 ? pct(roe) : \"\u2013\";\n  const cagr = (r.ek > 0 && r.pachtdauer > 0)\n    ? Math.pow(1 + roe, 1 \/ r.pachtdauer) - 1 : 0;\n  document.getElementById(\"r-cagr\").textContent =\n    r.ek > 0 ? \"\u2248 \" + pct(cagr) + \" p.a. (annualisiert)\" : \"\u2013\";\n\n  const meilensteine = [1, 2, 5, 10, 15].filter(n => n <= r.pachtdauer);\n  if (!meilensteine.includes(r.pachtdauer)) meilensteine.push(r.pachtdauer);\n  const tbody = document.getElementById(\"r-table\");\n  tbody.innerHTML = \"\";\n  meilensteine.forEach(n => {\n    const kum = r.kumCashflow[n];\n    const npv = r.npvReihe[n];\n    const rendite = r.ek > 0 ? kum \/ r.ek : 0;\n    const tr = document.createElement(\"tr\");\n    if (n === r.pachtdauer) tr.className = \"highlight\";\n    tr.innerHTML =\n      \"<td>nach \" + n + \" Jahr\" + (n > 1 ? \"en\" : \"\") + \"<\/td>\" +\n      \"<td class='\" + (kum >= 0 ? \"pos\" : \"neg\") + \"'>\" + euro(kum) + \"<\/td>\" +\n      \"<td>\" + euro(npv) + \"<\/td>\" +\n      \"<td class='\" + (rendite >= 0 ? \"pos\" : \"neg\") + \"'>\" + (r.ek > 0 ? pct(rendite) : \"\u2013\") + \"<\/td>\" +\n      \"<td>\" + (kum >= 0 ? \"\u2705 positiv\" : \"\u23f3 Aufbau\") + \"<\/td>\";\n    tbody.appendChild(tr);\n  });\n\n  const yt = document.getElementById(\"r-yeartable\");\n  yt.innerHTML = \"\";\n  r.jahresDaten.forEach((d, i) => {\n    const label = d.periode === 0 ? \"IAB-Jahr\" : \"Jahr \" + d.periode;\n    const tr = document.createElement(\"tr\");\n    tr.innerHTML =\n      \"<td>\" + label + \"<\/td>\" +\n      \"<td>\" + (d.ops ? euro(d.ops) : \"\u2013\") + \"<\/td>\" +\n      \"<td>\" + (d.zins || d.tilg ? euro(d.zins) + \" \/ \" + euro(d.tilg) : \"\u2013\") + \"<\/td>\" +\n      \"<td>\" + (d.afa ? euro(d.afa) : \"\u2013\") + \"<\/td>\" +\n      \"<td class='\" + (d.steuer >= 0 ? \"pos\" : \"neg\") + \"'>\" + euro(d.steuer) + \"<\/td>\" +\n      \"<td class='\" + (d.cf >= 0 ? \"pos\" : \"neg\") + \"'>\" + euro(d.cf) + \"<\/td>\" +\n      \"<td>\" + euro(r.kumCashflow[i]) + \"<\/td>\";\n    yt.appendChild(tr);\n  });\n\n  drawChart(r.kumCashflow);\n}\n\n\/\/ ---------- Chart (SVG-Balkendiagramm) ----------\nfunction drawChart(kumData) {\n  const svg = document.getElementById(\"chart\");\n  const W = 900, H = 240, padL = 60, padR = 20, padT = 20, padB = 30;\n  svg.setAttribute(\"viewBox\", \"0 0 \" + W + \" \" + H);\n  svg.innerHTML = \"\";\n\n  const n = kumData.length;\n  const maxV = Math.max(...kumData, 0);\n  const minV = Math.min(...kumData, 0);\n  const range = (maxV - minV) || 1;\n  const plotW = W - padL - padR;\n  const plotH = H - padT - padB;\n  const barW = plotW \/ n * 0.7;\n  const gap = plotW \/ n;\n  const yZero = padT + (maxV \/ range) * plotH;\n\n  const NS = \"http:\/\/www.w3.org\/2000\/svg\";\n  function el(tag, attrs) {\n    const e = document.createElementNS(NS, tag);\n    for (const k in attrs) e.setAttribute(k, attrs[k]);\n    return e;\n  }\n\n  svg.appendChild(el(\"line\", {x1:padL, y1:yZero, x2:W-padR, y2:yZero, stroke:\"#9ca3af\", \"stroke-width\":1}));\n\n  [maxV, (maxV+minV)\/2, minV].forEach(val => {\n    const y = padT + ((maxV - val) \/ range) * plotH;\n    const t = el(\"text\", {x:padL-8, y:y+4, \"text-anchor\":\"end\", \"font-size\":11, fill:\"#6b7280\"});\n    t.textContent = Math.round(val\/1000) + \"k\";\n    svg.appendChild(t);\n  });\n\n  kumData.forEach((v, i) => {\n    const x = padL + i * gap + (gap - barW) \/ 2;\n    const barH = Math.abs(v) \/ range * plotH;\n    const y = v >= 0 ? yZero - barH : yZero;\n    const rect = el(\"rect\", {\n      x:x, y:y, width:barW, height:Math.max(barH,1),\n      fill: v >= 0 ? \"#16a34a\" : \"#dc2626\",\n      rx:2, opacity:0.9\n    });\n    svg.appendChild(rect);\n    if (n <= 12 || i % 2 === 0 || i === n-1) {\n      const t = el(\"text\", {x:x+barW\/2, y:H-padB+16, \"text-anchor\":\"middle\", \"font-size\":10, fill:\"#6b7280\"});\n      t.textContent = i;\n      svg.appendChild(t);\n    }\n  });\n}\n\n\/\/ ============================================================\n\/\/ ============      PDF-EXPORT      ==========================\n\/\/ ============================================================\n\n\/\/ PDF-Formatierer (jsPDF default-Font = WinAnsi \u2192 ASCII-Ersatz f\u00fcr \u2248)\nconst eurPdf = v => Math.round(v).toLocaleString(\"de-DE\") + \" EUR\";\nconst pctPdf = v => (v * 100).toLocaleString(\"de-DE\", {minimumFractionDigits:1, maximumFractionDigits:1}) + \" %\";\n\nfunction generatePDF() {\n  const statusEl = document.getElementById(\"pdf-status\");\n  const btnEl = document.getElementById(\"btn-pdf\");\n\n  \/\/ Library-Check\n  if (typeof window.jspdf === \"undefined\" || !window.jspdf.jsPDF) {\n    statusEl.textContent = \"PDF-Bibliothek konnte nicht geladen werden (offline?).\";\n    statusEl.className = \"pdf-status error\";\n    return;\n  }\n\n  btnEl.disabled = true;\n  statusEl.textContent = \"PDF wird erstellt \u2026\";\n  statusEl.className = \"pdf-status\";\n\n  try {\n    const { jsPDF } = window.jspdf;\n    const doc = new jsPDF({ orientation: \"portrait\", unit: \"mm\", format: \"a4\" });\n\n    const r = berechne();\n    const inp = r.inputs;\n    const today = new Date().toLocaleDateString(\"de-DE\", { year: \"numeric\", month: \"long\", day: \"numeric\" });\n\n    const projekt = document.getElementById(\"pdf-projekt\").value.trim() || \"\u2014\";\n    const mandant = document.getElementById(\"pdf-mandant\").value.trim() || \"\u2014\";\n    const ersteller = document.getElementById(\"pdf-ersteller\").value.trim() || \"\u2014\";\n\n    \/\/ Farben\n    const GREEN_DARK = [21, 128, 61];\n    const INK = [31, 41, 55];\n    const MUTED = [107, 114, 128];\n    const LIGHT_BG = [240, 253, 244];\n    const WARN_BG = [254, 242, 242];\n    const WARN_BORDER = [252, 165, 165];\n    const WARN_INK = [127, 29, 29];\n\n    const PAGE_W = 210, MARGIN = 15;\n\n    \/\/ ===== SEITE 1: KOPF + ZUSAMMENFASSUNG =====\n    \/\/ Header-Band\n    doc.setFillColor(...GREEN_DARK);\n    doc.rect(0, 0, PAGE_W, 28, \"F\");\n    doc.setTextColor(255, 255, 255);\n    doc.setFont(\"helvetica\", \"bold\");\n    doc.setFontSize(16);\n    doc.text(\"Wirtschaftlichkeitsberechnung\", MARGIN, 13);\n    doc.setFont(\"helvetica\", \"normal\");\n    doc.setFontSize(11);\n    doc.text(\"Batteriespeicher mit IAB nach \u00a7 7g EStG\", MARGIN, 21);\n    doc.setFontSize(9);\n    doc.text(\"Erstellt am: \" + today, PAGE_W - MARGIN, 13, { align: \"right\" });\n\n    doc.setTextColor(...INK);\n    let y = 36;\n\n    \/\/ Projekt-Block\n    doc.autoTable({\n      startY: y,\n      body: [\n        [\"Projektbezeichnung\", projekt],\n        [\"Mandant \/ Investor\", mandant],\n        [\"Erstellt von\", ersteller],\n      ],\n      theme: \"plain\",\n      styles: { fontSize: 9.5, cellPadding: 1.6 },\n      columnStyles: {\n        0: { cellWidth: 50, textColor: MUTED },\n        1: { fontStyle: \"bold\" }\n      },\n      margin: { left: MARGIN, right: MARGIN }\n    });\n    y = doc.lastAutoTable.finalY + 6;\n\n    \/\/ KPI-Box\n    const kpiH = 30;\n    doc.setFillColor(...LIGHT_BG);\n    doc.rect(MARGIN, y, PAGE_W - 2 * MARGIN, kpiH, \"F\");\n    doc.setDrawColor(...GREEN_DARK);\n    doc.setLineWidth(0.4);\n    doc.rect(MARGIN, y, PAGE_W - 2 * MARGIN, kpiH);\n\n    const kpiW = (PAGE_W - 2 * MARGIN) \/ 4;\n    const kumEnd = r.kumCashflow[r.kumCashflow.length - 1];\n    const roe = r.ek > 0 ? kumEnd \/ r.ek : 0;\n    const cagr = (r.ek > 0 && r.pachtdauer > 0) ? Math.pow(1 + roe, 1 \/ r.pachtdauer) - 1 : 0;\n\n    const kpis = [\n      { label: \"Steuerersparnis (IAB)\", value: eurPdf(r.ersparnis), sub: \"im IAB-Bildungsjahr\" },\n      { label: \"Eigenkapital\", value: eurPdf(r.ek), sub: r.investition > 0 ? \"EK-Quote \" + pctPdf(r.ek \/ r.investition) : \"\" },\n      { label: \"Fremdkapital\", value: eurPdf(r.fk), sub: r.annuitaet > 0 ? \"Annuit\u00e4t \" + eurPdf(r.annuitaet) + \"\/Jahr\" : \"keine Finanzierung\" },\n      { label: \"EK-Rendite (gesamt)\", value: r.ek > 0 ? pctPdf(roe) : \"\u2014\", sub: r.ek > 0 ? \"ca. \" + pctPdf(cagr) + \" p.a.\" : \"\" }\n    ];\n\n    kpis.forEach((k, i) => {\n      const x = MARGIN + i * kpiW + 4;\n      doc.setFont(\"helvetica\", \"normal\");\n      doc.setFontSize(8);\n      doc.setTextColor(...MUTED);\n      doc.text(k.label, x, y + 6);\n      doc.setFont(\"helvetica\", \"bold\");\n      doc.setFontSize(12);\n      doc.setTextColor(...GREEN_DARK);\n      doc.text(k.value, x, y + 16);\n      doc.setFont(\"helvetica\", \"normal\");\n      doc.setFontSize(7.5);\n      doc.setTextColor(...MUTED);\n      doc.text(k.sub, x, y + 23);\n    });\n\n    y += kpiH + 8;\n\n    \/\/ Eingabe-Tabellen (4 Tabellen, 2x2 Raster)\n    doc.setTextColor(...INK);\n    doc.setFont(\"helvetica\", \"bold\");\n    doc.setFontSize(12);\n    doc.text(\"Eingabeparameter\", MARGIN, y);\n    y += 4;\n\n    const tabW = (PAGE_W - 3 * MARGIN) \/ 2;\n    const tabL = MARGIN;\n    const tabR = MARGIN + tabW + MARGIN;\n\n    const tblInvest = [\n      [\"Investitionssumme (netto)\", eurPdf(inp.investition)],\n      [\"J\u00e4hrlicher Bruttoertrag\", eurPdf(inp.bruttoertrag)],\n      [\"Wartung \/ Service \/ Vers. p.a.\", eurPdf(inp.wartung)],\n      [\"Pachtdauer\", inp.pachtdauer + \" Jahre\"]\n    ];\n    const tblSteuer = [\n      [\"zu vers. Einkommen (zvE)\", eurPdf(inp.zve)],\n      [\"Veranlagung\", inp.splitting ? \"Zusammen (Splitting)\" : \"Einzel\"],\n      [\"Kirchensteuer\", inp.kistSatz === 0 ? \"keine\" : (inp.kistSatz * 100).toFixed(0) + \" %\"],\n      [\"Solidarit\u00e4tszuschlag\", inp.soliAktiv ? \"ja\" : \"nein\"]\n    ];\n    const tblAfa = [\n      [\"IAB-Satz\", (inp.iabSatz * 100).toFixed(0) + \" %\"],\n      [\"Degressive AfA\", (inp.degSatz * 100).toFixed(0) + \" %\"],\n      [\"Sonder-AfA \u00a7 7g Abs. 5\", (inp.sonderSatz * 100).toFixed(0) + \" %\"],\n      [\"Steuerl. Nutzungsdauer\", inp.nutzungsdauer + \" Jahre\"]\n    ];\n    const tblFin = [\n      [\"EK-Strategie\", state.ek === \"iab\" ? \"EK = IAB-Erstattung\" : \"eigener Betrag\"],\n      [\"Zinssatz Fremdkapital\", (inp.zinssatz * 100).toFixed(2) + \" %\"],\n      [\"Finanzierungslaufzeit\", inp.laufzeit + \" Jahre\"],\n      [\"Diskontsatz (NPV)\", (inp.diskont * 100).toFixed(1) + \" %\"]\n    ];\n\n    const tblStyle = {\n      theme: \"grid\",\n      styles: { fontSize: 8.5, cellPadding: 1.6 },\n      headStyles: { fillColor: GREEN_DARK, textColor: 255, fontStyle: \"bold\", halign: \"left\" },\n      columnStyles: { 1: { halign: \"right\", fontStyle: \"bold\" } }\n    };\n\n    doc.autoTable({ ...tblStyle, startY: y, head: [[\"Investition & Ertrag\", \"\"]], body: tblInvest,\n      margin: { left: tabL }, tableWidth: tabW });\n    const yLeft1 = doc.lastAutoTable.finalY;\n\n    doc.autoTable({ ...tblStyle, startY: y, head: [[\"Steuerliche Situation\", \"\"]], body: tblSteuer,\n      margin: { left: tabR }, tableWidth: tabW });\n    const yRight1 = doc.lastAutoTable.finalY;\n\n    const y2 = Math.max(yLeft1, yRight1) + 4;\n\n    doc.autoTable({ ...tblStyle, startY: y2, head: [[\"IAB & Abschreibung\", \"\"]], body: tblAfa,\n      margin: { left: tabL }, tableWidth: tabW });\n    doc.autoTable({ ...tblStyle, startY: y2, head: [[\"Finanzierung\", \"\"]], body: tblFin,\n      margin: { left: tabR }, tableWidth: tabW });\n\n    \/\/ ===== SEITE 2: DETAILTABELLEN =====\n    doc.addPage();\n    doc.setFillColor(...GREEN_DARK);\n    doc.rect(0, 0, PAGE_W, 18, \"F\");\n    doc.setTextColor(255, 255, 255);\n    doc.setFont(\"helvetica\", \"bold\");\n    doc.setFontSize(13);\n    doc.text(\"Detailauswertung\", MARGIN, 12);\n\n    y = 28;\n    doc.setTextColor(...INK);\n    doc.setFontSize(11);\n    doc.text(\"Rendite-Meilensteine\", MARGIN, y);\n    y += 3;\n\n    const meilensteine = [1, 2, 5, 10, 15].filter(n => n <= r.pachtdauer);\n    if (!meilensteine.includes(r.pachtdauer)) meilensteine.push(r.pachtdauer);\n    const milestoneBody = meilensteine.map(n => {\n      const kum = r.kumCashflow[n];\n      const npv = r.npvReihe[n];\n      const rendite = r.ek > 0 ? kum \/ r.ek : 0;\n      return [\n        \"nach \" + n + \" Jahr\" + (n > 1 ? \"en\" : \"\"),\n        eurPdf(kum),\n        eurPdf(npv),\n        r.ek > 0 ? pctPdf(rendite) : \"\u2014\",\n        kum >= 0 ? \"positiv\" : \"Aufbauphase\"\n      ];\n    });\n\n    doc.autoTable({\n      startY: y,\n      head: [[\"Zeitraum\", \"Kum. Cashflow\", \"Barwert (NPV)\", \"EK-Rendite\", \"Status\"]],\n      body: milestoneBody,\n      theme: \"striped\",\n      styles: { fontSize: 9.5, cellPadding: 2.2 },\n      headStyles: { fillColor: GREEN_DARK, textColor: 255, fontStyle: \"bold\", halign: \"right\" },\n      columnStyles: {\n        0: { halign: \"left\", fontStyle: \"bold\" },\n        1: { halign: \"right\" }, 2: { halign: \"right\" }, 3: { halign: \"right\" },\n        4: { halign: \"center\" }\n      },\n      alternateRowStyles: { fillColor: [248, 250, 252] },\n      margin: { left: MARGIN, right: MARGIN }\n    });\n    y = doc.lastAutoTable.finalY + 8;\n\n    doc.setFont(\"helvetica\", \"bold\");\n    doc.setFontSize(11);\n    doc.text(\"Jahres\u00fcbersicht (vollst\u00e4ndig)\", MARGIN, y);\n    y += 3;\n\n    const yearBody = r.jahresDaten.map((d, i) => {\n      const label = d.periode === 0 ? \"IAB-Jahr\" : \"Jahr \" + d.periode;\n      const zt = (d.zins || d.tilg) ? eurPdf(d.zins) + \" \/ \" + eurPdf(d.tilg) : \"\u2014\";\n      return [\n        label,\n        d.ops ? eurPdf(d.ops) : \"\u2014\",\n        zt,\n        d.afa ? eurPdf(d.afa) : \"\u2014\",\n        eurPdf(d.steuer),\n        eurPdf(d.cf),\n        eurPdf(r.kumCashflow[i])\n      ];\n    });\n\n    doc.autoTable({\n      startY: y,\n      head: [[\"Jahr\", \"Ertr\u00e4ge \u2212 Wartung\", \"Zins \/ Tilgung\", \"AfA gesamt\", \"Steuerwirkung\", \"Cashflow\", \"Kumuliert\"]],\n      body: yearBody,\n      theme: \"striped\",\n      styles: { fontSize: 8, cellPadding: 1.8 },\n      headStyles: { fillColor: GREEN_DARK, textColor: 255, fontStyle: \"bold\", halign: \"right\" },\n      columnStyles: {\n        0: { halign: \"left\", fontStyle: \"bold\" },\n        1: { halign: \"right\" }, 2: { halign: \"right\" }, 3: { halign: \"right\" },\n        4: { halign: \"right\" }, 5: { halign: \"right\" },\n        6: { halign: \"right\", fontStyle: \"bold\" }\n      },\n      alternateRowStyles: { fillColor: [248, 250, 252] },\n      margin: { left: MARGIN, right: MARGIN }\n    });\n\n    \/\/ ===== SEITE 3: HINWEISE & UNTERSCHRIFT =====\n    doc.addPage();\n    doc.setFillColor(...GREEN_DARK);\n    doc.rect(0, 0, PAGE_W, 18, \"F\");\n    doc.setTextColor(255, 255, 255);\n    doc.setFont(\"helvetica\", \"bold\");\n    doc.setFontSize(13);\n    doc.text(\"Hinweise & Rechtsgrundlagen\", MARGIN, 12);\n\n    y = 30;\n    doc.setTextColor(...INK);\n    doc.setFont(\"helvetica\", \"bold\");\n    doc.setFontSize(11);\n    doc.text(\"Berechnungsgrundlagen\", MARGIN, y);\n    y += 6;\n    doc.setFont(\"helvetica\", \"normal\");\n    doc.setFontSize(9.5);\n    [\n      \"\u2022  \u00a7 7g EStG \u2013 Investitionsabzugsbetrag (IAB) und Sonderabschreibung\",\n      \"\u2022  \u00a7 7 Abs. 2 EStG \u2013 Degressive Abschreibung (Investitionssofortprogramm 2025)\",\n      \"\u2022  \u00a7 32a EStG \u2013 Einkommensteuertarif 2025\",\n      \"\u2022  Anschaffungszeitraum 01.07.2025 \u2013 31.12.2027 (Wachstumsbooster)\"\n    ].forEach(l => { doc.text(l, MARGIN, y); y += 5.5; });\n\n    y += 4;\n    doc.setFont(\"helvetica\", \"bold\");\n    doc.setFontSize(11);\n    doc.text(\"Voraussetzungen f\u00fcr den IAB\", MARGIN, y);\n    y += 6;\n    doc.setFont(\"helvetica\", \"normal\");\n    doc.setFontSize(9.5);\n    [\n      \"\u2022  Gewerbliche oder selbst\u00e4ndige T\u00e4tigkeit\",\n      \"\u2022  Gewinngrenze: 200.000 EUR im Wirtschaftsjahr der Inanspruchnahme\",\n      \"\u2022  Mindestens 90 % betriebliche Nutzung des Wirtschaftsguts\",\n      \"\u2022  Anschaffung\/Herstellung innerhalb von 3 Jahren nach Bildung\",\n      \"\u2022  Bei Nichtinvestition: r\u00fcckwirkende Aufl\u00f6sung des IAB mit Verzinsung\"\n    ].forEach(l => { doc.text(l, MARGIN, y); y += 5.5; });\n\n    y += 6;\n    \/\/ Disclaimer-Box\n    const dboxH = 44;\n    doc.setFillColor(...WARN_BG);\n    doc.rect(MARGIN, y, PAGE_W - 2 * MARGIN, dboxH, \"F\");\n    doc.setDrawColor(...WARN_BORDER);\n    doc.rect(MARGIN, y, PAGE_W - 2 * MARGIN, dboxH);\n    doc.setTextColor(...WARN_INK);\n    doc.setFont(\"helvetica\", \"bold\");\n    doc.setFontSize(10);\n    doc.text(\"Wichtiger Hinweis\", MARGIN + 5, y + 7);\n    doc.setFont(\"helvetica\", \"normal\");\n    doc.setFontSize(8.8);\n    const disc = doc.splitTextToSize(\n      \"Diese Berechnung stellt eine vereinfachte Modellrechnung dar und ersetzt keine individuelle Steuerberatung. \" +\n      \"Die tats\u00e4chliche steuerliche Auswirkung kann je nach pers\u00f6nlicher Situation, Veranlagungsjahr und weiteren Eink\u00fcnften abweichen. \" +\n      \"Gewerbesteuer ist nicht ber\u00fccksichtigt. Die Steuerwirkung der Folgejahre wird mit dem Grenzsteuersatz angen\u00e4hert; das IAB-Jahr wird \" +\n      \"exakt nach \u00a7 32a EStG (Tarif 2025) berechnet. Ertr\u00e4ge und Wartungskosten sind mit den Vertragsunterlagen abzugleichen. \" +\n      \"Vor Vertragsabschluss empfehlen wir die individuelle Pr\u00fcfung durch einen Steuerberater bzw. die finanzierende Bank.\",\n      PAGE_W - 2 * MARGIN - 10\n    );\n    doc.text(disc, MARGIN + 5, y + 13);\n    y += dboxH + 14;\n\n    \/\/ Unterschrift-Block\n    doc.setTextColor(...INK);\n    doc.setFont(\"helvetica\", \"bold\");\n    doc.setFontSize(11);\n    doc.text(\"Pr\u00fcfung \/ Freigabe\", MARGIN, y);\n    y += 12;\n    doc.setDrawColor(...INK);\n    doc.setLineWidth(0.3);\n\n    const sigW = (PAGE_W - 3 * MARGIN) \/ 2;\n    \/\/ Links: Mandant\n    doc.line(MARGIN, y, MARGIN + sigW, y);\n    doc.setFont(\"helvetica\", \"normal\");\n    doc.setFontSize(8.5);\n    doc.setTextColor(...MUTED);\n    doc.text(\"Ort, Datum, Unterschrift Mandant \/ Investor\", MARGIN, y + 4);\n\n    \/\/ Rechts: Berater\n    doc.line(MARGIN + sigW + MARGIN, y, PAGE_W - MARGIN, y);\n    doc.text(\"Ort, Datum, Unterschrift Steuerberater \/ Bank\", MARGIN + sigW + MARGIN, y + 4);\n\n    \/\/ ===== FUSSZEILE auf allen Seiten =====\n    const pageCount = doc.internal.getNumberOfPages();\n    for (let i = 1; i <= pageCount; i++) {\n      doc.setPage(i);\n      doc.setFont(\"helvetica\", \"normal\");\n      doc.setFontSize(8);\n      doc.setTextColor(...MUTED);\n      doc.text(\"IAB-Rechner Batteriespeicher  \u00b7  \" + today + \"  \u00b7  Ohne Gew\u00e4hr\", MARGIN, 290);\n      doc.text(\"Seite \" + i + \" \/ \" + pageCount, PAGE_W - MARGIN, 290, { align: \"right\" });\n    }\n\n    \/\/ Dateiname\n    const dateStr = new Date().toISOString().slice(0, 10);\n    const safeName = (projekt !== \"\u2014\" ? projekt : \"Batteriespeicher\")\n      .replace(\/[^a-zA-Z0-9\u00e4\u00f6\u00fc\u00c4\u00d6\u00dc\u00df \\-_]\/g, \"\")\n      .trim().replace(\/\\s+\/g, \"_\") || \"Batteriespeicher\";\n    doc.save(\"IAB-Berechnung_\" + safeName + \"_\" + dateStr + \".pdf\");\n\n    statusEl.textContent = \"\u2713 PDF wurde heruntergeladen.\";\n    statusEl.className = \"pdf-status success\";\n  } catch (err) {\n    console.error(err);\n    statusEl.textContent = \"Fehler beim Erstellen: \" + err.message;\n    statusEl.className = \"pdf-status error\";\n  } finally {\n    btnEl.disabled = false;\n  }\n}\n\n\/\/ ---------- Event-Bindung ----------\ndocument.querySelectorAll(\"input[type=number]\").forEach(inp => {\n  inp.addEventListener(\"input\", render);\n});\nfunction bindSeg(segId, stateKey, parser) {\n  document.querySelectorAll(\"#\" + segId + \" button\").forEach(btn => {\n    btn.addEventListener(\"click\", () => {\n      document.querySelectorAll(\"#\" + segId + \" button\").forEach(b => b.classList.remove(\"active\"));\n      btn.classList.add(\"active\");\n      state[stateKey] = parser(btn.dataset.val);\n      if (stateKey === \"ek\") {\n        document.getElementById(\"ekCustomField\").style.display =\n          state.ek === \"custom\" ? \"block\" : \"none\";\n      }\n      render();\n    });\n  });\n}\nbindSeg(\"seg-veranlagung\", \"veranlagung\", v => v);\nbindSeg(\"seg-kist\", \"kist\", v => parseFloat(v));\nbindSeg(\"seg-soli\", \"soli\", v => parseInt(v));\nbindSeg(\"seg-ek\", \"ek\", v => v);\n\ndocument.getElementById(\"btn-pdf\").addEventListener(\"click\", generatePDF);\ndocument.getElementById(\"btn-print\").addEventListener(\"click\", () => window.print());\n\n\/\/ Initial\nrender();\n<\/script>\n<\/body>\n<\/html>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<!--\n  Buy Me a Coffee \u2013 Trinkgeld-Aufruf (dezent, f\u00fcr hellen Hintergrund)\n  Slug: grotzmanueI\n  Einf\u00fcgen als \"Custom HTML\"-Block in WordPress.\n-->\n\n<div style=\"max-width:640px;margin:2rem auto;padding:1.5rem 1.75rem;\n            border:1px solid rgba(0,0,0,.12);border-radius:10px;\n            background:rgba(0,0,0,.03);font-family:inherit;text-align:center;\">\n  <p style=\"margin:0 0 1rem;font-size:1rem;color:#111827;line-height:1.55;\">\n    Wenn dir der Rechner oder die Inhalte hier weitergeholfen haben,\n    freue ich mich \u00fcber einen kleinen Kaffee als Dankesch\u00f6n.\n    Das h\u00e4lt das Projekt werbefrei und am Leben.\n  <\/p>\n  <a href=\"https:\/\/www.buymeacoffee.com\/grotzmanueI\" target=\"_blank\" rel=\"noopener\">\n    <img decoding=\"async\" src=\"https:\/\/img.buymeacoffee.com\/button-api\/?text=Kaffee%20spendieren&#038;emoji=\u2615&#038;slug=grotzmanueI&#038;button_colour=FFDD00&#038;font_colour=000000&#038;font_family=Cookie&#038;outline_colour=000000&#038;coffee_colour=ffffff\"\n         alt=\"Buy me a coffee\" style=\"height:48px;border:0;\">\n  <\/a>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>IAB-Rechner Batteriespeicher \u2013 Rendite &amp; Steuerersparnis IAB \u00b7 WACHSTUMSBOOSTER \u00b7 FINANZIERUNG IAB-Rechner f\u00fcr Batteriespeicher Berechnen Sie Steuerersparnis und Eigenkapitalrendite einer gewerblichen Batteriespeicher-Investition \u2013 inklusive Investitionsabzugsbetrag (\u00a7 7g EStG), degressiver AfA (Wachstumsbooster) und Fremdfinanzierung. Alle Eingaben aktualisieren das Ergebnis sofort. Standardwerte sind beispielhaft \u2013 bitte mit Ihren echten Projekt- und Steuerdaten ersetzen. 1 Investition &amp; Ertrag [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"class_list":["post-1893","page","type-page","status-publish","hentry"],"aioseo_notices":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"trp-custom-language-flag":false,"m360ps-logo":false},"uagb_author_info":{"display_name":"Manuel Grotz","author_link":"https:\/\/manuel360finanz.de\/de\/author\/grmu\/"},"uagb_comment_info":0,"uagb_excerpt":"IAB-Rechner Batteriespeicher \u2013 Rendite &amp; Steuerersparnis IAB \u00b7 WACHSTUMSBOOSTER \u00b7 FINANZIERUNG IAB-Rechner f\u00fcr Batteriespeicher Berechnen Sie Steuerersparnis und Eigenkapitalrendite einer gewerblichen Batteriespeicher-Investition \u2013 inklusive Investitionsabzugsbetrag (\u00a7 7g EStG), degressiver AfA (Wachstumsbooster) und Fremdfinanzierung. Alle Eingaben aktualisieren das Ergebnis sofort. Standardwerte sind beispielhaft \u2013 bitte mit Ihren echten Projekt- und Steuerdaten ersetzen. 1 Investition &amp; Ertrag&hellip;","_links":{"self":[{"href":"https:\/\/manuel360finanz.de\/de\/wp-json\/wp\/v2\/pages\/1893","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/manuel360finanz.de\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/manuel360finanz.de\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/manuel360finanz.de\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manuel360finanz.de\/de\/wp-json\/wp\/v2\/comments?post=1893"}],"version-history":[{"count":5,"href":"https:\/\/manuel360finanz.de\/de\/wp-json\/wp\/v2\/pages\/1893\/revisions"}],"predecessor-version":[{"id":1939,"href":"https:\/\/manuel360finanz.de\/de\/wp-json\/wp\/v2\/pages\/1893\/revisions\/1939"}],"wp:attachment":[{"href":"https:\/\/manuel360finanz.de\/de\/wp-json\/wp\/v2\/media?parent=1893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}