<?php
namespace App\Controller;
use App\Entity\RefAffectationCalendrier;
use JMS\Serializer\SerializationContext;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\Conge;
use App\Entity\CongeDroitAnnuel;
use App\Entity\CongeType;
use App\Entity\Utilisateur;
use App\Entity\UtilisateurInformation;
use App\Entity\Workflow;
use App\Form\CongeDroitAnnuelType;
use Doctrine\Persistence\ManagerRegistry;
use App\Services\AccessRule;
use JMS\Serializer\SerializerInterface;
use App\Entity\RefAffectation;
use App\Entity\DemandeReport;
class CongeDroitAnnuelController extends AbstractController
{
private $doctrine;
private $accessRule;
private $serializer;
final public const ERROR_VALIDATION_FORM = 'Erreur lors de la validation du formulaire';
final public const ERROR_OCCURED = 'Une erreur est survenue';
final public const ERROR_ALREADY_EXISTS = 'Conge droit annuel déjà existant';
final public const ERROR_ACTION_FORBIDDEN = 'Action non autorisée';
public function __construct(ManagerRegistry $doctrine, AccessRule $accessRule, SerializerInterface $serializer)
{
$this->doctrine = $doctrine;
$this->accessRule = $accessRule;
$this->serializer = $serializer;
}
#[Route(path: '/api/conges-annuel/{id}', name: 'ctsweb_get_conges-annuel', methods: ['GET'], requirements: ['id' => '\d+'])]
public function detail(CongeDroitAnnuel $congeDroit): JsonResponse
{
$congeDroit = $this->serialize($congeDroit);
return new JsonResponse(
$congeDroit,
JsonResponse::HTTP_OK,
[],
true
);
}
/**
* @return JsonResponse
*/
#[Route(path: '/api/conges-annuel', name: 'ctsweb_create_conges-annuel', methods: ['POST'])]
public function create(Request $request)
{
$congeAnnuel = new CongeDroitAnnuel();
$form = $this->handleRequest($request, $congeAnnuel, 'create');
$entityManager = $this->doctrine->getManager();
$utilisateur = $congeAnnuel->getUtilisateur();
$utilisateurInformation = $entityManager
->getRepository(UtilisateurInformation::class)
->findOneBy(["idUtilisateur" => $utilisateur]);
$Idaffectation = $utilisateurInformation->getIdAffectation()->getIdAffectation();
$today = (new \DateTime());
$year = $today->format("Y");
$getRefCalendrier = $entityManager
->getRepository(RefAffectationCalendrier::class)
->getRefCalendrier($Idaffectation);
$congeScolaire = $getRefCalendrier['calendrierScolaire'];
$dateBasculeCongeSolaire = $getRefCalendrier['dateBascule'];
$yearBascule = $getRefCalendrier['yearBascule'];
if ($dateBasculeCongeSolaire != null) {
if (intval($congeAnnuel->getAnnee()) >= intval($yearBascule)) {
$typeCalendrier = ($congeScolaire) ? 's' : 'c';
} else {
$typeCalendrier = ($congeScolaire) ? 'c' : 's';
}
} else {
$typeCalendrier = ($congeScolaire) ? 's' : 'c';
}
if ((true === $congeScolaire) && ($dateBasculeCongeSolaire < $today) && ($today < new \DateTime("$year-09-01"))) {
$congeAnnuel->setAnnee($congeAnnuel->getAnnee() - 1);
}
if ($form->isSubmitted()) {
$entityManager = $this->doctrine->getManager();
$accessRuleService = $this->getServiceAccessRule();
if (!$accessRuleService->hasRightWithoutCheckAffectation($congeAnnuel->getUtilisateur(), $this->getUser())) {
return new JsonResponse('', JsonResponse::HTTP_FORBIDDEN);
}
$congeAnnuelEntity = $entityManager
->getRepository(CongeDroitAnnuel::class)
->findOneBy([
'annee' => $congeAnnuel->getAnnee(),
'utilisateur' => $congeAnnuel->getUtilisateur(),
'congeType' => $congeAnnuel->getCongeType(),
'archive' => false
]);
if ($congeAnnuelEntity) {
return new JsonResponse(
[
'success' => false,
'info' => self::ERROR_ALREADY_EXISTS
],
JsonResponse::HTTP_BAD_REQUEST
);
}
$congeAnnuel->setArchive(false);
$congeAnnuel->setTypeCalendrier($typeCalendrier);
$entityManager->persist($congeAnnuel);
$entityManager->flush();
return new JsonResponse(
[
'success' => true
],
JsonResponse::HTTP_CREATED
);
} else {
$result = [
'success' => false,
'data' => self::ERROR_VALIDATION_FORM,
'error' => (string) $form->getErrors(true, false)
];
}
return new JsonResponse($result, JsonResponse::HTTP_BAD_REQUEST);
}
/**
* @return JsonResponse
*/
#[Route(path: '/api/conges-annuel/{id}', name: 'ctsweb_update_conges-annuel', methods: ['POST'], requirements: ['id' => '\d+'])]
public function update(
Request $request,
CongeDroitAnnuel $congeAnnuel
) {
$accessRuleService = $this->getServiceAccessRule();
if (!$accessRuleService->hasRightWithoutCheckAffectation($congeAnnuel->getUtilisateur(), $this->getUser())) {
return new JsonResponse('', JsonResponse::HTTP_FORBIDDEN);
}
$label = 'update-ca';
if ($congeAnnuel->getCongeType()->getCode() !== CongeType::CAN) {
$label = 'update-others';
}
$form = $this->handleRequest($request, $congeAnnuel, $label);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->doctrine->getManager();
$entityManager->flush();
$result = ['success' => true];
} else {
$result = [
'success' => false,
'data' => self::ERROR_VALIDATION_FORM,
'error' => (string) $form->getErrors(true, false)
];
}
return new JsonResponse($result, JsonResponse::HTTP_OK);
}
/**
* @param CongeDroitAnnuel $id
*/
#[Route(path: '/api/conges-annuel/delete/{id}/{utilisateur}', name: 'ctsweb_remove_conges-annuel', methods: ['POST'], requirements: ['id' => '\d+', 'utilisateur' => '\d+'])]
public function delete(
CongeDroitAnnuel $congeDroitAnnuel,
Utilisateur $utilisateur
): JsonResponse {
if ($congeDroitAnnuel->getUtilisateur() !== $utilisateur) {
return new JsonResponse(
['info' => self::ERROR_ACTION_FORBIDDEN],
JsonResponse::HTTP_FORBIDDEN
);
}
$this->doctrine->getManager()->remove($congeDroitAnnuel);
$this->doctrine->getManager()->flush();
return new JsonResponse('', JsonResponse::HTTP_NO_CONTENT);
}
#[Route(path: '/api/conges-annuel/search/{user}/{year}/{type}', name: 'ctsweb_get_conges-annuel-by-year-type-user', methods: ['GET'], requirements: ['user' => '\d+', 'year' => '\d+'])]
public function searchByUserAndUserAndType(
Utilisateur $user,
int $year,
string $type
): JsonResponse {
$congeAnnuel = $this
->doctrine
->getRepository(CongeDroitAnnuel::class)
->searchByUserAndUserAndType($user, $year, $type);
return new JsonResponse(
$this->serialize($congeAnnuel),
JsonResponse::HTTP_OK,
[],
true
);
}
/**
* @return JsonResponse
*/
#[Route(path: '/api/conges-annuel/list/{conge}', name: 'ctsweb_list_conges-annuel_by_conge', methods: ['GET'], requirements: ['conge' => '\d+'])]
public function listByDayOff(Conge $conge)
{
$congeTypes = $this->doctrine
->getRepository(CongeType::class)
->findBy(['code' => ['RTT', 'CAN', 'RAA', 'CET']], ['id' => 'ASC']);
$utilisateurInformation = $this->getUser();
$affectation = $utilisateurInformation->getIdAffectation()->getIdAffectation();
$entityManager = $this->doctrine->getManager();
$getRefCalendrier = $entityManager
->getRepository(RefAffectationCalendrier::class)
->getRefCalendrier($affectation);
$congeScolaire = $getRefCalendrier['calendrierScolaire'];
$dateBascule = $getRefCalendrier['dateBascule'];
$today = (new \DateTime());
$currentYear = $today->format("Y");
$dateCalendrierScolaire = new \DateTime("$currentYear-09-01");
if (true === $congeScolaire) {
if ($conge->getDateDebut() < $dateCalendrierScolaire && $today < $dateCalendrierScolaire) {
$year = $conge->getDateDebut()->format("Y");
} elseif ($conge->getDateDebut() < $dateCalendrierScolaire && $today > $dateCalendrierScolaire) {
$year = $conge->getDateDebut()->format("Y") - 1;
} elseif ($conge->getDateDebut() > $dateCalendrierScolaire && $today < $dateCalendrierScolaire) {
$year = $conge->getDateDebut()->format("Y") + 1;
} else {
$year = $conge->getDateDebut()->format("Y");
}
} else {
$year = $conge->getDateDebut()->format("Y");
}
foreach ($congeTypes as $congeType) {
$congeType = $this->setTotal($conge->getUtilisateur(), $congeType, $year, $conge->getDateDebut(), $congeScolaire);
if ($congeType === $conge->getCongeType()) {
$congeType->setNouveauSolde($congeType->getSolde() - $conge->getNbJour());
} else {
$congeType->setNouveauSolde($congeType->getSolde());
}
if ((($dateBascule != null) && ($dateBascule < $today)) || ($dateBascule == null)) {
$congeType->setCalendrierScolaire($congeScolaire);
} else {
$congeType->setCalendrierScolaire(!$congeScolaire);
}
}
return new JsonResponse(
$this->serialize($congeTypes),
JsonResponse::HTTP_OK,
[],
true
);
}
//#[Route(path: '/api/conges-annuel/list/{conge}', name: 'ctsweb_list_conges-annuel_by_conge')]
public function getAnneeExportAction(Request $request)
{
$data = json_decode($request->getContent(), true, 512, JSON_THROW_ON_ERROR);
$request->request->replace(is_array($data) ? $data : []);
$params = $request->request->all();
}
/**
* @return JsonResponse
*/
#[Route(path: '/api/conges-annuel/recap/{utilisateur}/{year}', name: 'ctsweb_list_conges-annuel_by_user_year', methods: ['GET'], requirements: ['utilisateur' => '\d+', 'year' => '\d+'])]
public function recap(
Utilisateur $utilisateur,
int $year
) {
$entityManager = $this->doctrine->getManager();
$utilisateurInformation = $entityManager
->getRepository(UtilisateurInformation::class)
->findOneBy(["idUtilisateur" => $utilisateur]);
$affectation = $utilisateurInformation->getIdAffectation()->getIdAffectation();
$entityManager = $this->doctrine->getManager();
$affectionEntity = $entityManager
->getRepository(RefAffectation::class)
->findOneBy(["idAffectation" => $affectation]);
$getRefCalendrier = $entityManager
->getRepository(RefAffectationCalendrier::class)
->getRefCalendrier($affectation);
$congeScolaire = $getRefCalendrier['calendrierScolaire'];
$congeTypes = $this->doctrine
->getRepository(CongeType::class)
->findBy(['code' => ['RTT', 'CAN', 'CET']], ['id' => 'ASC']);
foreach ($congeTypes as $congeType) {
$congeType = $this->setTotal($utilisateur, $congeType, $year, new \DateTime("$year-12-31"), $congeScolaire);
}
return new JsonResponse(
$this->serialize($congeTypes),
JsonResponse::HTTP_OK,
[],
true
);
}
/**
* @param Utilisateur $user
* @param $year
* @return JsonResponse
*/
#[Route(path: '/api/conges-annuel/listing/{utilisateur}/{year}', name: 'ctsweb_list_conges-annuel', methods: ['GET'], requirements: ['utilisateur' => '\d+', 'year' => '\d+'])]
public function listByYearAndUser(Utilisateur $utilisateur, $year)
{
// détecter affectation et conge scolaire
$entityManager = $this->doctrine->getManager();
$utilisateurInformation = $entityManager
->getRepository(UtilisateurInformation::class)
->findOneBy(["idUtilisateur" => $utilisateur]);
$Idaffectation = $utilisateurInformation->getIdAffectation()->getIdAffectation();
$affectation = $entityManager
->getRepository(RefAffectation::class)
->findOneBy(["idAffectation" => $Idaffectation]);
// $congeScolaire = $affectation->getCalendrierScolaire();
// $dateBascule = $affectation->getDateBascule();
$today = new \DateTime();
$currentYear = $today->format("Y");
$getRefCalendrier = $entityManager
->getRepository(RefAffectationCalendrier::class)
->getRefCalendrier($Idaffectation);
$congeScolaire = $getRefCalendrier['calendrierAffectation'];
$dateBascule = $getRefCalendrier['dateBascule'];
if ($congeScolaire) {
if ((null != $dateBascule) && ($today >= $dateBascule)) {
if ($today < new \DateTime($currentYear . '-09-01')) {
$congeAnnuel = $this->doctrine
->getRepository(CongeDroitAnnuel::class)
->findBy([
'utilisateur' => $utilisateur,
'annee' => $year - 1,
'archive' => false,
'congeType' => [1, 2, 3, 4]
], ['congeType' => 'ASC']);
$congeCet = $this->doctrine
->getRepository(CongeDroitAnnuel::class)
->findBy([
'utilisateur' => $utilisateur,
'annee' => $year - 1,
'archive' => false,
'congeType' => 5
], ['congeType' => 'ASC']);
$congeAnnuel = array_merge($congeAnnuel, $congeCet);
} else {
$year = $year;
$congeAnnuel = $this->doctrine
->getRepository(CongeDroitAnnuel::class)
->findBy([
'utilisateur' => $utilisateur,
'annee' => $year,
'archive' => false
], ['congeType' => 'ASC']);
}
} else {
$congeAnnuel = $this->doctrine
->getRepository(CongeDroitAnnuel::class)
->findBy([
'utilisateur' => $utilisateur,
'annee' => $year,
'archive' => false
], ['congeType' => 'ASC']);
}
} else {
$congeAnnuel = $this->doctrine
->getRepository(CongeDroitAnnuel::class)
->findBy([
'utilisateur' => $utilisateur,
'annee' => $year,
'archive' => false
], ['congeType' => 'ASC']);
}
return new JsonResponse(
$this->serialize($congeAnnuel),
JsonResponse::HTTP_OK,
[],
true
);
}
/**
* @return JsonResponse
*/
#[Route(path: '/api/conges-droits-annees/{id}', name: 'ctsweb_conges-annuel-annees', methods: ['GET'], requirements: ['id' => '\d+'])]
public function getAnnees(
int $id
) {
$entityManager = $this->doctrine->getManager();
$congesDroitsAnnees = $entityManager
->getRepository(CongeDroitAnnuel::class)
->findAndOrderBy($id);
$utilisateurInformation = $entityManager
->getRepository(UtilisateurInformation::class)
->findOneBy(["idUtilisateur" => $id]);
$affectation = $utilisateurInformation->getIdAffectation();
$refcalendrier = $entityManager
->getRepository(RefAffectationCalendrier::class)
->findAllByRefAffectation($affectation->getIdAffectation());
$getRefCalendrier = $entityManager
->getRepository(RefAffectationCalendrier::class)
->getRefCalendrier($affectation->getIdAffectation());
$congeScolaireAffectation = $getRefCalendrier['calendrierScolaire'];
$dateBascule = $getRefCalendrier['dateBascule'];
$today = new \DateTime();
$today = $today->format('Y-m-d');
$congesDroitsAnnees = $this->manageYears(
$id,
$congeScolaireAffectation,
$dateBascule,
$today,
$congesDroitsAnnees,
$refcalendrier
);
return new JsonResponse(
$this->serialize($congesDroitsAnnees),
JsonResponse::HTTP_OK,
[],
true
);
}
public function createYearLabels($records, $id)
{
// Récupérer toutes les dates de bascule dans un tableau
$basculeDates = array_column($records, 'date_bascule');
// Trier les dates de bascule par ordre croissant
sort($basculeDates);
// Obtenir l'année actuelle
$currentYear = $this->anneeMax($basculeDates);
$currentYears = date('Y');
$aujourdhui = new \DateTime();
$currentDay = $aujourdhui->format('Y-m-d');
// Créer un tableau pour stocker les libellés
$yearLabels = array();
if (empty($currentYear)) {
for ($year = 2021; $year <= $currentYears; $year++) {
$archive = ($year == 2021) ? 1 : 0;
$type_calendrier = 'c';
$yearLabels[] = array('libelle' => $year, 'annee' => $year, 'archive' => $archive, 'url' => "api/conges-droits-annees-export/" . $id . "/" . $year . "/" . $type_calendrier . "/" . $archive, 'type_calendrier' => $type_calendrier, 'year_url' => $year);
}
} else {
// Vérifier si l'année 2021 doit être incluse
for ($year = 2021; $year <= $currentYears; $year++) {
$archive = ($year == 2021) ? 1 : 0;
if (in_array($year . '-01-01', $basculeDates) || $year == 2021) {
$type_calendrier = 'c';
$yearLabels[] = array('libelle' => $year, 'annee' => $year, 'archive' => $archive, 'url' => "api/conges-droits-annees-export/" . $id . "/" . $year . "/" . $type_calendrier . "/" . $archive, 'type_calendrier' => $type_calendrier, 'year_url' => $year);
} else {
$label = $year;
$nextYear = $year + 1;
$prevYear = $year - 1;
if (in_array($year . '-09-01', $basculeDates)) {
$type_calendrier = 'c';
$yearLabels[] = array('libelle' => $label, 'annee' => $year, 'archive' => $archive, 'url' => "api/conges-droits-annees-export/" . $id . "/" . $prevYear . "/" . $type_calendrier . "/" . $archive, 'type_calendrier' => $type_calendrier, 'year_url' => $prevYear);
$label .= '/' . $nextYear;
// }
$type_calendrier = 's';
$yearLabels[] = array('libelle' => $label, 'annee' => $year, 'archive' => $archive, 'url' => "api/conges-droits-annees-export/" . $id . "/" . $year . "/" . $type_calendrier . "/" . $archive, 'type_calendrier' => $type_calendrier, 'year_url' => $year);
}
elseif(($currentDay > $year . '-09-01')){
$label .= '/' . $nextYear;
$type_calendrier = 's';
$yearLabels[] = array('libelle' => $label, 'annee' => $year, 'archive' => $archive, 'url' => "api/conges-droits-annees-export/" . $id . "/" . $year . "/" . $type_calendrier . "/" . $archive, 'type_calendrier' => $type_calendrier, 'year_url' => $year);
}
}
}
}
if (!empty($basculeDates)) {
$maxDate = max($basculeDates);
$currentYear = $this->anneeMax($maxDate);
if ($aujourdhui >= new \DateTime('first day of September') && ($this->isSeptemberFirst($maxDate))) {
for ($year = $currentYear + 1; $year <= date('Y'); $year++) {
$archive = ($year == 2021) ? 1 : 0;
$label = $year;
$nextYear = $year + 1;
$type_calendrier = 's';
$label .= '/' . $nextYear;
$yearLabels[] = array('libelle' => $label, 'annee' => $year, 'archive' => $archive, 'url' => "api/conges-droits-annees-export/" . $id . "/" . $year . "/" . $type_calendrier . "/" . $archive, 'type_calendrier' => $type_calendrier, 'year_url' => $year);
}
}
// else {
// $archive = ($year == 2021) ? 1 : 0;
// for ($year = $currentYear; $year <= date('Y'); $year++) {
// $label = $year;
// $type_calendrier = 'c';
// $yearLabels[] = array('libelle' => $label, 'annee' => $year, 'archive' => $archive, 'url' => "api/conges-droits-annees-export/" . $id . "/" . $year . "/" . $type_calendrier . "/" . $archive,'type_calendrier'=>$type_calendrier);
// }
// }
}
return $yearLabels;
}
function isSeptemberFirst($date)
{
$dateToCheck = '09-01';
$formattedDate = date('m-d', strtotime($date));
return ($formattedDate === $dateToCheck);
}
public function anneeMax($dates)
{
$maxYear = null;
foreach ((array) $dates as $date) {
$year = intval(substr($date, 0, 4));
if ($maxYear === null || $year > $maxYear) {
$maxYear = $year;
}
}
return $maxYear;
}
public function manageYears(
$id,
$congeScolaire,
$dateBascule,
$today,
$congesDroitsAnnees,
$refcalendrier
) {
$todays = new \DateTime();
$currentYear = $todays->format('Y');
$delete = false;
foreach ($congesDroitsAnnees as $key => $congesDroitsAnnee) {
if ($today < $currentYear . '-09-01' && (true == $congeScolaire) && $congesDroitsAnnee['annee'] == $currentYear) {
unset($congesDroitsAnnees[$key]);
}
if ($congesDroitsAnnee['annee'] == 2021 && (false == $congeScolaire)) {
if ($delete) {
unset($congesDroitsAnnees[$key]);
}
$delete = true;
}
}
return $this->createYearLabels($refcalendrier, $id);
}
#[Route(path: '/api/conges-droits-annees-affectation/{idAff}', name: 'ctsweb_conges-annuel-annees-affectation', methods: ['GET'], requirements: ['id' => '\d+'])]
public function getAnneesAffectation(
int $idAff
) {
$entityManager = $this->doctrine->getManager();
if ($idAff != 1) {
$usersByAffectation = $entityManager
->getRepository(UtilisateurInformation::class)
->findBy(["idAffectation" => $idAff]);
} else {
$usersByAffectation = $entityManager
->getRepository(UtilisateurInformation::class)
->findAll();
}
$i = 0;
$output = [];
$affectation = $entityManager
->getRepository(RefAffectation::class)
->findOneBy(["idAffectation" => 1]);
foreach ($usersByAffectation as $userByAffectation) {
$id = $userByAffectation->getIdUtilisateur();
$congesDroitsAnnees = $entityManager
->getRepository(CongeDroitAnnuel::class)
->findAndOrderBy($id);
$utilisateurInformation = $entityManager
->getRepository(UtilisateurInformation::class)
->findOneBy(["idUtilisateur" => $id]);
/** Fix Err 500 prod sur $utilisateurInformation null bouton syntheses archivées**/
if (null !== $utilisateurInformation) {
if (null != $utilisateurInformation->getIdAffectation()) {
$affectation = $utilisateurInformation->getIdAffectation();
}
}
$refcalendrier = $entityManager
->getRepository(RefAffectationCalendrier::class)
->findAllByRefAffectation($affectation->getIdAffectation());
$tableaubascule = $entityManager
->getRepository(RefAffectationCalendrier::class)
->getClosestDates($refcalendrier);
if (isset($tableaubascule) && !empty($tableaubascule)) {
$congeScolaire = $tableaubascule[0]['calendrier_scolaire'];
$dateBascule = $tableaubascule[0]['date_bascule'];
} else {
$congeScolaire = false;
$dateBascule = null;
}
$today = new \DateTime();
$today = $today->format('Y-m-d');
$congesDroitsAnneesAffectation[$i] = $this->manageYears(
$id,
$congeScolaire,
$dateBascule,
$today,
$congesDroitsAnnees,
$refcalendrier
);
foreach ($congesDroitsAnneesAffectation[$i] as $congesDroitsAnneesAffectationArr) {
unset($congesDroitsAnneesAffectationArr["url"]);
$congesDroitsAnneesAffectation["id_user"] = $id;
$congesDroitsAnneesAffectation[$i][] = $congesDroitsAnneesAffectationArr;
$output[] = $congesDroitsAnneesAffectationArr;
}
$i++;
}
$output = array_unique($output, SORT_REGULAR);
if ($idAff != 1) {
$valsort = array_column($output, 'libelle');
foreach ($output as $key => $congesDroitsAnneesAffectationItem) {
if (!empty($congesDroitsAnneesAffectationItem)) {
$archive = ($congesDroitsAnneesAffectationItem['archive']) ? 1 : 0;
$congesDroitsAnneesAffectationItem['url'] = "api/export/conges/" . $idAff . "/" . $congesDroitsAnneesAffectationItem['year_url'] . "/" . $congesDroitsAnneesAffectationItem['type_calendrier'] . "/" . $archive;
$output[$key] = $congesDroitsAnneesAffectationItem;
} else {
unset($output[$key]);
}
}
array_multisort($valsort, SORT_ASC, $output);
} else {
$valsort = array_column($output, 'annee');
foreach ($output as $key => $congesDroitsAnneesAffectationItem) {
if (!empty($congesDroitsAnneesAffectationItem)) {
$congesDroitsAnneesAffectationItem["archive"] = 2;
$congesDroitsAnneesAffectationItem["type_calendrier"] = "all";
$congesDroitsAnneesAffectationItem["libelle"] = $congesDroitsAnneesAffectationItem["annee"];
$congesDroitsAnneesAffectationItem['url'] = "api/export/conges/" . $idAff . "/" . $congesDroitsAnneesAffectationItem['year_url'] . "/" . $congesDroitsAnneesAffectationItem['type_calendrier'] . "/" . $congesDroitsAnneesAffectationItem["archive"];
$output[$key] = $congesDroitsAnneesAffectationItem;
} else {
unset($output[$key]);
}
}
array_multisort($valsort, SORT_ASC, $output);
$output = $this->getTableauParAnneeSansDoublon($output);
}
$output = array_unique($output, SORT_REGULAR);
$return = [];
foreach ($output as $key => $value) {
$return[] = $value;
}
return new JsonResponse(
$this->serialize($return),
JsonResponse::HTTP_OK,
[],
true
);
}
public function getTableauParAnneeSansDoublon($tableau)
{
$result = array();
$anneesTraitees = array();
foreach ($tableau as $element) {
$annee = $element['url'];
if (!in_array($annee, $anneesTraitees)) {
$result[] = $element;
$anneesTraitees[] = $annee;
}
}
return $result;
}
/**
* @return JsonResponse
*/
#[Route(path: '/api/conges-droits-saisie-annee/{id}/{n}', name: 'ctsweb_conges-saisie-annees', methods: ['GET'], requirements: ['id' => '\d+'])]
public function getAnneeSaisie(
int $id,
int $n
) {
$congesDroitsAnnees = [];
$entityManager = $this->doctrine->getManager();
$utilisateurInformation = $entityManager
->getRepository(UtilisateurInformation::class)
->findOneBy(["idUtilisateur" => $id]);
$affectation = $utilisateurInformation->getIdAffectation();
// $congeScolaire = $affectation->getCalendrierScolaire();
// $dateBascule = $affectation->getDateBascule();
// if (null !== $dateBascule) {
// $dateBascule = $dateBascule->format('Y-m-d');
// }
$Idaffectation = $utilisateurInformation->getIdAffectation()->getIdAffectation();
$today = new \DateTime();
$currentYear = $today->format('Y');
$getRefCalendrier = $entityManager
->getRepository(RefAffectationCalendrier::class)
->getRefCalendrier($Idaffectation);
$congeScolaire = $getRefCalendrier['calendrierAffectation'];
$dateBascule = $getRefCalendrier['dateBascule'];
if ($n == 0) {
$year = $currentYear - 1;
$currentDay = $today;
} else {
$year = $currentYear;
$currentDay = $today;
}
$currentDay = $currentDay->format('Y-m-d');
$nextYear = $year + 1;
$lastYear = $year - 1;
if ((true == $congeScolaire) && (null != $dateBascule) && ($currentDay >= $dateBascule)) {
if ($n == 1) {
$date = new \DateTime('first day of September');
if ($currentDay < $date->format('Y-m-d')) {
$congesDroitsAnnees['libelle'] = $lastYear . "/" . $year;
} else {
$congesDroitsAnnees['libelle'] = $year . "/" . $nextYear;
}
} else {
$dateB = new \DateTime('first day of September');
$formattedDate = $dateB->format('Y-m-d');
if ($dateBascule < $formattedDate && ($currentDay > $dateB->format('Y-m-d')) ){
$congesDroitsAnnees['libelle'] = $year . "/" . $nextYear;
}
elseif($currentDay < $dateB->format('Y-m-d')){
$congesDroitsAnnees['libelle'] = $lastYear . "/" . $year;
} else {
$congesDroitsAnnees['libelle'] = strval($year);
}
}
$congesDroitsAnnees['id'] = $id;
} elseif ((true == $congeScolaire) && (null != $dateBascule) && ($currentDay < $dateBascule)) {
$congesDroitsAnnees['libelle'] = strval($year);
} elseif ((false == $congeScolaire) && (null != $dateBascule) && ($currentDay <= $dateBascule)) {
$congesDroitsAnnees['libelle'] = $lastYear . "/" . $year;
} else {
$congesDroitsAnnees['libelle'] = strval($year);
}
$congesDroitsAnnees['id'] = $id;
return new JsonResponse(
$this->serialize($congesDroitsAnnees),
JsonResponse::HTTP_OK,
[],
true
);
}
/**
* @return JsonResponse
*/
#[Route(path: '/api/conges-annuel/recapitulatif/{conge}', name: 'ctsweb_manager_recap_conges-annuel', methods: ['GET'], requirements: ['conge' => '\d+'])]
public function managerRecap(Conge $conge)
{
$entityManager = $this->doctrine->getManager();
$utilisateur = $conge->getUtilisateur();
$utilisateurInformation = $entityManager
->getRepository(UtilisateurInformation::class)
->findOneBy(["idUtilisateur" => $utilisateur]);
$Idaffectation = $utilisateurInformation->getIdAffectation()->getIdAffectation();
$affectation = $entityManager
->getRepository(RefAffectation::class)
->findOneBy(["idAffectation" => $Idaffectation]);
// $congeScolaire = $affectation->getCalendrierScolaire();
$getRefCalendrier = $entityManager
->getRepository(RefAffectationCalendrier::class)
->getRefCalendrier($Idaffectation);
$congeScolaire = $getRefCalendrier['calendrierScolaire'];
$recapitulatif = $entityManager
->getRepository(Conge::class)
->getRecapitulatif($conge, $congeScolaire);
// var_dump($recapitulatif);
$managerRecap = $this->manage($recapitulatif);
// var_dump($managerRecap);
// die();
return new JsonResponse(
$this->serialize($managerRecap),
JsonResponse::HTTP_OK,
[],
true
);
}
/**
*
* @return JsonResponse
*/
public function majDaysOffAction()
{
$entityManager = $this->doctrine->getManager();
$listAffectations = $entityManager->getRepository(RefAffectation::class)->findAll();
$array = [];
foreach ($listAffectations as $affectation) {
$today = new \DateTime('now');
$year = $today->format('Y');
$today = $today->format('Y-m-d');
if (null != $affectation->getDateBascule()) {
$date_format = $affectation->getDateBascule()->format('Y-m-d');
} else {
$date_format = $affectation->getDateBascule();
}
$array[] = $date_format . " - " . $today;
if ($today == $date_format) {
$listCTSByAffectation = $entityManager->getRepository(UtilisateurInformation::class)->findBy(
['idAffectation' => $affectation->getIdAffectation()]
);
foreach ($listCTSByAffectation as $CTSByAffectation) {
$entityManager->getRepository(CongeDroitAnnuel::class)->resetByAffectation(
$CTSByAffectation->getIdAffectation(),
$year,
[1, 2, 3, 4]
);
}
}
}
return new JsonResponse(
$this->serialize([$array]),
JsonResponse::HTTP_OK,
[],
true
);
}
/**
*
* @return JsonResponse
*/
public function majDaysOff2Action()
{
$entityManager = $this->doctrine->getManager();
$listAffectations = $entityManager->getRepository(RefAffectation::class)->findAll();
$array = [];
foreach ($listAffectations as $affectation) {
$today = new \DateTime('now');
$year = $today->format('Y');
$today = $today->format('Y-m-d');
if (null != $affectation->getDateBascule()) {
$date_format = $affectation->getDateBascule()->format('Y-m-d');
} else {
$date_format = $affectation->getDateBascule();
}
$array[] = $date_format . " - " . $today;
if ($today == $date_format) {
$array[] = "Coucou";
$listCTSByAffectation = $entityManager->getRepository(UtilisateurInformation::class)->findBy(
['idAffectation' => $affectation->getIdAffectation()]
);
foreach ($listCTSByAffectation as $CTSByAffectation) {
$entityManager->getRepository(CongeDroitAnnuel::class)->resetByAffectation2(
$CTSByAffectation->getIdAffectation(),
$year,
[1, 2, 3, 4]
);
}
}
}
return new JsonResponse(
$this->serialize([$array]),
JsonResponse::HTTP_OK,
[],
true
);
}
/**
* @param string $validatonGroup
* @return \Symfony\Component\Form\FormInterface
*/
private function handleRequest(
Request $request,
CongeDroitAnnuel $congeDroitAnnuel,
string $label
) {
$data = json_decode($request->getContent(), true, 512, JSON_THROW_ON_ERROR);
$request->request->replace(is_array($data) ? $data : []);
$form = $this->createForm(
CongeDroitAnnuelType::class,
$congeDroitAnnuel,
[
'label' => $label
]
);
$form->handleRequest($request);
return $form;
}
/**
* @param array $states
* @return mixed
*/
private function serialize($item)
{
$data = ["items" => $item];
$context = new SerializationContext();
$context->setSerializeNull(true);
return $this->serializer->serialize($data, 'json', $context);
}
private function setTotal(
Utilisateur $utilisateur,
CongeType $congeType,
int $year,
$date_conge_actuel,
bool $calendrierScolaire
) {
$byUserAndTypeAndStatus = $this->doctrine
->getRepository(Conge::class)
->findDayOffByTypeAndSatatusAndUser(
$utilisateur,
$congeType,
[Workflow::CO_ACCEPTED, Workflow::CO_SIGN],
$date_conge_actuel,
$year,
$calendrierScolaire
);
$congeAnnuelByType = $this
->doctrine
->getRepository(CongeDroitAnnuel::class)
->findOneBy([
'utilisateur' => $utilisateur,
'annee' => $year,
'congeType' => $congeType
]);
if ($congeType->getCode() == 'RTT') {
$nbJourTotal = ($congeAnnuelByType)
? (float) $congeAnnuelByType->getNbJourTotal()
: 0;
$total = $nbJourTotal - $byUserAndTypeAndStatus;
$congeType->setNbJourTotal($nbJourTotal);
$congeType->setSolde($total);
} else {
if ($calendrierScolaire) {
$byUserAndTypeAndStatusLastYear = $this->doctrine
->getRepository(Conge::class)
->findDayOffByTypeAndSatatusAndUser(
$utilisateur,
$congeType,
[Workflow::CO_ACCEPTED, Workflow::CO_SIGN],
$date_conge_actuel,
$year,
$calendrierScolaire
);
} else {
$byUserAndTypeAndStatusLastYear = 0;
}
$congeAnnuelByTypeLastYear = $this
->doctrine
->getRepository(CongeDroitAnnuel::class)
->findOneBy([
'utilisateur' => $utilisateur,
'annee' => $year - 1,
'congeType' => $congeType
]);
$ReportcongeAnnuel = $this
->doctrine
->getRepository(CongeDroitAnnuel::class)
->findOneBy([
'utilisateur' => $utilisateur,
'annee' => $year + 1,
'congeType' => 4
]);
$nbJourReportY = ($ReportcongeAnnuel)
? (float) $ReportcongeAnnuel->getNbJourTotal()
: 0;
$nbJourTotalY = ($congeAnnuelByType)
? (float) $congeAnnuelByType->getNbJourTotal()
: 0;
$nbJourTotalLastY = ($congeAnnuelByTypeLastYear)
? (float) $congeAnnuelByTypeLastYear->getNbJourTotal()
: 0;
$nbJourTotalFracY = ($congeAnnuelByType)
? (float) $congeAnnuelByType->getNbJourFractionnement()
: 0;
$nbJourTotalLastYFrac = ($congeAnnuelByTypeLastYear)
? (float) $congeAnnuelByTypeLastYear->getNbJourFractionnement()
: 0;
$nbJourTotal = $nbJourTotalY + $nbJourTotalFracY + $nbJourReportY;
$total = ($calendrierScolaire) ? $nbJourTotal - $byUserAndTypeAndStatus : $nbJourTotal - $byUserAndTypeAndStatus - $byUserAndTypeAndStatusLastYear;
$congeType->setNbJourTotal($nbJourTotal);
$congeType->setSolde($total);
}
return $congeType;
}
/**
* @return array
*/
private function manage(array $recapitulatif)
{
$soldeAfterLastYear = null;
$soldeAfterCan = null;
$soldeAfterCet = null;
$soldeAfterRtt = null;
$soldeAfterRaa = null;
$soldeAfterFractionnement = null;
$soldeBeforeRtt = $recapitulatif['totalRtt'] - $recapitulatif['givenRtt'];
$soldeBeforeCet = $recapitulatif['totalCet'] - $recapitulatif['givenCet'];
$soldeBeforeCan = $recapitulatif['totalCan'] - $recapitulatif['givenCa'];
$soldeBeforeRaa = $recapitulatif['totalReport']- $recapitulatif['givenRaa'];
// $soldeLastYear = $recapitulatif['totalReport'];
$soldeLastYear = 0;
$total =
// $soldeLastYear +
$recapitulatif['totalCan'] +
$recapitulatif['totalFrac'];
$totalBefore =
// $soldeLastYear +
$soldeBeforeCan +
$recapitulatif['totalFrac'];
if (CongeType::CAN === $recapitulatif['code']) {
$soldeAfterRtt = $soldeBeforeRtt;
$soldeAfterCet = $soldeBeforeCet;
$soldeAfterRaa = $soldeBeforeRaa;
if ($soldeLastYear <= 0 && $recapitulatif['totalFrac'] <= 0) {
$soldeAfterLastYear = $soldeLastYear;
$soldeAfterFractionnement = $recapitulatif['totalFrac'];
$soldeAfterCan = $soldeBeforeCan - $recapitulatif['nbJour'];
} else if ($soldeLastYear >= $recapitulatif['nbJour']) {
$soldeAfterLastYear = $soldeLastYear - $recapitulatif['nbJour'];
$soldeAfterFractionnement = $recapitulatif['totalFrac'];
$soldeAfterCan = $soldeBeforeCan;
} else if ($soldeLastYear < $recapitulatif['nbJour']) {
$soldeAfterLastYear = 0;
$leave = $recapitulatif['nbJour'] - $soldeLastYear;
if ($recapitulatif['totalFrac'] >= $leave) {
$soldeAfterFractionnement = $recapitulatif['totalFrac'] - $leave;
$soldeAfterCan = $soldeBeforeCan;
} else {
$soldeAfterFractionnement = 0;
$soldeAfterCan = $soldeBeforeCan - ($leave - $recapitulatif['totalFrac']);
}
}
} elseif (CongeType::RTT === $recapitulatif['code']) {
$soldeAfterLastYear = $soldeLastYear;
$soldeAfterRtt = $soldeBeforeRtt - $recapitulatif['nbJour'];
$soldeAfterFractionnement = $recapitulatif['totalFrac'];
$soldeAfterCan = $soldeBeforeCan;
$soldeAfterCet = $soldeBeforeCet;
$soldeAfterRaa = $soldeBeforeRaa;
} elseif (CongeType::CET === $recapitulatif['code']) {
$soldeAfterLastYear = $soldeLastYear;
$soldeAfterCet = $soldeBeforeCet - $recapitulatif['nbJour'];
$soldeAfterFractionnement = $recapitulatif['totalFrac'];
$soldeAfterCan = $soldeBeforeCan;
$soldeAfterRtt = $soldeBeforeRtt;
$soldeAfterRaa = $soldeBeforeRaa;
} elseif (CongeType::RAA === $recapitulatif['code']) {
$soldeAfterLastYear = $soldeLastYear;
$soldeAfterRaa = $soldeBeforeRaa - $recapitulatif['nbJour'];
$soldeAfterFractionnement = $recapitulatif['totalFrac'];
$soldeAfterCan = $soldeBeforeCan;
$soldeAfterRtt = $soldeBeforeRtt;
$soldeAfterCet = $soldeBeforeCet;
} else {
$soldeAfterLastYear = $soldeLastYear;
$soldeAfterRtt = $soldeBeforeRtt;
$soldeAfterFractionnement = $recapitulatif['totalFrac'];
$soldeAfterCan = $soldeBeforeCan;
$soldeAfterRaa = $soldeBeforeRaa;
$soldeAfterCet = $soldeBeforeCet;
}
// $totalAfter = /*$soldeAfterRtt +*/ $soldeAfterLastYear + $soldeAfterCan + $soldeAfterFractionnement;
$totalAfter = /*$soldeAfterRtt + $soldeAfterLastYear + */ $soldeAfterCan + $soldeAfterFractionnement - $recapitulatif['givenRAANextYear'];
return
[
[
'libelle' => 'RTT',
'annuel' => (float) $recapitulatif['totalRtt'],
'before' => $soldeBeforeRtt,
'after' => $soldeAfterRtt
],
[
'libelle' => 'CET',
'annuel' => (float) $recapitulatif['totalCet'],
'before' => $soldeBeforeCet,
'after' => $soldeAfterCet,
],
[
'libelle' => 'Report année antérieure',
'annuel' => (float) $recapitulatif['totalReport'],
'before' => $soldeBeforeRaa,
//'after' => $soldeBeforeRaa,
'after' => $soldeAfterRaa
],
[
'libelle' => 'Année en cours',
'annuel' => (float) $recapitulatif['totalCan'],
'before' => null,
'after' => null
],
[
'libelle' => 'Jours de fractionnement*',
'annuel' => (float) $recapitulatif['totalFrac'],
'before' => null,
'after' => null
],
[
'libelle' => 'Total congés annuels',
'annuel' => (float) $total,
'before' => (float) $totalBefore,
'after' => (float) $totalAfter
],
isset($recapitulatif['calendrier_scolaire']) ? ["calendrier_scolaire" => $recapitulatif['calendrier_scolaire']] : []
];
}
/**
* @return object
*/
private function getServiceAccessRule()
{
return $this->accessRule;
}
}