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

196 lines
7.2 KiB
Python

#!/usr/bin/env python3
"""
Extrahiert alle 5 Kredite mit vollständigen Daten.
"""
import openpyxl
import json
from datetime import datetime
# Excel-Datei laden
datei = "Kopie von Kostenrechnung der Nächsten jahre (3).xlsx"
print(f"Lade {datei}...")
wb = openpyxl.load_workbook(datei, data_only=True)
# Sheet "Tilgung bei Gleichbleibenden Be" laden
sheet_name = "Tilgung bei Gleichbleibenden Be"
ws = wb[sheet_name]
# Kredit-Definitionen
kredite = {
"Targo Bank": {"col_base": 2}, # Spalte 2 = Restschuld, 3=Tilgung, 4=Zinsen
"Köpke": {"col_base": 6}, # Spalte 6 = Restschuld, 7=Tilgung
"DSL Bank": {"col_base": 9}, # Spalte 9 = Restschuld, 10=Tilgung, 11=Zinsen
"PSD Nord": {"col_base": 13}, # Spalte 13 = Restschuld, 14=Tilgung, 15=Zinsen
"Zingelstr. 14": {"col_base": 20}, # Spalte 20 = Restschuld, 21=Rate, 22=Zinsen
}
# Meine 5 Ziel-Kredite
target_kredite = ["DSL Bank", "PSD Nord", "Zingelstr. 14", "PVCreditplus", "Sparkasse"]
# Für Zingelstr. 14 müssen wir nach Sparkasse suchen (die haben beide Zingelstr. 14)
# Zingelstr. 14 DSL und Zingelstr. 14 Sparkasse sind wahrscheinlich unter "Zingelstr. 14" zusammen
print("\n=== DATENEXTRAKTION FUER 5 KREDITE ===\n")
def get_last_value(ws, col, start_row=6):
"""Holt den letzten numerischen Wert aus einer Spalte"""
for row in range(ws.max_row, start_row-1, -1):
val = ws.cell(row=row, column=col).value
if val is not None and isinstance(val, (int, float)) and val != 0:
return val, row
return None, None
def get_first_date(ws, col=1, start_row=6):
"""Holt das erste Datum aus Spalte 1 (Monat)"""
val = ws.cell(row=start_row, column=col).value
if val and isinstance(val, datetime):
return val
return None
def get_monthly_rate(ws, tilgung_col, start_row=6):
"""Ermittelt die monatliche Rate (häufigster Tilgungswert)"""
rates = []
for row in range(start_row, min(start_row + 24, ws.max_row)):
val = ws.cell(row=row, column=tilgung_col).value
if val and isinstance(val, (int, float)) and val > 0:
rates.append(val)
if rates:
from collections import Counter
return Counter(rates).most_common(1)[0][0]
return 0
def get_zinssatz_from_berechnung(ws, zinsen_col, restschuld_col, start_row=6):
"""Berechnet Zinssatz aus Zinsen/Restschuld * 12"""
for row in range(start_row, min(start_row + 5, ws.max_row)):
zinsen = ws.cell(row=row, column=zinsen_col).value
restschuld = ws.cell(row=row, column=restschuld_col).value
if zinsen and restschuld and isinstance(zinsen, (int, float)) and isinstance(restschuld, (int, float)) and restschuld > 0:
zinssatz = (zinsen / restschuld) * 12 * 100 # Jahreszins in %
if 0 < zinssatz < 20: # Plausibilitätscheck
return round(zinssatz, 2)
return None
# DSL Bank
print("1. DSL BANK")
print("-" * 40)
col_base = 9
restschuld_col = col_base
tilgung_col = col_base + 1
zinsen_col = col_base + 2
restschuld, last_row = get_last_value(ws, restschuld_col)
start_datum = get_first_date(ws)
monatsrate = get_monthly_rate(ws, tilgung_col)
zinssatz = get_zinssatz_from_berechnung(ws, zinsen_col, restschuld_col)
print(f" Restschuld: {restschuld:,.2f} EUR")
print(f" Monatsrate: {monatsrate:,.2f} EUR")
print(f" Zinssatz: {zinssatz}% (berechnet)")
print(f" Startdatum: {start_datum}")
print(f" Letzte Zeile mit Daten: {last_row}")
# PSD Nord
print("\n2. PSD NORD")
print("-" * 40)
col_base = 13
restschuld_col = col_base
tilgung_col = col_base + 1
zinsen_col = col_base + 2
restschuld, last_row = get_last_value(ws, restschuld_col)
monatsrate = get_monthly_rate(ws, tilgung_col)
zinssatz = get_zinssatz_from_berechnung(ws, zinsen_col, restschuld_col)
print(f" Restschuld: {restschuld:,.2f} EUR")
print(f" Monatsrate: {monatsrate:,.2f} EUR")
print(f" Zinssatz: {zinssatz}% (berechnet)")
print(f" Startdatum: {start_datum}")
# Zingelstr. 14 (kombiniert DSL + Sparkasse?)
print("\n3. ZINGELSTR. 14 (Gesamt)")
print("-" * 40)
col_base = 20
restschuld_col = col_base
rate_col = col_base + 1
zinsen_col = col_base + 2
restschuld, last_row = get_last_value(ws, restschuld_col)
monatsrate = get_monthly_rate(ws, rate_col)
zinssatz = get_zinssatz_from_berechnung(ws, zinsen_col, restschuld_col)
print(f" Restschuld: {restschuld:,.2f} EUR")
print(f" Monatsrate: {monatsrate:,.2f} EUR")
print(f" Zinssatz: {zinssatz}% (berechnet)")
print(f" Startdatum: {start_datum}")
# Zeige einige Zeilen der Zingelstr. 14 Spalten
print("\n Erste 5 Tilgungszeilen für Zingelstr. 14:")
for row in range(6, 11):
monat = ws.cell(row=row, column=1).value
rest = ws.cell(row=row, column=20).value
rate = ws.cell(row=row, column=21).value
zins = ws.cell(row=row, column=22).value
print(f" {row}: Monat={monat}, Rest={rest}, Rate={rate}, Zins={zins}")
print("\n4. SUCHE NACH PVCreditplus...")
print("-" * 40)
# Suche nach PVCreditplus in Zeile 1
pvc_col = None
for col in range(1, ws.max_column + 1):
val = ws.cell(row=1, column=col).value
if val and "pvc" in str(val).lower():
pvc_col = col
print(f" GEFUNDEN in Spalte {col}: {val}")
break
if not pvc_col:
print(" PVCreditplus nicht im Sheet 'Tilgung bei Gleichbleibenden Be' gefunden!")
print(" Suche in anderen Sheets...")
for sheet_name in wb.sheetnames:
print(f" Checking {sheet_name}...")
temp_ws = wb[sheet_name]
for row in range(1, min(5, temp_ws.max_row + 1)):
for col in range(1, min(20, temp_ws.max_column + 1)):
val = temp_ws.cell(row=row, column=col).value
if val and "pvc" in str(val).lower():
print(f" GEFUNDEN in Sheet '{sheet_name}', Zeile {row}, Spalte {col}: {val}")
print("\n5. SUCHE NACH SPARKASSE...")
print("-" * 40)
# Suche nach Sparkasse in Zeile 1
sparkasse_col = None
for col in range(1, ws.max_column + 1):
val = ws.cell(row=1, column=col).value
if val and "sparkasse" in str(val).lower():
sparkasse_col = col
print(f" GEFUNDEN in Spalte {col}: {val}")
# Zeige die zugehörigen Labels
label = ws.cell(row=2, column=col).value
label2 = ws.cell(row=2, column=col+1).value
print(f" Labels: {label}, {label2}")
break
# Jetzt die Restschuld und Rate holen
if sparkasse_col:
restschuld, last_row = get_last_value(ws, sparkasse_col)
monatsrate = get_monthly_rate(ws, sparkasse_col + 1)
zinssatz = get_zinssatz_from_berechnung(ws, sparkasse_col + 2, sparkasse_col)
print(f" Restschuld: {restschuld:,.2f} EUR")
print(f" Monatsrate: {monatsrate:,.2f} EUR")
print(f" Zinssatz: {zinssatz}% (berechnet)")
print("\n=== ZUSAMMENFASSUNG ===")
print("""
Die 5 Kredite aus dem Task:
1. DSL Bank -> Spalte 9 in Sheet 'Tilgung bei Gleichbleibenden Be'
2. PSD Nord -> Spalte 13 in Sheet 'Tilgung bei Gleichbleibenden Be'
3. Zingelstr.14 DSL -> Teil von Zingelstr. 14 (Spalte 20) oder separat?
4. Zingelstr.14 Sparkasse -> Gefunden in Spalte 21!
5. PVCreditplus -> NICHT im Tilgung-Sheet gefunden!
WICHTIG: Die Werte für Zingelstr. 14 scheinen KOMBINIERT zu sein (DSL + Sparkasse)
Für separate Importe müssen wir die Einzelwerte finden!
""")