src/Repository/AssistantMaternel/AssistantMaternelRepository.php line 429

Open in your IDE?
  1. <?php
  2. namespace App\Repository\AssistantMaternel;
  3. use App\Entity\AssistantMaternel\Agrement;
  4. use App\Entity\Commun\Utilisateur;
  5. use App\Entity\GDA\PlanningDispo;
  6. use App\Entity\GDA\Accueil;
  7. use App\Entity\OffreAccueil\DispoPublicAssmat;
  8. use App\Entity\Referentiel\BureauDistributeur;
  9. use App\Entity\Referentiel\EnumLieuAccueil;
  10. use App\Utils\StringUtils;
  11. use Doctrine\ORM\Query\Expr\Join;
  12. use Doctrine\ORM\QueryBuilder;
  13. /**
  14.  * AssistantMaternelRepository
  15.  * Repository des Assistants Maternels via ORM Doctrine
  16.  */
  17. class AssistantMaternelRepository extends \Doctrine\ORM\EntityRepository
  18. {
  19.     //TODO
  20.     protected $logger null;
  21.     function setLogger($logger)
  22.     {
  23.         $this->logger $logger;
  24.     }
  25.     /**
  26.      * Rechercher des assmats selon des critères cumulatifs
  27.      * @param string $nom commence par
  28.      * @param string $prenom commence par
  29.      * @param Commune? $commune
  30.      * @param Utilisateur $user
  31.      * @param bool $inclureArchive indique si les assmats archivées doivent faire partie des résultats
  32.      * @param bool $inclureCreche indique si les assmats en creche doivent faire partie des résultats
  33.      * @param array $paramsDatatable
  34.      * @return App\Repository\AssistantMaternel
  35.      * La liste des assmats renvoyée est triée par nom puis prénom
  36.      */
  37.     public function listePartenaire(string $nomstring $prenom$commune$userbool $inclureArchivebool $inclureCreche$paramsDatatable)
  38.     {
  39.         /* initialise la requête avec un select 'ass' from AssistantMaternel */
  40.         $qb $this->createQueryBuilder('ass')
  41.                 // On prend aussi en compte la MAM pour l'utiliser dans les jointures
  42.                 ->leftJoin('ass.mam''mam')
  43.                 ->addSelect('mam')
  44.                 ->leftJoin('mam.preferences_publication''pref_mam')
  45.                 ->addSelect('pref_mam')
  46.                 ->leftJoin('mam.presentation_mam''pres_mam')
  47.                 ->addSelect('pres_mam')
  48.                 // Fix perf lazy loading onetoone
  49.                 ->leftJoin('ass.preferences_publication''pref')
  50.                 ->addSelect('pref')
  51.                 ->leftJoin('ass.presentation_assmat''pres')
  52.                 ->addSelect('pres')
  53.                 // Pré-chargement
  54.                 ->leftJoin('ass.commune''c')
  55.                 ->addSelect('c')
  56.                 // Pour le calcul de la possibilité de déclaration d'accueil
  57.                 ->leftJoin('ass.agrements''agr')
  58.                 ->addSelect('agr')
  59.         ;
  60.         if (trim($nom) !== '') {
  61.             $nom StringUtils::str_sanitize($nom);
  62.             $qb->andWhere('LOWER(UNACCENT(ass.nom_famille)) LIKE LOWER(UNACCENT(:nom))')
  63.                     ->setParameter('nom'trim($nom) . '%');
  64.         }
  65.         if (trim($prenom) !== '') {
  66.             $prenom StringUtils::str_sanitize($prenom);
  67.             $qb->andWhere('LOWER(UNACCENT(ass.prenom)) LIKE LOWER(UNACCENT(:prenom))')
  68.                     ->setParameter('prenom''%' trim($prenom) . '%');
  69.         }
  70.         if ($commune) {
  71.             //restreint aux assmats avec un agrément existant selon le lieu fourni (pas de contrôle sur la date de fin)
  72.             $qb->andWhere('((ass.commune = :commune AND ass.date_debut_agrement_domicile is not null) OR ( mam.commune = :commune AND ass.date_debut_agrement_mam is not null))');
  73.             $qb->setParameter('commune'$commune);
  74.         } else if ($user->getCommunes() && count($user->getCommunes()) > 0) {
  75.             //limiter aux communes de l'utlisateur si restreint
  76.             $listeCommunes $user->getCommunes();
  77.             //restreint aux assmats avec un agrément existant selon le lieu fourni (pas de contrôle sur la date de fin)
  78.             $qb->andWhere('((ass.commune IN (:commune) AND ass.date_debut_agrement_domicile is not null) OR ( mam.commune IN (:commune) AND ass.date_debut_agrement_mam is not null))');
  79.             $qb->setParameter('commune'$listeCommunes);
  80.         }
  81.         //si l'utilisateur n'a pas de commune associée => il peut voir tout le département
  82.         if (!$inclureArchive) {
  83.             $qb->andWhere(' (ass.archive_domicile = false OR ass.archive_mam = false )'); //il faut eu moins avoir un des 2 lieux pas archive pour apparaitre
  84.             $qb->andWhere(' (ass.cta_dom is NULL OR ass.cta_dom = false )');
  85.             $qb->andWhere(' (ass.cta_mam is NULL OR ass.cta_mam = false )');
  86.             $qb->andWhere(' (ass.suspension_dom is NULL OR ass.suspension_dom = false )');
  87.             $qb->andWhere(' (ass.suspension_mam is NULL OR ass.suspension_mam = false )');
  88.         }
  89.         if (!$inclureCreche) {
  90.             $qb->andWhere('(ass.creche is NULL OR ass.creche = false)');
  91.         }
  92.         // on ne veut que les assmats non-opposées (cf leguay 13/01/2022)
  93.         //         et que les assmats ayant fait la formation 1 (cf leguay 13/11/2022 EVO 26)
  94.         $qb->andWhere('ass.oppose = false');
  95.         $qb->andWhere('(ass.formation1_effectuee is NULL OR ass.formation1_effectuee = true)');
  96.         $qb->andWhere('(ass.supprime is null or ass.supprime = false)');
  97.         // TODO : on exclut les assmats sans aucune place agree
  98.         // $qb->groupBy('ass.id')->having('SUM(agr.nombre_places) > 0');
  99.         // pseudo-colonne archive agrégée des 2 champs archive par lieu d'agrément
  100.         $qb->addSelect('CASE WHEN ass.archive_domicile = true AND ass.archive_mam = true THEN true ELSE false END AS HIDDEN hid_archive ');
  101.         \App\Utils\DatatablesUtils::ajouterCritereTri($qb$paramsDatatable, [
  102.             '0' => ['ass.nom_famille'],
  103.             '1' => ['ass.prenom'],
  104.             '2' => ['ass.adresse'], // adresse - NON triable
  105.             '3' => ['ass.code_postal'],
  106.             '4' => ['c.libelle'], //commune
  107.             '5' => ['ass.tel_fixe'], //telephone fixe - NON triable
  108.             '6' => ['ass.tel_portable'], //telephone port - NON triable
  109.             '7' => ['ass.email'], //mail - NON triable
  110.             '8' => ['hid_archive'],
  111.                 //'9' => ['hid_nb_places'], // non triable
  112.         ]);
  113.         $qb->setFirstResult($paramsDatatable[\App\Utils\DatatablesUtils::START]); // à partir du resultat n° offset
  114.         if ($paramsDatatable[\App\Utils\DatatablesUtils::LENGTH] <> -1) {
  115.             $qb->setMaxResults($paramsDatatable[\App\Utils\DatatablesUtils::LENGTH]); // nb de resultats de la page
  116.         }
  117.         $query $qb->getQuery();
  118.         $paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
  119.         return $paginator;
  120.     }
  121.     /**
  122.      * Rechercher des assmats selon des critères cumulatifs
  123.      * @param int? $idFonctionnel
  124.      * @param string $nom commence par
  125.      * @param string $prenom comemnce par
  126.      * @param Canton? $canton
  127.      * @param int? $idSecteurPmi
  128.      * @param Commune? $commune
  129.      * @param BureauDistributeur? $bureauDistributeur
  130.      * @param int? $idLieu
  131.      * @param bool $formation2 formation2 effectuée ou pas
  132.      * @param bool $premierAccueil c'est le 1er accueil de l'assmat ou pas
  133.      * @param bool $offreAccueil offre d'accueil saisie ou pas
  134.      * @param bool $inclureArchive indique si les assmats archivées doivent faire partie des résultats
  135.      * @param bool $inclurePuericultrice indique si les assmats surchargées par la puer doivent faire partie des résultats
  136.      * @param utilisateur $puericultrice utilisateur connecté en train de réaliser une recherche
  137.      * @param bool $inclureSupprime indique si les assmats supprimées doivent faire partie des résultats
  138.      * @param TrancheAge $trancheAge tranche d'âge où l'assmat éligible doit avoir au moins une place agréée
  139.      * @param array $paramsDatatable
  140.      * @param bool $inclureDispoGrandPublic indique si on doit remonter le nombre de places disponibles (si module grand public présent)
  141.      * @return App\Repository\AssistantMaternel
  142.      * La liste des assmats renvoyée est triée par nom puis prénom
  143.      */
  144.     public function rechercher(string $idFonctionnelstring $nomstring $prenom$cantonint $idSecteurPmi$commune$bureauDistributeur,
  145.             int $idLieubool $formation2 nullbool $premierAccueil nullbool $offreAccueil nullbool $inclureArchivebool $inclurePuericultrice\App\Entity\Commun\Utilisateur $puericultrice,
  146.             bool $inclureSupprime$trancheAge$paramsDatatablebool $inclureDispoGrandPublicbool $listes false)
  147.     {
  148.         /* initialise la requête avec un select 'ass' from AssistantMaternel */
  149.         $qb $this->createQueryBuilder('ass')
  150.                 // On prend aussi en compte la MAM pour l'utiliser dans les jointures
  151.                 ->leftJoin('ass.mam''mam')
  152.                 ->addSelect('mam')
  153.                 ->leftJoin('mam.preferences_publication''pref_mam')
  154.                 ->addSelect('pref_mam')
  155.                 ->leftJoin('mam.presentation_mam''pres_mam')
  156.                 ->addSelect('pres_mam')
  157.                 // Fix perf lazy loading onetoone
  158.                 ->leftJoin('ass.preferences_publication''pref')
  159.                 ->addSelect('pref')
  160.                 ->leftJoin('ass.presentation_assmat''pres')
  161.                 ->addSelect('pres')
  162.                 // Pré-chargement
  163.                 ->leftJoin('ass.commune''c')
  164.                 ->addSelect('c')
  165.                 // Pour le calcul de la possibilité de déclaration d'accueil
  166.                 ->leftJoin('ass.agrements''agr')
  167.                 ->addSelect('agr')
  168.                 // Pour le calcul des badges Nuit et Atypique
  169.                 ->leftJoin('ass.accueils''acc')
  170.                 ->addSelect('acc')
  171.                 //TODO : regarder pourquoi on fait la jointure sur log??
  172.                 ->leftJoin('acc.log_accueil''log')
  173.                 ->addSelect('log');
  174.         if ($listes) {
  175.             $qb->leftJoin('ass.secteur_pmi''s');
  176.         }
  177.         // On n'utilise pas la fonction empty() car renvoie true avec la chaine de caractères "0"
  178.         if (trim($idFonctionnel) !== '') {
  179.             $qb->andWhere('ass.id_fonctionnel = :idFonctionnel')
  180.                     ->setParameter('idFonctionnel'trim($idFonctionnel));
  181.         }
  182.         if (trim($nom) !== '') {
  183.             $nom StringUtils::str_sanitize($nom);
  184.             $qb->andWhere('LOWER(UNACCENT(ass.nom_famille)) LIKE LOWER(UNACCENT(:nom))')
  185.                     ->setParameter('nom'trim($nom) . '%');
  186.         }
  187.         if (trim($prenom) !== '') {
  188.             $prenom StringUtils::str_sanitize($prenom);
  189.             $qb->andWhere('LOWER(UNACCENT(ass.prenom)) LIKE LOWER(UNACCENT(:prenom))')
  190.                     ->setParameter('prenom''%' trim($prenom) . '%');
  191.         }
  192.         if ($canton) {
  193.             $qb->innerJoin('ass.canton''can'Join::WITH'(ass.date_debut_agrement_domicile is not null and ass.canton.id = :canton)'
  194.                             'or'
  195.                             '(ass.date_debut_agrement_mam is not null and mam.canton.id = :canton)'
  196.                     )
  197.                     ->setParameter('canton'$canton);
  198.         }
  199.         if ($idSecteurPmi != 0) {
  200.             if ($inclurePuericultrice && $puericultrice != null) {
  201.                 //on veut à la fois les assmats du secteur et celles de la puer connectée
  202.                 $qb $qb->innerJoin('ass.secteur_pmi''sec')
  203.                         ->andWhere('sec.id = :secteur OR ass.puericultrice = :puericultrice')
  204.                         ->setParameter('secteur'$idSecteurPmi)
  205.                         ->setParameter('puericultrice'$puericultrice);
  206.             } else {
  207.                 //seulement secteur
  208.                 $qb $qb->innerJoin('ass.secteur_pmi''sec')
  209.                         ->andWhere('sec.id = :secteur')
  210.                         ->setParameter('secteur'$idSecteurPmi);
  211.             }
  212.         }
  213.         if ($commune) {
  214.             // Cas 1 : lieu d'exercice à domicile uniquement
  215.             if ($idLieu EnumLieuAccueil::DOMICILE && !($idLieu EnumLieuAccueil::MAM)) {
  216.                 $qb->andWhere('ass.commune = :commune');
  217.             }
  218.             // Cas 2 : lieu d'exercice en MAM uniquement
  219.             else if ($idLieu EnumLieuAccueil::MAM && !($idLieu EnumLieuAccueil::DOMICILE)) {
  220.                 $qb->andWhere('mam.commune = :commune');
  221.             }
  222.             // Cas 3 : lieu d'exercice indifférent (ou double agrément)
  223.             else {
  224.                 $qb->andWhere('ass.commune = :commune or mam.commune = :commune');
  225.             }
  226.             $qb->setParameter('commune'$commune);
  227.         }
  228.         if ($bureauDistributeur) {
  229.             $subqueryBuilder = new QueryBuilder($this->getEntityManager());
  230.             $subqueryBuilder
  231.                     ->select('bur.id')
  232.                     ->from(BureauDistributeur::class, 'bur')
  233.                     ->andWhere('bur = :bureau_distributeur');
  234.             // Cas 1 : lieu d'exercice à domicile uniquement
  235.             if ($idLieu EnumLieuAccueil::DOMICILE && !($idLieu EnumLieuAccueil::MAM)) {
  236.                 $subqueryBuilder->andWhere('ass.bureau_distributeur = bur.libelle');
  237.             }
  238.             // Cas 2 : lieu d'exercice en MAM uniquement
  239.             else if ($idLieu EnumLieuAccueil::MAM && !($idLieu EnumLieuAccueil::DOMICILE)) {
  240.                 $subqueryBuilder->andWhere('mam.bureau_distributeur = bur.libelle');
  241.             }
  242.             // Cas 3 : lieu d'exercice indifférent (ou double agrément)
  243.             else {
  244.                 $subqueryBuilder->andWhere('ass.bureau_distributeur = bur.libelle or mam.bureau_distributeur = bur.libelle');
  245.             }
  246.             $subquery $subqueryBuilder->getQuery()->getDQL();
  247.             $qb->andWhere($qb->expr()->exists($subquery))
  248.                     ->setParameter('bureau_distributeur'$bureauDistributeur);
  249.         }
  250.         if ($idLieu) {
  251.             //restreint aux assmats avec un agrément existant selon le lieu fourni (pas de contrôle sur la date de fin)
  252.             if ($idLieu EnumLieuAccueil::DOMICILE) {
  253.                 $qb->andWhere('ass.date_debut_agrement_domicile is not null');
  254.             }
  255.             if ($idLieu EnumLieuAccueil::MAM) {
  256.                 $qb->andWhere('ass.date_debut_agrement_mam is not null');
  257.             }
  258.         }
  259.         if ($formation2 !== null) {
  260.             if ($formation2) {
  261.                 //todo : voir pour la prise en compte de debut d'agrement < 01/01/2007
  262.                 $qb->andWhere('ass.formation2_effectuee = true');
  263.             } else {
  264.                 $qb->andWhere('ass.formation2_effectuee = false OR ass.formation2_effectuee is null');
  265.             }
  266.         }
  267.         if ($premierAccueil !== null) {
  268.             $subqueryBuilder = new QueryBuilder($this->getEntityManager());
  269.             $subqueryBuilder
  270.                     ->select('ass.id')
  271.                     ->from(Accueil::class, 'accu')
  272.                     ->andWhere('accu.assmat = ass')
  273.                     //->andWhere('accu.est_premier_accueil = true ')
  274.                     ->groupBy('ass.id')
  275.                     ->having('count(accu.id) = 1');
  276.             $subquery $subqueryBuilder->getQuery()->getDQL();
  277.             if ($premierAccueil) {
  278.                 $qb->andWhere($qb->expr()->exists($subquery));
  279.             } else {
  280.                 $qb->andWhere($qb->expr()->not($qb->expr()->exists($subquery)));
  281.             }
  282.         }
  283.         if ($offreAccueil !== null) {
  284.             if ($offreAccueil) {
  285.                 // les assmats avec une date de maj ont saisi leur offre d'accueil au moins une fois
  286.                 $qb->andWhere('ass.date_maj_assmat is not null ');
  287.             } else {
  288.                 $qb->andWhere('ass.date_maj_assmat is null ');
  289.             }
  290.         }
  291.         // resteint aux assmats avec un agrément valide selon la tranche d'âge fournie
  292.         if ($trancheAge) {
  293.             $subqueryBuilder = new QueryBuilder($this->getEntityManager());
  294.             $subqueryBuilder
  295.                     ->select('age.id')
  296.                     ->from(Agrement::class, 'age')
  297.                     ->andWhere('age.assmat = ass');
  298.             $subqueryBuilder->andWhere('age.tranche_age = :tranche_age and age.nombre_places > 0 ');
  299.             $qb->setParameter('tranche_age'$trancheAge);
  300.             $subquery $subqueryBuilder->getQuery()->getDQL();
  301.             $qb->andWhere($qb->expr()->exists($subquery));
  302.             /* On n'utilise pas la jointure car on veut charger toute la liste des agréments de l'assmat
  303.              * $qb->andWhere('(agr.nombre_places > 0 and agr.tranche_age = :tranche_age)')->setParameter('tranche_age', $trancheAge); */
  304.         }
  305.         if (!$inclureArchive) {
  306.             $critereDomicileValide ' (ass.archive_domicile = false ) AND (ass.cta_dom is NULL OR ass.cta_dom = false ) AND (ass.suspension_dom is NULL OR ass.suspension_dom = false )';
  307.             $critereMamValide ' (ass.archive_mam = false ) AND (ass.cta_mam is NULL OR ass.cta_mam = false ) AND (ass.suspension_mam is NULL OR ass.suspension_mam = false )';
  308.             if ($idLieu) {
  309.                 //restreint aux assmats avec un agrément valide et non archives selon le lieu fourni
  310.                 if ($idLieu EnumLieuAccueil::MAM && $idLieu EnumLieuAccueil::DOMICILE) {
  311.                     $qb $qb->andWhere($critereDomicileValide 'AND' $critereMamValide);
  312.                 } else if ($idLieu EnumLieuAccueil::DOMICILE) {
  313.                     $qb $qb->andWhere($critereDomicileValide);
  314.                 } else if ($idLieu EnumLieuAccueil::MAM) {
  315.                     $qb $qb->andWhere($critereMamValide);
  316.                 }
  317.             } else {
  318.                 $qb->andWhere(' (ass.archive_domicile = false OR ass.archive_mam = false )'); //il faut eu moins avoir un des 2 lieux pas archive pour apparaitre
  319.                 $qb->andWhere(' (ass.cta_dom is NULL OR ass.cta_dom = false )');
  320.                 $qb->andWhere(' (ass.cta_mam is NULL OR ass.cta_mam = false )');
  321.                 $qb->andWhere(' (ass.suspension_dom is NULL OR ass.suspension_dom = false )');
  322.                 $qb->andWhere(' (ass.suspension_mam is NULL OR ass.suspension_mam = false )');
  323.             }
  324.             $qb->andWhere('(ass.creche is NULL OR ass.creche = false)');
  325.             $qb->andWhere('(ass.formation1_effectuee is NULL OR ass.formation1_effectuee = true)');
  326.         }
  327.         if (!$inclureSupprime) {
  328.             $qb->andWhere('ass.supprime = false');
  329.         }
  330.         if ($listes) {
  331.             // affichage listes
  332.             \App\Utils\DatatablesUtils::ajouterCritereTri($qb$paramsDatatable, [
  333.                 '0' => ['s.libelle'],
  334.                 '1' => ['ass.nom_famille'],
  335.                 '2' => ['ass.prenom'],
  336.                 // Colonne 3 : lieu d'agrément
  337.                 // On ne peut pas trier server-side, car il n'y a qu'une seule ligne de données par assmat dans la BDD
  338.                 // alors qu'on en affiche 2 dans l'IHM - les 2 lignes ne peuvent être séparées
  339.                 // Colonne 4 : adresse, tri pas pertinent
  340.                 '5' => ['ass.code_postal'],
  341.                 '6' => ['c.libelle'],
  342.                 // Colonnes 7 à 18 : non triables
  343.                 '19' => ['ass.oppose'],
  344.             ]);
  345.         } else {
  346.             //critères de tri à affiner
  347.             $qb->addSelect('CASE WHEN ass.formation2_effectuee = true THEN 1 '
  348.                     'WHEN ass.formation2_effectuee = false THEN 3 '
  349.                     'ELSE 2 END AS HIDDEN hid_formation2_effectuee ');
  350.             $qb->addSelect('CASE WHEN (ass.date_premier_agrement_domicile is not null and ass.date_premier_agrement_mam is not null) '
  351.                     'THEN (CASE WHEN ass.date_premier_agrement_domicile > ass.date_premier_agrement_mam THEN ass.date_premier_agrement_mam ELSE ass.date_premier_agrement_domicile END ) '
  352.                     'WHEN ass.date_premier_agrement_domicile is not null THEN ass.date_premier_agrement_domicile '
  353.                     'WHEN ass.date_premier_agrement_mam is not null THEN ass.date_premier_agrement_mam '
  354.                     'ELSE ass.date_premier_agrement_mam END AS HIDDEN hid_premier_agrem ');
  355.             // Recherche assmat
  356.             \App\Utils\DatatablesUtils::ajouterCritereTri($qb$paramsDatatable, [
  357.                 '0' => ['ass.id_fonctionnel'],
  358.                 '1' => ['ass.nom_famille''ass.prenom'],
  359.                 '3' => ['hid_formation2_effectuee''hid_premier_agrem'],
  360.                 '4' => ['acc.est_premier_accueil''acc.date_derniere_modification']
  361.             ]);
  362.         }
  363.         $qb->setFirstResult($paramsDatatable[\App\Utils\DatatablesUtils::START]) // à partir du resultat n° offset
  364.                 ->setMaxResults($paramsDatatable[\App\Utils\DatatablesUtils::LENGTH]); // nb de resultats de la page
  365.         $query $qb->getQuery();
  366.         $paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
  367.         return $paginator;
  368.     }
  369.     /**
  370.      * Rechercher des dispos assmats selon des critères cumulatifs
  371.      * il s'agit des disponibilitésréeles
  372.      * @param int? $idCanton
  373.      * @param int? $idSecteurPmi
  374.      * @param int? $idCommune
  375.      * @param ?BureauDistributeur $bureauDistributeur
  376.      * @param int? $idLieu
  377.      * @param bool $formation2 formation2 effectuée ou pas
  378.      * @param array $listeTrancheAge liste des tranches d'ages applicables
  379.      * @param bool $inclurePuericultrice indique si les assmats surchargées par la puer doivent faire partie des résultats
  380.      * @param utilisateur $puericultrice utilisateur connecté en train de réaliser une recherche
  381.      * @param bool $occupeIrreg indique s'il faut considérer les créneaux occupés irrégulièrement comme libres dans la recherche
  382.      * @param array $planningDispo planning des dispos libres recherchées
  383.      * @param array $paramsDatatable Les paramètres envoyés par Datatables, récupérés avec DatatableUtils
  384.      * @return App\Repository\AssistantMaternel
  385.      * La liste des assmats renvoyée est triée par nom puis prénom
  386.      */
  387.     public function rechercherDispo(
  388.             int $idCantonint $idSecteurPmiint $idCommune, ?BureauDistributeur $bureauDistributeurint $idLieubool $formation2 null$listeTrancheAge nullbool $inclurePuericultriceUtilisateur $puericultricebool $occupeIrreg, array $planningDispo, array $paramsDatatable
  389.     )
  390.     {
  391.         /* initialise la requête avec un select 'ass' from AssistantMaternel */
  392.         $qb $this->createQueryBuilder('ass')
  393.                 // Chargement en eager loading car le lazy loading n'est pas possible en OneToOne bidirectionnel
  394.                 ->leftJoin('ass.preferences_publication''pref')
  395.                 ->leftJoin('ass.presentation_assmat''pres')
  396.                 ->addSelect('pref')
  397.                 ->addSelect('pres')
  398.                 // optim nombre requetes
  399.                 ->innerJoin('ass.agrements''agr')
  400.                 ->andWhere('agr.nombre_places > 0')
  401.                 ->addSelect('agr')
  402.                 // jointure pour conditions sur la MAM
  403.                 ->leftJoin('ass.mam''mam');
  404.         if ($listeTrancheAge) {
  405.             //nombre de places > 0 pour les tranches d'age cherchées
  406.             $qb->andWhere('agr.tranche_age IN (:listeTrancheAge)')
  407.                     ->setParameter('listeTrancheAge'$listeTrancheAge);
  408.         }
  409.         if ($idCanton != 0) {
  410.             $qb->innerJoin('ass.canton''can')
  411.                     ->andWhere('can.id = :canton')
  412.                     ->setParameter('canton'$idCanton);
  413.         }
  414.         if ($idSecteurPmi != 0) {
  415.             if ($inclurePuericultrice && $puericultrice != null) {
  416.                 //on veut à la fois les assmats du secteur et celles de la puer connectée
  417.                 $qb->innerJoin('ass.secteur_pmi''sec')
  418.                         ->andWhere('sec.id = :secteur OR ass.puericultrice = :puericultrice')
  419.                         ->setParameter('secteur'$idSecteurPmi)
  420.                         ->setParameter('puericultrice'$puericultrice);
  421.             } else {
  422.                 //seulement secteur
  423.                 $qb->innerJoin('ass.secteur_pmi''sec')
  424.                         ->andWhere('sec.id = :secteur')
  425.                         ->setParameter('secteur'$idSecteurPmi);
  426.             }
  427.         }
  428.         $qb->leftJoin('ass.commune''com')->addSelect('com');
  429.         if ($idCommune != 0) {
  430.             // FIXME : critère MAM ?
  431.             $qb->andWhere('com.id = :commune')->setParameter('commune'$idCommune);
  432.         }
  433.         if ($bureauDistributeur) {
  434.             $subqueryBuilder = new QueryBuilder($this->getEntityManager());
  435.             $subqueryBuilder
  436.                     ->select('bur.id')
  437.                     ->from(BureauDistributeur::class, 'bur')
  438.                     ->andWhere('(ass.date_debut_agrement_domicile is not null and ass.bureau_distributeur = bur.libelle)'
  439.                             'or'
  440.                             '(ass.date_debut_agrement_mam is not null and mam.bureau_distributeur = bur.libelle)')
  441.                     ->andWhere('bur = :bureau_distributeur');
  442.             $subquery $subqueryBuilder->getQuery()->getDQL();
  443.             $qb->andWhere($qb->expr()->exists($subquery))
  444.                     ->setParameter('bureau_distributeur'$bureauDistributeur);
  445.         }
  446.         $qb->andWhere('(ass.creche is NULL OR ass.creche = false)');
  447.         $qb->andWhere('(ass.formation1_effectuee is NULL OR ass.formation1_effectuee = true)');
  448.         $critereDomicileValide ' (ass.archive_domicile = false AND '
  449.                 '  ass.date_debut_agrement_domicile is not null AND '
  450.                 ' (ass.date_fin_agrement_domicile is null OR ass.date_fin_agrement_domicile > :now ) ) AND '
  451.                 ' (ass.cta_dom is NULL OR ass.cta_dom = false ) AND '
  452.                 ' (ass.suspension_dom is NULL OR ass.suspension_dom = false )';
  453.         $critereMamValide ' (ass.archive_mam = false AND '
  454.                 '  ass.date_debut_agrement_mam is not null AND '
  455.                 '  (ass.date_fin_agrement_mam is null OR ass.date_fin_agrement_mam > :now ) ) AND'
  456.                 ' (ass.cta_mam is NULL OR ass.cta_mam = false ) AND '
  457.                 ' (ass.suspension_mam is NULL OR ass.suspension_mam = false )';
  458.         $now = new \DateTime();
  459.         if ($idLieu) {
  460.             //restreint aux assmats avec un agrément valide et non archives selon le lieu fourni
  461.             if (
  462.                     $idLieu EnumLieuAccueil::MAM &&
  463.                     $idLieu EnumLieuAccueil::DOMICILE
  464.             ) {
  465.                 $qb->andWhere($critereDomicileValide 'AND' $critereMamValide);
  466.             } else if ($idLieu EnumLieuAccueil::DOMICILE) {
  467.                 $qb->andWhere($critereDomicileValide);
  468.             } else if ($idLieu EnumLieuAccueil::MAM) {
  469.                 $qb->andWhere($critereMamValide);
  470.             }
  471.         } else {
  472.             $qb->andWhere('(' $critereDomicileValide 'OR' $critereMamValide ')');
  473.         }
  474.         $qb->setParameter('now'$now);
  475.         if ($formation2 !== null) {
  476.             if ($formation2) {
  477.                 //todo : voir pour la prise en compte de debut d'agrement < 01/01/2007
  478.                 $qb->andWhere('ass.formation2_effectuee = true');
  479.             } else {
  480.                 $qb->andWhere('ass.formation2_effectuee = false OR ass.formation2_effectuee is null');
  481.             }
  482.         }
  483.         $qb->andWhere('ass.supprime = false');
  484.         if ($planningDispo) {
  485.             $idType 1;
  486.             foreach ($planningDispo as $key => $value) {
  487.                 $subqueryBuilder = new QueryBuilder($this->getEntityManager());
  488.                 $subqueryBuilder
  489.                         ->select('disp' $key '.id')
  490.                         ->from(PlanningDispo::class, 'disp' $key)
  491.                         ->andWhere('disp' $key '.assmat = ass');
  492.                 if ($value["id_frequence_dispo"] != 1) {
  493.                     $idPeriode $value["id_periode"];
  494.                     $idJour $value["id_jour_semaine"];
  495.                     $idHoraire $value["id_tranche_horaire"];
  496.                     if ($idLieu != 0) {
  497.                         $subqueryBuilder->andWhere('disp' $key '.lieu_accueil = :idLieu' $key);
  498.                     }
  499.                     $subqueryBuilder->andWhere('disp' $key '.type_accueil = :idType' $key)
  500.                             ->andWhere('disp' $key '.periode = :idPeriode' $key)
  501.                             ->andWhere('disp' $key '.tranche_age IN (:listeTrancheAge' $key ')')
  502.                             ->andWhere('disp' $key '.tranche_horaire = :idHoraire' $key)
  503.                             ->andWhere('disp' $key '.jour_semaine = :idJour' $key);
  504.                     if ($idLieu != 0) {
  505.                         $qb->setParameter('idLieu' $key$idLieu);
  506.                     }
  507.                     $qb->setParameter('idType' $key$idType)
  508.                             ->setParameter('listeTrancheAge' $key$listeTrancheAge)
  509.                             ->setParameter('idPeriode' $key$idPeriode)
  510.                             ->setParameter('idJour' $key$idJour)
  511.                             ->setParameter('idHoraire' $key$idHoraire);
  512.                     if ($occupeIrreg) {
  513.                         $subqueryBuilder->andWhere('disp' $key '.nombre_places_libres_irregulier > 0');
  514.                     } else {
  515.                         $subqueryBuilder->andWhere('disp' $key '.nombre_places_libres > 0');
  516.                     }
  517.                     $subquery $subqueryBuilder->getQuery()->getDQL();
  518.                     $qb->andWhere($qb->expr()->exists($subquery));
  519.                 }
  520.             }
  521.         }
  522.         \App\Utils\DatatablesUtils::ajouterCritereTri($qb$paramsDatatable, [
  523.             '0' => ['ass.id_fonctionnel'],
  524.             '1' => ['ass.nom_famille''ass.prenom'],
  525.             '2' => ['ass.code_postal']
  526.         ]);
  527.         $qb->setFirstResult($paramsDatatable[\App\Utils\DatatablesUtils::START]) // à partir du resultat n° offset
  528.                 ->setMaxResults($paramsDatatable[\App\Utils\DatatablesUtils::LENGTH]); // nb de resultats de la page
  529.         $query $qb->getQuery();
  530.         $paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
  531.         return $paginator;
  532.     }
  533.     /**
  534.      * Rechercher des dispos assmats selon des critères cumulatifs
  535.      * @param int? $idCommune
  536.      * @param int? $idBureauDistributeur
  537.      * @param int? $idLieu
  538.      * @param array $listeTrancheAge liste des tranches d'ages applicables
  539.      * @param bool $atypiqueMatin indique s'il faut inclure les assmats acceptant les accueils atypiques le matin
  540.      * @param bool $atypiqueSoir indique s'il faut inclure les assmats acceptant les accueils atypiques le soir
  541.      * @param bool $handicap indique s'il faut inclure les assmats acceptant les enfants en situation de handicap
  542.      * @param array $planningDispo planning des dispos libres recherchées
  543.      * @param bool $participe indique si les assmats recherchées participent ou non au site grand public
  544.      * @param $listeIdASM restreint les résultats aux AM de la liste
  545.      * @param $listeIdMAM restreint les résultats aux AM qui font partie des MAM de la liste
  546.      * @return App\Repository\AssistantMaternel
  547.      * La liste des assmats renvoyée est triée par nom puis prénom
  548.      */
  549.     public function rechercherDispoGrandPublic(
  550.             int $idCommuneint $idBureauDistributeurint $idLieu$listeTrancheAge null
  551.             bool $atypiqueMatin nullbool $atypiqueSoir nullbool $handicap null
  552.             array $planningDispobool $participe$listeIdASM null$listeIdMAM null
  553.     )
  554.     {
  555.         /* initialise la requête avec un select 'ass' from AssistantMaternel */
  556.         $qb $this->createQueryBuilder('ass')
  557.                 // Chargement en eager loading car le lazy loading n'est pas possible en OneToOne bidirectionnel
  558.                 ->leftJoin('ass.preferences_publication''pref')
  559.                 ->leftJoin('ass.presentation_assmat''pres')
  560.                 ->addSelect('pref')->addSelect('pres')
  561.                 // optim nombre requetes
  562.                 ->innerJoin('ass.agrements''agr')
  563.                 ->andWhere('agr.nombre_places > 0')
  564.                 ->addSelect('agr');
  565.         if ($listeIdASM != null && count($listeIdASM) > 0) {
  566.             $listeIdASM array_map('strval'$listeIdASM);
  567.             if(count($listeIdASM) > 0) {
  568.                 $qb $qb->andWhere("ass.id_fonctionnel IN (:listeIdASM)")
  569.                         ->setParameter('listeIdASM'$listeIdASM\Doctrine\DBAL\Connection::PARAM_STR_ARRAY);
  570.             }
  571.         }
  572.         if ($listeIdMAM != null && count($listeIdMAM) > 0) {
  573.             $listeIdMAM array_map('strval'$listeIdMAM);
  574.             if(count($listeIdMAM) > 0) {
  575.                 $qb $qb->leftJoin('ass.mam''mam')
  576.                         ->addSelect('mam');
  577.                 $qb $qb->andWhere("mam.id_fonctionnel IN (:listeIdMAM)")
  578.                         ->setParameter('listeIdMAM'$listeIdMAM\Doctrine\DBAL\Connection::PARAM_STR_ARRAY);
  579.             }
  580.         }
  581.         //nombre de places > 0 pour les tranches d'age cherchées
  582.         $qb $qb->andWhere('agr.tranche_age IN (:listeTrancheAge)')
  583.                 ->setParameter('listeTrancheAge'$listeTrancheAge);
  584.         if ($idCommune != 0) {
  585.             $qb $qb->innerJoin('ass.commune''com')
  586.                     ->andWhere('com.id = :commune')
  587.                     ->setParameter('commune'$idCommune);
  588.         }
  589.         if ($idBureauDistributeur != 0) {
  590.             // FIXME
  591.             $qb $qb->from(BureauDistributeur::class, 'bur')
  592.                     ->andWhere('ass.bureau_distributeur = bur.libelle')
  593.                     ->andWhere('bur.id = :bureau_distributeur')
  594.                     ->setParameter('bureau_distributeur'$idBureauDistributeur);
  595.         }
  596.         $qb->andWhere('(ass.creche is NULL OR ass.creche = false)');
  597.         $qb->andWhere('(ass.formation1_effectuee is NULL OR ass.formation1_effectuee = true)');
  598.         $critereDomicileValide ' (ass.archive_domicile = false AND '
  599.                 '  ass.date_debut_agrement_domicile is not null AND '
  600.                 ' (ass.date_fin_agrement_domicile is null OR ass.date_fin_agrement_domicile > :now ) ) AND '
  601.                 ' (ass.cta_dom is NULL OR ass.cta_dom = false ) AND '
  602.                 ' (ass.suspension_dom is NULL OR ass.suspension_dom = false )';
  603.         $critereMamValide ' (ass.archive_mam = false AND '
  604.                 '  ass.date_debut_agrement_mam is not null AND '
  605.                 '  (ass.date_fin_agrement_mam is null OR ass.date_fin_agrement_mam > :now ) ) AND'
  606.                 ' (ass.cta_mam is NULL OR ass.cta_mam = false ) AND '
  607.                 ' (ass.suspension_mam is NULL OR ass.suspension_mam = false )';
  608.         $now = new \DateTime();
  609.         $qb $qb->setParameter('now'$now);
  610.         if ($idLieu) {
  611.             //restreint aux assmats avec un agrément valide et non archives selon le lieu fourni
  612.             if (
  613.                     $idLieu EnumLieuAccueil::MAM &&
  614.                     $idLieu EnumLieuAccueil::DOMICILE
  615.             ) {
  616.                 $qb $qb->andWhere($critereDomicileValide 'AND' $critereMamValide);
  617.             } else if ($idLieu EnumLieuAccueil::DOMICILE) {
  618.                 $qb $qb->andWhere($critereDomicileValide);
  619.             } else if ($idLieu EnumLieuAccueil::MAM) {
  620.                 $qb $qb->andWhere($critereMamValide);
  621.             }
  622.         } else {
  623.             $qb $qb->andWhere('(' $critereDomicileValide 'OR' $critereMamValide ')');
  624.         }
  625.         // seulement les assmats non supprimés
  626.         $qb $qb->andWhere('ass.supprime = false');
  627.         //TODO : lien avec offre accueil
  628.         if ($handicap !== null && $handicap) {
  629.             $qb $qb->andWhere('pres.accepte_handicap = true');
  630.         }
  631.         if ($atypiqueMatin !== null && $atypiqueMatin) {
  632.             $qb $qb->andWhere('pres.accepte_atypique_matin = true');
  633.         }
  634.         if ($atypiqueSoir !== null && $atypiqueSoir) {
  635.             $qb $qb->andWhere('pres.accepte_atypique_soir = true');
  636.         }
  637.         if ($participe !== null) {
  638.             //les assmats qui rempli leur calendrier de dispo publiques
  639.             $subqExistDispoBuilder = new QueryBuilder($this->getEntityManager());
  640.             $subqExistDispoBuilder
  641.                     ->select('dispo.id')
  642.                     ->from(DispoPublicAssmat::class, 'dispo')
  643.                     ->andWhere('dispo.assmat = ass');
  644.             if ($idLieu != 0) {
  645.                 $subqExistDispoBuilder->andWhere('dispo.lieu_accueil = :idLieu');
  646.                 $qb->setParameter('idLieu'$idLieu);
  647.             }
  648.             $subqExistDispo $subqExistDispoBuilder->getQuery()->getDQL();
  649.             // prise en compte des 'participe' sur présence d'un planning de dispo seulement
  650.             if ($participe) {
  651.                 $qb->andWhere($qb->expr()->exists($subqExistDispo));
  652.             } else {
  653.                 $qb->andWhere($qb->expr()->not($qb->expr()->exists($subqExistDispo)));
  654.             }
  655.         }
  656.         if ($participe) {
  657.             if ($planningDispo) {
  658.                 $idType 1;
  659.                 foreach ($planningDispo as $key => $value) {
  660.                     $subqueryBuilder = new QueryBuilder($this->getEntityManager());
  661.                     $subqueryBuilder
  662.                             ->select('disp' $key '.id')
  663.                             ->from(DispoPublicAssmat::class, 'disp' $key)
  664.                             ->andWhere('disp' $key '.assmat = ass');
  665.                     if ($value["id_frequence_dispo"] != 1) {
  666.                         $idPeriode $value["id_periode"];
  667.                         $idJour $value["id_jour_semaine"];
  668.                         $idHoraire $value["id_tranche_horaire"];
  669.                         if ($idLieu != 0) {
  670.                             $subqueryBuilder->andWhere('disp' $key '.lieu_accueil = :idLieu' $key);
  671.                         }
  672.                         $subqueryBuilder->andWhere('disp' $key '.type_accueil = :idType' $key)
  673.                                 ->andWhere('disp' $key '.periode = :idPeriode' $key)
  674.                                 ->andWhere('disp' $key '.tranche_age IN (:listeTrancheAge' $key ')')
  675.                                 ->andWhere('disp' $key '.tranche_horaire = :idHoraire' $key)
  676.                                 ->andWhere('disp' $key '.jour_semaine = :idJour' $key);
  677.                         if ($idLieu != 0) {
  678.                             $qb->setParameter('idLieu' $key$idLieu);
  679.                         }
  680.                         $qb->setParameter('idType' $key$idType)
  681.                                 ->setParameter('listeTrancheAge' $key$listeTrancheAge)
  682.                                 ->setParameter('idPeriode' $key$idPeriode)
  683.                                 ->setParameter('idJour' $key$idJour)
  684.                                 ->setParameter('idHoraire' $key$idHoraire);
  685.                         $subqueryBuilder->andWhere('disp' $key '.nombre_places_libres > 0');
  686.                         $subquery $subqueryBuilder->getQuery()->getDQL();
  687.                         $qb->andWhere($qb->expr()->exists($subquery));
  688.                     }
  689.                 }
  690.             }
  691.             //sinon, pas de planning fourni => toutes les assmats ayant saisi un planing de dispo remontent (même celles jamais dispos)
  692.         }
  693.         //on ne doit pas prendre en compte les assmats opposées au site grand public
  694.         $qb $qb->andWhere('ass.oppose = false');
  695.         $query $qb->orderBy('ass.nom_famille''ASC')
  696.                 ->addOrderBy('ass.prenom''ASC')
  697.                 ->getQuery();
  698.         //TODO : si besoin de paginer
  699.         //->setFirstResult( $offset ) // à partir du resultat n° offset
  700.         //->setMaxResults( $limit )   // nb de resultats de la page
  701.         return $query->getResult();
  702.     }
  703.     /**
  704.      * Rechercher des dispos grand public prévisionnelles assmats selon des critères cumulatifs
  705.      * @param int? $idCommune
  706.      * @param int? $idBureauDistributeur
  707.      * @param int? $idLieu
  708.      * @param array $listeTrancheAge liste des tranches d'ages applicables
  709.      * @param \DateTime $dateDebutAccueil date de début de la recherche de disponibilité prévisionnelle
  710.      * @param bool $atypiqueMatin indique s'il faut inclure les assmats acceptant les accueils atypiques le matin
  711.      * @param bool $atypiqueSoir indique s'il faut inclure les assmats acceptant les accueils atypiques le soir
  712.      * @param bool $handicap indique s'il faut inclure les assmats acceptant les enfants en situation de handicap
  713.      * @param bool $participe indique si les assmats recherchées participent ou non au site grand public
  714.      * @return App\Repository\AssistantMaternel
  715.      * La liste des assmats renvoyée est triée par nom puis prénom
  716.      */
  717.     public function rechercherDispoPrevGrandPublic(
  718.             int $idCommuneint $idBureauDistributeurint $idLieu$listeTrancheAge null$dateDebutAccueilbool $atypiqueMatin nullbool $atypiqueSoir nullbool $handicap nullbool $participe$listeIdASM null
  719.     )
  720.     {
  721.         /* initialise la requête avec un select 'ass' from AssistantMaternel */
  722.         $qb $this->createQueryBuilder('ass')
  723.                 // Chargement en eager loading car le lazy loading n'est pas possible en OneToOne bidirectionnel
  724.                 ->leftJoin('ass.preferences_publication''pref')
  725.                 ->leftJoin('ass.presentation_assmat''pres')
  726.                 ->leftJoin('ass.dispos_prev''prev')
  727.                 ->addSelect('pref')->addSelect('pres')
  728.                 // optim nombre requetes
  729.                 ->innerJoin('ass.agrements''agr')
  730.                 ->andWhere('agr.nombre_places > 0')
  731.                 ->addSelect('agr');
  732.         if ($listeIdASM != null && count($listeIdASM) > 0) {
  733.             $listeIdASM array_map('strval'$listeIdASM);
  734.             $qb $qb->andWhere("ass.id_fonctionnel IN (:listeIdASM)")
  735.                     ->setParameter('listeIdASM'$listeIdASM\Doctrine\DBAL\Connection::PARAM_STR_ARRAY);
  736.         }
  737.         //nombre de places > 0 pour les tranches d'age cherchées
  738.         $qb $qb->andWhere('agr.tranche_age IN (:listeTrancheAge)')
  739.                 ->setParameter('listeTrancheAge'$listeTrancheAge);
  740.         // existe des dispos prev pour les tranches d'age cherchées
  741.         $qb $qb->andWhere('prev.tranche_age IN (:listeTrancheAge)')
  742.                 ->setParameter('listeTrancheAge'$listeTrancheAge);
  743.         if ($dateDebutAccueil != null) {
  744.             $qb $qb->andWhere('prev.date_debut <= :dateDebutAccueil')
  745.                     ->setParameter('dateDebutAccueil'$dateDebutAccueil);
  746.         }
  747.         if ($idCommune != 0) {
  748.             $qb $qb->innerJoin('ass.commune''com')
  749.                     ->andWhere('com.id = :commune')
  750.                     ->setParameter('commune'$idCommune);
  751.         }
  752.         if ($idBureauDistributeur != 0) {
  753.             $qb $qb->from(BureauDistributeur::class, 'bur')
  754.                     ->andWhere('ass.bureau_distributeur = bur.libelle')
  755.                     ->andWhere('bur.id = :bureau_distributeur')
  756.                     ->setParameter('bureau_distributeur'$idBureauDistributeur);
  757.         }
  758.         $qb->andWhere('(ass.creche is NULL OR ass.creche = false)');
  759.         $qb->andWhere('(ass.formation1_effectuee is NULL OR ass.formation1_effectuee = true)');
  760.         $critereDomicileValide ' (ass.archive_domicile = false AND '
  761.                 '  ass.date_debut_agrement_domicile is not null AND '
  762.                 ' (ass.date_fin_agrement_domicile is null OR ass.date_fin_agrement_domicile > :now ) ) AND '
  763.                 ' (ass.cta_dom is NULL OR ass.cta_dom = false ) AND '
  764.                 ' (ass.suspension_dom is NULL OR ass.suspension_dom = false )';
  765.         $critereMamValide ' (ass.archive_mam = false AND '
  766.                 '  ass.date_debut_agrement_mam is not null AND '
  767.                 '  (ass.date_fin_agrement_mam is null OR ass.date_fin_agrement_mam > :now ) ) AND'
  768.                 ' (ass.cta_mam is NULL OR ass.cta_mam = false ) AND '
  769.                 ' (ass.suspension_mam is NULL OR ass.suspension_mam = false )';
  770.         $now = new \DateTime();
  771.         $qb $qb->setParameter('now'$now);
  772.         if ($idLieu) {
  773.             //restreint aux assmats avec un agrément valide et non archives selon le lieu fourni
  774.             if (
  775.                     $idLieu EnumLieuAccueil::MAM &&
  776.                     $idLieu EnumLieuAccueil::DOMICILE
  777.             ) {
  778.                 $qb $qb->andWhere($critereDomicileValide 'AND' $critereMamValide);
  779.             } else if ($idLieu EnumLieuAccueil::DOMICILE) {
  780.                 $qb $qb->andWhere($critereDomicileValide);
  781.             } else if ($idLieu EnumLieuAccueil::MAM) {
  782.                 $qb $qb->andWhere($critereMamValide);
  783.             }
  784.             $qb $qb->andWhere('prev.lieu_accueil = :idLieu')
  785.                     ->setParameter('idLieu'$idLieu);
  786.         } else {
  787.             $qb $qb->andWhere($critereDomicileValide 'OR' $critereMamValide);
  788.         }
  789.         // seulement les assmats non supprimés
  790.         $qb $qb->andWhere('ass.supprime = false');
  791.         //TODO : lien avec offre accueil
  792.         if ($handicap !== null && $handicap) {
  793.             $qb $qb->andWhere('pres.accepte_handicap = true');
  794.         }
  795.         if ($atypiqueMatin !== null && $atypiqueMatin) {
  796.             $qb $qb->andWhere('pres.accepte_atypique_matin = true');
  797.         }
  798.         if ($atypiqueSoir !== null && $atypiqueSoir) {
  799.             $qb $qb->andWhere('pres.accepte_atypique_soir = true');
  800.         }
  801.         if ($participe !== null) {
  802.             //les assmats avec participe à true ont rempli leur calendrier de dispo publiques
  803.             if ($participe) {
  804.                 $qb $qb->andWhere('ass.participe = true');
  805.             } else {
  806.                 $qb $qb->andWhere('ass.participe = false OR ass.participe is null');
  807.             }
  808.         }
  809.         //on ne doit pas prendre en compte les assmats opposées au site grand public
  810.         $qb $qb->andWhere('ass.oppose = false');
  811.         $query $qb->getQuery();
  812.         return $query->getResult();
  813.     }
  814.     /**
  815.      */
  816.     public function getAllIterable()
  817.     {
  818.         // TODO doc
  819.         return $this->createQueryBuilder('ass')->addOrderBy('ass.id''ASC')->getQuery()->iterate();
  820.     }
  821.     public function findSansCompteUtilisateur($limiteComptesAssmats null)
  822.     {
  823.         $qb $this->createQueryBuilder('ass')
  824.                 ->where('ass.utilisateur is null');
  825.         if ($limiteComptesAssmats) {
  826.             $qb->setMaxResults($limiteComptesAssmats);
  827.         }
  828.         // TODO doc
  829.         return $qb->getQuery()->iterate();
  830.     }
  831. }