Fix: Teilen-Button und Telefonnummern-Links wieder hinzugefügt, Zeilenabstand in Suchergebnissen optimiert

This commit is contained in:
2025-03-19 09:56:06 +01:00
parent 35645fc671
commit 611a5dd906
4 changed files with 286 additions and 45 deletions

66
app.py
View File

@@ -38,7 +38,7 @@ def init_db():
conn = sqlite3.connect(DB_FILE)
c = conn.cursor()
# Erstelle die Tabelle
# Erstelle die Kunden-Tabelle
c.execute('''
CREATE TABLE IF NOT EXISTS customers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -55,6 +55,25 @@ def init_db():
)
''')
# Erstelle die Tags-Tabelle
c.execute('''
CREATE TABLE IF NOT EXISTS tags (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE NOT NULL
)
''')
# Erstelle die Verbindungstabelle für Kunden-Tags
c.execute('''
CREATE TABLE IF NOT EXISTS customer_tags (
customer_id INTEGER,
tag_id INTEGER,
PRIMARY KEY (customer_id, tag_id),
FOREIGN KEY (customer_id) REFERENCES customers (id),
FOREIGN KEY (tag_id) REFERENCES tags (id)
)
''')
# Erstelle Indizes für alle Suchfelder
c.execute('CREATE INDEX IF NOT EXISTS idx_customers_nummer ON customers(nummer)')
c.execute('CREATE INDEX IF NOT EXISTS idx_customers_name ON customers(name)')
@@ -69,6 +88,10 @@ def init_db():
# Erstelle einen zusammengesetzten Index für die häufigste Suchkombination
c.execute('CREATE INDEX IF NOT EXISTS idx_customers_name_ort ON customers(name, ort)')
# Erstelle Standard-Tags, falls sie noch nicht existieren
c.execute('INSERT OR IGNORE INTO tags (name) VALUES (?)', ('medisoft',))
c.execute('INSERT OR IGNORE INTO tags (name) VALUES (?)', ('mediconsult',))
conn.commit()
conn.close()
logger.info('Datenbank initialisiert')
@@ -79,6 +102,7 @@ def import_csv():
c = conn.cursor()
# Lösche bestehende Daten
c.execute('DELETE FROM customer_tags')
c.execute('DELETE FROM customers')
try:
@@ -96,6 +120,10 @@ def import_csv():
# Kombiniere Vorname und Nachname
df['name'] = df['Vorname'] + ' ' + df['Nachname']
# Hole die ID des medisoft Tags
c.execute('SELECT id FROM tags WHERE name = ?', ('medisoft',))
medisoft_tag_id = c.fetchone()[0]
# Importiere die Daten
for _, row in df.iterrows():
c.execute('''
@@ -113,6 +141,15 @@ def import_csv():
f"Fachrichtung: {row['Fachrichtung']}",
row['Fachrichtung']
))
# Hole die ID des eingefügten Kunden
customer_id = c.lastrowid
# Füge das medisoft Tag hinzu
c.execute('''
INSERT INTO customer_tags (customer_id, tag_id)
VALUES (?, ?)
''', (customer_id, medisoft_tag_id))
conn.commit()
logger.info('CSV-Daten erfolgreich in die Datenbank importiert')
@@ -142,7 +179,13 @@ def search_customers(search_params):
try:
# Baue die SQL-Abfrage dynamisch auf
query = "SELECT * FROM customers WHERE 1=1"
query = """
SELECT c.*, GROUP_CONCAT(t.name) as tags
FROM customers c
LEFT JOIN customer_tags ct ON c.id = ct.customer_id
LEFT JOIN tags t ON ct.tag_id = t.id
WHERE 1=1
"""
params = []
# Allgemeine Suche über alle Felder
@@ -156,35 +199,37 @@ def search_customers(search_params):
conditions = []
for term in terms:
term = f"%{term}%"
conditions.append("(name LIKE ? OR ort LIKE ? OR nummer LIKE ? OR telefon LIKE ? OR mobil LIKE ? OR email LIKE ? OR bemerkung LIKE ? OR fachrichtung LIKE ?)")
conditions.append("(c.name LIKE ? OR c.ort LIKE ? OR c.nummer LIKE ? OR c.telefon LIKE ? OR c.mobil LIKE ? OR c.email LIKE ? OR c.bemerkung LIKE ? OR c.fachrichtung LIKE ?)")
params.extend([term] * 8)
query += " AND " + " AND ".join(conditions)
else:
# Bei ODER-Verknüpfung (Standard) muss mindestens ein Begriff in einem Feld vorkommen
query += " AND (name LIKE ? OR ort LIKE ? OR nummer LIKE ? OR telefon LIKE ? OR mobil LIKE ? OR email LIKE ? OR bemerkung LIKE ? OR fachrichtung LIKE ?)"
query += " AND (c.name LIKE ? OR c.ort LIKE ? OR c.nummer LIKE ? OR c.telefon LIKE ? OR c.mobil LIKE ? OR c.email LIKE ? OR c.bemerkung LIKE ? OR c.fachrichtung LIKE ?)"
params.extend([search_term] * 8)
# Spezifische Suche für einzelne Felder
if search_params.get('name'):
query += " AND name LIKE ?"
query += " AND c.name LIKE ?"
params.append(f"%{search_params['name']}%")
if search_params.get('ort'):
query += " AND ort LIKE ?"
query += " AND c.ort LIKE ?"
params.append(f"%{search_params['ort']}%")
if search_params.get('nummer'):
query += " AND nummer LIKE ?"
query += " AND c.nummer LIKE ?"
params.append(f"%{search_params['nummer']}%")
if search_params.get('plz'):
query += " AND plz LIKE ?"
query += " AND c.plz LIKE ?"
params.append(f"%{search_params['plz']}%")
if search_params.get('fachrichtung'):
query += " AND fachrichtung LIKE ?"
query += " AND c.fachrichtung LIKE ?"
params.append(f"%{search_params['fachrichtung']}%")
query += " GROUP BY c.id"
# Führe die Abfrage aus
c.execute(query, params)
results = c.fetchall()
@@ -203,7 +248,8 @@ def search_customers(search_params):
'mobil': row[7],
'email': row[8],
'bemerkung': row[9],
'fachrichtung': row[10]
'fachrichtung': row[10],
'tags': row[11].split(',') if row[11] else []
}
customers.append(customer)