Initial commit - Stand 26.04.2026
This commit is contained in:
@@ -0,0 +1,195 @@
|
||||
#!/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!
|
||||
""")
|
||||
Reference in New Issue
Block a user