src/Controller/ModeleODPController.php line 53

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use DateTime;
  4. use App\Entity\Site;
  5. use App\Entity\Episode;
  6. use App\Service\PetitsOutils;
  7. use App\Service\ModeleODP\Previs;
  8. use App\Repository\SiteRepository;
  9. use App\Repository\MeteoRepository;
  10. use App\Repository\EpisodeRepository;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use App\Service\ModeleODP\ModeleODPExcel;
  13. use App\Service\ModeleODP\ModeleODPgraph;
  14. use App\Service\ModeleODP\CreationEpisodes;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  19. use Symfony\Component\Form\Extension\Core\Type\TextType;
  20. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. class ModeleODPController extends AbstractController
  23. {
  24.     private $petitsOutils;
  25.     private $meteoRepository;
  26.     private $em;
  27.     private $episodeRepository;
  28.     private $modeleODPExcel;
  29.     private $modeleODPgraph;
  30.     private $previs;
  31.     private $creationEpisodes;
  32.     private $siteRepository;
  33.     public function __construct(PetitsOutils $petitsOutilsMeteoRepository $meteoRepositoryEntityManagerInterface $emEpisodeRepository $episodeRepositoryModeleODPExcel $modeleODPExcelPrevis $previsCreationEpisodes $creationEpisodes,ModeleODPgraph $modeleODPgraphSiteRepository $siteRepository)
  34.     {
  35.         $this->petitsOutils $petitsOutils;
  36.         $this->meteoRepository  $meteoRepository;
  37.         $this->em $em;
  38.         $this->episodeRepository $episodeRepository;
  39.         $this->modeleODPExcel $modeleODPExcel;
  40.         $this->previs $previs;
  41.         $this->creationEpisodes $creationEpisodes;
  42.         $this->modeleODPgraph $modeleODPgraph;
  43.         $this->siteRepository $siteRepository;
  44.     }
  45.     /**
  46.      * @Route("/user/modele/odp/dates", name="app_modele_odp_dates")
  47.      */
  48.     public function choixDates(Request $request): Response
  49.     {
  50.         $defaultData = [];
  51.         $form $this->createFormBuilder($defaultData)
  52.             ->add('debut'TextType::class,array(
  53.             'label' =>"début",
  54.             'attr' => array(
  55.                 'class' => 'js-datepicker',
  56.             )))
  57.             ->add('fin'TextType::class,array(
  58.                 'label' =>"fin",
  59.                 'attr' => array(
  60.                     'class' => 'js-datepicker',
  61.                 )
  62.             ))
  63.             ->add('site',EntityType::class,array(
  64.                 'class'=>Site::class,
  65.             ))
  66.             ->add('ok'SubmitType::class)
  67.             ->getForm();
  68.         $form->handleRequest($request);
  69.         if($form->isSubmitted() && $form->isValid()){
  70.             $data $form->getData();
  71.             $debut $this->petitsOutils->frenchDateToEnglish($data['debut']);
  72.             
  73.             $fin $this->petitsOutils->frenchDateToEnglish($data['fin']);
  74.             $siteId $data['site']->getId();
  75.             return $this->render('/modele_odp/sortie.html.twig',array(
  76.                 'siteId'=>$siteId
  77.             ));
  78.         }
  79.         return $this->render('modele_odp/dates.html.twig', [
  80.             'form' => $form->createView()
  81.         ]);
  82.     }
  83.     /**
  84.      * @Route("/user/modele/odp/calcul-modele", name="app_modele_odp_calcul-modele")
  85.      */
  86.     public function calculModele(Request $request):Response
  87.     {
  88.         /**
  89.          * 1 - Récupération des pluies entre les dates choisies
  90.          */
  91.         $debut $request->query->get('debut');
  92.         $fin $request->query->get('fin');
  93.         $siteId $request->query->get('siteId');
  94.         
  95.         $site $this->siteRepository->find($siteId);
  96.         $pluies $this->meteoRepository->findPluies($debut,$fin,$site);
  97.         /**
  98.          * 2 - Récupération des prévisions à 7 jours dans InfoClimat
  99.          */
  100. //         $arrayPrevis = [];
  101. //        // $arrayPrevis = $this->previs->recupPrevis();
  102. // //dd($arrayPrevis);
  103.         /**
  104.          * 3 - Pour chaque pluie horaire on crée un épisode pluvieux
  105.          * qui démarre à la première pluie et s'arrête à la dernière pluie horaire consécutive 
  106.          * avec un trou possible d'une heure sans pluie//////-------à faire////////
  107.          */
  108.         
  109.         $episodesP = array();
  110.         $episodesP $this->creationEpisodes->creationEpisodesPluie($pluies);
  111.         //on enregistre les épisodes
  112.         $this->_recEpisodes($episodesP,$siteId);
  113. // dd($episodesP)
  114.         
  115.         /**
  116.          * 4 - Récupération des prévisions à 9 jours dans Weathermesures
  117.          */
  118.         $arrayPrevis = [];
  119.         //$arrayPrevis = $this->previs->recupPrevisWeatherMeasures($siteId);
  120.         //dd($arrayPrevis);
  121.         /**
  122.          * 5 - Pour chaque pluie horaire prévision on crée un épisode pluvieux
  123.          * qui démarre à la première pluie et s'arrête à la dernière pluie horaire consécutive 
  124.          * avec un trou possible d'une heure sans pluie//////-------à faire////////
  125.          */
  126.         $episodesP = array();
  127.         $pluiesP = array();
  128.         foreach($arrayPrevis as $k => $e){
  129.             //dd($e);
  130.             if($e['pluie'] > 0){
  131.                 $pluiesP[$k] = $e;
  132.                 //dump($pluiesP);
  133.             }
  134.         }
  135.         //dd($pluiesP);
  136.         $episodesP $this->creationEpisodes->creationEpisodesPluiePrevis($pluiesP);
  137.         /**
  138.          *  4 - Pour chaque épisode pluvieux on étudie l'hygrométrie dans les heures suivantes
  139.          */
  140.         //on récupère les épisodes
  141.         $episodes $this->episodeRepository->findDebSite($debut,$site);
  142.         foreach ($episodes as $ep) {
  143.             $hum $this->_calculHumide($ep);
  144.             //dd($hum);
  145.             $humide = array();
  146.             foreach ($hum as $h) {
  147.                 $humide $h;
  148.             }
  149.             //on met à jour la table épisodes avec les infos de humide
  150.             //et de S1 S2
  151.             //pour avoir un objet épisode pluvieux complet
  152.             if (!empty($humide)) {
  153.                 $ep->setDateDebHygroSup85($humide['debut']);
  154.                 $ep->setDateFinHygroSup85($humide['fin']);
  155.                 $ep->setNbreHeuresHygroSup85($humide['nbre']);
  156.                 $ep->setTempMoyHygroSup85($humide['temp']);
  157.             }
  158.             $temp $ep->getTempMoyPluie();
  159.             //calcul S1
  160.             $S1 round(exp(-16.492684 + (72.865517 $temp) + 4.8386114 log($temp)), 1);
  161.             //dd($S1);
  162.             if (strlen($S1) > 5) { // plus de 9999 heures (il fait trop froid ou trop chaud)
  163.                 //dump($S1);
  164.                 //dump($ep);exit;
  165.                 $S1 1000;
  166.             }
  167.             $ep->setS1($S1);
  168.             //calcul S2
  169.             $S2 round(exp(-16.417647 + (74.073111 $temp) + 4.8611597 log($temp)), 1);
  170.             if (strlen($S2) > 5) {
  171.                 $S2 1000;
  172.             }
  173.             $ep->setS2($S2);
  174.             if (empty($humide)) {
  175.                 $humide['nbre'] = 0;
  176.             }
  177.             //dd($ep);
  178.             $totalHeures $ep->getNbreHeuresPluie() + $ep->getNbreHeuresHygroSup85();
  179.             if ($totalHeures >= $S1) {
  180.                 $ep->setConta(true);
  181.             }
  182.             $this->em->persist($ep);
  183.         }//fin de chaque épisode pluvieux
  184.         // Flushing and clear data on queue
  185.         $this->em->flush();
  186.         // Detaches all objects from Doctrine for memory save
  187.         $this->em->clear();
  188.         //on travaille sur les épisodes prévis
  189.         // foreach ($episodesP as $ep) {
  190.         //     $hum = $this->_calculHumideP($ep,$arrayPrevis);
  191.         //     dd($hum);
  192.         //     $humide = array();
  193.         //     foreach ($hum as $h) {
  194.         //         $humide = $h;
  195.         //     }
  196.         //     //on met à jour la table épisodes avec les infos de humide
  197.         //     //et de S1 S2
  198.         //     //pour avoir un objet épisode pluvieux complet
  199.         //     if (!empty($humide)) {
  200.         //         $ep->setDateDebHygroSup85($humide['debut']);
  201.         //         $ep->setDateFinHygroSup85($humide['fin']);
  202.         //         $ep->setNbreHeuresHygroSup85($humide['nbre']);
  203.         //         $ep->setTempMoyHygroSup85($humide['temp']);
  204.         //     }
  205.         //     $temp = $ep->getTempMoyPluie();
  206.         //     //calcul S1
  207.         //     $S1 = round(exp(-16.492684 + (72.865517 / $temp) + 4.8386114 * log($temp)), 1);
  208.         //     //dd($S1);
  209.         //     if (strlen($S1) > 5) { // plus de 9999 heures (il fait trop froid ou trop chaud)
  210.         //         //dump($S1);
  211.         //         //dump($ep);exit;
  212.         //         $S1 = 1000;
  213.         //     }
  214.         //     $ep->setS1($S1);
  215.         //     //calcul S2
  216.         //     $S2 = round(exp(-16.417647 + (74.073111 / $temp) + 4.8611597 * log($temp)), 1);
  217.         //     if (strlen($S2) > 5) {
  218.         //         $S2 = 1000;
  219.         //     }
  220.         //     $ep->setS2($S2);
  221.         //     if (empty($humide)) {
  222.         //         $humide['nbre'] = 0;
  223.         //     }
  224.         //     //dd($ep);
  225.         //     $totalHeures = $ep->getNbreHeuresPluie() + $ep->getNbreHeuresHygroSup85();
  226.         //     if ($totalHeures >= $S1) {
  227.         //         $ep->setConta(true);
  228.         //     }
  229.         //     $this->em->persist($ep);
  230.         // }
  231.         //Maintenant pour chaque épisode pluvieux contaminant on calcule la durée d'incubation :
  232.             //on avance dans les mesures suivantes en calculant
  233.             //la T° moyenne par jour.
  234.             //À la fin de chaque jour D, on enregistre le nombre de jours J depuis la fin 
  235.             //de l'épisode pluvieux, et on calcule la durée d'incubation Di qui est en jours.
  236.             //Dés que J >= Di on a l'apparition de taches et donc l'émission de spores (?????)
  237.             //On enregistre la date D et la durée D1 dans l'objet épisode 
  238.             //on arrête soit parce qu'on a Di, soit parce qu'on a atteint la fin des mesures connues (et prévisionnelles)
  239.         
  240.         //on récupère les épisodes contaminants
  241.         $episodesC $this->episodeRepository
  242.             ->findBy([
  243.                 'conta' => true,
  244.                 'site'=> $site
  245.             ]);
  246.         //dd($episodesC);
  247.         //Pour chaque épisode pluvieux contaminant :
  248.         foreach ($episodesC as $ep) {
  249.             //on avance jour par jour dans les mesures
  250.             //en partant du début de la pluie ////////////////// A voir avec Regis
  251.             $epi $this->_calculLatence($ep$arrayPrevis = array());
  252.             // dd($epi);
  253.             $this->em->persist($epi);
  254.             $this->em->flush($epi);
  255.         } //fin de chaque $episodeC
  256.         return $this->render('/modele_odp/sortie.html.twig',array(
  257.             'site'=>$site
  258.         ));
  259.     }
  260.     /**
  261.      * @Route("/modele/ODP/excel",name="app_modele_odp_excel")
  262.      *
  263.      * @return void
  264.      */
  265.     public function excel(Request $request)
  266.     {
  267.         $siteId $request->query->get('siteId');
  268.         //sortie Excel
  269.         return $this->modeleODPExcel->generateExcel($siteId);
  270.     }
  271.     /**
  272.      * @Route("/modele/ODP/graph",name="app_modele_odp_graph")
  273.      *
  274.      * @return void
  275.      */
  276.     public function graph(Request $request)
  277.     {
  278.         $siteId $request->query->get('siteId');
  279.         //sortie graphique
  280.         return $this->modeleODPgraph->generateGraph($siteId);
  281.     }
  282.     
  283. private function _recEpisodes($episodes,$siteId)
  284.     {
  285.         //dump($stationId);exit;
  286.         foreach ($episodes as $ep) {
  287.             // $d = substr($deb, 0, 10);
  288.             // $h = substr($deb, 11, 2);
  289.             $deb = new \DateTime($ep['debut']);
  290.             $fin = new \DateTime($ep['fin']);
  291.             //dump($deb);
  292.             //test existence
  293.             $existe $this->episodeRepository->findDebFinSite($deb,$siteId);
  294.             //dump($existe);
  295.             if(!empty($existe)){
  296.                 continue;
  297.             }else{
  298.             $epi = new Episode();
  299.             $epi->setSite($siteId);
  300.             $epi->setDateDebPluie($deb);
  301.             $epi->setDateFinPluie($fin);
  302.             // if ($ep['pluv'] > 500) {
  303.             //     // dump($ep['pluv']);
  304.             //     // dump($deb);
  305.             //     // dump($fin);exit;
  306.             //     continue;
  307.             // }
  308.             $epi->setPluvioTotale($ep['pluv']);
  309.             $epi->setNbreHeuresPluie($ep['nbre']);
  310.             $epi->setTempMoyPluie($ep['temp']);
  311.             //dd($epi);
  312.             $this->em->persist($epi);
  313.             $this->em->flush($epi);
  314.             }
  315.         }
  316.     }
  317.     private function _calculHumide($ep)
  318.     {
  319.         //dump($ep);
  320.         $fin $ep->getDateFinPluie();
  321.         $site $ep->getSite();
  322.         //dump($fin);exit;
  323.         $humide = array();
  324.         // 1 - on récupère la première hygro > 85%
  325.         //qui suit la fin de la pluie
  326.         //dump($station);exit;
  327.         $firstHygro $this->_recupHygro85suivantes($fin$limite 1$site);
  328.         
  329.         if (!isset($firstHygro[0])) {
  330.             return $humide;
  331.         }
  332.         // dump($fin);
  333.         // dump($firstHygro);exit;
  334.         $firstDateMesureHygro $firstHygro[0]->getDate();
  335.         //si l'intervalle entre la fin de la pluie ($fin)
  336.         //et la première mesure avec une hygro >= 85 %
  337.         //est de plus de 1 heure, alors on passe à l'épisode pluvieux suivant
  338.         $interval $fin->diff($firstDateMesureHygro);
  339.         //s'il y a plus d'une heure (et pas un jour et une heure) de différence avec l'heure précédente
  340.         //dump($fin->fotmat('H'));
  341.         if ($interval->format("%d") > || $interval->format("%h") > 1) {
  342.             return $humide;
  343.         }
  344.         //on récupère les 24 * 4 * 10 = 9600 mesures suivantes (10 jours)
  345.         //avec une hygro >= 85%
  346.         $hygros85 $this->_recupHygro85suivantes($fin$limite 9600,$site);
  347.         //dd($hygros85);
  348.         
  349.         //on ne garde que les premières hygros >= 85%
  350.         //consécutives dans le tableau tabHygros85
  351.         //avec un trou maxi de 1 hygro
  352.         $prec = new \DateTime();//valeur bidon pour démarrer la boucle
  353.         $origin "";
  354.         $i 1;
  355.         $tabHygros85 = array();
  356.         foreach ($hygros85 as $h) {
  357.             if ($i == 1) {
  358.                 //on sait déjà qu'il n'y a pas plus d'une heure d'écart
  359.                 //avec la fin de la pluie
  360.                 $tabHygros85[$h->getDate()->format('Y-m-d H:i:s')] = $h;
  361.                 $prec $h->getDate();
  362.             } else {
  363.                 $heureActuelle $h->getDate();
  364.                 $interval $prec->diff($heureActuelle);
  365.                 //s'il y a plus d'une heure (ou plus d'un jour)
  366.                 //de différence avec l'heure précédente
  367.                 //on s'arrête
  368.                 if ($interval->format("%d") > || $interval->format("%h") > 1) {
  369.                     break;
  370.                 } else {
  371.                     $prec $h->getDate();
  372.                     $tabHygros85[$h->getDate()->format('Y-m-d H:i:s')] = $h;
  373.                 }
  374.             }
  375.             $i++;
  376.         }
  377.         //Pour chaque hygro horaire on crée un éventuel épisode humide
  378.         //qui démarre à la première heure >= 85% et s'arrête à la dernière 
  379.         //heure consécutive > 85% (avec un trou possible d'une heure <85%////////////////)
  380.         $i 1;
  381.         foreach ($tabHygros85 as $h) {
  382.             $heure $h->getDate();
  383.             if ($i == 1) {
  384.                 $k$h->getDate()->format('Y-m-d H:i:s');
  385.                 $humide[$k]['nbre'] = 1;
  386.                 $humide[$k]['hygro'] = $h->getU();
  387.                 $humide[$k]['temp'] = $h->getT();
  388.                 $humide[$k]['debut'] = $heure;
  389.                 $humide[$k]['fin'] = $heure;
  390.                 //origin est la date de début de l'épisode humide
  391.                 $origin $k;
  392.                 //dump($humide);exit;
  393.             } else {
  394.                 $humide[$origin]['nbre'] += 1;
  395.                 $humide[$origin]['hygro'] += $h->getU();
  396.                 $humide[$origin]['temp'] += $h->getT();
  397.                 $humide[$origin]['fin'] = $heure;
  398.             }
  399.             $i++;
  400.         }
  401.         //dump($i);exit;
  402.         //on fait les calculs de moyennes
  403.         $humide[$origin]['hygro'] = round($humide[$origin]['hygro'] / $humide[$origin]['nbre'], 1);
  404.         $humide[$origin]['temp'] = round($humide[$origin]['temp'] / $humide[$origin]['nbre'], 1);
  405.         //on enregistre l'id de l'épisode pluvieux
  406.         $humide[$origin]['idEp'] = $h->getId();
  407.         //dump($humide);exit;
  408.         return $humide;
  409.     }
  410.     private function _calculHumideP($ep,$arrayPrevis)
  411.     {
  412.         $fin = new DateTime($ep['fin']);
  413.         //dump($fin);
  414.         $humide = array();
  415.         // 1 - on récupère la première hygro > 85%
  416.         //qui suit la fin de la pluie
  417.         $firstHygro = array();
  418.         foreach($arrayPrevis as $d => $a){
  419.             //dd($a);
  420.             $date = new DateTime($d);
  421.             if($date $fin){
  422.                 if($a['hum'] >= 0.85){
  423.                     $firstHygro[0] = $arrayPrevis[$d];
  424.                 }
  425.                 break;
  426.             }
  427.         }
  428.         
  429.         if (!isset($firstHygro[0])) {
  430.             return $humide;
  431.         }
  432.         
  433.         $firstDateMesureHygro $date;
  434.         //dump($fin);
  435. //dd($firstDateMesureHygro);
  436.         //si l'intervalle entre la fin de la pluie ($fin)
  437.         //et la première mesure avec une hygro >= 85 %
  438.         //est de plus de 1 heure, alors on passe à l'épisode pluvieux suivant
  439.         $finOb = new DateTime($fin);
  440.         $firstDateMesureHygroOb = new DateTime($firstDateMesureHygro);
  441.         $interval $finOb->diff($firstDateMesureHygroOb);
  442.         //s'il y a plus d'une heure (et pas un jour et une heure) de différence avec l'heure précédente
  443.         //dump($fin->fotmat('H'));
  444.         if ($interval->format("%d") > || $interval->format("%h") > 1) {
  445.             return $humide;
  446.         }
  447.         
  448.         //on ne garde que les premières hygros >= 85%
  449.         //consécutives dans le tableau tabHygros85
  450.         //avec un trou maxi de 1 hygro
  451.         $prec = new \DateTime();//valeur bidon pour démarrer la boucle
  452.         $origin "";
  453.         $i 1;
  454.         $tabHygros85 = array();
  455.         foreach ($arrayPrevis as $h) {
  456.             if ($i == 1) {
  457.                 //on sait déjà qu'il n'y a pas plus d'une heure d'écart
  458.                 //avec la fin de la pluie
  459.                 $tabHygros85[$h->getDate()->format('Y-m-d H:i:s')] = $h;
  460.                 $prec $h->getDate();
  461.             } else {
  462.                 $heureActuelle $h->getDate();
  463.                 $interval $prec->diff($heureActuelle);
  464.                 //s'il y a plus d'une heure (ou plus d'un jour)
  465.                 //de différence avec l'heure précédente
  466.                 //on s'arrête
  467.                 if ($interval->format("%d") > || $interval->format("%h") > 1) {
  468.                     break;
  469.                 } else {
  470.                     $prec $h->getDate();
  471.                     $tabHygros85[$h->getDate()->format('Y-m-d H:i:s')] = $h;
  472.                 }
  473.             }
  474.             $i++;
  475.         }
  476.         //Pour chaque hygro horaire on crée un éventuel épisode humide
  477.         //qui démarre à la première heure >= 85% et s'arrête à la dernière 
  478.         //heure consécutive > 85% (avec un trou possible d'une heure <85%////////////////)
  479.         $i 1;
  480.         foreach ($tabHygros85 as $h) {
  481.             $heure $h->getDate();
  482.             if ($i == 1) {
  483.                 $k$h->getDate()->format('Y-m-d H:i:s');
  484.                 $humide[$k]['nbre'] = 1;
  485.                 $humide[$k]['hygro'] = $h->getU();
  486.                 $humide[$k]['temp'] = $h->getT();
  487.                 $humide[$k]['debut'] = $heure;
  488.                 $humide[$k]['fin'] = $heure;
  489.                 //origin est la date de début de l'épisode humide
  490.                 $origin $k;
  491.                 //dump($humide);exit;
  492.             } else {
  493.                 $humide[$origin]['nbre'] += 1;
  494.                 $humide[$origin]['hygro'] += $h->getU();
  495.                 $humide[$origin]['temp'] += $h->getT();
  496.                 $humide[$origin]['fin'] = $heure;
  497.             }
  498.             $i++;
  499.         }
  500.         //dump($i);exit;
  501.         //on fait les calculs de moyennes
  502.         $humide[$origin]['hygro'] = round($humide[$origin]['hygro'] / $humide[$origin]['nbre'], 1);
  503.         $humide[$origin]['temp'] = round($humide[$origin]['temp'] / $humide[$origin]['nbre'], 1);
  504.         //on enregistre l'id de l'épisode pluvieux
  505.         $humide[$origin]['idEp'] = $h->getId();
  506.         //dump($humide);exit;
  507.         return $humide;
  508.     }
  509.     private function _recupHygro85suivantes($fin$limite,$siteId)
  510.     {
  511.         $site $this->siteRepository->find($siteId);
  512.         $hygros $this->meteoRepository
  513.             ->findHyg($fin$limite,$site);
  514.                 
  515.         return $hygros;
  516.     }
  517.     private function _calculLatence($ep$arrayPrevis)
  518.     {
  519.         $J 1;
  520.         $dat $ep->getDateDebPluie();
  521.         $date = clone $dat;
  522.         $siteId $ep->getSite();
  523.         $site $this->siteRepository->find($siteId);
  524.        //dump($date);
  525.         //moyenne des températures de la journée $date
  526.         $moyenneJour $this->meteoRepository->recupTempMoyJour($date,$site);
  527.         //dd($moyenneJour);
  528.         if ($moyenneJour == "vide") { //pas de mesures pour cette date
  529.             //dump('vide et premier new = 1');
  530.             $ep->setLatence(' >' $J); //l'espace avant le > est important pour strpos dans la feuille excel
  531.             $ep->setTempMoyLatence(null);
  532.             $ep->setDateTache($date);
  533.             //dump($ep);exit;
  534.             return $ep;
  535.         } else {
  536.             $moyJ $moyenneJour $J;
  537.             $moy $moyenneJour;
  538.             //jours suivants
  539.             //dump($ep);
  540.             for ($i 1$i <= 300$i++) {
  541.                 $date->add(new \DateInterval('P1D'));
  542.                 //dump($ep);
  543.                 $J++;
  544.                 //dump($J);
  545.                 //dump($date);
  546.                 $moyenneJour $this->meteoRepository->recupTempMoyJour($date,$site);
  547.                 //dump($moyenneJour);
  548.                 if ($moyenneJour == "vide") { //pas de mesures pour cette date
  549.                     //dump('vide et second new = 1');
  550.                     //dd($ep);
  551.                     if (array_key_exists($date->format('Y-m-d'), $arrayPrevis)) {
  552.                         $moyenneJour $arrayPrevis[$date->format('Y-m-d')];
  553.                         // dd($moyenneJour);
  554.                     } else {
  555.                         $ep->setLatence(' >' $J); //l'espace avant le > est important pour strpos dans la feuille excel
  556.                         $ep->setTempMoyLatence(null);
  557.                         $ep->setDateTache(null);
  558.                         //dd($ep);
  559.                         return $ep;
  560.                     }
  561.                 } else {
  562.                     if (is_numeric($moyenneJour)) {
  563.                         $moy += $moyenneJour;
  564.                     } else {
  565.                         //dump($moyenneJour);
  566.                         exit;
  567.                     }
  568.                     // dump($moy);
  569.                     //dump($J);
  570.                     $moyJ $moy $J;
  571.                     //dump($moyJ);
  572.                     //calcul Di
  573.                     $Di 365.76 89.57 $moyJ 9.12 pow($moyJ2) - 0.43 pow($moyJ3) + 0.0078 pow($moyJ4);
  574.                     //dump('Di = '.$Di);
  575.                     if ($J >= $Di) {
  576.                         //on arrête pour cette épisode
  577.                         //dump($J);
  578.                         //dump($ep);
  579.                         // dump($Di);
  580.                         //dump($moyJ);
  581.                         $ep->setLatence($J);
  582.                         $ep->setTempMoyLatence(round($moyJ1));
  583.                         $ep->setDateTache($date);
  584.                         //dump($ep);exit;
  585.                         return $ep;
  586.                     }
  587.                     //dump($ep);
  588.                 }
  589.             } //fin de $i 
  590.         }
  591.     }
  592.    
  593. }