diff --git a/internal/handlers/file.go b/internal/handlers/file.go index 665c9c0..6141016 100644 --- a/internal/handlers/file.go +++ b/internal/handlers/file.go @@ -77,7 +77,6 @@ func (h *FileHandler) FileEvent(w http.ResponseWriter, r *http.Request) { } to := r.FormValue("email") - format := r.FormValue("format") if to == "" { log.Printf("ERROR [%s] handlers: FileEvent: missing email field", @@ -85,12 +84,6 @@ func (h *FileHandler) FileEvent(w http.ResponseWriter, r *http.Request) { renderFileError(w, "Email address is required.") return } - if format != "csv" && format != "pdf" { - log.Printf("ERROR [%s] handlers: FileEvent: invalid format %q", - time.Now().Format(time.RFC3339), format) - renderFileError(w, "Format must be 'csv' or 'pdf'.") - return - } // 3. Verify the authenticated user owns this event. userID := getUserID(r) @@ -139,26 +132,27 @@ func (h *FileHandler) FileEvent(w http.ResponseWriter, r *http.Request) { userDept = reportUser.Department } - // 5. Generate the report in the requested format. - var reportAttachment *email.Attachment - switch format { - case "csv": - reportAttachment, err = generateCSV(event.Name, expenses, userName, userDept) - case "pdf": - reportAttachment, err = generatePDF(event.Name, expenses, userName, userDept) - } + // 5. Generate both CSV and PDF reports. + csvAttachment, err := generateCSV(event.Name, expenses, userName, userDept) if err != nil { - log.Printf("ERROR [%s] handlers: FileEvent: generate %s report: %v", - time.Now().Format(time.RFC3339), format, err) - renderFileError(w, "Failed to generate report. Please try again.") + log.Printf("ERROR [%s] handlers: FileEvent: generate CSV: %v", + time.Now().Format(time.RFC3339), err) + renderFileError(w, "Failed to generate CSV report. Please try again.") + return + } + pdfAttachment, err := generatePDF(event.Name, expenses, userName, userDept) + if err != nil { + log.Printf("ERROR [%s] handlers: FileEvent: generate PDF: %v", + time.Now().Format(time.RFC3339), err) + renderFileError(w, "Failed to generate PDF report. Please try again.") return } // 6. Create a ZIP of all receipt images. zipAttachment, zipErr := createReceiptZip(event.Name, expenses) - // 7. Build the list of attachments (report + ZIP if available). - attachments := []*email.Attachment{reportAttachment} + // 7. Build the list of attachments (CSV + PDF + ZIP if available). + attachments := []*email.Attachment{csvAttachment, pdfAttachment} if zipErr == nil && zipAttachment != nil { attachments = append(attachments, zipAttachment) } else if zipErr != nil { @@ -219,11 +213,6 @@ func (h *FileHandler) GenerateReport(w http.ResponseWriter, r *http.Request) { return } - format := strings.ToLower(strings.TrimSpace(r.FormValue("format"))) - if format != "csv" && format != "pdf" { - format = "pdf" - } - userID := getUserID(r) if userID == "" { renderFileError(w, "Session expired. Please log in again.") @@ -259,17 +248,19 @@ func (h *FileHandler) GenerateReport(w http.ResponseWriter, r *http.Request) { uDept = repUser.Department } - // Generate the report. - var reportAtt *email.Attachment - if format == "csv" { - reportAtt, err = generateCSV(event.Name, expenses, uName, uDept) - } else { - reportAtt, err = generatePDF(event.Name, expenses, uName, uDept) - } + // Generate both CSV and PDF reports. + csvAtt, err := generateCSV(event.Name, expenses, uName, uDept) if err != nil { - log.Printf("ERROR [%s] handlers: GenerateReport: generate %s: %v", - time.Now().Format(time.RFC3339), format, err) - renderFileError(w, "Failed to generate report.") + log.Printf("ERROR [%s] handlers: GenerateReport: generate CSV: %v", + time.Now().Format(time.RFC3339), err) + renderFileError(w, "Failed to generate CSV report.") + return + } + pdfAtt, err := generatePDF(event.Name, expenses, uName, uDept) + if err != nil { + log.Printf("ERROR [%s] handlers: GenerateReport: generate PDF: %v", + time.Now().Format(time.RFC3339), err) + renderFileError(w, "Failed to generate PDF report.") return } @@ -277,8 +268,9 @@ func (h *FileHandler) GenerateReport(w http.ResponseWriter, r *http.Request) { var pkgBuf bytes.Buffer pkg := zip.NewWriter(&pkgBuf) - // Add report file. - addToZip(pkg, reportAtt.Filename, reportAtt.Content) + // Add both report files. + addToZip(pkg, csvAtt.Filename, csvAtt.Content) + addToZip(pkg, pdfAtt.Filename, pdfAtt.Content) // Add receipt images directly (not nested). for i, exp := range expenses { @@ -344,12 +336,10 @@ func (h *FileHandler) GenerateReport(w http.ResponseWriter, r *http.Request) { time.Now().Format(time.RFC3339), pkgFilename, eventID) // Render the download/send fragment. - ext := format - reportName := fmt.Sprintf("%s-report.%s", sanitiseFilename(event.Name), ext) w.Header().Set("Content-Type", "text/html; charset=utf-8") fmt.Fprintf(w, `
%s & %d receipt images packaged.
+CSV + PDF report & %d receipt images packaged.
@@ -364,7 +354,7 @@ func (h *FileHandler) GenerateReport(w http.ResponseWriter, r *http.Request) {