#!/usr/bin/env python3 """ KORRIGIERTER IMPORT: Kerstin Kredit - Startbetrag: 34.036,98 € - Startdatum: 01.01.2018 - Zinssatz: 0% - Nur Tabelle2 (Zahlungen/Auslagen) """ import psycopg2 import openpyxl from datetime import datetime from decimal import Decimal import os conn = psycopg2.connect( host="db", # Docker service name port=5432, database="buchhaltung", user="postgres", password="postgres" ) cursor = conn.cursor() print("="*60) print("KERSTIN IMPORT - KORRIGIERT") print("="*60) print("Startbetrag: 34.036,98 €") print("Startdatum: 01.01.2018") print("Zinssatz: 0%") print("="*60) print("\n" + "="*60) print("SCHRITT 1: Alten Kredit 'Kerstin' löschen falls vorhanden") print("="*60) cursor.execute("SELECT id, name FROM kredite WHERE name ILIKE '%kerstin%'") kerstin_kredite = cursor.fetchall() if kerstin_kredite: for kredit_id, name in kerstin_kredite: print(f"Lösche Kredit: {name} (ID: {kredit_id})") cursor.execute("DELETE FROM kredit_zahlungen WHERE kredit_id = %s", (kredit_id,)) cursor.execute("DELETE FROM kredit_buchungen WHERE kredit_id = %s", (kredit_id,)) cursor.execute("DELETE FROM kredite WHERE id = %s", (kredit_id,)) print(f" -> Gelöscht") else: print("Kein Kredit 'Kerstin' gefunden") conn.commit() print("\n" + "="*60) print("SCHRITT 2: Excel Tabelle2 laden (Zahlungen/Auslagen)") print("="*60) wb = openpyxl.load_workbook('Schulden Kerstin.xlsx', data_only=True) ws2 = wb['Tabelle2'] zahlungen = [] for row in ws2.iter_rows(min_row=2, values_only=True): datum = row[0] # Spalte A beschreibung = row[1] # Spalte B betrag = row[2] # Spalte C if betrag is None or (datum is None and beschreibung is None): continue try: betrag_val = float(betrag) except: continue # Datum konvertieren datum_str = None if datum and datum != 'NaT': if isinstance(datum, datetime): datum_str = datum.strftime('%Y-%m-%d') elif isinstance(datum, str) and len(datum) >= 10: datum_str = datum[:10] # Typ bestimmen # Negative Beträge = Zahlungen/Raten (verringern Schulden) # Positive Beträge = Auslagen (erhöhen Schulden) if betrag_val < 0: typ = 'monatsrate' notiz = beschreibung if beschreibung else "Rate gezahlt" else: typ = 'auslage' notiz = beschreibung if beschreibung else "Auslage" zahlungen.append({ 'datum': datum_str, 'typ': typ, 'betrag': abs(betrag_val), 'roh_betrag': betrag_val, 'notiz': str(notiz) if notiz else "" }) print(f"Gefunden: {len(zahlungen)} Zahlungen/Auslagen") for z in zahlungen[:20]: print(f" {z['datum'] or '----------'} | {z['typ']:12} | {z['roh_betrag']:10.2f} € | {z['notiz'][:35]}") if len(zahlungen) > 20: print(f" ... und {len(zahlungen)-20} weitere") summe_raten = sum(z['roh_betrag'] for z in zahlungen if z['typ'] == 'monatsrate') summe_auslagen = sum(z['roh_betrag'] for z in zahlungen if z['typ'] == 'auslage') print(f"\nZusammenfassung:") print(f" Zahlungen/Raten (negativ): {summe_raten:.2f} €") print(f" Auslagen (positiv): {summe_auslagen:.2f} €") print(f" Netto gezahlt: {summe_raten + summe_auslagen:.2f} €") wb.close() print("\n" + "="*60) print("SCHRITT 3: Kredit anlegen") print("="*60) # Feste Werte aus Update kredit_name = "Kerstin Schulden" kredit_betrag = 34036.98 # Startbetrag aus Update zinssatz_pct = 0.0 # Keine Zinsen! start_dt = '2018-01-01' # 01.01.2018 monatsrate = 350.0 richtung = "ausgehend" # Schulden # Berechne Restschuld: Start - Zahlungen + Auslagen restschuld = kredit_betrag + summe_raten + summe_auslagen print(f"Kredit: {kredit_name}") print(f" Startbetrag: {kredit_betrag:.2f} €") print(f" Zinssatz: {zinssatz_pct}%") print(f" Start: {start_dt}") print(f" Rate: {monatsrate:.2f} €/Monat") print(f" Richtung: {richtung}") print(f" Berechnete Restschuld: {restschuld:.2f} €") cursor.execute(""" INSERT INTO kredite (name, kreditgeber, person, ursprungsschuld, restschuld, monatsrate, zinssatz, start_datum, notizen, richtung, status) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING id """, ( kredit_name, "Kerstin", "Kerstin", kredit_betrag, restschuld, monatsrate, zinssatz_pct, start_dt, "Importiert aus Excel 'Schulden Kerstin.xlsx' - Start 01.01.2018, 0% Zinsen", richtung, "aktiv" if restschuld > 0 else "abgeschlossen" )) kredit_id = cursor.fetchone()[0] conn.commit() print(f"\n✅ Kredit angelegt mit ID: {kredit_id}") print("\n" + "="*60) print("SCHRITT 4: Zahlungen importieren") print("="*60) for z in zahlungen: cursor.execute(""" INSERT INTO kredit_zahlungen (kredit_id, datum, betrag, typ, notizen) VALUES (%s, %s, %s, %s, %s) """, ( kredit_id, z['datum'], z['betrag'], z['typ'], z['notiz'][:200] if z['notiz'] else "" )) print(f" {z['datum'] or '----------'} | {z['typ']:12} | {z['roh_betrag']:10.2f} € | {z['notiz'][:40]}") conn.commit() print(f"\n✅ {len(zahlungen)} Zahlungen importiert") print("\n" + "="*60) print("SCHRITT 5: Verifikation") print("="*60) cursor.execute("SELECT * FROM kredite WHERE id = %s", (kredit_id,)) kredit = cursor.fetchone() print(f"\nKredit in DB:") print(f" Name: {kredit[1]}") print(f" Startbetrag: {float(kredit[4]):.2f} €") print(f" Restschuld: {float(kredit[5]):.2f} €") print(f" Zinssatz: {float(kredit[7]):.2f}%") print(f" Richtung: {kredit[12]}") print(f" Status: {kredit[13]}") cursor.execute("SELECT * FROM kredit_zahlungen WHERE kredit_id = %s ORDER BY datum", (kredit_id,)) imported_zahlungen = cursor.fetchall() print(f"\nZahlungen in DB: {len(imported_zahlungen)}") for z in imported_zahlungen[:15]: print(f" {z[2]} | {z[4]:12} | {float(z[3]):10.2f} € | {z[5][:40] if z[5] else ''}") if len(imported_zahlungen) > 15: print(f" ... und {len(imported_zahlungen)-15} weitere") cursor.execute(""" SELECT COALESCE(SUM(CASE WHEN typ = 'monatsrate' THEN betrag ELSE 0 END), 0) as sum_raten, COALESCE(SUM(CASE WHEN typ = 'auslage' THEN betrag ELSE 0 END), 0) as sum_auslagen FROM kredit_zahlungen WHERE kredit_id = %s """, (kredit_id,)) result = cursor.fetchone() sum_raten_db = float(result[0]) sum_auslagen_db = float(result[1]) print(f"\nSummen:") print(f" Zahlungen/Raten: {sum_raten_db:.2f} €") print(f" Auslagen: {sum_auslagen_db:.2f} €") expected_restschuld = kredit_betrag - sum_raten_db + sum_auslagen_db print(f"\nRestschuld-Check:") print(f" Erwartet: {expected_restschuld:.2f} €") print(f" In DB: {float(kredit[5]):.2f} €") if abs(expected_restschuld - float(kredit[5])) < 0.01: print(f"\n✅ VERIFIKATION ERFOLGREICH!") else: print(f"\n⚠️ Differenz erkannt!") cursor.close() conn.close() print("\n" + "="*60) print("IMPORT ABGESCHLOSSEN") print("="*60) print(f"Kredit '{kredit_name}' ist jetzt in der Datenbank.") print(f"Dashboard zeigt 'Meine Schulden' (rot) mit {restschuld:.2f} € Restschuld.")