Initial commit - Stand 26.04.2026
This commit is contained in:
@@ -0,0 +1,235 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
KORRIGIERTER IMPORT: Kerstin Kredit
|
||||
- Startbetrag: 34.036,98 €
|
||||
- Startdatum: 01.01.2018
|
||||
- Zinssatz: 0%
|
||||
- Nur Tabelle2 (Zahlungen/Auslagen)
|
||||
"""
|
||||
|
||||
import psycopg2
|
||||
import openpyxl
|
||||
from datetime import datetime
|
||||
from decimal import Decimal
|
||||
import os
|
||||
|
||||
conn = psycopg2.connect(
|
||||
host="db", # Docker service name
|
||||
port=5432,
|
||||
database="buchhaltung",
|
||||
user="postgres",
|
||||
password="postgres"
|
||||
)
|
||||
cursor = conn.cursor()
|
||||
|
||||
print("="*60)
|
||||
print("KERSTIN IMPORT - KORRIGIERT")
|
||||
print("="*60)
|
||||
print("Startbetrag: 34.036,98 €")
|
||||
print("Startdatum: 01.01.2018")
|
||||
print("Zinssatz: 0%")
|
||||
print("="*60)
|
||||
|
||||
print("\n" + "="*60)
|
||||
print("SCHRITT 1: Alten Kredit 'Kerstin' löschen falls vorhanden")
|
||||
print("="*60)
|
||||
|
||||
cursor.execute("SELECT id, name FROM kredite WHERE name ILIKE '%kerstin%'")
|
||||
kerstin_kredite = cursor.fetchall()
|
||||
|
||||
if kerstin_kredite:
|
||||
for kredit_id, name in kerstin_kredite:
|
||||
print(f"Lösche Kredit: {name} (ID: {kredit_id})")
|
||||
cursor.execute("DELETE FROM kredit_zahlungen WHERE kredit_id = %s", (kredit_id,))
|
||||
cursor.execute("DELETE FROM kredit_buchungen WHERE kredit_id = %s", (kredit_id,))
|
||||
cursor.execute("DELETE FROM kredite WHERE id = %s", (kredit_id,))
|
||||
print(f" -> Gelöscht")
|
||||
else:
|
||||
print("Kein Kredit 'Kerstin' gefunden")
|
||||
|
||||
conn.commit()
|
||||
|
||||
print("\n" + "="*60)
|
||||
print("SCHRITT 2: Excel Tabelle2 laden (Zahlungen/Auslagen)")
|
||||
print("="*60)
|
||||
|
||||
wb = openpyxl.load_workbook('Schulden Kerstin.xlsx', data_only=True)
|
||||
ws2 = wb['Tabelle2']
|
||||
|
||||
zahlungen = []
|
||||
for row in ws2.iter_rows(min_row=2, values_only=True):
|
||||
datum = row[0] # Spalte A
|
||||
beschreibung = row[1] # Spalte B
|
||||
betrag = row[2] # Spalte C
|
||||
|
||||
if betrag is None or (datum is None and beschreibung is None):
|
||||
continue
|
||||
|
||||
try:
|
||||
betrag_val = float(betrag)
|
||||
except:
|
||||
continue
|
||||
|
||||
# Datum konvertieren
|
||||
datum_str = None
|
||||
if datum and datum != 'NaT':
|
||||
if isinstance(datum, datetime):
|
||||
datum_str = datum.strftime('%Y-%m-%d')
|
||||
elif isinstance(datum, str) and len(datum) >= 10:
|
||||
datum_str = datum[:10]
|
||||
|
||||
# Typ bestimmen
|
||||
# Negative Beträge = Zahlungen/Raten (verringern Schulden)
|
||||
# Positive Beträge = Auslagen (erhöhen Schulden)
|
||||
if betrag_val < 0:
|
||||
typ = 'monatsrate'
|
||||
notiz = beschreibung if beschreibung else "Rate gezahlt"
|
||||
else:
|
||||
typ = 'auslage'
|
||||
notiz = beschreibung if beschreibung else "Auslage"
|
||||
|
||||
zahlungen.append({
|
||||
'datum': datum_str,
|
||||
'typ': typ,
|
||||
'betrag': abs(betrag_val),
|
||||
'roh_betrag': betrag_val,
|
||||
'notiz': str(notiz) if notiz else ""
|
||||
})
|
||||
|
||||
print(f"Gefunden: {len(zahlungen)} Zahlungen/Auslagen")
|
||||
for z in zahlungen[:20]:
|
||||
print(f" {z['datum'] or '----------'} | {z['typ']:12} | {z['roh_betrag']:10.2f} € | {z['notiz'][:35]}")
|
||||
if len(zahlungen) > 20:
|
||||
print(f" ... und {len(zahlungen)-20} weitere")
|
||||
|
||||
summe_raten = sum(z['roh_betrag'] for z in zahlungen if z['typ'] == 'monatsrate')
|
||||
summe_auslagen = sum(z['roh_betrag'] for z in zahlungen if z['typ'] == 'auslage')
|
||||
|
||||
print(f"\nZusammenfassung:")
|
||||
print(f" Zahlungen/Raten (negativ): {summe_raten:.2f} €")
|
||||
print(f" Auslagen (positiv): {summe_auslagen:.2f} €")
|
||||
print(f" Netto gezahlt: {summe_raten + summe_auslagen:.2f} €")
|
||||
|
||||
wb.close()
|
||||
|
||||
print("\n" + "="*60)
|
||||
print("SCHRITT 3: Kredit anlegen")
|
||||
print("="*60)
|
||||
|
||||
# Feste Werte aus Update
|
||||
kredit_name = "Kerstin Schulden"
|
||||
kredit_betrag = 34036.98 # Startbetrag aus Update
|
||||
zinssatz_pct = 0.0 # Keine Zinsen!
|
||||
start_dt = '2018-01-01' # 01.01.2018
|
||||
monatsrate = 350.0
|
||||
richtung = "ausgehend" # Schulden
|
||||
|
||||
# Berechne Restschuld: Start - Zahlungen + Auslagen
|
||||
restschuld = kredit_betrag + summe_raten + summe_auslagen
|
||||
|
||||
print(f"Kredit: {kredit_name}")
|
||||
print(f" Startbetrag: {kredit_betrag:.2f} €")
|
||||
print(f" Zinssatz: {zinssatz_pct}%")
|
||||
print(f" Start: {start_dt}")
|
||||
print(f" Rate: {monatsrate:.2f} €/Monat")
|
||||
print(f" Richtung: {richtung}")
|
||||
print(f" Berechnete Restschuld: {restschuld:.2f} €")
|
||||
|
||||
cursor.execute("""
|
||||
INSERT INTO kredite (name, kreditgeber, person, ursprungsschuld, restschuld,
|
||||
monatsrate, zinssatz, start_datum, notizen, richtung, status)
|
||||
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
|
||||
RETURNING id
|
||||
""", (
|
||||
kredit_name,
|
||||
"Kerstin",
|
||||
"Kerstin",
|
||||
kredit_betrag,
|
||||
restschuld,
|
||||
monatsrate,
|
||||
zinssatz_pct,
|
||||
start_dt,
|
||||
"Importiert aus Excel 'Schulden Kerstin.xlsx' - Start 01.01.2018, 0% Zinsen",
|
||||
richtung,
|
||||
"aktiv" if restschuld > 0 else "abgeschlossen"
|
||||
))
|
||||
|
||||
kredit_id = cursor.fetchone()[0]
|
||||
conn.commit()
|
||||
print(f"\n✅ Kredit angelegt mit ID: {kredit_id}")
|
||||
|
||||
print("\n" + "="*60)
|
||||
print("SCHRITT 4: Zahlungen importieren")
|
||||
print("="*60)
|
||||
|
||||
for z in zahlungen:
|
||||
cursor.execute("""
|
||||
INSERT INTO kredit_zahlungen (kredit_id, datum, betrag, typ, notizen)
|
||||
VALUES (%s, %s, %s, %s, %s)
|
||||
""", (
|
||||
kredit_id,
|
||||
z['datum'],
|
||||
z['betrag'],
|
||||
z['typ'],
|
||||
z['notiz'][:200] if z['notiz'] else ""
|
||||
))
|
||||
print(f" {z['datum'] or '----------'} | {z['typ']:12} | {z['roh_betrag']:10.2f} € | {z['notiz'][:40]}")
|
||||
|
||||
conn.commit()
|
||||
print(f"\n✅ {len(zahlungen)} Zahlungen importiert")
|
||||
|
||||
print("\n" + "="*60)
|
||||
print("SCHRITT 5: Verifikation")
|
||||
print("="*60)
|
||||
|
||||
cursor.execute("SELECT * FROM kredite WHERE id = %s", (kredit_id,))
|
||||
kredit = cursor.fetchone()
|
||||
print(f"\nKredit in DB:")
|
||||
print(f" Name: {kredit[1]}")
|
||||
print(f" Startbetrag: {float(kredit[4]):.2f} €")
|
||||
print(f" Restschuld: {float(kredit[5]):.2f} €")
|
||||
print(f" Zinssatz: {float(kredit[7]):.2f}%")
|
||||
print(f" Richtung: {kredit[12]}")
|
||||
print(f" Status: {kredit[13]}")
|
||||
|
||||
cursor.execute("SELECT * FROM kredit_zahlungen WHERE kredit_id = %s ORDER BY datum", (kredit_id,))
|
||||
imported_zahlungen = cursor.fetchall()
|
||||
print(f"\nZahlungen in DB: {len(imported_zahlungen)}")
|
||||
for z in imported_zahlungen[:15]:
|
||||
print(f" {z[2]} | {z[4]:12} | {float(z[3]):10.2f} € | {z[5][:40] if z[5] else ''}")
|
||||
if len(imported_zahlungen) > 15:
|
||||
print(f" ... und {len(imported_zahlungen)-15} weitere")
|
||||
|
||||
cursor.execute("""
|
||||
SELECT
|
||||
COALESCE(SUM(CASE WHEN typ = 'monatsrate' THEN betrag ELSE 0 END), 0) as sum_raten,
|
||||
COALESCE(SUM(CASE WHEN typ = 'auslage' THEN betrag ELSE 0 END), 0) as sum_auslagen
|
||||
FROM kredit_zahlungen
|
||||
WHERE kredit_id = %s
|
||||
""", (kredit_id,))
|
||||
result = cursor.fetchone()
|
||||
sum_raten_db = float(result[0])
|
||||
sum_auslagen_db = float(result[1])
|
||||
|
||||
print(f"\nSummen:")
|
||||
print(f" Zahlungen/Raten: {sum_raten_db:.2f} €")
|
||||
print(f" Auslagen: {sum_auslagen_db:.2f} €")
|
||||
|
||||
expected_restschuld = kredit_betrag - sum_raten_db + sum_auslagen_db
|
||||
print(f"\nRestschuld-Check:")
|
||||
print(f" Erwartet: {expected_restschuld:.2f} €")
|
||||
print(f" In DB: {float(kredit[5]):.2f} €")
|
||||
|
||||
if abs(expected_restschuld - float(kredit[5])) < 0.01:
|
||||
print(f"\n✅ VERIFIKATION ERFOLGREICH!")
|
||||
else:
|
||||
print(f"\n⚠️ Differenz erkannt!")
|
||||
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
print("\n" + "="*60)
|
||||
print("IMPORT ABGESCHLOSSEN")
|
||||
print("="*60)
|
||||
print(f"Kredit '{kredit_name}' ist jetzt in der Datenbank.")
|
||||
print(f"Dashboard zeigt 'Meine Schulden' (rot) mit {restschuld:.2f} € Restschuld.")
|
||||
Reference in New Issue
Block a user