No description
Find a file
2025-10-27 11:27:23 +01:00
assets init 2025-10-27 09:43:17 +01:00
calculations init 2025-10-27 09:43:17 +01:00
gaspreisrechner.egg-info init 2025-10-27 09:43:17 +01:00
.dockerignore init 2025-10-27 09:43:17 +01:00
.pdm-python init 2025-10-27 09:43:17 +01:00
app.py app.py aktualisiert 2025-10-27 11:17:40 +01:00
docker-compose.yml docker-compose.yml aktualisiert 2025-10-27 11:24:30 +01:00
dockerfile dockerfile aktualisiert 2025-10-27 11:27:23 +01:00
export_temp.json init 2025-10-27 09:43:17 +01:00
pdm.lock init 2025-10-27 09:43:17 +01:00
pyproject.toml init 2025-10-27 09:43:17 +01:00
README.md init 2025-10-27 09:43:17 +01:00
requirements.txt init 2025-10-27 09:43:17 +01:00
update_repo.sh change mod 2025-10-27 10:46:07 +01:00

💡 Gaspreis-Simulationsrechner

Ein interaktives Dash-Dashboard zur Simulation und Analyse von Gaspreisverträgen
mit Folgeverträgen, Boni, Rabatten, Teuerungsraten und dynamischer Ergebnisvisualisierung.


🚀 Features

  • Eingabe beliebig vieler Verträge (interaktiv über Dash-Table)
  • Automatische Berechnung von Folgeverträgen (Varianten A, B, C)
  • Dynamische Simulation über beliebige Simulationsjahre
  • Teuerungstabelle (mit Default 5 %)
  • Import & Export (CSV)
  • PDF-Bericht mit:
    • formatierten Ergebnistabellen
    • markiertem Gewinnervertrag
    • Plot
    • zweispaltiger Erläuterungsseite mit Annahmen
  • Responsives Tailwind-Layout mit Kartenoptik

🧩 Projektstruktur

project_root/
├── app.py                 # Haupt-Dash-App (Layout + Callbacks)
├── calculations.py        # Berechnungslogik
├── engine.py              # Simulation, Erklärungstext, Ergebnismodellierung
├── models.py              # Definition von Simulationsvarianten
├── utils.py               # Import/Export, Standardwerte etc.
├── assets/
│   └── style.css          # Globales Styling
├── requirements.txt
├── Dockerfile
└── README.md

⚙️ Installation (lokal)

# 1. Umgebung vorbereiten
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 2. Abhängigkeiten installieren
pip install -r requirements.txt

# 3. Starten
python app.py

App läuft danach unter http://localhost:8050


🐳 Mit Docker starten

# Image bauen
docker build -t gaspreisrechner .

# Container starten
docker run -p 8050:8050 gaspreisrechner

App erreichbar unter http://localhost:8050


🧠 Simulationen in models.py

In models.py sind die Berechnungsmodelle für Folgeverträge definiert.
Jede Simulation beschreibt, wie Preise, Laufzeiten, Boni und Rabatte über die Jahre fortgeschrieben werden.

Ein typischer Ausschnitt:

# models.py

def simulate_variant_a(contract, avg_bonuses, avg_discounts, sim_years):
    """Variante A:
    - gleiche Laufzeit wie Originalvertrag
    - Durchschnittsboni und Rabatte aller Verträge
    - konstante Preise während der Laufzeit
    """
    results = []
    price = contract["Arbeitspreis"]
    base = contract["Grundpreis"]
    for year in range(sim_years):
        total = base + price * contract["Verbrauch"]
        total *= (1 - avg_discounts)
        total -= avg_bonuses
        results.append(total)
    return results


def simulate_variant_b(contract, sim_years):
    """Variante B:
    - Laufzeit = 1 Jahr
    - keine Boni oder Rabatte
    """
    results = []
    for year in range(sim_years):
        total = contract["Grundpreis"] + contract["Arbeitspreis"] * contract["Verbrauch"]
        results.append(total)
    return results


def simulate_variant_c(contract, avg_duration, avg_bonus, avg_discount, sim_years):
    """Variante C:
    - abgerundete Durchschnittslaufzeit
    - Durchschnittsboni und Rabatte
    """
    duration = round(avg_duration)
    results = []
    for year in range(sim_years):
        total = contract["Grundpreis"] + contract["Arbeitspreis"] * contract["Verbrauch"]
        if (year + 1) % duration == 0:
            total *= (1 - avg_discount)
            total -= avg_bonus
        results.append(total)
    return results

🧩 Eine neue Simulation hinzufügen

1 Öffne models.py
2 Füge eine neue Funktion hinzu, z. B.:

def simulate_variant_d(contract, inflation, sim_years):
    """Variante D:
    - Preise steigen jährlich gemäß Inflationsrate
    - keine Boni oder Rabatte
    """
    results = []
    base = contract["Grundpreis"]
    price = contract["Arbeitspreis"]
    for year in range(sim_years):
        total = base + price * contract["Verbrauch"]
        results.append(total)
        # Preise für nächstes Jahr anpassen
        base *= (1 + inflation)
        price *= (1 + inflation)
    return results

3 Registriere die Variante in engine.py:

from models import simulate_variant_a, simulate_variant_b, simulate_variant_c, simulate_variant_d

SIMULATION_VARIANTS = {
    "A": simulate_variant_a,
    "B": simulate_variant_b,
    "C": simulate_variant_c,
    "D": simulate_variant_d,   # <--- neue Variante
}

4 Starte die App neu
→ Die Variante „D“ erscheint automatisch im PDF & in der Ergebnislogik.


📄 PDF-Export

Exportiert automatisch:

  • Ergebnistabelle
  • Gewinner farblich markiert
  • Plot (PNG via Kaleido)
  • Zweispaltige Erläuterungsseite
    aus _cached_explanation (z. B. Dict mit header + bullets)

Beispiel:

app._cached_explanation = {
    "header": "Simulationsvarianten & Annahmen",
    "bullets": [
        "Variante A  gleiche Laufzeit wie der Originalvertrag, Durchschnittsboni und Rabatte.",
        "Variante B  1 Jahr Laufzeit ohne Boni oder Rabatte.",
        "Variante C  Durchschnittslaufzeit mit Durchschnittsboni und Rabatten.",
        "Während der Laufzeit bleiben Grund- und Arbeitspreise fix.",
        "Nach Ablauf werden sie gemäß den Teuerungsraten fortgeschrieben."
    ]
}

📚 Lizenz

MIT License
(c) 2025 Gaspreisrechner Project Team