This commit is contained in:
Mateusz Gruszczyński
2026-06-03 22:31:29 +02:00
parent 4bdb20d9f5
commit 85ffc36e75
3 changed files with 52 additions and 6 deletions
+48 -2
View File
@@ -190,17 +190,63 @@ async def nbp_rate():
)
CSV_MONEY_FIELDS = {
"rata",
"kapital",
"odsetki",
"nadplata",
"prowizja_nadplaty",
"saldo",
"odsetki_narastajaco",
"koszt_narastajaco",
"nadplaty_narastajaco",
}
CSV_SUMMARY_MONEY_FIELDS = {
"total_paid",
"total_interest",
"total_overpayment",
"total_overpayment_fees",
"interest_saved",
"baseline_interest",
"average_payment",
"max_payment",
}
def _csv_money(value: float) -> str:
return f"{float(value):.2f}".replace(".", ",")
@app.post("/api/export/csv")
def export_csv(req: SimulationRequest):
result = simulate(req)
buf = io.StringIO()
writer = csv.writer(buf, delimiter=";")
writer.writerow(["miesiac", "data_splaty", "dni", "oprocentowanie", "rata", "kapital", "odsetki", "nadplata", "prowizja_nadplaty", "saldo", "karencja", "odsetki_narastajaco", "koszt_narastajaco", "nadplaty_narastajaco"])
headers = ["miesiac", "data_splaty", "dni", "oprocentowanie", "rata", "kapital", "odsetki", "nadplata", "prowizja_nadplaty", "saldo", "karencja", "odsetki_narastajaco", "koszt_narastajaco", "nadplaty_narastajaco"]
writer.writerow(headers)
for row in result.schedule:
writer.writerow([row.month, row.due_date, row.days, row.rate, row.payment, row.principal_part, row.interest_part, row.overpayment, row.overpayment_fee, row.remaining, row.grace_type.value, row.cumulative_interest, row.cumulative_cost, row.cumulative_overpayment])
values = {
"miesiac": row.month,
"data_splaty": row.due_date,
"dni": row.days,
"oprocentowanie": row.rate,
"rata": row.payment,
"kapital": row.principal_part,
"odsetki": row.interest_part,
"nadplata": row.overpayment,
"prowizja_nadplaty": row.overpayment_fee,
"saldo": row.remaining,
"karencja": row.grace_type.value,
"odsetki_narastajaco": row.cumulative_interest,
"koszt_narastajaco": row.cumulative_cost,
"nadplaty_narastajaco": row.cumulative_overpayment,
}
writer.writerow([_csv_money(values[h]) if h in CSV_MONEY_FIELDS else values[h] for h in headers])
writer.writerow([])
writer.writerow(["Podsumowanie"])
for key, value in result.summary.model_dump().items():
if key in CSV_SUMMARY_MONEY_FIELDS:
value = _csv_money(value)
writer.writerow([key, value])
data = buf.getvalue().encode("utf-8-sig")
return StreamingResponse(