src/Utils/Residences.php line 192

Open in your IDE?
  1. <?php
  2. namespace App\Utils;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\HttpFoundation\JsonResponse;
  6. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  7. use Twig\Environment;
  8. use Symfony\Contracts\Translation\TranslatorInterface;
  9. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  10. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  11. use Symfony\Component\Routing\RouterInterface;
  12. use App\Services\ToolService;
  13. use App\Services\iresaService;
  14. use App\Utils\IresaManager;
  15. use App\Services\TravellerService;
  16. use App\Entity\assurance;
  17. use App\Entity\commande;
  18. use App\Entity\Destination;
  19. use App\Entity\Package;
  20. use App\Entity\InfosDiscover;
  21. use App\Entity\InfosDiscoverLink;
  22. use App\Entity\InfosEvent;
  23. use App\Entity\InfosFormuleBase;
  24. use App\Entity\InfosResidence;
  25. use App\Entity\OptionResidence;
  26. use App\Entity\Residence;
  27. use App\Entity\Service;
  28. use App\Entity\Typologie;
  29. use App\Entity\Language;
  30. class Residences
  31. {
  32.     const IRESA_LANG_DEFAULT 'fr';
  33.     private $em;
  34.     private $toolService;
  35.     private $iresaManager;
  36.     private $iresaService;
  37.     private $travellerService;
  38.     private $router;
  39.     private $locale;
  40.     private $lang;
  41.     private $langDefault;
  42.     private $twig;
  43.     private $packageIds;
  44.     private $session;
  45.     private $translator;
  46.     private $residences;
  47.     public function __construct(
  48.         EntityManagerInterface $em
  49.         ToolService $toolService
  50.         IresaManager $iresaManager
  51.         iresaService $iresaService
  52.         TravellerService $travellerService
  53.         Environment $twig
  54.         SessionInterface $session,
  55.         TranslatorInterface $translator
  56.         RouterInterface $router
  57.     ) {
  58.         $this->em $em;
  59.         $this->session $session;
  60.         $this->toolService $toolService;
  61.         $this->iresaService $iresaService;
  62.         $this->iresaManager $iresaManager;
  63.         $this->translator $translator;
  64.         $this->travellerService $travellerService;
  65.         $this->router $router;
  66.         $this->twig $twig;
  67.         $this->locale "fr";
  68.         $this->lang null;
  69.         $this->langDefault null;
  70.         $this->packageIds = [];
  71.     }
  72.     public function setLocale($locale) {
  73.         $this->locale $locale;
  74.         $this->lang  $this->em->getRepository(Language::class)->findOneByCode($locale);
  75.         $this->langDefault  $this->em->getRepository(Language::class)->findOneByCode('fr');
  76.     }
  77.     public function getPlanning($request$datearrivee$duree$type$delta$residence) {
  78.         $id $residence->getIdiresa();
  79.         $locale $this->locale;
  80.         $dispoPrestations = [];
  81.         $prestationDefault = [];
  82.         $planning = [];
  83.         $response =  [
  84.             "packages" => [],
  85.             "prestations" => [],
  86.             "listDatesDebut" => [],
  87.             "listDatesFin" => [],
  88.             "listDurees" => [],
  89.             "idPrestationDefault" => []
  90.         ];
  91.         
  92.         // les prestations de la date d'arrivée sélectionnée uniquement
  93.         $prestations $this->getPrestations($id$datearrivee$duree$locale$delta);
  94.         // Si pas de prestation avec la durée sélectionnée recherche sans préciser la durée
  95.         if(count($prestations['ListReponses']) == 0) { 
  96.             $message[] = "Pas de prestation sélectionnée avec cette date et cette durée";
  97.             $prestations $this->getPrestations($id$datearriveenull$locale$delta);
  98.         } 
  99.         
  100.         // Si toujours pas de réponse
  101.         if(count($prestations['ListReponses']) == 0) { 
  102.             
  103.             $travellers $this->travellerService->getTravellers();
  104.             $this->travellerService->init();
  105.             $response['redirect'] = true;
  106.             return $response;
  107.         }
  108.        
  109.         $packages $this->getPackages($id$prestations);
  110.         $idPrestationDefault $prestations['ListReponses'][0]['IdPrestation'];
  111.         
  112.         /*
  113.         foreach ($prestations['ListReponses'] as $prestation) { 
  114.             $dispoPrestations[] = $prestation;
  115.         }
  116.         if ($dispoPrestations) { 
  117.             $idPrestationDefault = $dispoPrestations[0]['IdPrestation'];
  118.             $message[] = "Prestations disponibles";
  119.             $idPrestationDefault = $dispoPrestations[0]['IdPrestation'];
  120.             $prestationDefault = [
  121.                 'id' => $idPrestationDefault,
  122.                 'nom_commercial' => $prestations[$idPrestationDefault]['zero']['nom_commercial'],
  123.                 'IdTypePrestation' => $dispoPrestations[0]['IdTypePrestation'],
  124.             ];
  125.         }
  126.         */
  127.         $now = new \DateTime();
  128.         $queryParams = [
  129.             'ListLieuHebergement' => $id
  130.             'IdPrestation' => $idPrestationDefault,
  131.             'noCache' => $now
  132.         ];
  133.         $planning $this->iresaManager->getPlanning($queryParams$datearrivee$type);
  134.         /*
  135.         if($request->isXmlHttpRequest()) {
  136.             // Si appel ajax, on a déjà le planning du mois, on recherche uniquement le planning pour le jour sélectionné
  137.             $planning = $this->iresaManager->getPlanning($queryParams, $datearrivee, "day");
  138.         } else {
  139.             // Si appel direct on veut connaitre le plannign du mois pour l'afficher
  140.             $planning = $this->iresaManager->getPlanning($queryParams, $datearrivee, "month");
  141.         }
  142.         */
  143.          
  144.         if(empty($planning['ListDatesDebut'])) {
  145.             if($request->isXmlHttpRequest()) {
  146.                 return $response;
  147.             }
  148.         }
  149.         $listDatesDebut = [];
  150.         foreach ($planning['ListDatesDebut'] as $date) {
  151.             $listDatesDebut[] = substr($date82) . '/'  .substr($date52) . '/' substr($date04);
  152.         }
  153.         $listDurees $planning['ListDurees'];
  154.         $listDatesFin = [];
  155.         foreach ($planning['ListDatesDebut'] as $date) {
  156.             foreach($listDurees as $duree) {
  157.                 // Ajouter la duree à la date et remplir le tableau $listDatesFin
  158.                 $dateFin = new \DateTime($date);
  159.                 $dateFin->add(new \DateInterval('P'.$duree.'D'));
  160.                 // push dateFin in french format to listrDatesFin if only it not present in array
  161.                 if(!in_array($dateFin->format('d/m/Y'), $listDatesFin)) {
  162.                     $listDatesFin[] = $dateFin->format('d/m/Y');
  163.                 }
  164.             }
  165.         }
  166.         
  167.         
  168.         $this->session->set('idPrestation'$idPrestationDefault);
  169.       
  170.         $response =  [
  171.             "packages" => $packages,
  172.             "prestations" => $prestations,
  173.             "listDatesDebut" => $listDatesDebut,
  174.             "listDatesFin" => $listDatesFin,
  175.             "listDurees" => $listDurees,
  176.             "idPrestationDefault" => $idPrestationDefault
  177.         ];
  178.         //throw $this->createNotFoundException('Résidence inexistante');
  179.         return $response;
  180.     }
  181.     public function getPackages($id$prestations) {
  182.         $residence =  $this->em->getRepository(Residence::class)->findOneBy(['idiresa' => $id]);
  183.         if(!$residence) {
  184.             return [];
  185.             //throw new \Exception('Résidence inexistante');
  186.         }
  187.         $params = [
  188.             'lang' => $this->lang,
  189.             'residence' => $residence
  190.         ];
  191.         $infosResidence $this->em->getRepository(InfosResidence::class)->findOneBy($params);
  192.         $formuleBase $this->em->getRepository(InfosFormuleBase::class)->findOneBy($params);
  193.         $params['commercialisation'] = true;
  194.         $listPackages $this->em->getRepository(Package::class)->findBy($params);
  195.         $packageIds = [];
  196.         foreach($listPackages as $package) {
  197.             $packageIds[] = $package->getIdIresa();
  198.         }
  199.         $packages = [];
  200.         $haslocative 0;
  201.         foreach ($prestations['ListReponses'] as $reponse) {
  202.             if( $reponse['IdPrestationHebergement'] != 0) {
  203.                 $idP $reponse['IdPrestationHebergement'];
  204.             } else {
  205.                 $idP $reponse['IdPrestation'];
  206.                 $haslocative 1;
  207.             }
  208.             if($haslocative == 1){
  209.                 $packages[0] = [
  210.                     'idIresa' => 0,
  211.                     'type' => 'formule_base',
  212.                     'entity' => $formuleBase,
  213.                     'nom' => $formuleBase->getNom(),
  214.                     'picto' => $formuleBase->getPicto(),
  215.                     'photoProfilDefault' => 'build/images/front/locatif-default.jpg',
  216.                     'photoProfil' => $formuleBase->getPhotoProfil(),
  217.                     'photoPopin' => $formuleBase->getPhotoPopin(),
  218.                     'descriptionPopin' => $formuleBase->getDescriptionPopin(),
  219.                     'prestaInc' => $formuleBase->getPrestaInc(),
  220.                     'prestaNoinc' => $formuleBase->getPrestaNoinc(),
  221.                     'serviceInc' => $formuleBase->getServiceInc(),
  222.                     'serviceNoinc' => $formuleBase->getServiceNoinc(),
  223.                     'description' =>  $formuleBase->getDescription(),
  224.                     //'resShortdesc' => $infosResidence->getResShortdesc(),
  225.                     'resBigdesc' => $infosResidence->getResBigdesc()
  226.                 ];
  227.             }
  228.         }
  229.         foreach($prestations['FichesPrestation'] as  $prestation) {
  230.             $package $this->em->getRepository(Package::class)->findOneBy([
  231.                 'lang' => $this->lang,
  232.                 'idIresa' => $prestation['IdElement'],
  233.                 'residence' => $residence
  234.             ]);
  235.             
  236.             if(array_key_exists("pack_heb"$prestation['ListFiches']) && in_array($package->getIdIresa(), $packageIds)) {
  237.                 $packages[] = [
  238.                     'idIresa' =>  $package->getIdIresa(),
  239.                     'type' => 'pack_heb',
  240.                     'entity' => $package,
  241.                     'nom' => $package->getNom(),
  242.                     'picto' => $package->getPicto(),
  243.                     'photoProfilDefault' => 'build/images/front/package-default.jpg',
  244.                     'photoProfil' => $package->getPhotoProfil(),
  245.                     'photoPopin' => $package->getPhotoPopin(),
  246.                     'descriptionPopin' => $package->getDescriptionPopin(),
  247.                     'prestaInc' => $formuleBase->getPrestaInc(),
  248.                     'prestaNoinc' => $formuleBase->getPrestaNoinc(),
  249.                     'serviceInc' => $package->getServiceInc(),
  250.                     'serviceNoinc' => $package->getServiceNoinc(),
  251.                     'description' =>  $package->getDescription(),
  252.                     //'resShortdesc' => $infosResidence->getResShortdesc(),
  253.                     'resBigdesc' => $infosResidence->getResBigdesc()
  254.                 ];
  255.             }
  256.             if(array_key_exists("pack_loisir"$prestation['ListFiches']) && in_array($package->getIdIresa(), $packageIds)) {
  257.                 $packages[] = [
  258.                     'idIresa' =>  $package->getIdIresa(),
  259.                     'type' => 'pack_loisir',
  260.                     'entity' => $package,
  261.                     'nom' => $package->getNom(),
  262.                     'picto' => $package->getPicto(),
  263.                     'photoProfilDefault' => 'build/images/front/package-default.jpg',
  264.                     'photoProfil' => $package->getPhotoProfil(),
  265.                     'photoPopin' => $package->getPhotoPopin(),
  266.                     'descriptionPopin' => $package->getDescriptionPopin(),
  267.                     'prestaInc' => $formuleBase->getPrestaInc(),
  268.                     'prestaNoinc' => $formuleBase->getPrestaNoinc(),
  269.                     'serviceInc' => $package->getServiceInc(),
  270.                     'serviceNoinc' => $package->getServiceNoinc(),
  271.                     'description' =>  $package->getDescription(),
  272.                     //'resShortdesc' => $infosResidence->getResShortdesc(),
  273.                     'resBigdesc' => $infosResidence->getResBigdesc()
  274.                 ];
  275.             }
  276.         }
  277.         return $packages;
  278.     }
  279.     public function getHebergements($prestations$selectedHebergementId$mode "") { 
  280.         $disabled "";
  281.         $formLoc "Formule temporaire";
  282.         $travellers $this->travellerService->getTravellers();
  283.         $nbPax $this->travellerService->travellers['nbPax'];
  284.         $dateArrivee $this->travellerService->travellers['actdatearrivee'] ;
  285.         $duree $this->travellerService->travellers['actnbnuits'] ;
  286.         $id =  $travellers['idResidence'];
  287.         $prestations $this->getPrestations($id$dateArrivee$duree$this->locale0);
  288.         $packages $this->getPackages($id$prestations);
  289.        
  290.         $contents "";
  291.         if(count($prestations['ListReponses']) > 0) {
  292.             $countHide 0;
  293.             foreach ($prestations['ListReponses'] as $key => $reponse) {
  294.                 if($reponse['IdPrestationHebergement'] == 0) {
  295.                     $idiresa $reponse['IdPrestation'];
  296.                 } else {
  297.                     $idiresa $reponse['IdPrestationHebergement'];
  298.                 }
  299.                 $params = [
  300.                     'lang' => $this->lang,
  301.                     'idiresa' => $idiresa
  302.                 ];
  303.         
  304.                 $typologie $this->em->getRepository(Typologie::class)->findOneBy($params);
  305.                 $typologie_nom "";
  306.                 $typologie_paxmax "";
  307.                 if($typologie instanceof Typologie) {
  308.                     $typologie_nom $typologie->getNom();
  309.                     $typologie_paxmax $typologie->getPaxMax();
  310.                 } else {
  311.                     $typologie "";
  312.                 }
  313.                 $prestations['ListReponses'][$key]['NomTypologie'] = $typologie_nom;
  314.                 $prestations['ListReponses'][$key]['PaxMax'] = $typologie_paxmax;
  315.             }
  316.             foreach ($prestations['Hebergements'] as $idPrestation => $ptsHeb) {
  317.                 foreach ($ptsHeb as $ptHeb) {
  318.                     $hebergement $prestations['ListReponses'][$ptHeb];
  319.                     if (array_key_exists('IdPrestationHebergement'$hebergement )) {
  320.                         
  321.                         if ($hebergement['IdPrestationHebergement'] == 0) {
  322.                             $idPrestationHebergement $hebergement['IdPrestation'];
  323.                             $idpack 0;
  324.                             $fichesPrestation =  $prestations['ListReponses'][$ptHeb];
  325.                             $formLoc =  $packages[0]['nom'];
  326.                         } else {
  327.                             $idPrestationHebergement $prestations['ListReponses'][$ptHeb];
  328.                             $idpack $hebergement['IdPrestation'];
  329.                             foreach($packages as $package) {
  330.                                 if($package['idIresa'] == $idpack) {
  331.                                     $formLoc =  $package['nom'];
  332.                                 }
  333.                             }
  334.                         }
  335.                         $capaciteMax $hebergement['CapaciteMax'];
  336.                       
  337.                         if ($nbPax <= $capaciteMax) {
  338.                             $contents .=  $this->twig->render('/front/Produit/recaptarif.html.twig', [
  339.                                 'hebergement' => $hebergement,
  340.                                 'idpack' => $idpack,
  341.                                 'formLoc' => $formLoc,
  342.                                 'paxMax' => $capaciteMax,
  343.                                 'selectedHebergement' => $selectedHebergementId,
  344.                                 'idPrestationHebergement' => $idPrestationHebergement                   
  345.                             ]);
  346.                         } else {
  347.                             echo "<!-- Hébergement: " $idPrestationHebergement " | PAX: " $nbPax " - CapaciteMax: " .  $capaciteMax " -->";
  348.                             $countHide++;
  349.                         }
  350.                     }
  351.                 }
  352.             }
  353.             if ( $countHide == count($prestations['ListReponses'])) {
  354.                 $contents .= '<div class="width-100 recherche-fp-tarif detailform margin-off">
  355.                     <p class="text-align-center">' $this->translator->trans('produit.residence.capacite_insufisante' , [], 'app') . '</p>
  356.                 </div>';
  357.                 $disabled "disabled";
  358.             }
  359.             
  360.             if(empty($travellerService->travellers['actdatearrivee'])) {
  361.                 $disabled "disabled";
  362.             }
  363.         }
  364.         
  365.         $contents .= '<div id="error-resa" class="error formule-bloc" style="display:none"></div>';
  366.         if($mode == "edit") {
  367.             $contents .= '<button type="submit" class="submitResaProduit" ' $disabled ' >' $this->translator->trans('ancre.actualiser_reservation' , [], 'app') . '</button>';
  368.         } else {
  369.             $contents .= '<button type="submit" class="submitResaProduit" ' $disabled ' >' $this->translator->trans('ancre.reserver' , [], 'app') . '</button>';
  370.         }
  371.         
  372.         return $contents;
  373.     }
  374.     function getPrestations($id$dateDebut$duree$locale$deltaJour) {
  375.         // Recherche formule locative
  376.         
  377.         $locale "fr";
  378.         $queryParams = [
  379.             'ListLieuHebergement' => $id
  380.             'DateDebut' => $dateDebut,
  381.             'DetailParPrestation' => 1,
  382.             'NbPages' => 50,
  383.             'NbDeltaJour' => $deltaJour,
  384.             'PageSize' => 360,
  385.             'Page' => 1
  386.         ];
  387.        
  388.         if ($duree ) {
  389.             $queryParams['Duree'] = $duree;  
  390.         }
  391.         $prestations $this->iresaManager->getAllPrestations($queryParams$locale);
  392.         
  393.         $this->packageIds $prestations['prestations'];
  394.         
  395.         $prestations['params'] =  $queryParams;
  396.         
  397.         return $prestations;
  398.     }
  399.     public function getFicheHebergement($detail) {
  400.         $details json_decode($detailtrue);
  401.         $reservation null;
  402.         $formule null;
  403.         if(!is_null($details)) {
  404.             $idPackage array_key_first($details['reservation']);
  405.             $reservation $details['reservation'][$idPackage];
  406.         }
  407.         $className $details['formule']['className'];
  408.         if($className != commande::FORMULE_UNKNOWN){
  409.             $formule $this->em->getRepository("App\\Entity\\{$className}")->findOneBy([
  410.                 'lang' => $this->lang,
  411.                 'id' => $details['residence'],
  412.                 'idIresa' => $details['formule']['idIresa']
  413.             ]);
  414.         }
  415.         
  416.         $typologie  $this->em->getRepository(Typologie::class)->findOneBy([
  417.             'lang' => $this->lang,
  418.             'idiresa' => $details['typologie']
  419.         ]);
  420.         $residence =  $this->em->getRepository(Residence::class)->findOneByIdiresa($reservation['idLieu']);
  421.         $fiche = [
  422.             "reservation" => $reservation,
  423.             "residence" => $residence,
  424.             "formule" => $formule,
  425.             "typologie" => $typologie
  426.         ];
  427.         return $fiche;
  428.     }
  429.     public function getSejours($hebergements$reponses$lang$nbPax 0) {
  430.         // On parcourt le tableau afin de ne garder que la typologie de CapaciteMax correspondant au nbPax et le tarif le plus petit pour la résidence
  431.         $fichesAll = [];
  432.         foreach ($reponses as $reponse) {
  433.             if($reponse['IdLieuHebergement'] > 0) {
  434.                 $idLieuHebergement $reponse['IdLieuHebergement'];
  435.                 $capaciteMax $reponse['CapaciteMax'];
  436.                 $prixTotal $reponse['PrixTotal'];
  437.                 // Si la capacité max est insuffisante, passer à l'itération suivante
  438.                 if (!($nbPax === || $capaciteMax >= $nbPax)) {
  439.                     continue;
  440.                 }
  441.                 // Si le lieu n'est pas encore enregistré ou si le prix est plus bas, on enregistre la réponse
  442.                 if (!isset($fichesAll[$idLieuHebergement]) || $prixTotal $fichesAll[$idLieuHebergement]['PrixTotal']) {
  443.                     $fichesAll[$idLieuHebergement] = $reponse;
  444.                 }
  445.             }
  446.         }
  447.       
  448.         $fiches = [];
  449.         foreach($fichesAll as $idLieuHebergement => $fiche) {
  450.             $residence  $this->em->getRepository(Residence::class)->findOneEnabledByIdiresa($lang$idLieuHebergement);
  451.             if(!$residence) {
  452.                 continue;
  453.             }
  454.             $params = [
  455.                 'residence' => $residence,
  456.                 'lang_id' => $this->lang->getId()
  457.             ];
  458.             $infosResidence  $this->em->getRepository(InfosResidence::class)->findOneByLang($params);
  459.             $formuleBase  $this->em->getRepository(InfosFormuleBase::class)->findOneByLang($params);
  460.             $presta_inc = [];
  461.             $presta_noinc = [];
  462.             $nom "";
  463.             $res_lieu "";
  464.             $famille"";
  465.             $res_shortdesc "";
  466.             if(!is_null($formuleBase)) {
  467.                 $presta_inc = (Array) json_decode($formuleBase->getPrestaInc()); 
  468.                 $presta_noinc = (Array) json_decode($formuleBase->getPrestaNoinc());
  469.             }
  470.             
  471.            
  472.             //$famille = $hebergement['ListFiches']['zero']['famille'];
  473.             $nom $residence->getNom();
  474.             $res_lieu $infosResidence->getResLieu();
  475.             $res_shortdesc $infosResidence->getResShortdesc();
  476.             $infosHebergement = [
  477.                 'residence' => $residence,
  478.                 'presta_inc' => $presta_inc,
  479.                 'presta_noinc' => $presta_noinc,
  480.                 'nom' => $nom,
  481.                 'res_lieu' => $res_lieu,
  482.                 //'famille' => $famille,
  483.                 'res_shortdesc' => $res_shortdesc,
  484.             ];
  485.             
  486.             $fiches[] = array_merge($fiche$infosHebergement);
  487.         }
  488.         return $fiches;
  489.     }
  490.     public function getBreadCrumb($residence) {
  491.         $destinations[] = [
  492.             'nom' => strtolower($residence->getNom()),
  493.         ];
  494.         
  495.         $currentDestinationId $residence->getDestinationIdiresa();
  496.         if ($currentDestinationId != null) {
  497.             // get destination record width idiresa and lang
  498.             $currentDestination $this->em->getRepository(Destination::class)->findOneBy(['idIresa' => $currentDestinationId'lang' => $this->lang]);
  499.             $currentDestination $currentDestination->getParent();
  500.             // Tant que la destination actuelle a un parent, on continue de remonter
  501.             while ($currentDestination !== null) {
  502.                 // On ajoute la destination actuelle au début du tableau des destinations
  503.                 $destination = [
  504.                     'nom' => strtolower($currentDestination->getTitreCourt()),
  505.                     'url' => $this->router->generate('ac_platform_destination', [
  506.                         'slug' => $currentDestination->getSlug(), 
  507.                         'id' => $currentDestination->getIdIresa()
  508.                     ])
  509.                 ];
  510.                 array_unshift($destinations$destination);
  511.                 // On remonte à la destination parente
  512.                 $currentDestination $currentDestination->getParent();
  513.                 
  514.             }
  515.         }
  516.         
  517.         $destination = [
  518.             'nom' => "Accueil",
  519.             'url' => $this->router->generate('ac_platform_homepage')
  520.         ];
  521.         array_unshift($destinations$destination);
  522.         return $destinations;
  523.     }
  524. }