<?php
namespace App\Service;
use App\Entity\CumulMensuel;
use App\Entity\Personnel;
use App\Entity\Typedeprime;
use App\Repository\CumulMensuelRepository;
use Doctrine\ORM\EntityManagerInterface;
class CumulMensuelService
{
private EntityManagerInterface $em;
private CumulMensuelRepository $cumulRepo;
public function __construct(EntityManagerInterface $em, CumulMensuelRepository $cumulRepo)
{
$this->em = $em;
$this->cumulRepo = $cumulRepo;
}
public function cumulerHeuresEtAvance(Personnel $personnel, float $nbHeure, float $avance = 0.0): void
{
$mois = (new \DateTimeImmutable('first day of this month'))->setTime(0, 0);
$cumul = $this->cumulRepo->findOneBy([
'personnel' => $personnel,
'mois' => $mois,
]);
if (!$cumul) {
$cumul = new CumulMensuel();
$cumul->setPersonnel($personnel);
$cumul->setMois($mois);
$cumul->setHeuresCumulees('0');
$cumul->setAvanceCumulee('0');
}
$heures = floatval($cumul->getHeuresCumulees()) + $nbHeure;
$avance = floatval($cumul->getAvanceCumulee()) + $avance;
$cumul->setHeuresCumulees((string) $heures);
$cumul->setAvanceCumulee((string) $avance);
$this->em->persist($cumul);
// Le flush se fait dans le contrôleur après toutes les persistance
}
// CumulMensuelService.php
public function cumulerAvanceEtPrime(Personnel $personnel, float $avance = 0.0, float $prime = 0.0, ?Typedeprime $typePrime = null): void {
$mois = (new \DateTimeImmutable('first day of this month'))->setTime(0, 0);
$cumul = $this->cumulRepo->findOneBy([
'personnel' => $personnel,
'mois' => $mois,
]);
if (!$cumul) {
$cumul = new CumulMensuel();
$cumul->setPersonnel($personnel)
->setMois($mois)
->setHeuresCumulees('0')
->setAvanceCumulee('0')
->setPrime('0')
->setTypedeprime(null);
}
// 1) Cumuler l’avance
if ($avance > 0) {
$avanceTot = floatval($cumul->getAvanceCumulee()) + $avance;
// $cumul->setAvanceCumulee((string)$avanceTot);
$cumul->setAvanceCumulee((string)$avance);
}
// 2) Cumuler la prime
if ($prime > 0) {
// $primeTot = $cumul->getPrime() + $prime;
$cumul->setPrime((string)$prime);
// 3) Enregistrer le dernier type de prime
if ($typePrime !== null) {
$cumul->setTypedeprime($typePrime);
}
}
$this->em->persist($cumul);
// flush() sera effectué dans le contrôleur
}
public function cumulerAvanceEtPrimePourMois(Personnel $personnel, float $avance = 0.0, float $prime = 0.0, ?Typedeprime $typePrime = null, \DateTimeImmutable $moisDebut): void {
// si aucun $mois passé, on reprend le mois courant
if (null === $moisDebut) {
$moisDebut = (new \DateTimeImmutable('first day of this month'))->setTime(0, 0);
}
$cumul = $this->cumulRepo->findOneBy([
'personnel' => $personnel,
'mois' => $moisDebut,
]);
if (!$cumul) {
$cumul = new CumulMensuel();
$cumul->setPersonnel($personnel)
->setMois($moisDebut)
->setHeuresCumulees('0')
->setAvanceCumulee('0')
->setPrime('0')
->setTypedeprime(null);
}
// 1) Cumuler l’avance
if ($avance > 0) {
$avanceTot = floatval($cumul->getAvanceCumulee()) + $avance;
// $cumul->setAvanceCumulee((string)$avanceTot);
$cumul->setAvanceCumulee((string)$avance);
}
// 2) Cumuler la prime
if ($prime > 0) {
// $primeTot = $cumul->getPrime() + $prime;
$cumul->setPrime((string)$prime);
// 3) Enregistrer le dernier type de prime
if ($typePrime !== null) {
$cumul->setTypedeprime($typePrime);
}
}
$this->em->persist($cumul);
// flush() sera effectué dans le contrôleur
}
/**
* Met à jour le cumul en soustrayant les anciennes heures et en ajoutant les nouvelles
*/
public function updateCumulHeures(Personnel $personnel, float $oldNbHeure, float $newNbHeure): void
{
$mois = (new \DateTimeImmutable('first day of this month'))->setTime(0, 0);
$cumul = $this->cumulRepo->findOneBy([
'personnel' => $personnel,
'mois' => $mois,
]);
if ($cumul) {
// Soustraire les anciennes heures et ajouter les nouvelles
$currentHeures = floatval($cumul->getHeuresCumulees());
$updatedHeures = $currentHeures - $oldNbHeure + $newNbHeure;
$cumul->setHeuresCumulees((string) max(0, $updatedHeures)); // Éviter les valeurs négatives
$this->em->persist($cumul);
} else {
// Si aucun cumul n'existe, créer un nouveau avec les nouvelles heures
$this->cumulerHeuresEtAvance($personnel, $newNbHeure);
}
}
}