diff --git a/internal/database/db.go b/internal/database/db.go index 94dff29..f83ad46 100644 --- a/internal/database/db.go +++ b/internal/database/db.go @@ -287,6 +287,16 @@ func UpdateEventStatus(db *sql.DB, id, status string) error { return err } +// UpdateEvent updates the base currency and exchange rate of an existing event. +func UpdateEvent(db *sql.DB, id, baseCurrency string, exchangeRate float64) error { + _, err := db.Exec("UPDATE events SET base_currency = ?, exchange_rate = ? WHERE id = ?", baseCurrency, exchangeRate, id) + if err != nil { + log.Printf("ERROR [%s] database: UpdateEvent(%s): %v", + time.Now().Format(time.RFC3339), id, err) + } + return err +} + // --------------------------------------------------------------------------- // Expense queries // --------------------------------------------------------------------------- diff --git a/internal/handlers/events.go b/internal/handlers/events.go index 7e17914..aec337d 100644 --- a/internal/handlers/events.go +++ b/internal/handlers/events.go @@ -259,3 +259,71 @@ func (h *EventHandler) ViewEventExpenses(w http.ResponseWriter, r *http.Request) time.Now().Format(time.RFC3339), err) } } + +// --------------------------------------------------------------------------- +// GET /events/{id}/edit — EditEvent +// --------------------------------------------------------------------------- + +// EditEvent returns the event edit form pre-filled with current event data. +func (h *EventHandler) EditEvent(w http.ResponseWriter, r *http.Request) { + eventID := chi.URLParam(r, "id") + event, err := database.GetEventByID(h.DB, eventID) + if err != nil || event == nil || event.UserID != getUserID(r) { + http.Error(w, "Forbidden", http.StatusForbidden) + return + } + + tmpl := getTemplate("dashboard.html") + data := map[string]interface{}{ + "Event": event, + "Editing": true, + "Events": []database.Event{}, + "BaseCurrency": event.BaseCurrency, + "ExchangeRate": event.ExchangeRate, + "LastSampleRcpt": "", + "LastSampleClm": "", + } + if err := tmpl.Execute(w, data); err != nil { + log.Printf("ERROR [%s] handlers: EditEvent: execute template: %v", + time.Now().Format(time.RFC3339), err) + } +} + +// --------------------------------------------------------------------------- +// PUT /events/{id} — UpdateEvent +// --------------------------------------------------------------------------- + +// UpdateEvent updates the event's base currency and exchange rate. +func (h *EventHandler) UpdateEvent(w http.ResponseWriter, r *http.Request) { + eventID := chi.URLParam(r, "id") + event, err := database.GetEventByID(h.DB, eventID) + if err != nil || event == nil || event.UserID != getUserID(r) { + http.Error(w, "Forbidden", http.StatusForbidden) + return + } + + baseCurrency := r.FormValue("base_currency") + if baseCurrency == "" { + baseCurrency = "USD" + } + + exchangeRate := 1.0 + sampleReceipt := r.FormValue("sample_receipt_amount") + sampleClaim := r.FormValue("sample_claim_amount") + if sampleReceipt != "" && sampleClaim != "" { + sampleReceiptVal, err1 := strconv.ParseFloat(sampleReceipt, 64) + sampleClaimVal, err2 := strconv.ParseFloat(sampleClaim, 64) + if err1 == nil && err2 == nil && sampleReceiptVal > 0 && sampleClaimVal > 0 { + exchangeRate = sampleClaimVal / sampleReceiptVal + } + } + + if err := database.UpdateEvent(h.DB, eventID, baseCurrency, exchangeRate); err != nil { + log.Printf("ERROR [%s] handlers: UpdateEvent: %v", time.Now().Format(time.RFC3339), err) + http.Error(w, "Failed to update event", http.StatusInternalServerError) + return + } + + w.Header().Set("HX-Redirect", "/dashboard") + w.WriteHeader(http.StatusOK) +} diff --git a/main.go b/main.go index 9b8a30a..8da274b 100644 --- a/main.go +++ b/main.go @@ -205,6 +205,8 @@ func main() { // Events. r.Get("/dashboard", eventHandler.Dashboard) r.Post("/events", eventHandler.CreateEvent) + r.Put("/events/{id}", eventHandler.UpdateEvent) + r.Get("/events/{id}/edit", eventHandler.EditEvent) r.Put("/events/{id}/reopen", eventHandler.ReopenEvent) r.Get("/events/{id}/expenses", eventHandler.ViewEventExpenses) diff --git a/templates/dashboard.html b/templates/dashboard.html index f1d0b83..c4d2793 100644 --- a/templates/dashboard.html +++ b/templates/dashboard.html @@ -28,20 +28,26 @@ @@ -80,6 +90,15 @@ style="text-decoration: none;"> Open + {{if eq .Status "open"}} + + {{end}} {{if eq .Status "closed"}}