196 lines
7.2 KiB
Python
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!
|
|
""")
|