#!/usr/bin/env python3 """ Detaillierte Analyse des Niki-Kredits: Excel vs. DB """ import openpyxl from datetime import datetime # Excel-Daten (bereits extrahiert) excel_data = [ # (Zeile, Datum, Restschuld, Zinsen, Abgezahlt, Neue_Kosten, Beschreibung) (7, datetime(2023, 7, 1), -7000, -58.33, None, None, "Start"), (8, datetime(2023, 8, 1), -7058.33, -58.82, None, None, None), (9, datetime(2023, 9, 1), -7117.15, -59.31, None, None, None), (10, datetime(2023, 10, 1), -7176.46, -59.80, None, None, None), (11, datetime(2023, 11, 1), -7236.27, -60.30, None, None, None), (12, datetime(2023, 12, 1), -7296.57, -60.80, None, None, None), (13, datetime(2024, 1, 1), -7357.37, -61.31, None, None, None), (14, datetime(2024, 2, 1), -7418.68, -61.82, None, None, None), (15, datetime(2024, 3, 1), -7480.51, -62.34, None, None, None), (16, datetime(2024, 4, 1), -7542.84, -62.86, 500, None, None), (17, datetime(2024, 5, 1), -7105.70, -59.21, 500, None, None), # Nach Zahlung (18, datetime(2024, 6, 1), -6664.92, -55.54, 150, -90, "Kameras"), (19, datetime(2024, 7, 1), -6660.46, -55.50, 450, -45, "Kameras"), (20, datetime(2024, 8, 1), -6310.96, -52.59, 500, None, None), (21, datetime(2024, 9, 1), -5863.55, -48.86, 300, None, None), (22, datetime(2024, 10, 1), -5612.41, -46.77, 300, -110, "Videorekorder + Zubehör"), (23, datetime(2024, 11, 1), -5469.18, -45.58, None, None, None), (24, datetime(2024, 12, 1), -5514.76, -45.96, None, None, None), (25, datetime(2025, 1, 1), -5560.72, -46.34, None, None, None), (26, datetime(2025, 2, 1), -5607.06, -46.73, 200, None, None), (27, datetime(2025, 3, 1), -5453.78, -45.45, None, None, None), (28, datetime(2025, 4, 1), -5499.23, -45.83, None, None, None), (29, datetime(2025, 5, 1), -5545.06, -46.21, None, None, None), (30, datetime(2025, 6, 1), -5591.27, -46.59, 500, -260, "Handyvertag"), (31, datetime(2025, 7, 1), -5397.86, -44.98, None, None, None), # ... bis Zeile 57 ] # DB-Daten (bereits extrahiert) db_zahlungen = [ {"datum": datetime(2024, 4, 1), "betrag": 500.00, "typ": "zahlung_eingang", "notiz": "Zahlung von Niki"}, {"datum": datetime(2024, 5, 1), "betrag": 500.00, "typ": "zahlung_eingang", "notiz": "Zahlung von Niki"}, {"datum": datetime(2024, 6, 1), "betrag": 150.00, "typ": "zahlung_eingang", "notiz": "Kameras"}, {"datum": datetime(2024, 6, 1), "betrag": 90.00, "typ": "auslage", "notiz": "Kameras"}, {"datum": datetime(2024, 7, 1), "betrag": 450.00, "typ": "zahlung_eingang", "notiz": "Kameras"}, {"datum": datetime(2024, 7, 1), "betrag": 45.00, "typ": "auslage", "notiz": "Kameras"}, {"datum": datetime(2024, 8, 1), "betrag": 500.00, "typ": "zahlung_eingang", "notiz": "Zahlung von Niki"}, {"datum": datetime(2024, 9, 1), "betrag": 300.00, "typ": "zahlung_eingang", "notiz": "Zahlung von Niki"}, {"datum": datetime(2024, 10, 1), "betrag": 300.00, "typ": "zahlung_eingang", "notiz": "Videorekorder + Zubehör"}, {"datum": datetime(2024, 10, 1), "betrag": 110.00, "typ": "auslage", "notiz": "Videorekorder + Zubehör"}, {"datum": datetime(2025, 2, 1), "betrag": 200.00, "typ": "zahlung_eingang", "notiz": "Zahlung von Niki"}, {"datum": datetime(2025, 6, 1), "betrag": 500.00, "typ": "zahlung_eingang", "notiz": "Handyvertag"}, {"datum": datetime(2025, 6, 1), "betrag": 260.00, "typ": "auslage", "notiz": "Handyvertag"}, ] print("=" * 80) print("ANALYSE: Niki-Kredit - Excel vs. DB") print("=" * 80) # Berechne Zahlungen aus Excel print("\n## ZAHLUNGEN/AUSLAGEN aus Excel:") print("-" * 80) excel_zahlungen = [] for row in excel_data: zeile, datum, restschuld, zinsen, abgezahlt, neue_kosten, beschreibung = row if abgezahlt: print(f"Zahlung: {datum.strftime('%Y-%m-%d')} | +{abgezahlt:6.2f} EUR | {beschreibung or 'Zahlung'}") excel_zahlungen.append({"datum": datum, "betrag": abgezahlt, "typ": "zahlung_eingang", "notiz": beschreibung or "Zahlung"}) if neue_kosten: print(f"Auslage: {datum.strftime('%Y-%m-%d')} | {neue_kosten:7.2f} EUR | {beschreibung}") excel_zahlungen.append({"datum": datum, "betrag": abs(neue_kosten), "typ": "auslage", "notiz": beschreibung}) print("\n## VERGLEICH: Excel vs. DB") print("-" * 80) print(f"{'Datum':<12} {'Excel Zahlung':>15} {'DB Zahlung':>15} {'Status':<15}") print("-" * 80) # Erstelle Mapping nach Datum from collections import defaultdict excel_by_date = defaultdict(list) db_by_date = defaultdict(list) for z in excel_zahlungen: key = z["datum"].strftime("%Y-%m-%d") excel_by_date[key].append(z) for z in db_zahlungen: key = z["datum"].strftime("%Y-%m-%d") db_by_date[key].append(z) all_dates = sorted(set(list(excel_by_date.keys()) + list(db_by_date.keys()))) fehlend_in_db = [] zusammenfassung = {"excel": 0, "db": 0, "fehlend": 0} for date in all_dates: excel_list = excel_by_date.get(date, []) db_list = db_by_date.get(date, []) excel_sum = sum(z["betrag"] for z in excel_list) db_sum = sum(z["betrag"] for z in db_list) zusammenfassung["excel"] += excel_sum zusammenfassung["db"] += db_sum status = "OK" if abs(excel_sum - db_sum) < 0.01 else "DIFFERENZ" if excel_sum > 0 and db_sum == 0: status = "FEHLT IN DB" fehlend_in_db.extend(excel_list) zusammenfassung["fehlend"] += excel_sum print(f"{date:<12} {excel_sum:>15.2f} EUR {db_sum:>15.2f} EUR {status}") print("-" * 80) print(f"{'GESAMT':<12} {zusammenfassung['excel']:>15.2f} EUR {zusammenfassung['db']:>15.2f} EUR") print(f"\nFehlend in DB: {zusammenfassung['fehlend']:.2f} EUR") if fehlend_in_db: print("\n## FEHLENDE EINTRÄGE IN DB:") print("-" * 80) for z in fehlend_in_db: print(f"INSERT INTO kredit_zahlungen (kredit_id, betrag, datum, typ, notiz) VALUES ('4ad8826f-ecb4-443d-aef6-ce9162e5f078', {z['betrag']:.2f}, '{z['datum'].strftime('%Y-%m-%d')}', '{z['typ']}', '{z['notiz']}');") # Analyse Restschuld print("\n" + "=" * 80) print("RESTSCHULD-ANALYSE") print("=" * 80) print(f"Excel (Stand 2023-07-01): -7000.00 EUR") print(f"DB Restschuld: 4105.00 EUR") print(f"DB Ursprungsschuld: 7000.00 EUR") print(f"\nBerechnung: 7000 - Summe(Zahlungen) + Summe(Auslagen) = ?") print(f"Gesamtzahlungen DB: {zusammenfassung['db']:.2f} EUR") print(f"Erwartete Restschuld: 7000 - {zusammenfassung['db']:.2f} = {7000 - zusammenfassung['db']:.2f} EUR") print(f"\nHinweis: Die App scheint die Restschuld anders zu berechnen als Excel.") print(f"Excel fügt Zinsen hinzu, DB vermutlich ohne/korrigierte Zinsberechnung.")