Import, Listing-Lifecycle und Datenqualität¶
Status: verbindlicher Zielentwurf
Spezifikationsversion: 1.1.0
Modellbezug: 0.6.2
Stand: 2026-07-05
1. Zweck¶
Diese Spezifikation beschreibt Kaufobjekt- und Listingdaten vor der Berechnung:
Quellenreferenzen
Rohdaten
Listing-Identität
Listing-Lifecycle
Normalisierung
AvailabilityCheck
Feldherkunft
Listing-Datenqualität
Enrichment
Übergang zu PropertyInput
Führende Detaildateien:
Batch: docs/specification/product-domains-and-workflows/batch-analysis.md
Marktmiet-Daten: docs/specification/product-domains-and-workflows/market-rent-import.md
Mietermittlung: docs/specification/product-domains-and-workflows/rent-analysis.md
Analyse-Datenqualität: docs/specification/data-quality-and-validation/data-quality-assessment.md
Meine Objekte: docs/specification/product-domains-and-workflows/saved-objects.md
2. Grundregeln¶
Rohdaten werden nie direkt berechnet.
Rohwerte bleiben nachvollziehbar.
Fehler werden je Objekt isoliert.
Fehlende und geschätzte Werte bleiben sichtbar.
Technische Machbarkeit ersetzt keine rechtliche Zulässigkeit.
Ein Quellenlink ist keine Datenübernahme.
3. Datenfluss¶
Zielarchitektur für freigegebene Importwege:
ListingSource
-> CollectionRun oder BatchImportRun
-> RawListingSnapshot
-> ListingRecord
-> NormalizedListing
-> EnrichedListing
-> PropertyInput
-> Single-Property-Engine
Aktiver manueller Quellenweg:
Inseratslink
-> source_reference
-> manuelle Eingabe
-> PropertyInput
4. Inseratslink als Quellenreferenz¶
Der Inseratslink ist als begrenzte Funktion angenommen.
Zulässig:
URL erfassen
Quellenart und Plattform dokumentieren
Erfassungszeitpunkt speichern
Link im PropertyInput und PropertyRecord referenzieren
Nicht zulässig:
automatische Portalabfrage
automatische Feldübernahme
Scraping
Speicherung vollständiger Exposés oder Bilder
Berechnung direkt aus Link oder Webseiteninhalt
Kanonische Struktur:
source_kind = listing_link
source_url
source_platform
processing_status = reference_only
captured_at
note optional
Speicherung:
PropertyInput.meta.source_reference
PropertyRecord.listing_import_reference
listing_import_state ist nur ein Legacy-Lesealias.
5. Unterstützte und spätere Quellen¶
Aktiv:
manual
listing_link als reference_only
csv_import für Marktmietdaten
Spätere mögliche Eingangskanäle nach separater Annahme:
csv_import für Kaufobjekte
browser_export
licensed_api
permitted_import
other_import
Jede Quelle benötigt mindestens:
source_name oder source_platform
source_type oder source_kind
source_reference
captured_at
Zusätzlich, soweit relevant:
license_note
terms_review_status
retention_policy
6. RawListingSnapshot¶
Nur für später freigegebene Importwege:
snapshot_id
collection_run_id oder batch_run_id
source_listing_id
source_url
raw_payload optional
raw_text optional
raw_file_reference optional
content_hash
captured_at
extraction_status
extraction_warnings
Nicht unnötig dauerhaft speichern:
urheberrechtlich geschützte Bilder
vollständige Exposés
personenbezogene Daten
7. ListingRecord und Lifecycle¶
canonical_listing_id
source_listing_ids
first_seen_at
last_seen_at
listing_status
missing_since
missing_count
reactivated_at
content_hash_current
possible_duplicate_of
Status:
active
missing_once
missing_repeated
inactive
archived
duplicate
invalid
Ein einmal nicht gefundenes Listing wird nicht automatisch dauerhaft inaktiv gesetzt.
8. AvailabilityCheck¶
check_id
canonical_listing_id
checked_at
source_name
source_url
result_status
found
redirect_detected
content_changed
error_code
warning
availability_confidence
Ein technischer Prüfungsfehler verschlechtert den Listingstatus nicht automatisch. Historische Analysen bleiben erhalten.
9. NormalizedListing¶
canonical_listing_id
batch_row_id oder snapshot_id
source_reference
base_data
location
acquisition
costs
rental
listing_status
field_origins
listing_data_quality_assessment
warnings
Kanonische Objektfelder:
property_category
rental_strategy
construction_status
object_type_profile bleibt ein optionales UI-Feld.
Kanonische Felder:
monthly_cold_rent
non_recoverable_operating_costs_pa
10. ValueWithOrigin¶
Der führende Vertrag steht in docs/specification/data-quality-and-validation/data-model.md.
Bei origin = missing gilt value = null. Nicht erkannte oder widersprüchliche Werte werden nicht erfunden.
11. Konflikte¶
Bei widersprüchlichen Angaben:
Konflikt speichern
Confidence reduzieren
Warnung erzeugen
keinen Wert still als sicher behandeln
12. EnrichedListing¶
rent_estimate
location_enrichment
condition_enrichment
cost_estimate
wg_suitability
listing_data_quality_assessment
warnings
Enrichment bleibt als derived oder estimated gekennzeichnet und wird nicht durch Objektprofile erneut verändert.
13. Getrennte Qualitätsmodelle¶
ListingDataQualityAssessment
RentEstimateConfidence
AnalysisDataQualityAssessment
Nur AnalysisDataQualityAssessment steuert die Ratings.
14. ListingDataQualityAssessment¶
Mögliche Komponenten:
required_fields_score
source_quality_score
location_resolution_score
freshness_score
availability_score
conflict_score
condition_data_score
cost_data_score
warnings
method_version
Die genaue Listing-Methode wird vor dem Batch-MVP separat versioniert.
15. Warnungen¶
code
severity
message
affected_fields
recommendation optional
Severity:
info
warning
critical
16. Pre-Screening¶
Ohne FinancingProfile immer zulässig:
Kaufpreis pro m²
Miete pro m²
Bruttorendite
Kaufpreisfaktor
Miet-Confidence
Listing-Datenqualität
fehlende Felder
Warnungen
Listingstatus
NOI-Rendite ist nur zulässig, wenn mindestens vorliegen oder transparent versioniert defaulted sind:
closing_costs_pct
initial_renovation_costs
vacancy_pct
non_recoverable_operating_costs_pa
Ohne FinancingProfile nicht zulässig:
Darlehen
LTV
DSCR
Kapitaldienst
Cashflow nach Finanzierung
ETF-Vergleich
Investment Rating
17. Übergang zu PropertyInput¶
Kanonische Mindestfelder einer Vollanalyse:
purchase_price
living_area_sqm
property_category
rental_strategy
construction_status
monthly_cold_rent
rent_basis
closing_costs_pct
requested_equity_contribution
interest_initial_pct
interest_basis
amortization_initial_pct
interest_reset_year
interest_reset_pct
interest_reset_basis
term_years
Lage ist für eine manuelle Einzelanalyse optional und reduziert bei Fehlen die Datenqualität. Für automatisches RentEstimate und Batch-Vollanalyse muss mindestens city oder location_label vorliegen.
Danach wird ein AnalysisDataQualityAssessment erzeugt.
18. Beziehung zu Batch und Meine Objekte¶
BatchAnalysisResult != PropertyRecord
Nur vollständig berechnete und bewusst ausgewählte Ergebnisse werden übernommen. PropertyRecords speichern keine unnötigen Rohpayloads.
19. Datenschutz und Repository¶
Nicht committen:
echte Importdateien
vollständige private Objektadressen
Kontaktdaten
Exposé-Bilder
Secrets
lizenzrechtlich ungeklärte Rohdaten
20. Aktueller Stand¶
Vorhanden:
manuelle Einzelanalyse
Inseratslink als reference_only
PropertyRecord-Snapshots
lokaler Marktmiet-Prototyp
Batch-Platzhalter
AnalysisDataQualityAssessment
Noch offen:
Kaufobjekt-Dateiupload
Spaltenmapping
persistente RawListingSnapshots
AvailabilityCheck
ListingDataQualityAssessment-Methode
Batch-Ranking
21. Tests¶
Inseratslink wird nur als Quellenreferenz gespeichert.
Quellenlink übernimmt keine Felder automatisch.
Rohdaten werden nicht direkt berechnet.
Rohwert und Normalisierung bleiben nachvollziehbar.
Feldkonflikte reduzieren Confidence.
Ein fehlerhaftes Objekt beendet nicht den Lauf.
Listingstatus folgt dem Lifecycle.
Listing- und Analyse-Datenqualität bleiben getrennt.
NOI-Pre-Screening benötigt transparente Kostendaten.
Neue Datensätze schreiben kanonische Felder.