Import initail de calcul-astreintes v0.9.4 pour passage en paycheck 1.0
This commit is contained in:
74
internal/calc/compute.go
Normal file
74
internal/calc/compute.go
Normal file
@@ -0,0 +1,74 @@
|
||||
package calc
|
||||
|
||||
import (
|
||||
"math"
|
||||
|
||||
"git.dumerain.org/alban/calcul-astreintes/internal/models"
|
||||
)
|
||||
|
||||
/*
|
||||
Le moteur de calcul est volontairement isolé du reste.
|
||||
Ça facilite :
|
||||
- les tests unitaires
|
||||
- l'évolution des règles
|
||||
- le support de nouveaux codes
|
||||
*/
|
||||
|
||||
func round2(v float64) float64 {
|
||||
return math.Round(v*100) / 100
|
||||
}
|
||||
|
||||
func Compute(req models.CalculateRequest, profile models.Profile, rules models.GlobalRules) models.CalculateResponse {
|
||||
// Chaque ligne = taux * quantité, arrondi au centime.
|
||||
// Libellés volontairement "fiche de paie" (courts) pour que UI + PDF collent.
|
||||
lines := []models.Line{
|
||||
{
|
||||
Code: "456",
|
||||
Label: "Interv.astreinte Jour",
|
||||
Rate: profile.T456,
|
||||
Quantity: req.Q456,
|
||||
Unit: "h",
|
||||
Amount: round2(profile.T456 * req.Q456),
|
||||
},
|
||||
{
|
||||
Code: "458",
|
||||
Label: "Interv.astreinte Dim & JF",
|
||||
Rate: profile.T458,
|
||||
Quantity: req.Q458,
|
||||
Unit: "h",
|
||||
Amount: round2(profile.T458 * req.Q458),
|
||||
},
|
||||
{
|
||||
Code: "459",
|
||||
Label: "Interv.astreinte Nuit",
|
||||
Rate: profile.T459,
|
||||
Quantity: req.Q459,
|
||||
Unit: "h",
|
||||
Amount: round2(profile.T459 * req.Q459),
|
||||
},
|
||||
{
|
||||
Code: "471",
|
||||
Label: "Astreinte",
|
||||
Rate: profile.T471,
|
||||
Quantity: req.Q471,
|
||||
Unit: "h",
|
||||
Amount: round2(profile.T471 * req.Q471),
|
||||
},
|
||||
{
|
||||
Code: "480",
|
||||
Label: "Ind. Forfait. Dim & JF",
|
||||
Rate: rules.ForfaitDimFerie,
|
||||
Quantity: float64(req.NbDimFerie),
|
||||
Unit: "j",
|
||||
Amount: round2(rules.ForfaitDimFerie * float64(req.NbDimFerie)),
|
||||
},
|
||||
}
|
||||
|
||||
// Total = somme des montants déjà arrondis (comportement typique paie).
|
||||
total := 0.0
|
||||
for _, l := range lines {
|
||||
total += l.Amount
|
||||
}
|
||||
|
||||
return models.CalculateResponse{Lines: lines, Total: round2(total)}
|
||||
}
|
||||
Reference in New Issue
Block a user