Zum Inhalt

Immohai Architekturübersicht

Status: verbindlicher Zielentwurf
Spezifikationsversion: 0.3.1
Modellbezug: 0.6.2
Implementierungsbezug: frontend-mvp-0.2.5
Stand: 2026-07-05

1. Zweck

Diese Datei beschreibt die technische Zielarchitektur der Immohai-App und verbindet fachliche Domänen, Frontend-MVP, Berechnungsengine, lokale Speicherung, Marktmiet-Daten, Batch-Analyse, spätere Persistenz und Deployment.

Die detaillierte Domänentrennung steht in docs/specification/product-domains-and-workflows/application-domains.md.

2. Produktziel

Immohai ist eine private Web-App zur transparenten Bewertung von Immobilieninvestitionen gegenüber einer ETF-Alternative unter Best-, Base- und Stress-Annahmen.

3. Fachliche Domänen

Einzelanalyse
Batch-Analyse
Meine Objekte
Marktmiet-Daten

Einzel- und Batch-Vollanalyse erzeugen ein normalisiertes PropertyInput und verwenden dieselbe Single-Property-Engine.

4. Zielbild

Einzelanalyse ─┐
               ├──> PropertyInput
Batch-Analyse ─┘        ↓
                 Single-Property-Engine
                        ↓
                  AnalysisResult
                        ↓ bewusste Übernahme
                  Meine Objekte

Separat:

Mietdatei
-> RentObservation[]
-> Validierung und Aggregation
-> RentReferenceDataset
-> published
-> RentEstimate
-> Einzel- oder Batch-Analyse

5. Zentrale Regeln

Rohdaten werden nie direkt berechnet.
Berechnung wird nicht automatisch gespeichert.
Batch-Ergebnisse werden nicht automatisch persönliche Objekte.
Meine Objekte enthält keine Marktmiet-Rohdaten.
Marktmiet-Daten enthält keine persönlichen Investitionsstatus.
Nur published Mietdatasets liefern automatische RentEstimate-Werte.
UI-Komponenten dürfen wiederverwendet werden.
Datenmodelle, Statuswerte und Speicher bleiben getrennt.

6. Aktueller Frontend-MVP

Browser
-> statisches HTML, CSS und JavaScript
-> JavaScript-Single-Property-Engine
-> lokale Browser-Speicher
-> Ergebnisdarstellung
-> Browser-Druck und CSV-Export

Aktiv:

Einzelanalyse
Meine Objekte
lokaler Marktmiet-Prototyp
Batch-Platzhalter
Dokumentation

Nicht aktiv:

zentrales Backend
serverseitige Datenbank
Login
Gerätesynchronisation
produktive Batch-Analyse
Monte Carlo in der App
serverseitige PDF-Erzeugung

7. Deployment

Docker-Compose-Services:

immohai-web
immohai-docs

Lokale Serverports:

App: 127.0.0.1:8200
Doku: 127.0.0.1:8201

Der Host-Nginx übernimmt Reverse Proxy und HTTPS.

8. Seiten

Normale App:

/frontend/index.html
/frontend/batch.html
/frontend/objects.html

Adminbereich:

/frontend/admin.html
/frontend/admin-data-import.html

Der sichtbare Produktbegriff lautet Meine Objekte; der technische Dateiname objects.html bleibt vorerst bestehen.

9. Frontend-Schichten

UI und Seitensteuerung
  ↓
Adapter und Orchestrierung
  ↓
fachliche Services
  ↓
Berechnungsengine
  ↓
Speicheradapter

UI enthält keine Formeln, KPI-Schwellen, Ratinglogik oder Marktmiet-Aggregationsregeln.

10. Adapter und Orchestrierung

Verantwortlich für:

Formularwerte normalisieren
Legacy-Aliase lesen
ValueWithOrigin erzeugen
Defaults und Herkunft auflösen
Szenario-Policies anwenden
PropertyInput erzeugen
Engine aufrufen
PropertyRecord erzeugen

Manuelle finale Werte werden nicht durch Objektprofile verändert.

11. Single-Property-Engine

PropertyInput
-> ScenarioInput[]
-> AnnualProjectionRow[]
-> ScenarioResult[]
-> AnalysisResult

Best und Stress erhalten ScenarioAssessments. Nur Base beziehungsweise AnalysisResult erhält das vollständige Investment Rating.

Fehlende Datenqualität führt zu UNRATED und niemals zu einem automatischen Score 100.

12. Kanonische Feldnamen

Neue Ergebnisse schreiben:

monthly_cold_rent
noi_yield_y1
initial_ltv
current_ltv_y1
terminal_net_vs_etf_after_exit
non_purchase_costs_financed_amount

Legacy-Felder werden nur über Adapter gelesen.

13. Marktmiet-Datenarchitektur

RentImportRun
-> RentObservation[]
-> Validierung
-> RentAreaStats[]
-> RentReferenceDataset
-> RentEstimate

Dataset-Lifecycle:

draft
published
archived

Automatische Standardsegmente trennen mindestens market_type und unit_scope; Möblierung wird getrennt oder explizit ausgeschlossen.

14. Speicherbereiche

immohai.propertyRecords.v1
immohai.marketRentDatabase.v1

Später:

MyObjectsStore
RentReferenceStore
BatchWorkspaceStore

Storage Keys werden nicht ohne Migration geändert.

15. Backend-Zielbild

Später möglich:

FastAPI
SQLite als erste private Serverpersistenz
PostgreSQL bei höherer Parallelität oder größerem Volumen
serverseitige Analysehistorie
Importhistorie
Jobs
Reportgenerierung

Zeitpunkt und Datenbankwahl bleiben offene Entscheidungen.

16. Importarchitektur

Kaufobjekte:

CSV
-> Mapping
-> NormalizedListing
-> Pre-Screening
-> PropertyInput
-> Vollanalyse

Mietdaten:

CSV
-> RentObservation
-> Aggregation
-> Dataset

CSV ist das bevorzugte erste Austauschformat. XLSX bleibt eine spätere direkte Importoption.

17. Versionierung

Das Versionsmanifest verbindet Modell, Engine, PropertyInput-Schema, Defaults, Szenariopresets, Objektprofile und Marktmiet-Schema.

Jeder Rechenlauf und PropertyRecord speichert die wirksamen Versionen.

18. Testbarkeit

Berechnungsfunktionen bleiben unabhängig von DOM und Browser-UI testbar.

Pflichtprüfungen:

Konfigurationssync
Schema-Validierung
Baseline-Regression
PropertyRecord-Store
Marktmiet-Aggregation
Frontend-Baseline
MkDocs strict build

19. Umsetzungsreihenfolge

Fachmodell und Spezifikationen stabilisieren
Schema, Konfiguration und Engine synchronisieren
Meine Objekte konsolidieren
Marktmiet-Daten stabilisieren
Batch implementieren
Backend und Persistenz
Reporting
Monte Carlo