diff --git a/internal/database/db.go b/internal/database/db.go index 3bdff47..d4d9f40 100644 --- a/internal/database/db.go +++ b/internal/database/db.go @@ -307,6 +307,23 @@ func UpdateEvent(db *sql.DB, id, baseCurrency string, exchangeRate float64) erro return err } +// RecalculateExpenses updates all expense converted_amounts for an event +// using the new exchange rate. Expenses already in the base currency are left unchanged. +func RecalculateExpenses(db *sql.DB, eventID, baseCurrency string, exchangeRate float64) error { + _, err := db.Exec( + `UPDATE expenses SET + converted_amount = CASE WHEN currency != ? THEN ROUND(amount * ?, 2) ELSE amount END, + base_currency = ? + WHERE event_id = ?`, + baseCurrency, exchangeRate, baseCurrency, eventID, + ) + if err != nil { + log.Printf("ERROR [%s] database: RecalculateExpenses(%s): %v", + time.Now().Format(time.RFC3339), eventID, err) + } + return err +} + // --------------------------------------------------------------------------- // Expense queries // --------------------------------------------------------------------------- diff --git a/internal/handlers/events.go b/internal/handlers/events.go index 13f23a6..9a50717 100644 --- a/internal/handlers/events.go +++ b/internal/handlers/events.go @@ -362,6 +362,12 @@ func (h *EventHandler) UpdateEvent(w http.ResponseWriter, r *http.Request) { return } + // Recalculate all existing expense converted amounts with the new rate. + if err := database.RecalculateExpenses(h.DB, eventID, baseCurrency, exchangeRate); err != nil { + log.Printf("ERROR [%s] handlers: UpdateEvent: recalc expenses: %v", time.Now().Format(time.RFC3339), err) + // Non-fatal — the event was updated, but expenses may have stale conversions. + } + w.Header().Set("HX-Redirect", "/dashboard") w.WriteHeader(http.StatusOK) }