implement latest changes to employee payroll process

- Add ContractDaysWeek
- Add Sickness Days to employee export sheet
- Add Gesundheitsbonus value per employee
- Additional fixes
This commit is contained in:
Marcel Arndt
2025-12-12 11:52:03 +01:00
parent 156733f65a
commit 0951282f11
17 changed files with 408 additions and 205 deletions
@@ -1,6 +1,7 @@
package genpdf
import (
"business-engine/internal/database"
domain "business-engine/internal/domain"
"fmt"
"slices"
@@ -77,6 +78,8 @@ func GenerateSalaryStatement(stmt domain.PayrollStatement, filename string, mont
drawSummary(pdf, gesamtbetrag)
drawSickdays(pdf, stmt.SickdaysYear)
if err := pdf.OutputFileAndClose(filename); err != nil {
return err
}
@@ -147,12 +150,12 @@ func genLineItemsFromStatement(stmt domain.PayrollStatement) []LineItem {
Betrag: 14.0,
})
}
if stmt.GesundheitsbonusAbzug == "" {
if stmt.Gesundheitsbonus > 0 {
items = append(items, LineItem{
Lohnart: "1032",
Beschreibung: "Gesundheitsbonus",
Anzahl: 1,
Betrag: 200.0,
Betrag: stmt.Gesundheitsbonus,
})
}
@@ -295,6 +298,41 @@ func drawSummary(pdf *fpdf.Fpdf, total float64) {
pdf.CellFormat(30, 8, formatCurrency(total), "T", 0, "R", false, 0, "")
}
func drawSickdays(pdf *fpdf.Fpdf, sickdays []database.ListSickdaysForEmployeeRow) {
// 1. Abstand und Überschrift
pdf.Ln(10)
pdf.SetFont("DejaVu", "B", 11)
// Kein Rahmen, Zeilenumbruch nach der Zelle
pdf.CellFormat(0, 10, "Krankmeldungen", "", 1, "L", false, 0, "")
// 2. Fallback: Wenn keine Krankmeldungen vorhanden sind
if len(sickdays) == 0 {
pdf.SetFont("DejaVu", "", 10)
text := "- Keine Einträge vorhanden"
pdf.CellFormat(0, 6, text, "", 1, "L", false, 0, "")
pdf.Ln(5)
return
}
// 3. Liste zeichne
pdf.SetFont("DejaVu", "", 10)
for _, sick := range sickdays {
startStr := sick.Start.Format("02.01.2006")
endStr := sick.End.Format("02.01.2006")
// Formatierung: "- 01.01.2023 bis 05.01.2023: 4 Tage"
text := fmt.Sprintf("- %s bis %s: %d Tage", startStr, endStr, sick.Days)
// Zeichnen der Zeile
pdf.CellFormat(0, 6, text, "", 1, "L", false, 0, "")
}
// Kleiner Abstand nach der Liste
pdf.Ln(5)
}
func formatFloat(f float64) string {
p := message.NewPrinter(language.German)
str := p.Sprintf("%.2f", f)