src/Service/GDA/PlanningDispoService.php line 72

Open in your IDE?
  1. <?php
  2. namespace App\Service\GDA;
  3. use App\Entity\AssistantMaternel\AssistantMaternel;
  4. use App\Entity\GDA\PlanningDispo;
  5. use App\Entity\Referentiel\FrequenceDispo;
  6. use App\Entity\Referentiel\EnumFrequenceDispo;
  7. use App\Entity\Referentiel\Periode;
  8. use App\Entity\Referentiel\JourSemaine;
  9. use App\Entity\Referentiel\TrancheHoraire;
  10. use Doctrine\Common\Collections\ArrayCollection;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use App\Entity\Referentiel\LieuAccueil;
  13. use App\Entity\Referentiel\TypeAccueil;
  14. use App\Entity\Referentiel\TrancheAge;
  15. use App\Service\Referentiel\TrancheAgeService;
  16. class PlanningDispoService
  17. {
  18.     const EST_ACTIF 'est_actif';
  19.     const NB_PLACES 'nbPlaces';
  20.     const NB_ENFANTS 'nbEnfants'// nombre d'enfants accueillis
  21.     const NB_ENFANTS_IRREG 'nbEnfantsIrreg'// dont nombre d'enfants accueillis irrégulièremet
  22.     const STATUT 'statut';
  23.     private $em;
  24.     private $trancheAgeService;
  25.     public function __construct(EntityManagerInterface $entity_managerTrancheAgeService $trancheAgeService)
  26.     {
  27.         $this->em $entity_manager;
  28.         $this->trancheAgeService $trancheAgeService;
  29.     }
  30.     public function creerPlanningVierge(AssistantMaternel $assmat, array $listePeriodes, array $listeJours, array $listeTranchesLieuAccueil $lieuAccueilTypeAccueil $typeAccueil)
  31.     {
  32.         $planning = new ArrayCollection();
  33.         $frequence_vierge $this->em->getRepository(FrequenceDispo::class)->findOneById(EnumFrequenceDispo::LIBRE);
  34.         // ATTENTION : l'ordre de ces 3 champs est important pour la construction de la vue
  35.         foreach ($listePeriodes as $periode) {
  36.             foreach ($listeTranches as $tranche) {
  37.                 foreach ($listeJours as $jour) {
  38.                     $entree_planning = new PlanningDispo();
  39.                     $entree_planning->setPeriode($periode);
  40.                     $entree_planning->setLieuAccueil($lieuAccueil);
  41.                     $entree_planning->setTypeAccueil($typeAccueil);
  42.                     $entree_planning->setJourSemaine($jour);
  43.                     $entree_planning->setTrancheHoraire($tranche);
  44.                     $entree_planning->setFrequenceDispo($frequence_vierge);
  45.                     $entree_planning->setAssmat($assmat);
  46.                     $planning->add($entree_planning);
  47.                 }
  48.             }
  49.         }
  50.         return $planning;
  51.     }
  52.     public function creerPlanningViergeRecherche()
  53.     {
  54.         $listePeriodes $this->em->getRepository(Periode::class)->findBy([self::EST_ACTIF => true], ['ordre' => 'ASC']);
  55.         $listeJours $this->em->getRepository(JourSemaine::class)->findBy([self::EST_ACTIF => true], ['id' => 'ASC']);
  56.         $listeTranches $this->em->getRepository(TrancheHoraire::class)->findBy([self::EST_ACTIF => true], ['id' => 'ASC']);
  57.         $planning = new ArrayCollection();
  58.         $frequence_vierge $this->em->getRepository(FrequenceDispo::class)->findOneById(EnumFrequenceDispo::LIBRE);
  59.         // ATTENTION : l'ordre de ces 3 champs est important pour la construction de la vue
  60.         foreach ($listePeriodes as $periode) {
  61.             foreach ($listeTranches as $tranche) {
  62.                 foreach ($listeJours as $jour) {
  63.                     $entree_planning = new PlanningDispo();
  64.                     $entree_planning->setPeriode($periode);
  65.                     $entree_planning->setJourSemaine($jour);
  66.                     $entree_planning->setTrancheHoraire($tranche);
  67.                     $entree_planning->setFrequenceDispo($frequence_vierge);
  68.                     $planning->add($entree_planning);
  69.                 }
  70.             }
  71.         }
  72.         return $planning;
  73.     }
  74.     /**
  75.      * Calcule l'ensemble des disponibilités de l'assmat à partir du récapotualif des accueils déclarés
  76.      */
  77.     public function creerPlanningDispoFromRecapAccueils(AssistantMaternel $assmat$arrPlanning)
  78.     {
  79.         $allFrequenceDispo $this->em->getRepository(FrequenceDispo::class)->findAllAsArray();
  80.         $allLieu $this->em->getRepository(LieuAccueil::class)->findAllAsArray();
  81.         $allTrancheAge $this->em->getRepository(TrancheAge::class)->findAllAsArray();
  82.         $allJour $this->em->getRepository(JourSemaine::class)->findAllAsArray();
  83.         $allHoraire $this->em->getRepository(TrancheHoraire::class)->findAllAsArray();
  84.         $allType $this->em->getRepository(TypeAccueil::class)->findAllAsArray();
  85.         $allPeriode $this->em->getRepository(Periode::class)->findAllAsArray();
  86.         $frequence_libre $allFrequenceDispo[EnumFrequenceDispo::LIBRE];
  87.         $frequence_occupe $allFrequenceDispo[EnumFrequenceDispo::OCCUPE];
  88.         $frequence_occupe_irreg $allFrequenceDispo[EnumFrequenceDispo::OCCUPE_IRREG];
  89.         $planning = new ArrayCollection();
  90.         // $arrPlanning[$idLieu][$idHoraire][$idJour][$idType]['tabTranchesAge'][$idTrancheAge]
  91.         foreach ($arrPlanning as $idLieu => $lieu) {
  92.             $estArchiveByLieu $assmat->getArchiveCalculeByLieuAccueil($idLieu);
  93.             if (! $estArchiveByLieu) {
  94.                 foreach ($lieu as $idHoraire => $horaire) {
  95.                     foreach ($horaire as $idJour => $jour) {
  96.                         foreach ($jour as $idType => $type) {
  97.                             $listeTranches $type['tabTranchesAge'];
  98.                             foreach ($listeTranches as $idTrancheAge => $trancheAge) {
  99.                                 //la tranche d'age d'id 0 est fictive : sert seulement puor l'afichage du planning avec de senfants hors tranches agréées
  100.                                 if ($idTrancheAge != 0) {
  101.                                     $entree_planning = new PlanningDispo();
  102.                                     $entree_planning->setAssmat($assmat);
  103.                                     $entree_planning->setPeriode($allPeriode[1]);
  104.                                     $entree_planning->setLieuAccueil($allLieu[$idLieu]);
  105.                                     $entree_planning->setTypeAccueil($allType[$idType]);
  106.                                     $entree_planning->setTrancheAge($allTrancheAge[$idTrancheAge]);
  107.                                     $entree_planning->setJourSemaine($allJour[$idJour]);
  108.                                     $entree_planning->setTrancheHoraire($allHoraire[$idHoraire]);
  109.                                     //dump('dispo ' . $idLieu . '.' . $idHoraire . '.' . $idJour . '.' . $idType . '.' . $idTrancheAge . '.' . $trancheAge[self::NB_PLACES]); //NOSONAR pour le debug
  110.                                     $val $arrPlanning[$idLieu][$idHoraire][$idJour][$idType]['tabTranchesAge'][$idTrancheAge];
  111.                                     $nbTotal $val[self::NB_PLACES];
  112.                                     $nbLibre max($nbTotal $val[self::NB_ENFANTS], 0);
  113.                                     $nbLibreIrreg max($nbTotal $val[self::NB_ENFANTS] + $val[self::NB_ENFANTS_IRREG], 0);
  114.                                     $freqDispo $nbLibre $frequence_libre : ($nbLibreIrreg $frequence_occupe_irreg $frequence_occupe);
  115.                                     $entree_planning->setFrequenceDispo($freqDispo);
  116.                                     $entree_planning->setNombrePlacesLibres($nbLibre);
  117.                                     $entree_planning->setNombrePlacesLibresIrregulier($nbLibreIrreg);
  118.                                     $entree_planning->setNombrePlacesTotal($nbTotal);
  119.                                     $planning->add($entree_planning);
  120.                                 }
  121.                             }
  122.                         }
  123.                     }
  124.                 }
  125.             }
  126.         }
  127.         return $planning;
  128.     }
  129.     /**
  130.      * Met à jour le planning de dispo de l'assamt en fonction du recapitulatifs des accueils déclarés
  131.      */
  132.     public function updatePlanningDispo(AssistantMaternel $assmat$recapAccueil)
  133.     {
  134.         //supprime l'ancien planning de dispo
  135.         foreach ($assmat->getDispos() as $dispo) {
  136.             $this->em->remove($dispo);
  137.         }
  138.         $this->em->flush(); //bad (même pb que pour les planning d'accueil) http://qpautrat.github.io/2016/11/16/delete-insert-unicity-constraint-doctrine/
  139.         //génère le planning de dispo à jour selon les accueils
  140.         $planningDispo $this->creerPlanningDispoFromRecapAccueils($assmat$recapAccueil);
  141.         foreach ($planningDispo as $dispo) {
  142.             $this->em->persist($dispo);
  143.         }
  144.         //enregistre le planning de dispo à jour
  145.         $assmat->setDispos($planningDispo);
  146.         $this->em->persist($assmat);
  147.         $this->em->flush();
  148.         unset($planningDispo);
  149.     }
  150.     public function rechercherDispo($cantonId$secteurId$communeId$bureauDistributeurId$lieuId$formation2$dateNaissanceEnfant$inclureArchive$inclurePuericultrice$user$inclureSupprime$occupeIrreg$planningDispo) {
  151.         if($dateNaissanceEnfant){
  152.             $listeIdTrancheAge $this->assmatService->getListTrancheAgeForDateNaissance($dateNaissanceEnfant);
  153.         }
  154.         else{
  155.             $listeIdTrancheAge $this->em->getRepository(TrancheAge::class)->findby([], ['age_max' => 'DESC''age_min' => 'DESC']);
  156.         }
  157.         $liste_assmats $this->em->getRepository(AssistantMaternel::class)
  158.                 ->rechercherDispo($cantonId$secteurId$communeId$bureauDistributeurId$lieuId$formation2$listeIdTrancheAge$inclureArchive$inclurePuericultrice$user$inclureSupprime$occupeIrreg$planningDispo);
  159.         return $liste_assmats;
  160.     }
  161. }