<?php
namespace App\Service\GDA;
use App\Entity\AssistantMaternel\AssistantMaternel;
use App\Entity\GDA\PlanningDispo;
use App\Entity\Referentiel\FrequenceDispo;
use App\Entity\Referentiel\EnumFrequenceDispo;
use App\Entity\Referentiel\Periode;
use App\Entity\Referentiel\JourSemaine;
use App\Entity\Referentiel\TrancheHoraire;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Referentiel\LieuAccueil;
use App\Entity\Referentiel\TypeAccueil;
use App\Entity\Referentiel\TrancheAge;
use App\Service\Referentiel\TrancheAgeService;
class PlanningDispoService
{
const EST_ACTIF = 'est_actif';
const NB_PLACES = 'nbPlaces';
const NB_ENFANTS = 'nbEnfants'; // nombre d'enfants accueillis
const NB_ENFANTS_IRREG = 'nbEnfantsIrreg'; // dont nombre d'enfants accueillis irrégulièremet
const STATUT = 'statut';
private $em;
private $trancheAgeService;
public function __construct(EntityManagerInterface $entity_manager, TrancheAgeService $trancheAgeService)
{
$this->em = $entity_manager;
$this->trancheAgeService = $trancheAgeService;
}
public function creerPlanningVierge(AssistantMaternel $assmat, array $listePeriodes, array $listeJours, array $listeTranches, LieuAccueil $lieuAccueil, TypeAccueil $typeAccueil)
{
$planning = new ArrayCollection();
$frequence_vierge = $this->em->getRepository(FrequenceDispo::class)->findOneById(EnumFrequenceDispo::LIBRE);
// ATTENTION : l'ordre de ces 3 champs est important pour la construction de la vue
foreach ($listePeriodes as $periode) {
foreach ($listeTranches as $tranche) {
foreach ($listeJours as $jour) {
$entree_planning = new PlanningDispo();
$entree_planning->setPeriode($periode);
$entree_planning->setLieuAccueil($lieuAccueil);
$entree_planning->setTypeAccueil($typeAccueil);
$entree_planning->setJourSemaine($jour);
$entree_planning->setTrancheHoraire($tranche);
$entree_planning->setFrequenceDispo($frequence_vierge);
$entree_planning->setAssmat($assmat);
$planning->add($entree_planning);
}
}
}
return $planning;
}
public function creerPlanningViergeRecherche()
{
$listePeriodes = $this->em->getRepository(Periode::class)->findBy([self::EST_ACTIF => true], ['ordre' => 'ASC']);
$listeJours = $this->em->getRepository(JourSemaine::class)->findBy([self::EST_ACTIF => true], ['id' => 'ASC']);
$listeTranches = $this->em->getRepository(TrancheHoraire::class)->findBy([self::EST_ACTIF => true], ['id' => 'ASC']);
$planning = new ArrayCollection();
$frequence_vierge = $this->em->getRepository(FrequenceDispo::class)->findOneById(EnumFrequenceDispo::LIBRE);
// ATTENTION : l'ordre de ces 3 champs est important pour la construction de la vue
foreach ($listePeriodes as $periode) {
foreach ($listeTranches as $tranche) {
foreach ($listeJours as $jour) {
$entree_planning = new PlanningDispo();
$entree_planning->setPeriode($periode);
$entree_planning->setJourSemaine($jour);
$entree_planning->setTrancheHoraire($tranche);
$entree_planning->setFrequenceDispo($frequence_vierge);
$planning->add($entree_planning);
}
}
}
return $planning;
}
/**
* Calcule l'ensemble des disponibilités de l'assmat à partir du récapotualif des accueils déclarés
*/
public function creerPlanningDispoFromRecapAccueils(AssistantMaternel $assmat, $arrPlanning)
{
$allFrequenceDispo = $this->em->getRepository(FrequenceDispo::class)->findAllAsArray();
$allLieu = $this->em->getRepository(LieuAccueil::class)->findAllAsArray();
$allTrancheAge = $this->em->getRepository(TrancheAge::class)->findAllAsArray();
$allJour = $this->em->getRepository(JourSemaine::class)->findAllAsArray();
$allHoraire = $this->em->getRepository(TrancheHoraire::class)->findAllAsArray();
$allType = $this->em->getRepository(TypeAccueil::class)->findAllAsArray();
$allPeriode = $this->em->getRepository(Periode::class)->findAllAsArray();
$frequence_libre = $allFrequenceDispo[EnumFrequenceDispo::LIBRE];
$frequence_occupe = $allFrequenceDispo[EnumFrequenceDispo::OCCUPE];
$frequence_occupe_irreg = $allFrequenceDispo[EnumFrequenceDispo::OCCUPE_IRREG];
$planning = new ArrayCollection();
// $arrPlanning[$idLieu][$idHoraire][$idJour][$idType]['tabTranchesAge'][$idTrancheAge]
foreach ($arrPlanning as $idLieu => $lieu) {
$estArchiveByLieu = $assmat->getArchiveCalculeByLieuAccueil($idLieu);
if (! $estArchiveByLieu) {
foreach ($lieu as $idHoraire => $horaire) {
foreach ($horaire as $idJour => $jour) {
foreach ($jour as $idType => $type) {
$listeTranches = $type['tabTranchesAge'];
foreach ($listeTranches as $idTrancheAge => $trancheAge) {
//la tranche d'age d'id 0 est fictive : sert seulement puor l'afichage du planning avec de senfants hors tranches agréées
if ($idTrancheAge != 0) {
$entree_planning = new PlanningDispo();
$entree_planning->setAssmat($assmat);
$entree_planning->setPeriode($allPeriode[1]);
$entree_planning->setLieuAccueil($allLieu[$idLieu]);
$entree_planning->setTypeAccueil($allType[$idType]);
$entree_planning->setTrancheAge($allTrancheAge[$idTrancheAge]);
$entree_planning->setJourSemaine($allJour[$idJour]);
$entree_planning->setTrancheHoraire($allHoraire[$idHoraire]);
//dump('dispo ' . $idLieu . '.' . $idHoraire . '.' . $idJour . '.' . $idType . '.' . $idTrancheAge . '.' . $trancheAge[self::NB_PLACES]); //NOSONAR pour le debug
$val = $arrPlanning[$idLieu][$idHoraire][$idJour][$idType]['tabTranchesAge'][$idTrancheAge];
$nbTotal = $val[self::NB_PLACES];
$nbLibre = max($nbTotal - $val[self::NB_ENFANTS], 0);
$nbLibreIrreg = max($nbTotal - $val[self::NB_ENFANTS] + $val[self::NB_ENFANTS_IRREG], 0);
$freqDispo = $nbLibre > 0 ? $frequence_libre : ($nbLibreIrreg > 0 ? $frequence_occupe_irreg : $frequence_occupe);
$entree_planning->setFrequenceDispo($freqDispo);
$entree_planning->setNombrePlacesLibres($nbLibre);
$entree_planning->setNombrePlacesLibresIrregulier($nbLibreIrreg);
$entree_planning->setNombrePlacesTotal($nbTotal);
$planning->add($entree_planning);
}
}
}
}
}
}
}
return $planning;
}
/**
* Met à jour le planning de dispo de l'assamt en fonction du recapitulatifs des accueils déclarés
*/
public function updatePlanningDispo(AssistantMaternel $assmat, $recapAccueil)
{
//supprime l'ancien planning de dispo
foreach ($assmat->getDispos() as $dispo) {
$this->em->remove($dispo);
}
$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/
//génère le planning de dispo à jour selon les accueils
$planningDispo = $this->creerPlanningDispoFromRecapAccueils($assmat, $recapAccueil);
foreach ($planningDispo as $dispo) {
$this->em->persist($dispo);
}
//enregistre le planning de dispo à jour
$assmat->setDispos($planningDispo);
$this->em->persist($assmat);
$this->em->flush();
unset($planningDispo);
}
public function rechercherDispo($cantonId, $secteurId, $communeId, $bureauDistributeurId, $lieuId, $formation2, $dateNaissanceEnfant, $inclureArchive, $inclurePuericultrice, $user, $inclureSupprime, $occupeIrreg, $planningDispo) {
if($dateNaissanceEnfant){
$listeIdTrancheAge = $this->assmatService->getListTrancheAgeForDateNaissance($dateNaissanceEnfant);
}
else{
$listeIdTrancheAge = $this->em->getRepository(TrancheAge::class)->findby([], ['age_max' => 'DESC', 'age_min' => 'DESC']);
}
$liste_assmats = $this->em->getRepository(AssistantMaternel::class)
->rechercherDispo($cantonId, $secteurId, $communeId, $bureauDistributeurId, $lieuId, $formation2, $listeIdTrancheAge, $inclureArchive, $inclurePuericultrice, $user, $inclureSupprime, $occupeIrreg, $planningDispo);
return $liste_assmats;
}
}