from flask import Flask, render_template, request, jsonify, url_for import pandas as pd import os import logging import numpy as np from datetime import datetime app = Flask(__name__, static_folder='static') logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(__name__) # Version der Anwendung VERSION = "1.0.1" # Pfad zur CSV-Datei CSV_FILE = "data/customers.csv" def clean_dataframe(df): """Konvertiert NaN-Werte in None für JSON-Kompatibilität""" return df.replace({np.nan: None}) # CSV-Datei laden def load_data(): try: logger.info("Versuche CSV-Datei zu laden...") if not os.path.exists(CSV_FILE): logger.error(f"CSV-Datei '{CSV_FILE}' nicht gefunden!") return None df = pd.read_csv(CSV_FILE, encoding='utf-8') df = clean_dataframe(df) logger.info(f"CSV-Datei erfolgreich geladen. {len(df)} Einträge gefunden.") return df except Exception as e: logger.error(f"Fehler beim Laden der CSV-Datei: {str(e)}") return None @app.route('/') def index(): return render_template('index.html') @app.route('/search') def search(): try: # Spezifische Suchparameter name = request.args.get('name', '').lower() ort = request.args.get('ort', '').lower() kundennummer = request.args.get('kundennummer', '').lower() fachrichtung = request.args.get('fachrichtung', '').lower() # Allgemeine Suche (für die alte Funktionalität) query = request.args.get('q', '').lower() logger.info(f"Suche nach - Name: {name}, Ort: {ort}, Kundennummer: {kundennummer}, Fachrichtung: {fachrichtung}, Query: {query}") df = load_data() if df is None: return jsonify({"error": "Datenbank konnte nicht geladen werden"}), 500 # Basis-Mask (immer True) mask = pd.Series(True, index=df.index) # Spezifische Suchkriterien anwenden if name: name_mask = ( df['Vorname'].str.lower().str.contains(name, na=False) | df['Nachname'].str.lower().str.contains(name, na=False) ) mask &= name_mask if ort: ort_mask = df['Ort'].str.lower().str.contains(ort, na=False) mask &= ort_mask if kundennummer: kunden_mask = df['Nummer'].astype(str).str.contains(kundennummer, na=False) mask &= kunden_mask if fachrichtung: fach_mask = df['Fachrichtung'].str.lower().str.contains(fachrichtung, na=False) mask &= fach_mask # Wenn eine allgemeine Suche vorhanden ist, diese zusätzlich anwenden if query: query_mask = ( df['Vorname'].str.lower().str.contains(query, na=False) | df['Nachname'].str.lower().str.contains(query, na=False) | df['Fachrichtung'].str.lower().str.contains(query, na=False) | df['Ort'].str.lower().str.contains(query, na=False) | df['Nummer'].astype(str).str.contains(query, na=False) ) mask &= query_mask results = df[mask].to_dict('records') logger.info(f"{len(results)} Ergebnisse gefunden") return jsonify(results) except Exception as e: logger.error(f"Fehler bei der Suche: {str(e)}") return jsonify({"error": str(e)}), 500 if __name__ == '__main__': app.run(debug=True)