avicenna/service/data-hub/business-engine/internal/payroll/handler.go

142 lines
4.8 KiB
Go

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)
// }
// }