<?php
namespace App\Controller\GrandPublic;
use App\Entity\AssistantMaternel\AssistantMaternel;
use App\Entity\Parametrage\EnumParametre;
use App\Entity\Referentiel\EnumLieuAccueil;
use App\Entity\Referentiel\FrequenceDispo;
use App\Entity\Referentiel\JourSemaine;
use App\Entity\Referentiel\Periode;
use App\Entity\Referentiel\TrancheHoraire;
use App\Form\GrandPublic\RechercheDispoListeIdType;
use App\Form\GrandPublic\RechercheDispoType;
use App\Service\AssistantMaternel\AssistantMaternelService;
use App\Service\GDA\PlanningDispoService;
use App\Service\Parametrage\ParametrageService;
use App\Service\Referentiel\TrancheAgeService;
use DateTime;
use Psr\Log\LoggerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
/**
* GP Recherche
*
*/
class RechercheController extends AbstractController
{
const HTML_TO_UPDATE = 'htmlToUpdate';
const EST_ACTIF = 'est_actif';
private $logger;
private $parametrageService;
private $assmatService;
private $planningDispoService;
private $trancheAgeService;
public function __construct(LoggerInterface $logger, ParametrageService $parametrageService, AssistantMaternelService $assmatService, PlanningDispoService $planningDispoService, TrancheAgeService $trancheAgeService)
{
$this->logger = $logger;
$this->parametrageService = $parametrageService;
$this->assmatService = $assmatService;
$this->planningDispoService = $planningDispoService;
$this->trancheAgeService = $trancheAgeService;
}
/// méthodes publiques : ROUTES
/**
* Formulaire de recherche de dispos grand public, issu de la sous liste de recherche carto
*
* @Route("/grandpublic/rechercheliste", name="ajax_recherche_dispo_listeid")
*/
public function rechercheDispoByIdAjax(Request $request)
{
$em = $this->getDoctrine()->getManager();
$listePeriodes = $em->getRepository(Periode::class)->findBy([self::EST_ACTIF => true], ['ordre' => 'ASC']);
$listeJours = $em->getRepository(JourSemaine::class)->findBy([self::EST_ACTIF => true], ['id' => 'ASC']);
$listeTranches = $em->getRepository(TrancheHoraire::class)->findBy([self::EST_ACTIF => true], ['id' => 'ASC']);
$listeDispos = $em->getRepository(FrequenceDispo::class)->findBy(array('est_actif' => true));
/* Initialisation */
$active_bureau_distrib = $this->parametrageService->getParametre(EnumParametre::ACTIVE_BUREAU_DISTRIBUTEUR)->getValeur();
$active_coche_nuit = $this->parametrageService->getParametre(EnumParametre::ACTIVE_GERE_ACCUEIL_NUIT)->getValeur();
$active_atypique = $this->parametrageService->getParametre(EnumParametre::ACTIVE_OA_ATYPIQUE)->getValeur();
$active_handicap = $this->parametrageService->getParametre(EnumParametre::ACTIVE_OA_HANDICAP)->getValeur();
$planningDispo = $this->planningDispoService->creerPlanningViergeRecherche();
$liste_assmats = null;
$liste_assmats_non_participe = null;
$liste_assmats_prev = null;
$lieuAccueilCherche = 'tous';
$communeId = 0;
$bureauDistributeurId = 0;
$atypiqueMatin = null;
$atypiqueSoir = null;
$handicap = null;
if ($request->isMethod('POST')) {
$leForm = $request->request->get('recherche_dispo_liste_id');
$listeIdASM = $leForm['listeIdASM'];
$listeIdMAM = $leForm['listeIdMAM'];
} else {
$listeIdASM = explode(',', $request->query->get('listeASM'));
$listeIdMAM = explode(',', $request->query->get('listeMAM'));
}
$form_recherche = $this->createForm(RechercheDispoListeIdType::class, null, [
'action' => $this->generateUrl('ajax_recherche_dispo_listeid'),
'planning_dispo' => $planningDispo,
'active_atypique' => $active_atypique,
'active_handicap' => $active_handicap,
'listeIdASM' => $listeIdASM,
'listeIdMAM' => $listeIdMAM,
]);
$form_recherche->handleRequest($request);
if ($form_recherche->isSubmitted() && $form_recherche->isValid()) {
$listeIdASM = $form_recherche->get('listeIdASM')->getData();
$listeIdASM = array_filter($listeIdASM, 'strlen');
$listeIdMAM = $form_recherche->get('listeIdMAM')->getData();
$listeIdMAM = array_filter($listeIdMAM, 'strlen');
$lieuId = $this->traduitLieuAccueilToEnum($lieuAccueilCherche);
$dateNaissanceEnfant = $form_recherche->get('date_naissance_enf')->getData();
$dateDebutAccueil = $form_recherche->get('date_debut_accueil')->getData();
if ($dateNaissanceEnfant === null) {
$dateNaissanceEnfant = $dateDebutAccueil;
if ($dateNaissanceEnfant === null) {
$dateNaissanceEnfant = new \DateTime();
}
}
$listeTranchesAge = $this->trancheAgeService->getListTrancheAgeForDateNaissance($dateNaissanceEnfant, $dateDebutAccueil);
if ($active_atypique == 'true') {
$atypiqueMatin = $form_recherche->get('accepte_atypique_matin')->getData();
$atypiqueSoir = $form_recherche->get('accepte_atypique_soir')->getData();
}
if ($active_handicap == 'true') {
$handicap = $form_recherche->get('accepte_handicap')->getData();
}
$postedForm = $request->request->get($form_recherche->getName());
$planningDispo = $postedForm['planning_dispo'];
$liste_assmats = $em->getRepository(AssistantMaternel::class)
->rechercherDispoGrandPublic($communeId, $bureauDistributeurId, $lieuId, $listeTranchesAge, $atypiqueMatin, $atypiqueSoir, $handicap, $planningDispo, true, $listeIdASM, $listeIdMAM);
if ($liste_assmats != null) {
shuffle($liste_assmats);
}
$liste_assmats_non_participe = $em->getRepository(AssistantMaternel::class)
->rechercherDispoGrandPublic($communeId, $bureauDistributeurId, $lieuId, $listeTranchesAge, $atypiqueMatin, $atypiqueSoir, $handicap, [], false, $listeIdASM, $listeIdMAM);
if ($liste_assmats_non_participe != null) {
shuffle($liste_assmats_non_participe);
}
$liste_assmats_prev = $em->getRepository(AssistantMaternel::class)
->rechercherDispoPrevGrandPublic($communeId, $bureauDistributeurId, $lieuId, $listeTranchesAge, $dateDebutAccueil, $atypiqueMatin, $atypiqueSoir, $handicap, false, $listeIdASM, $listeIdMAM);
if ($liste_assmats_prev != null) {
shuffle($liste_assmats_prev);
}
}
return $this->render('grand_public/recherche/_recherche_dispo_listeid.html.twig', array(
'form_recherche' => $form_recherche->createView(),
'liste_assmats' => $liste_assmats,
'liste_assmats_non_participe' => $liste_assmats_non_participe,
'liste_assmats_prev' => $liste_assmats_prev,
'active_bureau_distrib' => $active_bureau_distrib,
'active_coche_nuit' => $active_coche_nuit,
'active_atypique' => $active_atypique,
'active_handicap' => $active_handicap,
'lieu_accueil' => $lieuAccueilCherche,
'planning_dispo' => $planningDispo,
'liste_jours' => $listeJours,
'liste_periodes' => $listePeriodes,
'liste_tranches' => $listeTranches,
'liste_disponibilite' => $listeDispos,
'listeIdASM' => $listeIdASM,
'listeIdMAM' => $listeIdMAM,
));
}
/**
* Formulaire de recherche listes grand public (basé sur commune)
*
* @Route("/grandpublic/recherche", name="gp_recherche_dispo_assmat")
*/
public function rechercheDispoListe(Request $request)
{
$urlLogoEntete = $this->parametrageService->getParametre(EnumParametre::URL_LOGO_ENTETE_GRANDPUBLIC)->getValeur();
$em = $this->getDoctrine()->getManager();
$listePeriodes = $em->getRepository(Periode::class)->findBy([self::EST_ACTIF => true], ['ordre' => 'ASC']);
$listeJours = $em->getRepository(JourSemaine::class)->findBy([self::EST_ACTIF => true], ['id' => 'ASC']);
$listeTranches = $em->getRepository(TrancheHoraire::class)->findBy([self::EST_ACTIF => true], ['id' => 'ASC']);
$listeDispos = $em->getRepository(FrequenceDispo::class)->findBy(array('est_actif' => true));
/* Initialisation */
$active_bureau_distrib = $this->parametrageService->getParametre(EnumParametre::ACTIVE_BUREAU_DISTRIBUTEUR)->getValeur();
$active_coche_nuit = $this->parametrageService->getParametre(EnumParametre::ACTIVE_GERE_ACCUEIL_NUIT)->getValeur();
$active_atypique = $this->parametrageService->getParametre(EnumParametre::ACTIVE_OA_ATYPIQUE)->getValeur();
$active_handicap = $this->parametrageService->getParametre(EnumParametre::ACTIVE_OA_HANDICAP)->getValeur();
$planningDispo = $this->planningDispoService->creerPlanningViergeRecherche();
$form_recherche = $this->createForm(RechercheDispoType::class, null, [
'planning_dispo' => $planningDispo,
'active_bureau_distrib' => $active_bureau_distrib,
'active_atypique' => $active_atypique,
'active_handicap' => $active_handicap
]);
$liste_assmats = null;
$liste_assmats_non_participe = null;
$liste_assmats_prev = null;
$zoneCherchee = 'commune';
$lieuAccueilCherche = 'tous';
$bureauDistributeurId = 0;
$atypiqueMatin = null;
$atypiqueSoir = null;
$handicap = null;
/* Déclenchement de la recherche */
$form_recherche->handleRequest($request);
if ($form_recherche->isSubmitted() && $form_recherche->isValid()) {
$commune = $form_recherche->get('commune')->getData();
$communeId = !\is_null($commune) ? $commune->getId() : 0;
if ($active_bureau_distrib == 'true') {
$bureauDistributeur = $form_recherche->get('bureau_distributeur')->getData();
$bureauDistributeurId = $zoneCherchee === 'bureau' && !\is_null($bureauDistributeur) ? $bureauDistributeur->getId() : 0;
}
$lieuAccueilCherche = $form_recherche->get('lieu_accueil')->getData();
$lieuId = $this->traduitLieuAccueilToEnum($lieuAccueilCherche);
$dateNaissanceEnfant = $form_recherche->get('date_naissance_enf')->getData();
$dateDebutAccueil = $form_recherche->get('date_debut_accueil')->getData();
if ($dateNaissanceEnfant === null) {
$dateNaissanceEnfant = $dateDebutAccueil;
if ($dateNaissanceEnfant === null) {
$dateNaissanceEnfant = new \DateTime();
}
}
$listeTranchesAge = $this->trancheAgeService->getListTrancheAgeForDateNaissance($dateNaissanceEnfant);
$listeTranchesAgePrev = $this->trancheAgeService->getListTrancheAgeForDateNaissance($dateNaissanceEnfant, $dateDebutAccueil);
if ($active_atypique == 'true') {
$atypiqueMatin = $form_recherche->get('accepte_atypique_matin')->getData();
$atypiqueSoir = $form_recherche->get('accepte_atypique_soir')->getData();
}
if ($active_handicap == 'true') {
$handicap = $form_recherche->get('accepte_handicap')->getData();
}
if ($request->isMethod('POST')) {
$postedForm = $request->request->get($form_recherche->getName());
$planningDispo = $postedForm['planning_dispo'];
}
$liste_assmats = $em->getRepository(AssistantMaternel::class)
->rechercherDispoGrandPublic($communeId, $bureauDistributeurId, $lieuId, $listeTranchesAge, $atypiqueMatin, $atypiqueSoir, $handicap, $planningDispo, true);
if ($liste_assmats != null) {
shuffle($liste_assmats);
}
$liste_assmats_non_participe = $em->getRepository(AssistantMaternel::class)
->rechercherDispoGrandPublic($communeId, $bureauDistributeurId, $lieuId, $listeTranchesAge, $atypiqueMatin, $atypiqueSoir, $handicap, [], false);
if ($liste_assmats_non_participe != null) {
shuffle($liste_assmats_non_participe);
}
$liste_assmats_prev = $em->getRepository(AssistantMaternel::class)
->rechercherDispoPrevGrandPublic($communeId, $bureauDistributeurId, $lieuId, $listeTranchesAgePrev, $dateDebutAccueil, $atypiqueMatin, $atypiqueSoir, $handicap, true);
if ($liste_assmats_prev != null) {
//on enlève des dispos prev les assmats 'disponibles dès à présent'
$liste_assmats_prev = array_diff($liste_assmats_prev, $liste_assmats);
shuffle($liste_assmats_prev);
}
}
return $this->render('grand_public/recherche/recherche_dispo_assmat.html.twig', array(
'form_recherche' => $form_recherche->createView(),
'liste_assmats' => $liste_assmats,
'liste_assmats_non_participe' => $liste_assmats_non_participe,
'liste_assmats_prev' => $liste_assmats_prev,
'active_bureau_distrib' => $active_bureau_distrib,
'active_coche_nuit' => $active_coche_nuit,
'active_atypique' => $active_atypique,
'active_handicap' => $active_handicap,
'zone' => $zoneCherchee,
'lieu_accueil' => $lieuAccueilCherche,
'planning_dispo' => $planningDispo,
'liste_jours' => $listeJours,
'liste_periodes' => $listePeriodes,
'liste_tranches' => $listeTranches,
'liste_disponibilite' => $listeDispos,
'urlLogoEntete' => $urlLogoEntete
));
}
/// méthodes privées
/**
* traduit la valeur du formulaire de recherche d'assmat en valeur générique basée sur les valeurs de l'EnumLieuAccueil
*/
private function traduitLieuAccueilToEnum($libelleLieuAccueilCherche)
{
$lieuAccueilId = 0;
switch ($libelleLieuAccueilCherche) {
case 'double':
$lieuAccueilId = EnumLieuAccueil::DOMICILE | $lieuAccueilId = EnumLieuAccueil::MAM;
break;
case 'mam':
$lieuAccueilId = EnumLieuAccueil::MAM;
break;
case 'domicile':
$lieuAccueilId = EnumLieuAccueil::DOMICILE;
break;
case 'tous':
default:
break;
}
return $lieuAccueilId;
}
}