142 lines
4.8 KiB
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.December, 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(payrollStatements); 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)
|
|
// }
|
|
// }
|