Files
buchhaltung/analyze_niki.py
2026-04-26 07:51:39 +02:00

137 lines
6.5 KiB
Python

#!/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.")