""" Menschenlesbare Hinweise zu typischen Import-/DB-Fehlern (Universal-CSV). """ from __future__ import annotations def enrich_row_error(message: str, module: str | None = None) -> dict[str, str | None]: """ Ergänzt eine Rohexception-Zeichenkette um ``code`` und ``hint`` für die Fehlerliste im Import. """ low = (message or "").lower() out: dict[str, str | None] = {"error": message, "code": None, "hint": None} if "numeric field overflow" in low or "numeric value out of range" in low: out["code"] = "db_numeric_overflow" out["hint"] = ( "Wert passt nicht in die Datenbank-Spalte (z. B. NUMERIC mit begrenzter Größe). " "Häufig: Kilojoule aus dem Export landen im Kalorien-Feld – in der Vorlage für kcal_active/kcal_resting " '"source_unit": "kj" setzen. Oder eine falsche CSV-Spalte ist einem kleinen Zielfeld zugeordnet ' "(z. B. große Zahl in einem HF-Feld)." ) return out if "violates check constraint" in low and "source" in low: out["code"] = "db_check_constraint_source" out["hint"] = ( "Die Tabelle erlaubt den gesetzten «source»-Wert nicht. " "System-Vorlage / Migration zur erlaubten Quelle prüfen (z. B. csv für Universal-Import)." ) return out if "current transaction is aborted" in low: out["code"] = "transaction_aborted" out["hint"] = ( "Eine frühere Zeile hat einen Datenbankfehler ausgelöst. " "Zuerst die niedrigste Zeilennummer in error_details beheben (Vorlage/Daten prüfen)." ) return out if "invalid input syntax" in low and "time" in low: out["code"] = "db_time_cast" out["hint"] = ( "start_time/end_time passen nicht zum erwarteten Zeitformat in der Datenbank. " "Vorlage: Datums- und Zeitanteil konsistent (oft nur Uhrzeit, wenn date separat)." ) return out if module == "activity" and "foreign key" in low: out["code"] = "db_foreign_key" out["hint"] = "Verknüpfung zur Datenbank verletzt (z. B. training_type). Support kontaktieren." return out