package payroll import ( "business-engine/internal/domain" "business-engine/internal/gencsv" "business-engine/internal/genpdf" "encoding/json" "fmt" "log/slog" "net/http" "slices" "time" ) type EmployeeHandler struct { service Service logger *slog.Logger } func NewEmployeeHandler(service Service, logger *slog.Logger) *EmployeeHandler { return &EmployeeHandler{ service: service, logger: logger, } } func (h *EmployeeHandler) RunPayroll(w http.ResponseWriter, r *http.Request) { month := time.Date(2025, time.November, 1, 0, 0, 0, 0, time.UTC) employees, err := h.service.FetchActiveEmployees(r.Context()) if err != nil { h.logger.Error("failed to fetch active employees", "error", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) return } h.logger.Info(fmt.Sprintf("found %d active employees", len(employees))) allZuschlaege, err := h.service.zuschlagParser.ParseFile("daten.csv") if err != nil { h.logger.Error("failed to load data from csv export", "error", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) } var data []domain.PayrollInput var payrollStatements []domain.PayrollStatement for _, employee := range employees { h.logger.Info("loading payroll input for employee", "name", fmt.Sprintf("%s %s", employee.Firstname, employee.Surname)) input, err := h.service.LoadPayrollInput(r.Context(), month.AddDate(0, -1, 0), employee, allZuschlaege) if err != nil { h.logger.Error("failed to fetch payroll input", "error", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) return } statement := h.service.GeneratePayrollStatement(input) payrollStatements = append(payrollStatements, statement) data = append(data, input) } slices.SortFunc(payrollStatements, func(a, b domain.PayrollStatement) int { if a.Tourengeld < b.Tourengeld { return 1 } if a.Tourengeld > b.Tourengeld { return -1 } return 0 }) payrollStatements[0].TourengeldBonus = 500 payrollStatements[1].TourengeldBonus = 400 payrollStatements[2].TourengeldBonus = 300 h.logger.Info("generating csv salary statements") err = gencsv.GeneratePayrollStatementCSV(payrollStatements) if err != nil { h.logger.Error("could not generate payroll statement csv", "error", err) } h.logger.Info("generating pdf salary statements") for _, stmt := range payrollStatements { err := genpdf.GenerateSalaryStatement(stmt, fmt.Sprintf("%s_%s.pdf", month.Format("2006-01"), fmt.Sprintf("%s %s", stmt.Vorname, stmt.Nachname)), month) if err != nil { h.logger.Error("could not generate salary statement pdf", "error", err) } } w.Header().Set("Content-Type", "application/json") if err := json.NewEncoder(w).Encode(data); err != nil { h.logger.Error("failed to encode response", "error", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) } } // func (h *EmployeeHandler) ReadEmployeeData(w http.ResponseWriter, r *http.Request) { // month := time.Date(2025, time.September, 1, 0, 0, 0, 0, time.UTC) // employeeData := excelread.ReadEmployeeData() // var payrollStatements []excelread.PayrollStatement // for _, employeeRow := range employeeData { // input, err := h.service.FetchPayrollInput(r.Context(), month, employeeRow.Vorname, employeeRow.Nachname) // if err != nil { // h.logger.Error("could not fetch payroll input", "error", err) // // http.Error(w, "Internal Server Error", http.StatusInternalServerError) // } // statement := excelread.GeneratePayrollStatement(employeeRow, input) // payrollStatements = append(payrollStatements, statement) // } // slices.SortFunc(payrollStatements, func(a, b excelread.PayrollStatement) int { // if a.Tourengeld < b.Tourengeld { // return 1 // } // if a.Tourengeld > b.Tourengeld { // return -1 // } // return 0 // }) // payrollStatements[0].TourengeldBonus = 500 // payrollStatements[1].TourengeldBonus = 400 // payrollStatements[2].TourengeldBonus = 300 // h.logger.Info("generating csv salary statements") // err := gencsv.GeneratePayrollStatementCSV(payrollStatements) // if err != nil { // h.logger.Error("could not generate payroll statement csv", "error", err) // } // h.logger.Info("generating pdf salary statements") // for _, stmt := range payrollStatements { // err := genpdf.GenerateSalaryStatement(stmt, fmt.Sprintf("%s_%s.pdf", month.Format("2006-01"), fmt.Sprintf("%s %s", stmt.Vorname, stmt.Nachname)), month) // if err != nil { // h.logger.Error("could not generate salary statement pdf", "error", err) // } // } // w.Header().Set("Content-Type", "application/json") // if err := json.NewEncoder(w).Encode(payrollStatements); err != nil { // h.logger.Error("failed to encode response", "error", err) // http.Error(w, "Internal Server Error", http.StatusInternalServerError) // } // }