src/Controller/Amce/DefaultController.php line 324

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Amce;
  3. use App\Service\StorageService;
  4. use Clegginabox\PDFMerger\PDFMerger;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use Symfony\Component\HttpFoundation\JsonResponse;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Form\Extension\Core\Type\TextType;
  12. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  13. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  14. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  15. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  16. use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
  17. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  18. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  19. use Symfony\Component\HttpFoundation\Cookie;
  20. use Abraham\TwitterOAuth\TwitterOAuth;
  21. use Symfony\Component\Form\Extension\Core\Type\FileType;
  22. use Symfony\Component\HttpFoundation\RedirectResponse;
  23. use GuzzleHttp\Client;
  24. use GuzzleHttp\Exception\RequestException;
  25. use Symfony\Component\Mailer\MailerInterface;
  26. use Symfony\Component\Mime\Email;
  27. use Symfony\Component\Mime\Address;
  28. use App\Entity\Home;
  29. use App\Entity\Contenu;
  30. use App\Entity\Member;
  31. use App\Entity\BlocEcran;
  32. use App\Entity\Publication;
  33. use App\Entity\Category;
  34. use App\Entity\Faq;
  35. use App\Entity\Lexique;
  36. use App\Entity\ErreurQuizz;
  37. use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
  38. use Knp\Snappy\Pdf as KnpSnappyPdf;
  39. class DefaultController extends AbstractController
  40. {
  41.     private $client null;
  42.     public function __construct(private readonly EntityManagerInterface $em, private readonly StorageService $storage)
  43.     {
  44.         $this->client = new Client();
  45.     }
  46.     public function getTwitter()
  47.     {
  48.         $connection = new TwitterOAuth($this->getParameter('twitter_consumer_key'), $this->getParameter('twitter_consumer_secret'), $this->getParameter('twitter_access_token'), $this->getParameter('twitter_access_token_secret'));
  49.         $connection->setTimeouts(3060);
  50.         $screen_name "EmilieM25909392"// compte twitter test
  51.         if ($this->getParameter('app_environment') != "dev"$screen_name "mediationtelco";
  52.         $content $connection->get("statuses/user_timeline", array("screen_name" => $screen_name"count" => 1"tweet_mode" => "extended"));
  53.         $hour 14;
  54.         $text "Le #Médiateur instruit les dossiers en toute #indépendance et c'est gratuit http://bit.ly/2kJB4Qe  #médiation #télécoms #consommateurs";
  55.         if ($connection->getLastHttpCode() == 200) {
  56.             $hour date("G", (time() - strtotime($content[0]->created_at)));
  57.             $text $this->getTwitterLinks($content[0]);
  58.         }
  59.         $datas = array("hour" => $hour"text" => $text);
  60.         return new Response(json_encode($datas));
  61.     }
  62.     /**
  63.      * Get clickabled links, hastags, etc. in tweet content
  64.      **/
  65.     private function getTwitterLinks($tweet)
  66.     {
  67.         $hashtags $user_mentions $urls $medias = array();
  68.         if (isset($tweet->retweeted_status)) {
  69.             $text $tweet->retweeted_status->full_text;
  70.             if (isset($tweet->retweeted_status->entities->hashtags))
  71.                 $hashtags $tweet->retweeted_status->entities->hashtags;
  72.             if (isset($tweet->retweeted_status->entities->user_mentions))
  73.                 $user_mentions $tweet->retweeted_status->entities->user_mentions;
  74.             if (isset($tweet->retweeted_status->entities->urls))
  75.                 $urls $tweet->retweeted_status->entities->urls;
  76.             if (isset($tweet->retweeted_status->entities->media))
  77.                 $medias $tweet->retweeted_status->entities->media;
  78.         } else {
  79.             $text $tweet->full_text;
  80.             if (isset($tweet->entities->hashtags))
  81.                 $hashtags $tweet->entities->hashtags;
  82.             if (isset($tweet->entities->user_mentions))
  83.                 $user_mentions $tweet->entities->user_mentions;
  84.             if (isset($tweet->entities->urls))
  85.                 $urls $tweet->entities->urls;
  86.             if (isset($tweet->entities->media))
  87.                 $medias $tweet->entities->media;
  88.         }
  89.         // hastags
  90.         $linkified = array();
  91.         foreach ($hashtags as $hashtag) {
  92.             $hash $hashtag->text;
  93.             if (in_array($hash$linkified)) {
  94.                 continue; // do not process same hash twice or more
  95.             }
  96.             $linkified[] = $hash;
  97.             // replace single words only, so looking for #Google we wont linkify >#Google<Reader
  98.             $text preg_replace('/#\b' $hash '\b/'sprintf('<a href="https://twitter.com/search?q=%%23%2$s&src=hash" target="_blank">#%1$s</a>'$hashurlencode($hash)), $text);
  99.         }
  100.         // user mentions
  101.         $linkified = array();
  102.         foreach ($user_mentions as $userMention) {
  103.             $name $userMention->name;
  104.             $screenName $userMention->screen_name;
  105.             if (in_array($screenName$linkified)) {
  106.                 continue; // do not process same user mention twice or more
  107.             }
  108.             $linkified[] = $screenName;
  109.             // replace single words only, so looking for @John we wont linkify >@John<Snow
  110.             $text preg_replace('/@\b' $screenName '\b/'sprintf('<a href="https://www.twitter.com/%1$s" title="%2$s" target="_blank">@%1$s</a>'$screenName$name), $text);
  111.         }
  112.         // urls
  113.         $linkified = array();
  114.         foreach ($urls as $url) {
  115.             $expandedUrl $url->expanded_url;
  116.             $url $url->url;
  117.             if (in_array($url$linkified)) {
  118.                 continue; // do not process same url twice or more
  119.             }
  120.             $linkified[] = $url;
  121.             $text str_replace($urlsprintf('<a href="%1$s" title="%2$s" target="_blank">%1$s</a>'$url$expandedUrl), $text);
  122.         }
  123.         // media
  124.         $linkified = array();
  125.         foreach ($medias as $media) {
  126.             $mediaUrl $media->media_url;
  127.             $media $media->url;
  128.             if (in_array($media$linkified)) {
  129.                 continue; // do not process same url twice or more
  130.             }
  131.             $linkified[] = $media;
  132.             $text str_replace($mediasprintf('<a href="%1$s" title="%2$s" target="_blank">%1$s</a>'$media$mediaUrl), $text);
  133.         }
  134.         return $text;
  135.     }
  136.     /**
  137.      * @Route("/", name="homepage")
  138.      */
  139.     public function indexAction(Request $request)
  140.     {
  141.         // replace this example code with whatever you need
  142.         $home $this->em->getRepository(Home::class)->findBy(array(), array('ordre' => 'ASC'));
  143.         $contenus $this->em->getRepository(Contenu::class)->findBy(array("page" => "home"));
  144.         $blocs = array();
  145.         foreach ($contenus as $contenu) {
  146.             $blocs[$contenu->getCode()] = $contenu;
  147.         }
  148.         return $this->render('Front/Default/index.html.twig', array("home" => $home"blocs" => $blocs));
  149.     }
  150.     
  151.     /**
  152.      * @Route("/tweet", name="tweet")
  153.      */
  154.     public function tweet(Request $request)
  155.     {
  156.         $tweet json_decode($this->getTwitter()->getContent());
  157.         return $this->render('Front/Default/tweet.html.twig', array("tweet_hour" => $tweet->hour"tweet_text" => $tweet->text));
  158.     }
  159.     /**
  160.      * @Route("/membres", name="membres")
  161.      */
  162.     public function membresAction()
  163.     {
  164.         $membres $this->em->getRepository(Member::class)->findBy(array(), array("ordre" => "ASC"));
  165.         //$client = new \Zend\XmlRpc\Client($this->container->getParameter('ws_url'));
  166.         //$xmlString = $client->call('saisine.brandList', array());
  167.         //$membres = new \SimpleXMLElement($xmlString);
  168.         $tweet json_decode($this->getTwitter()->getContent());
  169.         return $this->render('Front/Default/membres.html.twig', array("membres" => $membres"tweet_hour" => $tweet->hour"tweet_text" => $tweet->text));
  170.     }
  171.     /**
  172.      * @Route("/detail_membre/{slug}", name="detail_membre")
  173.      */
  174.     public function detailMembreAction($slug)
  175.     {
  176.         $membre $this->em->getRepository(Member::class)->findOneBySlug($slug);
  177.         if(!$membre) return $this->redirectToRoute('membres');
  178.         $membres $this->em->getRepository(Member::class)->findBy(array(), array("nom" => "ASC"));
  179.         $tels $this->em->getRepository(Member::class)->getTels($membre->getId());
  180.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "detail_membre"), array("ordre" => "ASC"));
  181.         return $this->render('Front/Default/detail_membre.html.twig', array("membre" => $membre"blocsd" => $blocsd"membres" => $membres"tels" => $tels));
  182.     }
  183.     
  184.     /**
  185.      * @Route("/publications/{cat}", name="publications")
  186.      */
  187.     public function publicationsAction($cat null)
  188.     {
  189.         $form null;
  190.         switch($cat){
  191.             case "guides":
  192.                 $name_category "Guides";
  193.                 $title_page "Guides";
  194.                 break;
  195.             case "etudes":
  196.                 $name_category "Etudes";
  197.                 $title_page "Etudes";
  198.                 break;
  199.             case "chiffres-cles":
  200.                 $name_category "Chiffres Clés";
  201.                 $title_page "Chiffres Clés";
  202.                 break;
  203.             case "rapports-annuels":
  204.                 $name_category "Rapports annuels";
  205.                 $title_page "Rapports annuels";
  206.                 break;
  207.             default:
  208.                 $name_category null;
  209.                 $title_page "Publications";
  210.                 $form $this->createFormBuilder()
  211.                     ->add('categories'EntityType::class, array(
  212.                         'class' => Category::class,
  213.                         'expanded' => false,
  214.                         'multiple' => false,
  215.                         'choices' => $this->em->getRepository(Category::class)->findAllCategories(),
  216.                         'placeholder' => 'Afficher toutes les publications',
  217.                         'attr' => array("class" => "select-form")
  218.                     ))
  219.                     ->getForm();
  220.         
  221.         }
  222.         $publications $this->em->getRepository(Publication::class)->findPublications($name_category);
  223.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "publication"), array("ordre" => "ASC"));
  224.         return $this->render('Front/Default/publications.html.twig', array("publications" => $publications"url_page" => "publications""form" => $form $form->createView() : null"title_page" => $title_page"blocsd" => $blocsd));
  225.     }
  226.     
  227.      /**
  228.       * @Route("/actualites", name="actualites")
  229.       */
  230.     public function actualitesAction()
  231.     {
  232.         $publications $this->em->getRepository(Publication::class)->findPublications('Actualités');
  233.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "publication"), array("ordre" => "ASC"));
  234.         return $this->render('Front/Default/publications.html.twig', array("publications" => $publications"url_page" => "actualites""title_page" => "Actualités""blocsd" => $blocsd));
  235.     }
  236.     
  237.      /**
  238.       * @Route("/fiches_pratiques", name="fiches_pratiques")
  239.       */
  240.     public function fichesPratiquesAction()
  241.     {
  242.         $publications $this->em->getRepository(Publication::class)->findPublications('Fiches pratiques');
  243.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "publication"), array("ordre" => "ASC"));
  244.         return $this->render('Front/Default/publications.html.twig', array("publications" => $publications"url_page" => "fiches_pratiques""title_page" => "Fiches pratiques""blocsd" => $blocsd));
  245.     }
  246.     /**
  247.      * @Route("/publication_by_categorie/{id}", name="publication_by_categorie")
  248.      */
  249.     public function publicationByCategorieAction($id)
  250.     {
  251.         if ($id) {
  252.             $publications $this->em->getRepository(Publication::class)->findBy(array("category" => $id), array("date" => "DESC"));
  253.         } else {
  254.             $publications $this->em->getRepository(Publication::class)->findBy(array(), array("date" => "DESC"));
  255.         }
  256.         return $this->render('Front/Default/publication_by_categorie.html.twig', array("publications" => $publications));
  257.     }
  258.     /**
  259.      * @Route("/publications/{slug_cat}/{slug}", name="detail_publication")
  260.      */
  261.     public function detailPublicationAction($slug_cat$slug)
  262.     {
  263.         $publication $this->em->getRepository(Publication::class)->findOneBy(array('slug' => $slug));
  264.         $extension $file $associes null;
  265.         $folder $this->getParameter('app.publications_fichiers_directory');
  266.         if ($publication) {
  267.             $id $publication->getId();
  268.             $file $folder '/' $publication->getFichier();
  269.             $size 0;
  270.             $extension ".";
  271.             if ($publication->getFichier() && $this->storage->isFileExists($file)) {
  272.                 $extension $this->storage->getFileExtension($file);
  273.                 $size $this->storage->getFileSize($file) / 1024// size in ko
  274.                 if ($size 1024) {
  275.                     $unit "Ko";
  276.                 } else {
  277.                     $size /= 1024;
  278.                     $unit "Mo";
  279.                 }
  280.                 $size round($size) . $unit;
  281.             }
  282.             for ($i 2$i <= 3$i++) {
  283.                 $fonction "getFichier" $i;
  284.                 $file $folder '/' .  $publication->$fonction();
  285.                 $sizes[$i] = 0;
  286.                 $extensions[$i] = ".";
  287.                 if ($publication->$fonction() && $this->storage->isFileExists($file)) {
  288.                     $extensions[$i] = $this->storage->getFileExtension($file);
  289.                     $sizes[$i] = $this->storage->getFileSize($file) / 1024;  // size in ko
  290.                     if ($sizes[$i] < 1024) {
  291.                         $unit "Ko";
  292.                     } else {
  293.                         $sizes[$i] /= 1024;
  294.                         $unit "Mo";
  295.                     }
  296.                     $sizes[$i] = round($sizes[$i]) . $unit;
  297.                 }
  298.             }
  299.             $associes = array();
  300.             foreach ($publication->getTags() as $tag) {
  301.                 foreach ($tag->getPublications() as $p) {
  302.                     if ($p->getId() != $id) {
  303.                         $associes[$p->getId()] = $p;
  304.                     }
  305.                 }
  306.             }
  307.         }
  308.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "detail_publication"), array("ordre" => "ASC"));
  309.         return $this->render('Front/Default/detail_publication.html.twig', array("publication" => $publication"associes" => $associes"blocsd" => $blocsd"extension" => $extension"size" => $size"sizes" => $sizes"extensions" => $extensions));
  310.     }
  311.     
  312.     /**
  313.      * @Route("/modification-informations", name="change_password")
  314.      */
  315.     public function changePasswordAction(Request $request)
  316.     {
  317.         $session $request->getSession();
  318.         if (!$session->has("user_token")) {
  319.             return $this->redirectToRoute('espace');
  320.         }
  321.         
  322.         $form $this->createFormBuilder(null, array(
  323.             'action' => $this->generateUrl('change_password'),
  324.             'method' => 'POST',
  325.             'attr' => ['class' => '']
  326.         ))
  327.         ->add('plainPassword'RepeatedType::class, array(
  328.             'type' => PasswordType::class,
  329.             'invalid_message' => 'Les mots de passe doivent être identifiques',
  330.             'first_options'  => array('label_attr'=> array('class'=>'label'), 'label' => 'Votre nouveau mot de passe*' 'attr' => array( 'pattern' => '^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*_=+-]).{8,}$' ) ),
  331.             'second_options' => array('label_attr'=> array('class'=>'label'), 'label' => 'Confirmer mot de passe*' 'attr' => array( 'pattern' => '^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*_=+-]).{8,}$' )),
  332.         ))
  333.         ->add('save'SubmitType::class, array('label' => 'Continuer''attr' => array('class'=> 'btn btn-blue' )))
  334.         ->getForm();
  335.         $form->handleRequest($request);
  336.         $result '';
  337.         $valide_response '';
  338.         if ($form->isSubmitted() && $form->isValid()) {
  339.             $data $form->getData();
  340.             $data['username'] = $request->getSession()->get("user_login");
  341.             $data['password'] = $data['plainPassword'];
  342.             try {
  343.                 $url $this->getParameter('api_url') . '/user/change-password';
  344.                 $headers = array(
  345.                     'Authorization' => 'Bearer ' $session->get("user_token"),
  346.                     'Content-Type' => 'application/json; charset=utf-8'
  347.                 );
  348.                 $response $this->client->post($url, array('headers' => $headers'body' => json_encode($data)));
  349.                 $reponse json_decode($response->getBody()->getContents());
  350.                 if($reponse == 1$this->addFlash("success""Le mot de passe a été modifié");
  351.                 else $this->addFlash("error""Une erreur est survenue. Veuillez réessayer.");
  352.             } catch (RequestException $e) {
  353.                 // erreur
  354.                 $this->addFlash("error""Une erreur est survenue. Veuillez réessayer.");
  355.             }
  356.         }
  357.         return $this->render('Front/Default/user.change.password.html.twig', array(
  358.             'form' => $form->createView(),
  359.         
  360.         
  361.         ));
  362.         
  363.     }
  364.     /**
  365.      * @Route("/affaires", name="affaires")
  366.      */
  367.     public function affairesAction(Request $request)
  368.     {
  369.         $session $request->getSession();
  370.         if (!$session->has("user_token")) {
  371.             return $this->redirectToRoute('espace');
  372.         }
  373.         
  374.         $request->getSession()->set("affair_id"null);
  375.         $membre $session->get("membre");
  376.         $block_quiz $session->get("block_quiz");
  377.         // if cookie "membre" and !cookie block_quiz is defined: quizz done and is ok, redirect to "saisine"
  378.         $is_quizz false;
  379.         if ($membre && !$block_quiz$is_quizz true;
  380.         if ($is_quizz) return $this->redirectToRoute('saisine_intro');
  381.         $url $this->getParameter('api_url') . "/affaires/list";
  382.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"));
  383.         $response $this->client->get($url, array('headers' => $header));
  384.         $results json_decode($response->getBody()->getContents());
  385.         
  386.         $date_before = new \Datetime('2021-09-15'); // affairs created before this date can't be finished if in process
  387.         $date_before->setTime(0,0,0);
  388.         $now = new \Datetime();
  389.         $begin_date = new \Datetime('2022-12-25 23:59:00'); // affairs created after 25/12
  390.         if($now >= $begin_date) {
  391.             $date_before = new \Datetime('2023-01-02 00:00:00'); // date wanted by the client : affairs created before this date can't be finished if in process (if now >= to this date)
  392.         
  393.         $affaires = array();
  394.         foreach ($results as $result) {
  395.             $affaires[$result->id] = 
  396.                 array(
  397.                     "numero" => $result->numero
  398.                     "status" => $result->status
  399.                     "id" => $result->id
  400.                     "client" => $result->client
  401.                     "closed_at" => $result->closed_at,
  402.                     "created_at" => $result->created_at,
  403.                     "updated_at" => $result->updated_at,
  404.                     "notification_at" => $result->notification_at,
  405.                     "send_avis_at" => $result->send_avis_at,
  406.                     "suite_davis_at" => $result->suite_davis_at,
  407.                     "envoi_global_at" => $result->envoi_global_at,
  408.                     "send_to_operateur" => $result->send_to_operateur,
  409.                     "owner_phone_number" => $result->owner_phone_number,
  410.                     "owner_contract_number" => $result->owner_contract_number,
  411.                     "brand" => $result->brand,
  412.                     "qualification_definitive_at" => $result->qualification_definitive_at,
  413.                     "cloture_suite_davis_at" => $result->cloture_suite_davis_at,
  414.                     "fin_saisine_at" => $result->fin_saisine_at,
  415.                     "sent_compte_rendu_at" =>  $result->sent_compte_rendu_at,
  416.                     "affect_amce_at" => $result->affect_amce_at,
  417.                     "mise_en_oeuvre_at" => $result->mise_en_oeuvre_at,
  418.                     "cloture_mise_en_oeuvre_at" => $result->cloture_mise_en_oeuvre_at,
  419.                     "is_autorised_demande_docs" => $result->is_autorised_demande_docs,
  420.                     "is_missing_docs" => $result->is_missing_docs,
  421.                     "is_refuse_entree_mediation" => $result->is_refuse_entree_mediation,
  422.                 );
  423.         }
  424.         
  425.         return $this->render('Front/Default/affaires.html.twig', array("affaires" => $affaires"date_before" => $date_before));
  426.     }
  427.     /**
  428.      * @Route("/modif_affaire", name="modif_affaire")
  429.      */
  430.     public function modifAffaireAction(Request $request)
  431.     {
  432.         $id $request->get("id");
  433.         $request->getSession()->set("affair_id_new"$id);
  434.         return $this->redirectToRoute('saisine');
  435.     }
  436.     /**
  437.      * @Route("/suppr_affaire", name="suppr_affaire")
  438.      */
  439.     public function supprAffaireAction(Request $request)
  440.     {
  441.         $id $request->get("id");
  442.         $session $request->getSession();
  443.         $url $this->getParameter('api_url') . "/affaires/suppression/" $id;
  444.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"));
  445.         $response $this->client->get($url, array('headers' => $header));
  446.         $affair json_decode($response->getBody()->getContents());
  447.         return $this->redirectToRoute('affaires');
  448.     }
  449.     
  450.     /**
  451.      * @Route("/saisine-intro", name="saisine_intro")
  452.      */
  453.     public function saisineIntroAction(Request $request)
  454.     {    
  455.         $session $request->getSession();
  456.         if (!$session->has("user_token")) {
  457.             return $this->redirectToRoute('espace');
  458.         }
  459.         
  460.         if (!$session->has("membre") || !$session->get("membre") ) {
  461.             return $this->redirectToRoute('espace');
  462.         }
  463.         
  464.         $date_service_client $session->get("date_service_client"null);
  465.         $date_service_conso $session->get("date_service_conso"null);
  466.         $date_reponse_service_client $session->get("date_reponse_service_client"null);
  467.         $date_reponse_service_conso $session->get("date_reponse_service_conso"null);
  468.         $service_conso_contact $session->get("service_conso_contact"null);
  469.         $reponse_service_client $session->get("reponse_service_client"null);
  470.         $reponse_service_conso $session->get("reponse_service_conso"null);
  471.         
  472.         //~ echo "<br>date_service_client => $date_service_client";
  473.         //~ echo "<br>date_service_conso => $date_service_conso";
  474.         //~ echo "<br>date_reponse_service_client => $date_reponse_service_client";
  475.         //~ echo "<br>date_reponse_service_conso => $date_reponse_service_conso";
  476.         //~ echo "<br>service_conso_contact => $service_conso_contact";
  477.         //~ echo "<br>reponse_service_client => $reponse_service_client";
  478.         //~ echo "<br>reponse_service_conso => $reponse_service_conso";
  479.         //~ die;
  480.         
  481.         if(!$date_service_client && !$date_service_conso && !$date_reponse_service_client
  482.             && !$date_reponse_service_conso && !$service_conso_contact && !$reponse_service_client 
  483.             && !$reponse_service_conso
  484.           ) { // aucune information renseignée => retour au quizz
  485.              return $this->redirectToRoute('quizz');
  486.         }
  487.         
  488.         $membre_quiz $session->get("membre");
  489.         //~ var_dump($membre_quiz);
  490.         $session->set("membre"null); // pour ne plus être redirigé vers la saisine à la connexion
  491.         
  492.         // mode creation
  493.         $affair_id $session->get("affair_id_new");
  494.         if (!$affair_id) {
  495.             $datas = array('membre' => $membre_quiz->getNom());
  496.             
  497.             $url $this->getParameter('api_url') . "/affaire/creation";
  498.             $header = array('Authorization' => 'Bearer ' $session->get("user_token"), 'Content-Type' => 'application/json; charset=utf-8');
  499.             $response $this->client->post($url, array('headers' => $header'body' => json_encode$datas ) ));
  500.             
  501.             $affair_id json_decode($response->getBody()->getContents());
  502.             $session->set("affair_id_new"$affair_id);
  503.             
  504.             // enregistrement des dates et réponses dans la saisine
  505.             $datas_dates = array(
  506.                 'affair_id' => $affair_id,
  507.                 'date_service_client' => $date_service_client,
  508.                 'date_service_conso' => $date_service_conso,
  509.                 'date_reponse_service_client' => $date_reponse_service_client,
  510.                 'date_reponse_service_conso' => $date_reponse_service_conso,
  511.                 'service_conso_contact' => $service_conso_contact,
  512.                 'reponse_service_client' => $reponse_service_client,
  513.                 'reponse_service_conso' => $reponse_service_conso
  514.             );
  515.             $url_save_dates $this->getParameter('api_url') . "/saisine/saveDatasDates";
  516.             $header = array('Authorization' => 'Bearer ' $session->get("user_token"), 'Content-Type' => 'application/json; charset=utf-8');
  517.             $response $this->client->post($url_save_dates, array('headers' => $header'body' => json_encode($datas_dates)));
  518.             $reponse json_decode($response->getBody()->getContents());
  519.             if ($reponse != 'OUI') {
  520.                 return $this->redirectToRoute('quizz');
  521.             }
  522.         }
  523.         
  524.         return $this->render('Front/Default/saisine.intro.html.twig',
  525.             array(
  526.                 'affair_id' => $affair_id,
  527.                 'membre_quiz' => $membre_quiz
  528.             )
  529.         );
  530.         
  531.     }
  532.     /**
  533.      * @Route("/saisine", name="saisine")
  534.      */
  535.     public function saisineAction(Request $request)
  536.     {    
  537.         $session $request->getSession();
  538.         if (!$session->has("user_token")) {
  539.             return $this->redirectToRoute('espace');
  540.         }
  541.         
  542.         $affair_id $session->get("affair_id_new");
  543.         
  544.         if(!$affair_id) {
  545.             return $this->redirectToRoute('espace');
  546.         }
  547.         
  548.         if($affair_id == -1){
  549.             return $this->redirectToRoute('quizz');
  550.         }
  551.         
  552.         $ovh_is_operateur $session->get("ovh_is_operateur""-1");
  553.         
  554.         $url $this->getParameter('api_url') . "/affaires/details/" . (int)$affair_id;
  555.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"));
  556.         $response $this->client->get($url, array('headers' => $header));
  557.         $infos_affaire json_decode($response->getBody()->getContents());
  558.         
  559.         if($infos_affaire && $infos_affaire->status == 4// go to "Messagerie" page to upload files and finalize saisine
  560.             return $this->redirectToRoute('detail_affair_messages', array('id' => $affair_id));
  561.         
  562.         
  563.         $mail $request->getSession()->get("user_login");
  564.         $membre_quiz $session->get("membre");
  565.         //~ $session->set("membre", null); // pour ne plus être redirigé vers la saisine à la connexion
  566.         $form $this->createFormBuilder()
  567.             ->add('titre1'TextType::class)
  568.             ->add('doc1'FileType::class)
  569.             ->add('save'SubmitType::class, array('label' => 'Enregistrer'))
  570.             ->getForm();
  571.         $form->handleRequest($request);
  572.         if ($form->isSubmitted() && $form->isValid()) {
  573.             $datas $form->getData();
  574.         }
  575.         
  576.         $url $this->getParameter('api_url') . "/brands/list";
  577.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"));
  578.         $response $this->client->get($url, array('headers' => $header));
  579.         $membres json_decode($response->getBody()->getContents());
  580.         $url $this->getParameter('api_url') . "/medias/list";
  581.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"));
  582.         $response $this->client->get($url, array('headers' => $header));
  583.         $medias json_decode($response->getBody()->getContents());
  584.         $url $this->getParameter('api_url') . "/representants/list";
  585.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"));
  586.         $response $this->client->get($url, array('headers' => $header));
  587.         $data json_decode($response->getBody()->getContents());
  588.         $representants $data->types;
  589.         $allRepresentants  = (array)$data->all;
  590.         return $this->render('Front/Default/saisine.html.twig',
  591.             array(
  592.                 'affair_id' => $affair_id,
  593.                 'representants' => $representants,
  594.                 'allRepresentants' => $allRepresentants,
  595.                 'membres' => $membres,
  596.                 'medias' => $medias,
  597.                 'form' => $form->createView(),
  598.                 'mail' => $mail,
  599.                 'membre_quiz' => $membre_quiz,
  600.                 'infos_affaire' => $infos_affaire,
  601.                 'ovh_is_operateur' => $ovh_is_operateur
  602.             )
  603.         );
  604.     }
  605.     
  606.     /**
  607.      * @Route("/phase1", name="phase1")
  608.      */
  609.     public function phase1Action(Request $request)
  610.     {
  611.         $session $request->getSession();
  612.         
  613.         if (!$session->has("user_token")) {
  614.             return $this->redirectToRoute('espace');
  615.         }
  616.         
  617.         $affaire_id $session->get("affair_id_new");
  618.         if(!$affaire_id){
  619.             return $this->redirectToRoute('affaires');
  620.         }
  621.         
  622.         $mail $request->getSession()->get("user_login");
  623.         $datas = array(
  624.             "affair_id" => (int)$affaire_id,
  625.             "media_id" => $request->get("media"),
  626.             "membre" => $request->get("membre"),
  627.             "owner_phone_number" => $request->get("tel_litige"),
  628.             "owner_contract_number" => $request->get("contrat_litige"),
  629.         );
  630.        
  631.         $url $this->getParameter('api_url') . "/saisine/phase1";
  632.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"), 'Content-Type' => 'application/json; charset=utf-8');
  633.         $response $this->client->post($url, array('headers' => $header'body' => json_encode($datas)));
  634.         $reponse json_decode($response->getBody()->getContents());
  635.         if ($reponse != 'OUI') {
  636.             return new Response(json_encode($reponse));
  637.         }
  638.         return new Response("OUI");
  639.     }
  640.     /**
  641.      * @Route("/phase4", name="phase4")
  642.      */
  643.     public function phase4Action(Request $request)
  644.     {
  645.         $session $request->getSession();
  646.         if (!$session->has("user_token")) {
  647.             return $this->redirectToRoute('espace');
  648.         }
  649.         $affaire_id $session->get("affair_id_new");
  650.         $mail $request->getSession()->get("user_login");
  651.         $genre $request->get("genre");
  652.         if($genre == 'mr'$val_genre "Monsieur";
  653.         elseif($genre == 'mme'$val_genre "Madame";
  654.         else $val_genre "";
  655.         $datas = array(
  656.             "affair_id" => (int)$affaire_id,
  657.             "denomination" => $val_genre,
  658.             "last_name" => $request->get("nom"),
  659.             "first_name" => $request->get("prenom"),
  660.             "address1" => $request->get("adresse"),
  661.             "address2" => $request->get("adresse2"),
  662.             "address3" => $request->get(""),
  663.             "postal_code" => $request->get("cp"),
  664.             "city" => $request->get("ville"),
  665.             "country" => $request->get("pays"),
  666.             "phone" => $request->get("tel"),
  667.             "mail" => $request->get("mail"),
  668.             "owner_phone_number" => $request->get("tel_litige"),
  669.             "owner_contract_number" => $request->get("contrat_litige"),
  670.             "owner_last_name" => $request->get("nom_titulaire"),
  671.             "owner_first_name" => $request->get("prenom_titulaire"),
  672.             "user_email" => $mail
  673.         );
  674.         if ($request->get("representant") == "representant") {
  675.             $genre_representant $request->get("genre_representant");
  676.             if($genre_representant == 'mr'$val_genre_representant "Monsieur";
  677.             elseif($genre_representant == 'mme'$val_genre_representant "Madame";
  678.             else $val_genre_representant "";
  679.             
  680.             $datas2 = array(
  681.                 "is_representant" => "oui",
  682.                 "authority_type_id" => $request->get("qualite"),
  683.                 "represent" => $request->get("represent"),
  684.                 "authority_name" => $request->get("institution"),
  685.                 "denomination_representant" => $val_genre_representant,
  686.                 "last_name_representant" => $request->get("nom_representant"),
  687.                 "first_name_representant" => $request->get("prenom_representant"),
  688.                 "email_representant" => $request->get("email_representant"),
  689.                 "address1_representant" => $request->get("adresse_representant"),
  690.                 "address2_representant" => $request->get("adresse2_representant"),
  691.                 "postal_code_representant" => $request->get("cp_representant"),
  692.                 "city_representant" => $request->get("ville_representant"),
  693.                 "country_representant" => $request->get("pays_representant"),
  694.                 "phone_representant" => $request->get("tel_representant")
  695.             );
  696.             $datas array_merge($datas$datas2);
  697.         }
  698.         $url $this->getParameter('api_url') . "/saisine/phase4";
  699.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"), 'Content-Type' => 'application/json; charset=utf-8');
  700.         $response $this->client->post($url, array('headers' => $header'body' => json_encode($datas)));
  701.         $reponse json_decode($response->getBody()->getContents());
  702.         if ($reponse != 'OUI') {
  703.             return new Response(json_encode($reponse));
  704.         }
  705.         return new Response("OUI");
  706.     }
  707.     
  708.     /**
  709.      * @Route("/phase2Old", name="phase2Old")
  710.      */
  711.     public function phase2OldAction(Request $request)
  712.     {
  713.         $session $request->getSession();
  714.         if (!$session->has("user_token")) {
  715.             return $this->redirectToRoute('espace');
  716.         }
  717.         $affaire_id $session->get("affair_id_new");
  718.         /* $datas = array("user_id" => $session->get("user_id"));
  719.         $client->call('saisine.connexion', array('datas' => $datas));
  720.         $datas = array("user_id" => $session->get("user_id"), "brand_id" => $request->get("membre"), "affair_id" => (int)$affaire_id);
  721.         $reponse = $client->call('saisine.setBrand', array("datas" => $datas)); */
  722.         $session->set("media_id"$request->get("media"));
  723.         $datas = array(
  724.             "affair_id" => (int)$affaire_id,
  725.             "media_id" => $request->get("media"),
  726.             "membre" => $request->get("membre"),
  727.             "consumer_service_contacted" => $request->get("ecrit_con") == "pas_reponse" 0,
  728.             "consumer_service_date_contact" => $request->get("ecrit_con") == "pas_reponse" $request->get("depose_con_annee") . "-" $request->get("depose_con_mois") . "-" $request->get("depose_con_jour") : null,
  729.             "consumer_service_type_contact" => "courrier",
  730.             "consumer_service_response" => $request->get("ecrit_con") == "satisfait_pas" 0,
  731.             "consumer_service_date_response" => $request->get("ecrit_con") == "satisfait_pas" $request->get("recu_con_annee") . "-" $request->get("recu_con_mois") . "-" $request->get("recu_con_jour") : null,
  732.             "client_service_bad_answer" => ($request->get("non_satisfait") == "oui" || $request->get("non_satisfait_copie") == "oui") ? 0,
  733.             "client_service_cant_inform" => "",
  734.             "client_service_contacted" => $request->get("ecrit_client") == "oui" 0,
  735.             "client_service_date_contact" => $request->get("ecrit_client_jour") != && $request->get("ecrit_client_inconnu") != "oui" $request->get("ecrit_client_annee") . "-" $request->get("ecrit_client_mois") . "-" $request->get("ecrit_client_jour") : null,
  736.             "client_service_type_contact" => $request->get("mode_contact"),
  737.             "client_service_response" => ($request->get("non_satisfait") == "oui" || $request->get("non_satisfait_copie") == "oui") ? 0,
  738.             "client_service_date_response" => null,
  739.             "law_suit_started" => 0,
  740.         );
  741.         $url $this->getParameter('api_url') . "/saisine/phase1DossierForm";
  742.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"), 'Content-Type' => 'application/json; charset=utf-8');
  743.         $response $this->client->post($url, array('headers' => $header'body' => json_encode($datas)));
  744.         $reponse json_decode($response->getBody()->getContents());
  745.         if ($reponse != 'OUI') {
  746.             return new Response(json_encode($reponse));
  747.         }
  748.         return new Response("OUI");
  749.     }
  750.     /**
  751.      * @Route("/phase2", name="phase2")
  752.      */
  753.     public function phase2Action(Request $request)
  754.     {
  755.         $session $request->getSession();
  756.         if (!$session->has("user_token")) {
  757.             return $this->redirectToRoute('espace');
  758.         }
  759.         $affaire_id $session->get("affair_id_new");
  760.         $datas = array(
  761.             "affair_id" => (int)$affaire_id,
  762.             "description" => $request->get("historique"),
  763.             "partial_solution" => $request->get("resolu") == "oui" 0,
  764.             "partial_solution_description" => $request->get("donnees"),
  765.             "expectation" => $request->get("attendu"),
  766.         );
  767.         $url $this->getParameter('api_url') . "/saisine/phase2Litige";
  768.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"), 'Content-Type' => 'application/json; charset=utf-8');
  769.         $response $this->client->post($url, array('headers' => $header'body' => json_encode($datas)));
  770.         $reponse json_decode($response->getBody()->getContents());
  771.         if ($reponse != 'OUI') {
  772.             return new Response(json_encode($reponse));
  773.         }
  774.         return new Response("OUI");
  775.     }
  776.     
  777.     /**
  778.      * @Route("/phase3", name="phase3")
  779.      */
  780.     public function phase3Action(Request $request)
  781.     {
  782.         $session $request->getSession();
  783.         if (!$session->has("user_token")) {
  784.             return $this->redirectToRoute('espace');
  785.         }
  786.         $affaire_id $session->get("affair_id_new");
  787.         /* $datas = array("user_id" => $session->get("user_id"));
  788.         $client->call('saisine.connexion', array('datas' => $datas));
  789.         $datas = array("user_id" => $session->get("user_id"), "brand_id" => $request->get("membre"), "affair_id" => (int)$affaire_id);
  790.         $reponse = $client->call('saisine.setBrand', array("datas" => $datas)); */
  791.         $session->set("media_id"$request->get("media"));
  792.         $datas = array(
  793.             "affair_id" => (int)$affaire_id,
  794.             "client_service_type_contact" => $request->get("mode_contact"),
  795.             "reponse_service_client" => $request->get("reponse_service_client"), // null, "non_satisfait" ou "plus_2_mois"
  796.             "consumer_service_response" => $request->get("ecrit_con") == "satisfait_pas" 0,
  797.             
  798.             //~ "consumer_service_contacted" => $request->get("ecrit_con") == "pas_reponse" ? 1 : 0,
  799.             //~ "consumer_service_date_contact" => $request->get("ecrit_con") == "pas_reponse" ? $request->get("depose_con_annee") . "-" . $request->get("depose_con_mois") . "-" . $request->get("depose_con_jour") : null,
  800.             //~ "consumer_service_type_contact" => "courrier",
  801.             //~ "consumer_service_response" => $request->get("ecrit_con") == "satisfait_pas" ? 1 : 0,
  802.             //~ "consumer_service_date_response" => $request->get("ecrit_con") == "satisfait_pas" ? $request->get("recu_con_annee") . "-" . $request->get("recu_con_mois") . "-" . $request->get("recu_con_jour") : null,
  803.             //~ "client_service_bad_answer" => ($request->get("non_satisfait") == "oui" || $request->get("non_satisfait_copie") == "oui") ? 1 : 0,
  804.             //~ "client_service_cant_inform" => "",
  805.             //~ "client_service_contacted" => $request->get("ecrit_client") == "oui" ? 1 : 0,
  806.             //~ "client_service_date_contact" => $request->get("ecrit_client_jour") != 0 && $request->get("ecrit_client_inconnu") != "oui" ? $request->get("ecrit_client_annee") . "-" . $request->get("ecrit_client_mois") . "-" . $request->get("ecrit_client_jour") : null,
  807.            
  808.             //~ "client_service_response" => ($request->get("non_satisfait") == "oui" || $request->get("non_satisfait_copie") == "oui") ? 1 : 0,
  809.             //~ "client_service_date_response" => null,
  810.         );
  811.         $url $this->getParameter('api_url') . "/saisine/phase3Echanges";
  812.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"), 'Content-Type' => 'application/json; charset=utf-8');
  813.         $response $this->client->post($url, array('headers' => $header'body' => json_encode($datas)));
  814.         $reponse json_decode($response->getBody()->getContents());
  815.         if ($reponse != 'OUI') {
  816.             return new Response(json_encode($reponse));
  817.         }
  818.         return new Response("OUI");
  819.     }
  820.     /**
  821.      * @Route("/phase4Old", name="phase4Old")
  822.      */
  823.     public function phase4OldAction(Request $requestMailerInterface $mailer)
  824.     {
  825.         $session $request->getSession();
  826.         //~ $affaire_id = $session->get("affair_id");
  827.         if (!$session->has("user_token")) {
  828.             return $this->redirectToRoute('espace');
  829.         }
  830.         $affaire_id $request->get("affair_id_new");
  831.         $files = array();
  832.         $type_envoi $request->get("envoi");
  833.         $datas = array(
  834.             "affair_id" => (int)$affaire_id,
  835.             "by_post" => $type_envoi == "poste" 0,
  836.             "by_mail" => $type_envoi == "electronique" 0,
  837.             
  838.         );
  839.         $baseurl $request->getScheme() . '://' $request->getHttpHost() . $request->getBasePath();
  840.         $tmpFiles = [];
  841.         for ($i 1$i <= 10$i++) {
  842.             if ($request->get("document_description_" $i)) {
  843.                 $file $request->files->get("document_file_" $i);
  844.                 if ($file) {
  845.                     $datas["document_description_" $i] = $request->get("document_description_" $i);
  846.                     $ext $file->getClientOriginalExtension();
  847.                     if (null == $ext || $ext == '') {
  848.                         $this->addFlash("error""Extension du fichier invalide. Veuillez vérifier votre fichier.");
  849.                         return $this->redirectToRoute('saisine'$request->query->all());
  850.                     }
  851.                     $name $file->getClientOriginalName();
  852.                     $filename uniqid() . "." $ext;
  853.                     $this->storage->moveFileToStorage('app.affair_files_directory'$filename$file);
  854.                     $datas["document_file_" $i] = $baseurl $this->storage->getFileStorageUrl('app.affair_files_directory'$filename );
  855.                     $datas["document_name_" $i] = $name;
  856.                     $tmpFiles[] = $filename;
  857.                 }
  858.             }
  859.         }
  860.         $url $this->getParameter('api_url') . "/saisine/phase2Pieces";
  861.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"), 'Content-Type' => 'application/json; charset=utf-8');
  862.         $response $this->client->post($url, array('headers' => $header'body' => json_encode($datas)));
  863.         $reponse json_decode($response->getBody()->getContents());
  864.         if ($reponse == 'OUI') {
  865.             foreach ($tmpFiles as $fileName) {
  866.                 $this->storage->deleteFileFromStorage('app.affair_files_directory'$fileName);
  867.             }
  868.         }
  869.         // reset cookie "membre"
  870.         $session->set("membre"null);
  871.         $session->set("affair_id"null);
  872.         $session->set("aaffair_id_new"null);
  873.         // envoi mail de confirmation de prise en compte de la saisine que pour les saisines 100% web
  874.         if ($type_envoi != "poste") {
  875.             $mail $request->getSession()->get("user_login");
  876.             $message = (new Email())
  877.                 ->from(new Address('noreply@mediation-telecom.org''Le Médiateur des Communications Electroniques'))
  878.                 ->to($mail)
  879.                 ->subject("Votre saisine du Médiateur des Communications Electroniques")
  880.                 ->html($this->renderView('Front/Mail/mail.fin.saisine.html.twig', ['type' => $type_envoi]));
  881.                 
  882.             $mailer->send($message);
  883.         }
  884.         
  885.         return $this->render('Front/Default/fin_saisine.html.twig', array('type_envoi' => $type_envoi));
  886.     }
  887.     /**
  888.      * @Route("/faq", name="faq")
  889.      */
  890.     public function FAQAction(Request $request)
  891.     {
  892.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "faq"), array("ordre" => "ASC"));
  893.         $faq $this->em->getRepository(Faq::class)->findBy(array(), array("ordre" => "asc"));
  894.         return $this->render('Front/Default/faq.html.twig', array("blocsd" => $blocsd"faq" => $faq));
  895.     }
  896.     /**
  897.      * @Route("/lexique", name="lexique")
  898.      */
  899.     public function lexiqueAction(Request $request)
  900.     {
  901.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "lexique"), array("ordre" => "ASC"));
  902.         $termes $this->em->getRepository(Lexique::class)->findBy(array(), array('terme' => 'asc'));
  903.         return $this->render('Front/Default/lexique.html.twig', array('termes' => $termes"blocsd" => $blocsd));
  904.     }
  905.     /**
  906.      * @Route("/mediateur", name="mediateur")
  907.      */
  908.     public function mediateurAction(Request $request)
  909.     {
  910.         $blocs $this->em->getRepository(Contenu::class)->createQueryBuilder('c')
  911.             ->where('c.code LIKE :code')
  912.             ->andWhere('c.page = :page')
  913.             ->orderBy('c.ordre''ASC')
  914.             ->setParameter('code''BLOC')
  915.             ->setParameter('page''mediateur')
  916.             ->getQuery()
  917.             ->getResult();
  918.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "mediateur"), array("ordre" => "ASC"));
  919.         $intro $this->em->getRepository(Contenu::class)->findOneBy(array("code" => "INTRO""page" => "mediateur"));
  920.         return $this->render('Front/Default/mediateur.html.twig', array("intro" => $intro"blocs" => $blocs"blocsd" => $blocsd));
  921.     }
  922.     /**
  923.      * @Route("/qui-sommes-nous", name="qsn")
  924.      */
  925.     public function quiSommesNousAction(Request $request)
  926.     {
  927.         $blocs $this->em->getRepository(Contenu::class)->createQueryBuilder('c')
  928.             ->where('c.code LIKE :code')
  929.             ->andWhere('c.page = :page')
  930.             ->orderBy('c.ordre''ASC')
  931.             ->setParameter('code''BLOC')
  932.             ->setParameter('page''qsn')
  933.             ->getQuery()
  934.             ->getResult();
  935.         $intro $this->em->getRepository(Contenu::class)->findOneBy(array("code" => "INTRO""page" => "qsn"));
  936.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "qsn"), array("ordre" => "ASC"));
  937.         return $this->render('Front/Default/qsn.html.twig', array("intro" => $intro"blocs" => $blocs"blocsd" => $blocsd));
  938.     }
  939.     /**
  940.      * @Route("/redirect", name="redirect")
  941.      */
  942.     public function redirectAction(Request $request)
  943.     {
  944.         $session $request->getSession();
  945.         // reset affair_id pour le cas où l'utilisateur a commencé une 1ère saisine, l'a interrompue et revient faire le quiz
  946.         if ($session->get("affair_id") !== null$session->set("affair_id"null);
  947.         $nom_membre $request->get('membre');
  948.         $tab_membres = array('Bouygues Telecom''Orange''Sosh');
  949.         if (in_array($nom_membre$tab_membres)) {
  950.             $membre $this->em->getRepository(Member::class)->findOneBy(array('nom' => $nom_membre));
  951.             if (!$membre) { // redirect to main website
  952.                 return $this->redirect($this->getParameter('url_main_site'));
  953.             }
  954.             $session->set("membre"$membre);
  955.             if ($membre->getRecourseLevel() == Member::DOUBLE_RECOURSE) {
  956.                 return $this->redirectToRoute('quizz_operateurs');
  957.             } else {
  958.                 return $this->redirectToRoute('quizz_non_operateurs');
  959.             }
  960.         } else { // redirect to main website
  961.             return $this->redirect($this->getParameter('url_main_site'));
  962.         }
  963.     }
  964.     /**
  965.      * @Route("/quizz", name="quizz")
  966.      */
  967.     public function quizzAction(Request $request)
  968.     {    
  969.         $session $request->getSession();
  970.         if ($session->get("block_quiz")) return $this->redirectToRoute('saisir');
  971.         // reset affair_id pour le cas où l'utilisateur a commencé une 1ère saisine, l'a interrompue et revient faire le quiz
  972.         if($session->get("affair_id_new") !== null$session->set("affair_id_new"null);
  973.         if($session->get("affair_id") !== null$session->set("affair_id"null);
  974.         $form $this->createFormBuilder()
  975.             ->add('membre'EntityType::class, array(
  976.                 'class' => Member::class,
  977.                 'placeholder' => 'Choisissez votre opérateur',
  978.                 'expanded' => false,
  979.                 'multiple' => false,
  980.                 'label' => false,
  981.                 'required' => false,
  982.                 'choice_value' => 'id',
  983.                 'choice_label' => 'nom',
  984.                 'choices' => $this->em->getRepository(Member::class)->findBy(array(), array("ordre_list" => "ASC""nom" => "ASC"))
  985.                 //~ 'choices' => $this->em->getRepository(Member::class)->findSpecific()
  986.             ))
  987.             ->getForm();
  988.         $form->handleRequest($request);
  989.         if ($form->isSubmitted() && $form->isValid()) {
  990.             $membre $form->getData();
  991.             $session->set("membre"$membre["membre"]);
  992.             $nom_membre $membre["membre"]->getNom();
  993.             if($membre["membre"]->getNom() == "OVH"){ // specific OVH
  994.                 return $this->redirectToRoute('quizz_operateurs_et_non');
  995.             }
  996.             if ($membre["membre"]->getRecourseLevel() == Member::DOUBLE_RECOURSE) {
  997.                 return $this->redirectToRoute('quizz_operateurs');
  998.             } else {
  999.                 return $this->redirectToRoute('quizz_non_operateurs');
  1000.             }
  1001.         }
  1002.         return $this->render('Front/Default/quizz.html.twig', array('form' => $form->createView()));
  1003.     }
  1004.     /**
  1005.      * @Route("/quizz_operateurs_et_non", name="quizz_operateurs_et_non")
  1006.      */
  1007.     public function quizzOperateursEtNonAction(Request $request)
  1008.     {
  1009.         $session $request->getSession();
  1010.         $membre $session->get("membre");
  1011.         $form $this->createFormBuilder()
  1012.             ->add('type'ChoiceType::class, array(
  1013.                 'expanded' => true,
  1014.                 'multiple' => false,
  1015.                 'label' => false,
  1016.                 'choices' => array("operateur" => "Opérateur télécoms""non_operateur" => "Professionnel non opérateur de communications électroniques")))
  1017.             ->getForm();
  1018.         $form->handleRequest($request);
  1019.         if ($form->isSubmitted() && $form->isValid()) {
  1020.             $values $form->getData();
  1021.             if ($values["type"] == "non_operateur") {
  1022.                 $session->set("ovh_is_operateur"0);
  1023.                 return $this->redirectToRoute('quizz_non_operateurs');
  1024.             } else {
  1025.                 $session->set("ovh_is_operateur"1);
  1026.                 return $this->redirectToRoute('quizz_operateurs');
  1027.             }
  1028.         }
  1029.         return $this->render('Front/Default/quizz_operateurs_et_non.html.twig', array('form' => $form->createView(), "membre" => $membre));
  1030.     }
  1031.     /**
  1032.      * @Route("/quizz_operateurs", name="quizz_operateurs")
  1033.      */
  1034.     public function quizzOperateursAction(Request $request)
  1035.     {
  1036.         $session $request->getSession();
  1037.         $membre $session->get("membre");
  1038.         if ($session->get("block_quiz")) return $this->redirectToRoute('saisir');
  1039.         $erreurs_etape $this->em->getRepository(ErreurQuizz::class)->findBy(array("type" => "OPERATEUR"));
  1040.         return $this->render('Front/Default/quizz_operateurs.html.twig', array("erreurs_etape" => $erreurs_etape"membre" => $membre"user_token"  => $session->has("user_token")));
  1041.     }
  1042.     /**
  1043.      * @Route("/quizz_non_operateurs", name="quizz_non_operateurs")
  1044.      */
  1045.     public function quizzNonOperateursAction(Request $request)
  1046.     {
  1047.         $session $request->getSession();
  1048.         $membre $session->get("membre");
  1049.         if ($session->get("block_quiz")) return $this->redirectToRoute('saisir');
  1050.         $erreurs_etape $this->em->getRepository(ErreurQuizz::class)->findBy(array("type" => "NON_OPERATEUR"));
  1051.         return $this->render('Front/Default/quizz_non_operateurs.html.twig', array("erreurs_etape" => $erreurs_etape"membre" => $membre"user_token" => $session->has("user_token")));
  1052.     }
  1053.     /**
  1054.      * @Route("/charte", name="charte")
  1055.      */
  1056.     public function charteAction(Request $request)
  1057.     {
  1058.         $blocs $this->em->getRepository(Contenu::class)->createQueryBuilder('c')
  1059.             ->where('c.code LIKE :code')
  1060.             ->andWhere('c.page = :page')
  1061.             ->orderBy('c.ordre''ASC')
  1062.             ->setParameter('code''BLOC')
  1063.             ->setParameter('page''charte')
  1064.             ->getQuery()
  1065.             ->getResult();
  1066.         $intro $this->em->getRepository(Contenu::class)->findOneBy(array("code" => "INTRO""page" => "charte"));
  1067.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "charte"), array("ordre" => "ASC"));
  1068.         return $this->render('Front/Default/charte.html.twig', array("intro" => $intro"blocs" => $blocs"blocsd" => $blocsd));
  1069.     }
  1070.     /**
  1071.      * @Route("/mediation", name="mediation")
  1072.      */
  1073.     public function mediationAction(Request $request)
  1074.     {
  1075.         $blocs $this->em->getRepository(Contenu::class)->createQueryBuilder('c')
  1076.             ->where('c.code LIKE :code')
  1077.             ->andWhere('c.page = :page')
  1078.             ->orderBy('c.ordre''ASC')
  1079.             ->setParameter('code''BLOC')
  1080.             ->setParameter('page''mediation')
  1081.             ->getQuery()
  1082.             ->getResult();
  1083.         $intro $this->em->getRepository(Contenu::class)->findOneBy(array("code" => "INTRO""page" => "mediation"));
  1084.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "mediation"), array("ordre" => "ASC"));
  1085.         return $this->render('Front/Default/mediation.html.twig', array("intro" => $intro"blocs" => $blocs"blocsd" => $blocsd));
  1086.     }
  1087.     /**
  1088.      * @Route("/contacts", name="contacts")
  1089.      */
  1090.     public function contactsAction(Request $request)
  1091.     {
  1092.         $blocs $this->em->getRepository(Contenu::class)->createQueryBuilder('c')
  1093.             ->where('c.code LIKE :code')
  1094.             ->andWhere('c.page = :page')
  1095.             ->orderBy('c.ordre''ASC')
  1096.             ->setParameter('code''BLOC')
  1097.             ->setParameter('page''contacts')
  1098.             ->getQuery()
  1099.             ->getResult();
  1100.         $intro $this->em->getRepository(Contenu::class)->findOneBy(array("code" => "INTRO""page" => "contacts"));
  1101.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "contacts"), array("ordre" => "ASC"));
  1102.         return $this->render('Front/Default/contacts.html.twig', array("intro" => $intro"blocs" => $blocs"blocsd" => $blocsd));
  1103.     }
  1104.     /**
  1105.      * @Route("/check_mail", name="check_mail")
  1106.      */
  1107.     public function checkMailAction(Request $request)
  1108.     {
  1109.         $mail $request->get("email");
  1110.         $token_jwt $this->prepare_access_token();
  1111.         $url $this->getParameter('api_url') . "/checkMail/" $mail;
  1112.         $header = array('Authorization' => 'Bearer ' $token_jwt);
  1113.         $response $this->client->get($url, array('headers' => $header));
  1114.         $reponse json_decode($response->getBody()->getContents());
  1115.         return new Response($reponse);
  1116.     }
  1117.     /**
  1118.      * @Route("/envoi_mail", name="envoi_mail")
  1119.      */
  1120.     public function envoiMailAction(Request $request)
  1121.     {
  1122.         $mail $request->get("email");
  1123.         $alphabet 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
  1124.         $pass = array(); //remember to declare $pass as an array
  1125.         $alphaLength strlen($alphabet) - 1//put the length -1 in cache
  1126.         for ($i 0$i 8$i++) {
  1127.             $n rand(0$alphaLength);
  1128.             $pass[] = $alphabet[$n];
  1129.         }
  1130.         $pass implode($pass); //turn the array into a string
  1131.         $data['password'] = $pass;
  1132.         $data['email'] = $mail;
  1133.         $data['username'] = $mail;
  1134.         $data['is_active'] = 1;
  1135.         $token_jwt $this->prepare_access_token();
  1136.         $url $this->getParameter('api_url') . '/user/create';
  1137.         $headers = array('Authorization' => 'Bearer ' $token_jwt'Content-Type' => 'application/json; charset=utf-8');
  1138.         $response $this->client->post($url, array('headers' => $headers'body' => json_encode($data)));
  1139.         return new Response("OUI");
  1140.     }
  1141.     /**
  1142.      * @Route("/check_login", name="check_login")
  1143.      */
  1144.     public function checkLoginAction(Request $request)
  1145.     {
  1146.         $login $request->get("login");
  1147.         $pass $request->get("pass");
  1148.         $url $this->getParameter('api_url') . "/login_check";
  1149.         $data = ['username' => $login'password' => $pass];
  1150.         $headers = array('Content-Type' => 'application/json; charset=utf-8');
  1151.         try {
  1152.             $response $this->client->post($url, ['headers' => $headers'body' => json_encode($data)]);
  1153.             $result json_decode($response->getBody()->getContents());
  1154.             if ($result->token) {
  1155.                 $request->getSession()->set("user_token"$result->token);
  1156.                 $request->getSession()->set("user_login"$login);
  1157.             }
  1158.             
  1159.             // get firstname and lastname of client to show it in header
  1160.             $data_client = ['username' => $login];
  1161.             $url_data $this->getParameter('api_url') . "/data_client/".$login;
  1162.             try {
  1163.                 $token_jwt $this->prepare_access_token();
  1164.                 $header = array('Authorization' => 'Bearer ' $token_jwt);
  1165.                 $response_data $this->client->get($url_data, array('headers' => $header));
  1166.                 $result_data json_decode($response_data->getBody()->getContents());
  1167.                 $request->getSession()->set("user_lastname"$result_data->lastname);
  1168.                 $request->getSession()->set("user_firstname"$result_data->firstname);    
  1169.             } catch (RequestException $r) {
  1170.                 // ne pas bloquer la connexion si souci de récupération du nom et prénom
  1171.                 //~ return new Response("NON");
  1172.             }
  1173.             return new Response("OUI");
  1174.             
  1175.         } catch (RequestException $r) {
  1176.             return new Response("NON");
  1177.         }
  1178.         return new Response("NON");
  1179.     }
  1180.     /**
  1181.      * @Route("/logout_ws", name="logout_ws")
  1182.      */
  1183.     public function logoutAction(Request $request)
  1184.     {
  1185.         $request->getSession()->remove("user_id");
  1186.         $request->getSession()->remove("user_token");
  1187.         return $this->redirectToRoute("espace");
  1188.     }
  1189.     /**
  1190.      * @Route("/saisir-le-mediateur", name="saisir")
  1191.      */
  1192.     public function saisirAction(Request $request)
  1193.     {    
  1194.         $session $request->getSession();
  1195.         $block_quiz $session->get("block_quiz");
  1196.         $contenus $this->em->getRepository(Contenu::class)->findBy(array("page" => "saisir"));
  1197.         $blocs = array();
  1198.         foreach ($contenus as $contenu) {
  1199.             $blocs[$contenu->getCode()] = $contenu;
  1200.         }
  1201.         return $this->render('Front/Default/saisir.html.twig', array('block_quiz' => $block_quiz"blocs" => $blocs));
  1202.     }
  1203.     /**
  1204.      * @Route("/mon-espace", name="espace")
  1205.      */
  1206.     public function espaceAction(Request $request)
  1207.     {
  1208.         $session $request->getSession();
  1209.         if ($session->has("user_token")) {
  1210.             return $this->redirectToRoute('affaires');
  1211.         }
  1212.         $blocs $this->em->getRepository(Contenu::class)->createQueryBuilder('c')
  1213.             ->where('c.code LIKE :code')
  1214.             ->andWhere('c.page = :page')
  1215.             ->orderBy('c.ordre''ASC')
  1216.             ->setParameter('code''BLOC')
  1217.             ->setParameter('page''espace')
  1218.             ->getQuery()
  1219.             ->getResult();
  1220.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "espace"), array("ordre" => "ASC"));
  1221.         return $this->render('/Front/Default/espace.html.twig', array("blocs" => $blocs"blocsd" => $blocsd));
  1222.     }
  1223.     /**
  1224.      * @Route("/recherche", name="recherche")
  1225.      */
  1226.     public function rechercheAction(Request $request)
  1227.     {
  1228.         $txt_recherche htmlentities($request->get("txt_recherche"));
  1229.         $txt_recherche2 $request->get("txt_recherche");
  1230.         $result1 $this->em->getRepository(Contenu::class)->createQueryBuilder('c')
  1231.             ->where('c.titre LIKE :search')
  1232.             ->OrWhere('c.contenu LIKE :search')
  1233.             ->OrWhere('c.contenu LIKE :search2')
  1234.             ->setParameter('search'"%" $txt_recherche "%")
  1235.             ->setParameter('search2'"%" $txt_recherche2 "%")
  1236.             ->orderBy('c.page')
  1237.             ->getQuery()
  1238.             ->getResult();
  1239.         // count distint page
  1240.         $result1_count $this->em->getRepository(Contenu::class)->createQueryBuilder('c')
  1241.             ->select('c.page')
  1242.             ->where('c.titre LIKE :search')
  1243.             ->OrWhere('c.contenu LIKE :search')
  1244.             ->OrWhere('c.contenu LIKE :search2')
  1245.             ->setParameter('search'"%" $txt_recherche "%")
  1246.             ->setParameter('search2'"%" $txt_recherche2 "%")
  1247.             ->distinct()
  1248.             ->getQuery()
  1249.             ->getResult();
  1250.         $result2 $this->em->getRepository(Faq::class)->createQueryBuilder('f')
  1251.             ->where('f.titre LIKE :search')
  1252.             ->OrWhere('f.contenu LIKE :search')
  1253.             ->setParameter('search'"%" $txt_recherche "%")
  1254.             ->getQuery()
  1255.             ->getResult();
  1256.         $result3 $this->em->getRepository(Member::class)->createQueryBuilder('m')
  1257.             ->where('m.nom LIKE :search')
  1258.             ->setParameter('search'"%" $txt_recherche "%")
  1259.             ->getQuery()
  1260.             ->getResult();
  1261.         $result4 $this->em->getRepository(Publication::class)->createQueryBuilder('p')
  1262.             ->where('p.titre LIKE :search')
  1263.             ->OrWhere('p.contenu LIKE :search')
  1264.             ->setParameter('search'"%" $txt_recherche "%")
  1265.             ->orderBy('p.date''DESC')
  1266.             ->getQuery()
  1267.             ->getResult();
  1268.         $titres = array(
  1269.             "_mediateur" => "Le Médiateur",
  1270.             "_qsn" => "Qui sommes-nous ?",
  1271.             "_charte" => "La charte de la médiation",
  1272.             "_mediation" => "La médiation",
  1273.             "_contacts" => "Contacts utiles",
  1274.             "_mentions" => "Mentions légales",
  1275.             "_espace" => "Mon Espace",
  1276.             "_presse" => "Presse",
  1277.             "_home" => "Accueil",
  1278.             "_saisir" => "Saisir le Médiateur",
  1279.         );
  1280.         
  1281.         $sections = array(
  1282.             "_mediateur" => "La médiation",
  1283.             "_qsn" => "La médiation",
  1284.             "_charte" => "La médiation",
  1285.             "_mediation" => "S'informer",
  1286.             "_contacts" => "S'informer",
  1287.             "_mentions" => "La médiation",
  1288.             "_espace" => "Mon Espace",
  1289.             "_presse" => "La médiation",
  1290.             "_home" => "Accueil",
  1291.             "_saisir" => "La médiation",
  1292.         );
  1293.         
  1294.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "publication"), array("ordre" => "ASC"));
  1295.         return $this->render('Front/Default/recherche.html.twig', array("resultats1_count" => $result1_count"recherche" => $txt_recherche"recherche2" => $txt_recherche2"resultats1" => $result1"resultats2" => $result2"resultats3" => $result3"resultats4" => $result4"titres" => $titres"sections" => $sections"blocsd" => $blocsd));
  1296.     }
  1297.     /**
  1298.      * @Route("/contact", name="contact")
  1299.      */
  1300.     public function contactAction(Request $request)
  1301.     {
  1302.         $contenu $this->em->getRepository(Contenu::class)->findOneBy(array("page" => "contact"));
  1303.         return $this->render('Front/Default/contact.html.twig', array("contenu" => $contenu));
  1304.     }
  1305.     /**
  1306.      * @Route("/credits", name="credits")
  1307.      */
  1308.     public function creditsAction(Request $request)
  1309.     {
  1310.         $blocs $this->em->getRepository(Contenu::class)->createQueryBuilder('c')
  1311.             ->where('c.code LIKE :code')
  1312.             ->andWhere('c.page = :page')
  1313.             ->orderBy('c.ordre''ASC')
  1314.             ->setParameter('code''BLOC')
  1315.             ->setParameter('page''credits')
  1316.             ->getQuery()
  1317.             ->getResult();
  1318.         $intro $this->em->getRepository(Contenu::class)->findOneBy(array("code" => "INTRO""page" => "credits"));
  1319.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "credits"), array("ordre" => "ASC"));
  1320.         return $this->render('Front/Default/credits.html.twig', array("intro" => $intro"blocs" => $blocs"blocsd" => $blocsd));
  1321.     }
  1322.     /**
  1323.      * @Route("/mentions", name="mentions")
  1324.      */
  1325.     public function mentionsAction(Request $request)
  1326.     {
  1327.         $blocs $this->em->getRepository(Contenu::class)->createQueryBuilder('c')
  1328.             ->where('c.code LIKE :code')
  1329.             ->andWhere('c.page = :page')
  1330.             ->orderBy('c.ordre''ASC')
  1331.             ->setParameter('code''BLOC')
  1332.             ->setParameter('page''mentions')
  1333.             ->getQuery()
  1334.             ->getResult();
  1335.         $intro $this->em->getRepository(Contenu::class)->findOneBy(array("code" => "INTRO""page" => "mentions"));
  1336.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "mentions"), array("ordre" => "ASC"));
  1337.         return $this->render('Front/Default/mentions.html.twig', array("intro" => $intro"blocs" => $blocs"blocsd" => $blocsd));
  1338.     }
  1339.     /**
  1340.      * @Route("/formulaire_contact", name="formulaire_contact")
  1341.      */
  1342.     public function formulaireContactAction(Request $requestMailerInterface $mailer)
  1343.     {
  1344.         $form $this->createFormBuilder()
  1345.             ->add('nom'TextType::class)
  1346.             ->add('prenom'TextType::class)
  1347.             ->add('email'EmailType::class)
  1348.             ->add('nature'ChoiceType::class, array(
  1349.                 'choices' => array(
  1350.                     'Droit d’accès' => 'Droit d’accès',
  1351.                     'Droit de rectification et/ou de suppression' => 'Droit de rectification et/ou de suppression',
  1352.                     'Droit à la portabilité' => 'Droit à la portabilité'
  1353.                 )))
  1354.             ->add('id'FileType::class)
  1355.             ->add('message'TextAreaType::class, array("attr" => array("rows" => 10"cols" => 50)))
  1356.             ->getForm();
  1357.         $form->handleRequest($request);
  1358.         if ($form->isSubmitted() && $form->isValid()) {
  1359.             $env $this->getParameter('app_environment');
  1360.             $res_captcha $this->captchaverify($request->request->get('g-recaptcha-response'), 'invisible');
  1361.             if ($env != 'dev' && !$res_captcha) {
  1362.                 $this->addFlash('error'"Le reCAPTCHA n'a pas été entré correctement. Revenez en arrière et réessayez.");
  1363.             } else {
  1364.                 $datas $form->getData();
  1365.                 $ext $datas["id"]->getClientOriginalExtension();
  1366.                 if (null == $ext || $ext == '') {
  1367.                     $this->addFlash("error""Extension du fichier invalide. Veuillez vérifier votre fichier.");
  1368.                     return $this->redirectToRoute('formulaire_contact'$request->query->all());
  1369.                 }
  1370.                 $filename uniqid() . "." $ext;
  1371.                 $this->storage->moveFileToStorage('app.identites_directory'$filename$datas["id"]);
  1372.                 //~ $message = \Swift_Message::newInstance()
  1373.                     //~ ->setSubject("Demande de " . $datas["nature"])
  1374.                     //~ ->setFrom(array($datas["email"] => $datas["nom"] . " " . $datas["prenom"]))
  1375.                     //~ ->setTo("Henri.Dolivier@mediation-telecom.org")
  1376.                     //~ ->setBody($datas["message"])
  1377.                     //~ ->attach(\Swift_Attachment::fromPath($this->getParameter('app.identites_directory') . "/" . $filename));
  1378.                 //~ $this->get('mailer')->send($message);
  1379.                 
  1380.                 $message = (new Email())
  1381.                     ->from(new Address($datas["email"], $datas["nom"] . " " $datas["prenom"]))
  1382.                     ->to('Henri.Dolivier@mediation-telecom.org')
  1383.                     ->subject("Demande de " $datas["nature"])
  1384.                     ->html($datas["message"])
  1385.                     ->attachFromPath($this->storage->getFileStorageUrl('app.affair_files_directory'$filename ));
  1386.                 
  1387.                 $mailer->send($message);
  1388.                 $body "Madame, Monsieur,<br /><br />
  1389. Nous accusons réception de votre demande. Cette dernière est en cours de traitement.<br />
  1390. Conformément au Règlement européen relatif à la protection des personnes physiques à l'égard du traitement des données à caractère personnel et à la libre circulation de ces données du 27 avril 2016 une réponse vous sera apportée dans un délai maximum d’un mois.<br /><br />
  1391. Toute autre demande à l’aide du formulaire de contact, prévu exclusivement pour formuler une demande d’accès, de modification, suppression ou de portabilité de données personnelles, ne fera l’objet d’aucun traitement ni de réponse.<br /><br />
  1392. Les Services de la médiation des Communications Electroniques<br /><br />
  1393. <i style='font-size: 10px'>Ce mail est un envoi automatique suite à votre démarche en ligne. Merci de ne pas y répondre</i>.
  1394. ";
  1395.                 //~ $message = \Swift_Message::newInstance()
  1396.                     //~ ->setSubject("Accusé de réception")
  1397.                     //~ ->setFrom("noreply@mediation-telecom.org")
  1398.                     //~ ->setTo($datas["email"])
  1399.                     //~ ->setBody($body, 'text/html');
  1400.                 //~ $this->get('mailer')->send($message);
  1401.                 
  1402.                 $message = (new Email())
  1403.                     ->from(new Address("noreply@mediation-telecom.org"'Le Médiateur des Communications Electroniques'))
  1404.                     ->to($datas["email"])
  1405.                     ->subject("Accusé de réception")
  1406.                     ->html($body);
  1407.                 $mailer->send($message);
  1408.                 return $this->redirectToRoute("mentions");
  1409.             }
  1410.         }
  1411.         return $this->render('Front/Default/formulaire_contact.html.twig', array('form' => $form->createView()));
  1412.     }
  1413.     
  1414.     
  1415.      /**
  1416.      * @Route("/devenir-membre", name="devenir_membre")
  1417.      */
  1418.     public function devenirMembreAction(Request $requestMailerInterface $mailer)
  1419.     {
  1420.         $form $this->createFormBuilder()
  1421.             ->add('nom'TextType::class, array('required' => true) )
  1422.             ->add('prenom'TextType::class, array('required' => true) )
  1423.             ->add('email'EmailType::class, array('required' => true) )
  1424.             ->add('telephone'TextType::class, array('required' => true) )
  1425.             ->add('societe'TextType::class, array('required' => true) )
  1426.             ->add('siret'TextType::class, array('required' => false) )
  1427.             
  1428.             ->add('message'TextAreaType::class, array('required' => true"attr" => array("rows" => 10"cols" => 50)))
  1429.             ->getForm();
  1430.         $form->handleRequest($request);
  1431.         if ($form->isSubmitted() && $form->isValid()) {
  1432.             $env $this->getParameter('app_environment');
  1433.             $res_captcha $this->captchaverify($request->request->get('g-recaptcha-response'), 'invisible');
  1434.             if ($env != 'dev' && !$res_captcha) {
  1435.                 $this->addFlash('error'"Le reCAPTCHA n'a pas été entré correctement. Revenez en arrière et réessayez.");
  1436.             } else {
  1437.                 $datas $form->getData();
  1438.                 // envoi à l'AMCE
  1439.                 //~ $message = \Swift_Message::newInstance()
  1440.                     //~ ->setSubject("Demande d'adhésion")
  1441.                     //~ ->setFrom(array($datas["email"] => $datas["nom"] . " " . $datas["prenom"]))
  1442.                     //~ ->setTo("Henri.Dolivier@mediation-telecom.org")
  1443.                     //~ ->setBody(
  1444.                         //~ $this->renderView(
  1445.                             //~ 'Front:Mail:mail.adhesion.html.twig',
  1446.                             //~ array('datas' => $datas)
  1447.                         //~ ),
  1448.                         //~ 'text/html'
  1449.                     //~ );
  1450.                 //~ $this->get('mailer')->send($message);
  1451.                 
  1452.                 $message = (new Email())
  1453.                     ->from(new Address($datas["email"], $datas["nom"] . " " $datas["prenom"]))
  1454.                     ->to("Henri.Dolivier@mediation-telecom.org")
  1455.                     ->subject("Demande d'adhésion")
  1456.                     ->html($this->renderView(
  1457.                             'Front/Mail/mail.adhesion.html.twig',
  1458.                             array('datas' => $datas)
  1459.                         )
  1460.                     );
  1461.                 $mailer->send($message);
  1462.                 // envoi accusé de réception
  1463.                 //~ $message = \Swift_Message::newInstance()
  1464.                     //~ ->setSubject("Accusé de réception")
  1465.                     //~ ->setFrom("noreply@mediation-telecom.org")
  1466.                     //~ ->setTo($datas["email"])
  1467.                     //~ ->setBody(
  1468.                         //~ $this->renderView('AmceBundle:Mail:accuse.reception.adhesion.html.twig'),
  1469.                         //~ 'text/html'
  1470.                     //~ );
  1471.                 //~ $this->get('mailer')->send($message);
  1472.                 
  1473.                 $message = (new Email())
  1474.                     ->from(new Address("noreply@mediation-telecom.org"'Le Médiateur des Communications Electroniques'))
  1475.                     ->to($datas["email"])
  1476.                     ->subject("Accusé de réception")
  1477.                     ->html($this->renderView('Front/Mail/accuse.reception.adhesion.html.twig'));
  1478.                 $mailer->send($message);
  1479.                 
  1480.                 $this->addFlash("success""Votre demande a bien été enregistrée.<br>Nous vous répondrons dans les plus brefs délais.");
  1481.                 return $this->redirectToRoute("devenir_membre");
  1482.             }
  1483.         }
  1484.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "publication"), array("ordre" => "ASC"));
  1485.         
  1486.         return $this->render('Front/Default/devenir_membre.html.twig', array('blocsd' => $blocsd'form' => $form->createView()));
  1487.     }
  1488.     /**
  1489.      * @Route("/plan", name="plan")
  1490.      */
  1491.     public function planAction(Request $request)
  1492.     {
  1493.         return $this->render('Front/Default/plan.html.twig');
  1494.     }
  1495.     
  1496.     /**
  1497.      * @Route("/la-mediation-des-communications-electroniques-fonctionnement", name="video1")
  1498.      */
  1499.     public function video1Action(Request $request)
  1500.     {
  1501.         return $this->render('Front/Default/video1.html.twig');
  1502.     }
  1503.     
  1504.     /**
  1505.      * @Route("/la-mediation-definition", name="video2")
  1506.      */
  1507.     public function video2Action(Request $request)
  1508.     {
  1509.         return $this->render('Front/Default/video2.html.twig');
  1510.     }
  1511.     /**
  1512.      * @Route("/presse", name="presse")
  1513.      */
  1514.     public function presseAction(Request $request)
  1515.     {
  1516.         $blocs $this->em->getRepository(Contenu::class)->createQueryBuilder('c')
  1517.             ->where('c.code LIKE :code')
  1518.             ->andWhere('c.page = :page')
  1519.             ->orderBy('c.ordre''ASC')
  1520.             ->setParameter('code''BLOC')
  1521.             ->setParameter('page''presse')
  1522.             ->getQuery()
  1523.             ->getResult();
  1524.         $intro $this->em->getRepository(Contenu::class)->findOneBy(array("code" => "INTRO""page" => "presse"));
  1525.         $blocsd $this->em->getRepository(BlocEcran::class)->findBy(array("ecran" => "presse"), array("ordre" => "ASC"));
  1526.         return $this->render('Front/Default/presse.html.twig', array("intro" => $intro"blocs" => $blocs"blocsd" => $blocsd));
  1527.     }
  1528.     /**
  1529.      * @Route("/mdp_oublie", name="mdp_oublie")
  1530.      */
  1531.     public function mdpOublieAction(Request $request)
  1532.     {
  1533.         return $this->render('Front/Default/mdp_oublie.html.twig');
  1534.     }
  1535.     /**
  1536.      * @Route("/mdp_oublie_ws", name="mdp_oublie_ws")
  1537.      */
  1538.     public function mdpOublieWsAction(Request $request)
  1539.     {
  1540.         $mail $request->get("mail");
  1541.         $token_jwt $this->prepare_access_token();
  1542.         $url $this->getParameter('api_url') . "/forget_mdp/" $mail;
  1543.         $header = array('Authorization' => 'Bearer ' $token_jwt);
  1544.         $response $this->client->get($url, array('headers' => $header));
  1545.         $reponse json_decode($response->getBody()->getContents());
  1546.         return new Response($reponse);
  1547.     }
  1548.     /**
  1549.      * @Route("/detail_affair", name="detail_affair")
  1550.      */
  1551.     public function detailAffairAction(Request $request)
  1552.     {
  1553.         // page details
  1554.         $session $request->getSession();
  1555.         if (!$session->has("user_token")) {
  1556.             return $this->redirectToRoute('espace');
  1557.         }
  1558.         $id = (int)$request->get("id");
  1559.         if(!$id) return $this->redirectToRoute('affaires');
  1560.         $url $this->getParameter('api_url') . "/affaires/details/" $id;
  1561.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"));
  1562.         $response $this->client->get($url, array('headers' => $header));
  1563.         $affair json_decode($response->getBody()->getContents());
  1564.         
  1565.         $date_before = new \Datetime('2021-09-15'); // affairs created before this date can't have new detail page
  1566.         $date_before->setTime(0,0,0);
  1567.         
  1568.         $created_at = new \Datetime($affair->created_at);
  1569.         if(!$affair->created_at || ($affair->created_at && $created_at->format('Y-m-d') < $date_before->format('Y-m-d')) ){ // affairs before this date can't have new process => show old template
  1570.             $template 'Front/Default/detail_affair.html.twig';
  1571.         } else {
  1572.             $template 'Front/Default/detail_affair_new.html.twig';
  1573.         }
  1574.         return $this->render($template, array("affair" => $affair));
  1575.     }
  1576.     
  1577.     /**
  1578.      * @Route("/detail_affaire_historique", name="detail_affair_history")
  1579.      */
  1580.     public function detailAffairHistoryAction(Request $request)
  1581.     {
  1582.         // page historique
  1583.         $session $request->getSession();
  1584.         if (!$session->has("user_token"))
  1585.             return $this->redirectToRoute('espace');
  1586.         
  1587.         $id = (int)$request->get("id");
  1588.         if(!$id) return $this->redirectToRoute('affaires');
  1589.         $url $this->getParameter('api_url') . "/affaires/details/" $id;
  1590.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"));
  1591.         $response $this->client->get($url, array('headers' => $header));
  1592.         $affair json_decode($response->getBody()->getContents());
  1593.         //~ print_r($affair); die;
  1594.         
  1595.         $date_before = new \Datetime('2021-09-15'); // affairs created before this date can't have new detail page
  1596.         $date_before->setTime(0,0,0);
  1597.         
  1598.         $created_at = new \Datetime($affair->created_at);
  1599.         if(!$affair->created_at || ($affair->created_at && $created_at->format('Y-m-d') < $date_before->format('Y-m-d')) ){ // affairs before this date can't have new process => show old template
  1600.             return $this->render('Front/Default/detail_affair.html.twig', array("affair" => $affair));
  1601.         }
  1602.         
  1603.         // group datas by dates
  1604.         $created_at = new \Datetime($affair->created_at);
  1605.         $datas_dates = array();
  1606.         
  1607.         $datas_dates[$created_at->format('Y-m-d')][] =  array(
  1608.             'field' => 'created_at',
  1609.             'date' => $affair->created_at,
  1610.             'document' => null,
  1611.             'document_btn_label' => null,
  1612.             'label' => 'Création dossier',
  1613.             'message' => 'Votre dossier est créé'
  1614.         );
  1615.         $label_btn "";
  1616.         if($affair->status == 4){
  1617.             $label_btn "Télécharger";
  1618.         }
  1619.         $datas_dates[$created_at->format('Y-m-d')][] =  array(
  1620.             'field' => 'created_at',
  1621.             'date' => $affair->created_at,
  1622.             'document' => null,
  1623.             'document_btn_label' => $label_btn,
  1624.             'label' => 'Finalisez votre dossier',
  1625.             'message' => 'Merci de télécharger les pièces manquantes afin de finaliser la création de votre dossier'
  1626.             
  1627.         );
  1628.         
  1629.         if($affair->fin_saisine_at && (!$affair->is_closed_prematurely || $affair->prematurely_closed_by != 'client')){
  1630.             $fin_saisine_at = new \Datetime($affair->fin_saisine_at);
  1631.             if($affair->is_mixte) {
  1632.                 $message "Vous avez choisi d'envoyer vos pièces par courrier.
  1633.                             <br>Vous devez nous adresser dans le délai maximum de 7 jours vos pièces justificatives par la poste.";
  1634.             
  1635.             } elseif($affair->waiting_representant_mandat) {
  1636.                 $message "Vous devez nous transmettre le mandat et la copie recto/verso de la carte d'identité du consommateur représenté";
  1637.                             
  1638.             } else {
  1639.                 $message "Vous avez finalisé votre saisine en ligne";
  1640.             }
  1641.             
  1642.             $datas_dates[$fin_saisine_at->format('Y-m-d')][] =  array(
  1643.                 'field' => 'fin_saisine_at',
  1644.                 'date' => $affair->fin_saisine_at,
  1645.                 'document' => null,
  1646.                 'document_btn_label' => null,
  1647.                 'label' => 'Votre dossier a été créé',
  1648.                 'message' => $message
  1649.             );
  1650.         }
  1651.         
  1652.         if($affair->notification_at && (!$affair->is_closed_prematurely || $affair->prematurely_closed_by != 'client')){
  1653.             $notification_at = new \Datetime($affair->notification_at);
  1654.             $datas_dates[$notification_at->format('Y-m-d')][] =  array(
  1655.                 'field' => 'notification_at',
  1656.                 'date' => $affair->notification_at,
  1657.                 'document' => null,
  1658.                 'document_btn_label' => null,
  1659.                 'label' => 'Saisine réceptionnée',
  1660.                 'message' => "Vous dossier est réceptionné, complet et notifié"
  1661.             );
  1662.             $datas_dates[$notification_at->format('Y-m-d')][] =  array(
  1663.                 'field' => 'notification_at',
  1664.                 'date' => $affair->notification_at,
  1665.                 //~ 'document' => 'notification',
  1666.                 //~ 'document_btn_label' => "Télécharger&nbsp;le courrier&nbsp;(PDF)",
  1667.                 'document' => null,
  1668.                 'document_btn_label' => null,
  1669.                 'label' => 'Recevabilité',
  1670.                 'message' => 'Votre dossier est en cours d\'analyse'
  1671.             );
  1672.         }
  1673.         
  1674.         //~ if($affair->sent_compte_rendu_at){
  1675.             //~ $notification_at = new \Datetime($affair->sent_compte_rendu_at);
  1676.             //~ $datas_dates[$notification_at->format('Y-m-d')][] =  array(
  1677.                 //~ 'field' => 'sent_compte_rendu_at',
  1678.                 //~ 'date' => $affair->sent_compte_rendu_at,
  1679.                 //~ 'document' => null,
  1680.                 //~ 'document_btn_label' => null,
  1681.                 //~ 'label' => '',
  1682.                 //~ 'message' => ""
  1683.             //~ );
  1684.         //~ }
  1685.         
  1686.         //~ if($affair->qualification_definitive_at){
  1687.             //~ $qualification_definitive_at = new \Datetime($affair->qualification_definitive_at);
  1688.             //~ $datas_dates[$qualification_definitive_at->format('Y-m-d')][] =  array(
  1689.                 //~ 'field' => 'qualification_definitive_at',
  1690.                 //~ 'date' => $affair->qualification_definitive_at,
  1691.                 //~ 'document' => null,
  1692.                 //~ 'document_btn_label' => null,
  1693.                 //~ 'label' => '',
  1694.                 //~ 'message' => ''
  1695.             //~ );
  1696.         //~ }
  1697.         
  1698.         if($affair->envoi_global_at){
  1699.             $recevabilite $affair->recevabilite;
  1700.             $is_recevable 0;
  1701.             switch($recevabilite){
  1702.                 case 1
  1703.                     $is_recevable 1;
  1704.                     $label "Saisine recevable";
  1705.                     $message "Votre dossier est déclaré recevable";
  1706.                     $type_doc "recevabilite";
  1707.                     break;
  1708.                 case 2
  1709.                     $label "Saisine irrecevable";
  1710.                     $message "Votre dossier est déclaré irrecevable";
  1711.                     $type_doc "cloture";
  1712.                     break;
  1713.                 case 3
  1714.                     $label "Saisine annulée"
  1715.                     $message "Votre dossier ne peut pas être pris en compte";
  1716.                     $type_doc "cloture";
  1717.                     break;
  1718.                 default: 
  1719.                     $label "";
  1720.                     $message "";
  1721.                     $type_doc "";
  1722.             }
  1723.             $envoi_global_at = new \Datetime($affair->envoi_global_at);
  1724.             $datas_dates[$envoi_global_at->format('Y-m-d')][] =  array(
  1725.                 'field' => 'envoi_global_at',
  1726.                 'date' => $affair->envoi_global_at,
  1727.                 'document' => $type_doc,
  1728.                 'document_btn_label' => $is_recevable "Télécharger" null,
  1729.                 'label' => $label,
  1730.                 'message' => $message
  1731.             );
  1732.             
  1733.             if($is_recevable){
  1734.                 $datas_dates[$envoi_global_at->format('Y-m-d')][] =  array(
  1735.                     'field' => 'envoi_global_at',
  1736.                     'date' => $affair->envoi_global_at,
  1737.                     'document' => null,
  1738.                     'document_btn_label' => null,
  1739.                     'label' => "En attente retour du professionnel",
  1740.                     'message' => "Le Médiateur a soumis votre litige au professionnel et est en attente de sa réponse"
  1741.                 );
  1742.                 
  1743.             }
  1744.             
  1745.         }
  1746.         
  1747.         if($affair->affect_amce_at){
  1748.             $affect_amce_at = new \Datetime($affair->affect_amce_at);
  1749.             $datas_dates[$affect_amce_at->format('Y-m-d')][] =  array(
  1750.                 'field' => 'affect_amce_at',
  1751.                 'date' => $affair->affect_amce_at,
  1752.                 'document' => null,
  1753.                 'document_btn_label' => null,
  1754.                 'label' => 'En cours d\'instruction',
  1755.                 'message' => 'Votre dossier est en cours de traitement par le Médiateur'
  1756.             );
  1757.         }
  1758.         
  1759.         if($affair->send_avis_at){
  1760.             $send_avis_at = new \Datetime($affair->send_avis_at);
  1761.             $datas_dates[$send_avis_at->format('Y-m-d')][] =  array(
  1762.                 'field' => 'send_avis_at',
  1763.                 'date' => $affair->send_avis_at,
  1764.                 'document' => 'avis',
  1765.                 'document_btn_label' => "Télécharger",
  1766.                 'label' => 'Avis transmis',
  1767.                 'message' => 'Le Médiateur a fait une proposition de solution'
  1768.             );
  1769.             $datas_dates[$send_avis_at->format('Y-m-d')][] =  array(
  1770.                 'field' => 'position_consommateur',
  1771.                 'date' => $affair->send_avis_at,
  1772.                 'document' => null,
  1773.                 'document_btn_label' => null,
  1774.                 'label' => 'En attente de position du consommateur',
  1775.                 'message' => 'En attente de votre réponse sur la proposition de solution du Médiateur'
  1776.             );
  1777.             $datas_dates[$send_avis_at->format('Y-m-d')][] =  array(
  1778.                 'field' => null,
  1779.                 'date' => $affair->send_avis_at,
  1780.                 'document' => null,
  1781.                 'document_btn_label' => null,
  1782.                 'label' => 'En attente de position du professionnel',
  1783.                 'message' => 'En attente de la réponse du professionnel sur la proposition de solution du Médiateur'
  1784.             );
  1785.         }
  1786.         
  1787.         if($affair->position_operateur_at){
  1788.             $position_operateur_at = new \Datetime($affair->position_operateur_at);
  1789.             $position_label "";
  1790.             switch($affair->position_operateur){
  1791.                 case "Refusé"$position_label "Proposition refusée par le professionnel"; break;
  1792.                 case "Accepté"$position_label "Proposition acceptée par le professionnel"; break;
  1793.                 case "Sans position"$position_label "Le professionnel ne s'est pas prononcé"; break;
  1794.             }
  1795.             $datas_dates[$position_operateur_at->format('Y-m-d')][] =  array(
  1796.                 'field' => 'position_operateur_at',
  1797.                 'date' => $affair->position_operateur_at,
  1798.                 'document' => '',
  1799.                 'document_btn_label' => '',
  1800.                 'label' => 'Position professionnel',
  1801.                 'message' => $position_label
  1802.             );
  1803.         }
  1804.         
  1805.         if($affair->position_client_at){
  1806.             $position_client_at = new \Datetime($affair->position_client_at);
  1807.             $position_label "";
  1808.             switch($affair->position_client){
  1809.                 case "Refusé"$position_label "Vous avez refusé la proposition"; break;
  1810.                 case "Accepté"$position_label "Vous avez accepté la proposition"; break;
  1811.                 case "Sans position"$position_label "Vous ne vous êtes pas prononcé sur la proposition"; break;
  1812.                 case "Constesté"$position_label "Vous avez contesté la proposition"; break;
  1813.             }
  1814.             $datas_dates[$position_client_at->format('Y-m-d')][] =  array(
  1815.                 'field' => 'position_client_at',
  1816.                 'date' => $affair->position_client_at,
  1817.                 'document' => '',
  1818.                 'document_btn_label' => '',
  1819.                 'label' => 'Votre position',
  1820.                 'message' => $position_label
  1821.             );
  1822.         }
  1823.         if($affair->closed_at){
  1824.             $message "";
  1825.             $button = (!$affair->is_closed_prematurely "Télécharger" null);
  1826.             if($affair->recevabilite && ($affair->recevabilite == || $affair->recevabilite == 3) ){
  1827.                 $label "Saisine clôturée";
  1828.                 $message "Saisine irrecevable clôturée";
  1829.             } elseif($affair->is_closed_prematurely){
  1830.                 $label "Dossier clôturé";
  1831.                 $message $affair->motif_cloture "Dossier clos : ".$affair->motif_cloture  '';
  1832.             }
  1833.             else {
  1834.                 $label "Saisine clôturée";
  1835.                 $message $affair->is_refuse_entree_mediation "Votre professionnel refuse d’entrer en Médiation":"Votre dossier est clôturé";
  1836.                 if (($affair->is_mixte || $affair->is_web) && !$affair->is_refuse_entree_mediation) {
  1837.                     $button null;
  1838.                 }
  1839.             }
  1840.             
  1841.             $closed_at = new \Datetime($affair->closed_at);
  1842.             $datas_dates[$closed_at->format('Y-m-d')][] =  array(
  1843.                 'field' => 'closed_at',
  1844.                 'date' => $affair->closed_at,
  1845.                 'document' => (!$affair->is_closed_prematurely 'cloture' null),
  1846.                 'document_btn_label' => $button,
  1847.                 'label' => $label,
  1848.                 'message' => $message
  1849.             );
  1850.         }
  1851.         
  1852.         if($affair->non_mise_en_oeuvre_at){
  1853.             $non_mise_en_oeuvre_at = new \Datetime($affair->non_mise_en_oeuvre_at);
  1854.             $datas_dates[$non_mise_en_oeuvre_at->format('Y-m-d')][] =  array(
  1855.                 'field' => 'non_mise_en_oeuvre_at',
  1856.                 'date' => $affair->non_mise_en_oeuvre_at,
  1857.                 'document' => null,
  1858.                 'document_btn_label' => null,
  1859.                 'label' => 'Mise en oeuvre solution',
  1860.                 'message' => 'Vous avez déclaré une difficulté dans la mise en oeuvre de la solution proposée'
  1861.             );
  1862.         } else {
  1863.             if($affair->send_avis_at){
  1864.                 $send_avis_at = new \Datetime($affair->send_avis_at); // date d'envoi de l'avis
  1865.                 // date 30 jours après l'envoi de l'avis
  1866.                 $send_avis_at_30_days = new \Datetime($affair->send_avis_at);
  1867.                 $send_avis_at_30_days->modify('+30 days');
  1868.                 // date 6 mois après l'envoi de l'avis
  1869.                 $send_avis_at_6_months = new \Datetime($affair->send_avis_at);
  1870.                 $send_avis_at_6_months->modify('+6 months');
  1871.                 
  1872.                 $today = new \Datetime();
  1873.                 
  1874.                 //~ echo "<br>send_avis_at : ".$send_avis_at->format('d-m-Y H:i:s'); 
  1875.                 //~ echo "<br>send_avis_at_30_days :".$send_avis_at_30_days->format('d-m-Y H:i:s');
  1876.                 //~ echo "<br>send_avis_at_6_months :".$send_avis_at_6_months->format('d-m-Y H:i:s');
  1877.                 
  1878.                 if ($send_avis_at_30_days <= $today && $send_avis_at_6_months >= $today && !$affair->mise_en_oeuvre_at){
  1879.                     // afficher message pour possiblité de notifier mauvaise ou non mise en oeuvre à l'AMCE
  1880.                     $send_avis_at->modify('+30 days'); // date de l'événement : date d'envoi de l'avis + 30 jours
  1881.                     $datas_dates[$send_avis_at->format('Y-m-d')][] =  array(
  1882.                         'field' => 'block_non_mise_en_oeuvre_at',
  1883.                         'date' => $send_avis_at->format('Y-m-d\TH:i:s'),
  1884.                         'document' => null,
  1885.                         'document_btn_label' => null,
  1886.                         'label' => 'Mise en oeuvre solution',
  1887.                         'message' => 'Vous souhaitez informer le Médiateur d’une difficulté de mise en œuvre ?'
  1888.                     );
  1889.                 }
  1890.             }
  1891.         }
  1892.         
  1893. //        if($affair->cloture_suite_davis_at){
  1894. //            $cloture_suite_davis_at = new \Datetime($affair->cloture_suite_davis_at);
  1895. //
  1896. //            if($affair->suite_davis_type){
  1897. //                switch($affair->suite_davis_type){
  1898. //                    case 'Contestation':
  1899. //                    case 'Demande d’explication':
  1900. //                        $label_btn = "Télécharger";
  1901. //                        $document = "cloture_suite_avis";
  1902. //                        break;
  1903. //                    default:
  1904. //                        $label_btn = "";
  1905. //                        $document = "";
  1906. //                }
  1907. //            }
  1908. //
  1909. //            $datas_dates[$cloture_suite_davis_at->format('Y-m-d')][] =  array(
  1910. //                'field' => 'cloture_suite_davis_at',
  1911. //                'date' => $affair->cloture_suite_davis_at,
  1912. //                'document' => $document,
  1913. //                'document_btn_label' => $label_btn,
  1914. //                'label' => 'Mise en oeuvre solution',
  1915. //                'message' => 'La mise en oeuvre de la solution proposée est effective'
  1916. //            );
  1917. //        }
  1918.         
  1919.         if($affair->cloture_mise_en_oeuvre_at){
  1920.             $cloture_mise_en_oeuvre_at = new \Datetime($affair->cloture_mise_en_oeuvre_at);
  1921.             
  1922.             $datas_dates[$cloture_mise_en_oeuvre_at->format('Y-m-d')][] =  array(
  1923.                 'field' => 'cloture_mise_en_oeuvre_at',
  1924.                 'date' => $affair->cloture_mise_en_oeuvre_at,
  1925.                 'document' => '',
  1926.                 'document_btn_label' => '',
  1927.                 'label' => 'Mise en oeuvre solution',
  1928.                 'message' => 'Difficulté dans la mise en oeuvre clôturée'
  1929.             );
  1930.         }
  1931.         
  1932.         $nb_messages_amce 0;
  1933.         $nb_messages_conso 0;
  1934.         if($affair->messages){
  1935.             foreach($affair->messages as $msg){
  1936.                 if($msg->from == "amce"){
  1937.                     if (null == $affair->closed_at) {
  1938.                         $nb_messages_amce ++;
  1939.                     }
  1940.                     $label'Demande d\'informations';
  1941.                     $label_message 'Vous avez reçu un message du Médiateur';
  1942.                     $field 'message';
  1943.                 } else {
  1944.                     if($msg->type != 7) { // n'est pas message TYPE_CLIENT_MISE_EN_OEUVRE => peut être affiché
  1945.                         $nb_messages_conso ++;
  1946.                         $label'Votre réponse';
  1947.                         $label_message 'Vous avez répondu au Médiateur';
  1948.                         $field 'message_conso';
  1949.                     }
  1950.                 }
  1951.                 if($msg->type != 7) { // n'est pas message TYPE_CLIENT_MISE_EN_OEUVRE => peut être affiché
  1952.                     $date_message = new \Datetime($msg->date);
  1953.                     $datas_dates[$date_message->format('Y-m-d')][] =  array(
  1954.                         'field' => $field,
  1955.                         'date' => $msg->date,
  1956.                         'document' => null,
  1957.                         'document_btn_label' => null,
  1958.                         'label' => $label,
  1959.                         'message' => $label_message
  1960.                     );
  1961.                 }
  1962.             }
  1963.         }
  1964.         if(null !== $affair->suite_davis_type_at && null !== $affair->suite_davis_type){
  1965.             $suite_davis_type_at = new \Datetime($affair->suite_davis_type_at);
  1966.             $suite_davis_history_lines = array(
  1967.                 "Remerciement ou acceptation" => "Vous avez accepté la proposition",
  1968.                 "Refus" => "Vous avez refusé la proposition",
  1969.                 "Contestation" => "Vous avez contesté la proposition",
  1970.                 "Demande d’explication" => "Vous avez demandé des explications sur la proposition"
  1971.             );
  1972.             $datas_dates[$suite_davis_type_at->format('Y-m-d')][] =  array(
  1973.                 'field' => 'suite_davis_type_at',
  1974.                 'date' => $affair->suite_davis_type_at,
  1975.                 'document' => '',
  1976.                 'document_btn_label' => '',
  1977.                 'label' =>  'Votre position',
  1978.                 'message' => $suite_davis_history_lines[$affair->suite_davis_type]
  1979.             );
  1980.         }
  1981.         if(null !== $affair->mise_en_oeuvre_at){
  1982.             $mise_en_oeuvre_at = new \Datetime($affair->mise_en_oeuvre_at);
  1983.             $datas_dates[$mise_en_oeuvre_at->format('Y-m-d')][] =  array(
  1984.                 'field' => 'mise_en_oeuvre_at',
  1985.                 'date' => $affair->mise_en_oeuvre_at,
  1986.                 'document' => '',
  1987.                 'document_btn_label' => '',
  1988.                 'label' => 'Mise en œuvre',
  1989.                 'message' => 'Vous avez déclaré une difficulté dans la mise en oeuvre de la solution proposée'
  1990.             );
  1991.         }
  1992.         if($affair->autorised_demande_docs_at){
  1993.             $autorised_demande_docs_at = new \Datetime($affair->autorised_demande_docs_at);
  1994.             $datas_dates[$autorised_demande_docs_at->format('Y-m-d')][] =  array(
  1995.                 'field' => 'autorised_demande_docs_at',
  1996.                 'date' => $affair->autorised_demande_docs_at,
  1997.                 'document' => '',
  1998.                 'document_btn_label' => '',
  1999.                 'label' => 'En attente pièces par opérateur',
  2000.                 'message' => 'Vous avez autorisé à demander les pièces à l\'opérateur'
  2001.             );
  2002.         }
  2003.         if ($affair->docs_transmitted_by_operator_at) {
  2004.             $message "Pièces transmises par l’opérateur";
  2005.             $docs_transmitted_by_operator_at = new \Datetime($affair->docs_transmitted_by_operator_at);
  2006.             $datas_dates[$docs_transmitted_by_operator_at->format('Y-m-d')][] =  array(
  2007.                 'field' => 'docs_transmitted_by_operator_at',
  2008.                 'date' => $affair->docs_transmitted_by_operator_at,
  2009.                 'document' => '',
  2010.                 'document_btn_label' => '',
  2011.                 'message' => $message,
  2012.                 'label' => 'Autorisation de chargement des pièces',
  2013.             );
  2014.         }
  2015.         // reorder by dates ASC 
  2016.         ksort($datas_dates);
  2017. //        Sort messages for each date
  2018.         $new_datas_dates = array();
  2019.         foreach ($datas_dates as $data_date) {
  2020.             uksort($data_date, function($a$b) use ($data_date) {
  2021.                 $date_a = new \DateTime($data_date[$a]['date']);
  2022.                 $date_b = new \DateTime($data_date[$b]['date']);
  2023.                 if ($date_a == $date_b) {
  2024.                     if ($data_date[$a]['label'] == 'En attente pièces par opérateur') {
  2025.                         return 1;
  2026.                     }
  2027.                         return $a $b : -1;
  2028.                 }
  2029. //                'En attente pièces par opérateur' is placed at the end of the list at the same time(H:i)!
  2030.                 if ($data_date[$a]['label'] == 'En attente pièces par opérateur' && $date_a->format('H:i') == $date_b->format('H:i')) {
  2031.                     return 1;
  2032.                 }
  2033.                 return $date_a $date_b : -1;
  2034.             });
  2035.             $new_datas_dates[] = $data_date;
  2036.         }
  2037.         return $this->render('Front/Default/detail_affair_history.html.twig', array(
  2038.             "affair" => $affair,
  2039.             "datas_dates" => $new_datas_dates,
  2040.             "nb_messages_amce" => $nb_messages_amce,
  2041.             "nb_messages_conso" => $nb_messages_conso
  2042.         ));
  2043.     }
  2044.      /**
  2045.      * @Route("/detail_affaire_messagerie", name="detail_affair_messages")
  2046.      */
  2047.     public function detailAffairMessagesAction(Request $requestMailerInterface $mailer)
  2048.     {
  2049.         // page messagerie / upload de docs
  2050.         $session $request->getSession();
  2051.         if (!$session->has("user_token"))
  2052.             return $this->redirectToRoute('espace');
  2053.         $token $session->get("user_token");
  2054.         $id = (int)$request->get("id");
  2055.         if(!$id) return $this->redirectToRoute('affaires');
  2056.         
  2057.         $request->getSession()->set("affair_id"$id);
  2058.         
  2059.         $header = array('Authorization' => 'Bearer ' $token);
  2060.         
  2061.         // set read customer field for messages of the affair
  2062.         $url_msg $this->getParameter('api_url') . "/affaires/set_read_messages/" $id;
  2063.         $response_msg $this->client->get($url_msg, array('headers' => $header));
  2064.         // get affair details
  2065.         $url $this->getParameter('api_url') . "/affaires/details/" $id;
  2066.         $response $this->client->get($url, array('headers' => $header));
  2067.         $affair json_decode($response->getBody()->getContents());
  2068.         $rep_type $affair->rep_type// type de représentant
  2069.         $is_waiting_mandat = ($rep_type == "Membre de la famille" 0);
  2070.         
  2071.         $date_before = new \Datetime('2021-09-15'); // affairs created before this date can't have new detail page
  2072.         $date_before->setTime(0,0,0);
  2073.         $created_at = new \Datetime($affair->created_at);
  2074.         if(!$affair->created_at || ($affair->created_at && $created_at->format('Y-m-d') < $date_before->format('Y-m-d')) ){ // affairs before this date can't have new process => show old template
  2075.             return $this->render('Front/Default/detail_affair.html.twig', array("affair" => $affair));
  2076.         }
  2077.         
  2078.         $has_mandat_sent false;
  2079.         $has_cni_sent false;
  2080.         $type_envoi $request->get("envoi"null);
  2081.         $is_close_prematurely $request->get("close_prematurely"null);
  2082.         $is_prevent_operator_vue $request->get("prevent_operator"null);
  2083.         if($type_envoi == "no_doc"$type_envoi "electronique"// if client choose "no doc to upload", type_envoi is by_mail
  2084.         if($affair->status == && $type_envoi){ // formulaire fin de saisine validé
  2085.             $files = array();
  2086.             $datas = array(
  2087.                 "affair_id" => (int)$id,
  2088.                 "by_post" => $type_envoi == "poste" 0,
  2089.                 "by_mail" => $type_envoi == "electronique" 0,
  2090.                 "close_prematurely" => $is_close_prematurely
  2091.             );
  2092.             $baseurl $request->getScheme() . '://' $request->getHttpHost() . $request->getBasePath();
  2093.             $tmpFiles = [];
  2094.             for ($i 1$i <= 10$i++) {
  2095.                 if ($request->get("type_doc_" $i)) {
  2096.                     $file $request->files->get("document_file_" $i);
  2097.                     if ($file) {
  2098.                         $datas["type_doc_" $i] = $request->get("type_doc_" $i);
  2099.                         
  2100.                         if($datas["type_doc_" $i] == 19$has_mandat_sent true;
  2101.                         if($datas["type_doc_" $i] == 20$has_cni_sent true;
  2102.                         
  2103.                         $ext $file->getClientOriginalExtension();
  2104.                         if (null == $ext || $ext == '') {
  2105.                             $this->addFlash("error""Extension du fichier invalide. Veuillez vérifier votre fichier.");
  2106.                             return $this->redirectToRoute('detail_affaire_messagerie'$request->query->all());
  2107.                         }
  2108.                         $name $file->getClientOriginalName();
  2109.                         $filename uniqid() . "." $ext;
  2110.                         $this->storage->moveFileToStorage('app.affair_files_directory'$filename$file);
  2111.                         $datas["document_file_" $i] = $baseurl $this->storage->getFileStorageUrl('app.affair_files_directory'$filename );
  2112.                         $datas["document_name_" $i] = $name;
  2113.                         $tmpFiles[] = $filename;
  2114.                     }
  2115.                 }
  2116.             }
  2117.             $url $this->getParameter('api_url') . "/saisine/phase2Pieces";
  2118.             $header = array('Authorization' => 'Bearer ' $token'Content-Type' => 'application/json; charset=utf-8');
  2119.             $response $this->client->post($url, array('headers' => $header'body' => json_encode($datas)));
  2120.             $reponse json_decode($response->getBody()->getContents());
  2121.             if ($reponse == 'OUI') {
  2122.                 foreach ($tmpFiles as $fileName) {
  2123.                     $this->storage->deleteFileFromStorage('app.affair_files_directory'$fileName);
  2124.                 }
  2125.             }
  2126.             // envoi mail de confirmation de prise en compte de la saisine que pour les saisines 100% web
  2127.             // envoi si pas besoin de mandat ou (si besoin de mandat et mandat et CNI fournis)
  2128.             if ($type_envoi != "poste" && (!$is_waiting_mandat || ($is_waiting_mandat && $has_mandat_sent && $has_cni_sent) ) ) { 
  2129.                 $mail $request->getSession()->get("user_login");
  2130.                 //~ $message = \Swift_Message::newInstance()
  2131.                     //~ ->setSubject("Votre saisine du Médiateur des Communications Electroniques")
  2132.                     //~ ->setSender(array('contact@mediateur-telecom.fr' => 'Le Médiateur des Communications Electroniques'))
  2133.                     //~ ->setFrom(array('contact@mediateur-telecom.fr' => 'Le Médiateur des Communications Electroniques'))
  2134.                     //~ ->setTo($mail)
  2135.                     //~ ->setBody($this->renderView(
  2136.                         //~ 'AmceBundle:Mail:mail.fin.saisine.html.twig',
  2137.                         //~ array(
  2138.                             //~ 'type' => $type_envoi
  2139.                         //~ )
  2140.                     //~ ),
  2141.                         //~ 'text/html');
  2142.                 //~ $this->get('mailer')->send($message);
  2143.                 $message = (new Email())
  2144.                     ->from(new Address('contact@mediateur-telecom.fr''Le Médiateur des Communications Electroniques'))
  2145.                     ->to($mail)
  2146.                     ->subject("Votre saisine du Médiateur des Communications Electroniques")
  2147.                     ->html(
  2148.                         $this->renderView('Front/Mail/mail.fin.saisine.html.twig',['type' => $type_envoi])
  2149.                     );
  2150.                 $mailer->send($message);
  2151.             }
  2152.             // Recharger les infos de l'affaire
  2153.             $url $this->getParameter('api_url') . "/affaires/details/" $id;
  2154.             $header = array('Authorization' => 'Bearer ' $token);
  2155.             $response $this->client->get($url, array('headers' => $header));
  2156.             $affair json_decode($response->getBody()->getContents());
  2157.             if ($is_close_prematurely) {
  2158.                 $url $this->getParameter('api_url') . "/close-prematurely";
  2159.                 $header = array('Authorization' => 'Bearer ' $token'Content-Type' => 'application/json; charset=utf-8');
  2160.                 $this->client->post($url, array('headers' => $header'body' => \json_encode(array('affaire'=> $id))));
  2161.                 return $this->redirectToRoute('detail_affair_history', ['id'=>$id]);
  2162.             }
  2163.         } // fin étape fin saisine  
  2164.         
  2165.         $envoi_new $request->get("envoi_new"null);
  2166.         if($envoi_new == "new" && !$affair->affect_amce_at) { // formulaire d'ajout de nouveaux documents tant que l'affaire n'est pas affectée à l'AMCE
  2167.             $datas = array("affair_id" => (int)$id);
  2168.             $has_mandat_sent false;
  2169.             $has_cni_sent false;
  2170.             $is_waiting_mandat $affair->waiting_representant_mandat;
  2171.             $tmpFiles = [];
  2172.             $baseurl $request->getScheme() . '://' $request->getHttpHost() . $request->getBasePath();
  2173.             for ($i 1$i <= 10$i++) {
  2174.                 if ($request->get("type_doc_" $i)) {
  2175.                     $file $request->files->get("document_file_" $i);
  2176.                     if ($file) {
  2177.                         $datas["type_doc_" $i] = $request->get("type_doc_" $i);
  2178.                         if($datas["type_doc_" $i] == 19$has_mandat_sent true;
  2179.                         if($datas["type_doc_" $i] == 20$has_cni_sent true;
  2180.                         $ext $file->getClientOriginalExtension();
  2181.                         if (null == $ext || $ext == '') {
  2182.                             $this->addFlash("error""Extension du fichier invalide. Veuillez vérifier votre fichier.");
  2183.                             return $this->redirectToRoute('detail_affaire_messagerie'$request->query->all());
  2184.                         }
  2185.                         $name $file->getClientOriginalName();
  2186.                         $filename uniqid() . "." $ext;
  2187.                         $this->storage->moveFileToStorage('app.affair_files_directory'$filename$file);
  2188.                         $datas["document_file_" $i] = $baseurl $this->storage->getFileStorageUrl('app.affair_files_directory'$filename );
  2189.                         $datas["document_name_" $i] = $name;
  2190.                         $tmpFiles[] = $filename;
  2191.                     }
  2192.                 }
  2193.             }
  2194.             $url $this->getParameter('api_url') . "/saisine/addNewDocs";
  2195.             $header = array('Authorization' => 'Bearer ' $token'Content-Type' => 'application/json; charset=utf-8');
  2196.             $response $this->client->post($url, array('headers' => $header'body' => json_encode($datas)));
  2197.             $reponse json_decode($response->getBody()->getContents());
  2198.             if ($reponse == 'OUI') {
  2199.                 foreach ($tmpFiles as $fileName) {
  2200.                     $this->storage->deleteFileFromStorage('app.affair_files_directory'$fileName);
  2201.                 }
  2202.             }
  2203.             if ($is_waiting_mandat && $has_mandat_sent && $has_cni_sent ) { // send notification email 
  2204.                 $mail $request->getSession()->get("user_login");
  2205.                 //~ $message = \Swift_Message::newInstance()
  2206.                     //~ ->setSubject("Votre saisine du Médiateur des Communications Electroniques")
  2207.                     //~ ->setSender(array('contact@mediateur-telecom.fr' => 'Le Médiateur des Communications Electroniques'))
  2208.                     //~ ->setFrom(array('contact@mediateur-telecom.fr' => 'Le Médiateur des Communications Electroniques'))
  2209.                     //~ ->setTo($mail)
  2210.                     //~ ->setBody($this->renderView(
  2211.                         //~ 'AmceBundle:Mail:mail.fin.saisine.html.twig',
  2212.                         //~ array(
  2213.                             //~ 'type' => "electronique"
  2214.                         //~ )
  2215.                     //~ ),
  2216.                         //~ 'text/html');
  2217.                 //~ $this->get('mailer')->send($message);
  2218.                 $message = (new Email())
  2219.                     ->from(new Address('contact@mediateur-telecom.fr''Le Médiateur des Communications Electroniques'))
  2220.                     ->to($mail)
  2221.                     ->subject("Votre saisine du Médiateur des Communications Electroniques")
  2222.                     ->html($this->renderView('Front/Mail/mail.fin.saisine.html.twig',['type' => "electronique"]));
  2223.                 $mailer->send($message);
  2224.             }
  2225.             
  2226.             // Recharger les infos de l'affaire
  2227.             $url $this->getParameter('api_url') . "/affaires/details/" $id;
  2228.             $header = array('Authorization' => 'Bearer ' $token);
  2229.             $response $this->client->get($url, array('headers' => $header));
  2230.             $affair json_decode($response->getBody()->getContents());
  2231.         }
  2232.         // When affair is validated “irrecevable” (10)
  2233.         if($affair->status == 10 && $is_prevent_operator_vue) {
  2234.             $url $this->getParameter('api_url') . "/prevent_view_pro";
  2235.             $header = array('Authorization' => 'Bearer ' $token'Content-Type' => 'application/json; charset=utf-8');
  2236.             $response $this->client->post($url, array('headers' => $header'body' => json_encode(['affair_id'=>$id])));
  2237.             $reponse json_decode($response->getBody()->getContents());
  2238.             $affair->view_pro 0;
  2239.         }
  2240.         $valid_answer $request->get("valid_answer"null);
  2241.         if($valid_answer){ // formulaire de réponse du client validé
  2242.             // tester si formulaire re-soumis
  2243.             $last_message null;
  2244.             if ($affair->messages){
  2245.                 $length sizeof($affair->messages);
  2246.                 $cpt 0;
  2247.                 $msg_type_no_need_answer 10;
  2248.                 foreach($affair->messages as $msg){
  2249.                     $cpt++;
  2250.                     if($cpt == $length && $msg->from == 'amce' and $msg->type != $msg_type_no_need_answer){ // le dernier message provient de l'AMCE
  2251.                         $last_message $msg;
  2252.                     }
  2253.                 }
  2254.             }
  2255.             
  2256.             if($last_message){ // message conso peut être envoyé
  2257.                 $datas = array(
  2258.                     "affair_id" => (int)$id,
  2259.                     "message" => $request->get("message"null),
  2260.                     "autorised_docs_for_pro" => $request->get("autorised_docs_for_pro"null)
  2261.                 );
  2262.                 $tmpFiles = [];
  2263.                 $baseurl $request->getScheme() . '://' $request->getHttpHost() . $request->getBasePath();
  2264.                 for ($i 1$i <= 10$i++) {
  2265.                     if ($request->get("type_doc_" $i)) {
  2266.                         $file $request->files->get("document_file_" $i);
  2267.                         if ($file) {
  2268.                             $datas["type_doc_" $i] = $request->get("type_doc_" $i);
  2269.                             $ext $file->getClientOriginalExtension();
  2270.                             if (null == $ext || $ext == '') {
  2271.                                 $this->addFlash("error""Extension du fichier invalide. Veuillez vérifier votre fichier.");
  2272.                                 return $this->redirectToRoute('detail_affaire_messagerie'$request->query->all());
  2273.                             }
  2274.                             $name $file->getClientOriginalName();
  2275.                             $filename uniqid() . "." $ext;
  2276.                             $this->storage->moveFileToStorage('app.affair_files_directory'$filename$file);
  2277.                             $datas["document_file_" $i] = $baseurl $this->storage->getFileStorageUrl('app.affair_files_directory'$filename );
  2278.                             $datas["document_name_" $i] = $name;
  2279.                             $tmpFiles[] = $filename;
  2280.                         }
  2281.                     }
  2282.                 }
  2283.                 $url $this->getParameter('api_url') . "/saisine/answerCustomer";
  2284.                 $header = array('Authorization' => 'Bearer ' $token'Content-Type' => 'application/json; charset=utf-8');
  2285.                 $response $this->client->post($url, array('headers' => $header'body' => json_encode($datas)));
  2286.                 $reponse json_decode($response->getBody()->getContents());
  2287.                 if ($reponse == 'OUI') {
  2288.                     foreach ($tmpFiles as $fileName) {
  2289.                         $this->storage->deleteFileFromStorage('app.affair_files_directory'$fileName);
  2290.                     }
  2291.                 }
  2292.                 // Recharger les infos de l'affaire
  2293.                 $url $this->getParameter('api_url') . "/affaires/details/" $id;
  2294.                 $header = array('Authorization' => 'Bearer ' $token);
  2295.                 $response $this->client->get($url, array('headers' => $header));
  2296.                 $affair json_decode($response->getBody()->getContents());
  2297.             }
  2298.         }
  2299.         
  2300.         // infos sur l'affaire
  2301.         // group datas by dates
  2302.         $created_at = new \Datetime($affair->created_at);
  2303.         $datas_dates = array();
  2304.         
  2305.         //~ $datas_dates[$created_at->format('Y-m-d')][] =  array(
  2306.             //~ 'field' => 'created_at',
  2307.             //~ 'date' => $affair->created_at,
  2308.             //~ 'from' => "amce",
  2309.             //~ 'docs' => null,
  2310.             //~ 'message' => ''
  2311.         //~ );
  2312.         if($affair->fin_saisine_at){
  2313.             $fin_saisine_at = new \Datetime($affair->fin_saisine_at);
  2314.             if($affair->is_mixte) {
  2315.                 $message "J'ai choisi d'envoyer mes documents par courrier pour finaliser ma saisine";
  2316.                 $datas_dates[$fin_saisine_at->format('Y-m-d')][] =  array(
  2317.                     'field' => 'fin_saisine_at',
  2318.                     'date' => $affair->fin_saisine_at,
  2319.                     'from' => 'client',
  2320.                     'docs' => null,
  2321.                     'message' => $message
  2322.                 );
  2323.                 
  2324.                 $message "Vous avez choisi d'envoyer vos pièces par courrier.
  2325.                             <br>Vous devez nous adresser dans le délai maximum de 10 jours vos pièces justificatives par la poste.";
  2326.                 
  2327.                 $datas_dates[$fin_saisine_at->format('Y-m-d')][] =  array(
  2328.                     'field' => 'fin_saisine_at',
  2329.                     'date' => $affair->fin_saisine_at,
  2330.                     'from' => 'amce',
  2331.                     'docs' => null,
  2332.                     'message' => $message
  2333.                 );
  2334.             
  2335.             } else {
  2336.                 
  2337.                 if ($affair->documents_saisine){
  2338.                     $message "Documents joints en ligne pour finaliser ma demande";
  2339.                     
  2340.                 } else {
  2341.                     $message "Je n'ai pas joint de documents pour finaliser ma saisine";
  2342.                 }            
  2343.                 $datas_dates[$fin_saisine_at->format('Y-m-d')][] =  array(
  2344.                     'field' => 'fin_saisine_at',
  2345.                     'date' => $affair->fin_saisine_at,
  2346.                     'from' => 'client',
  2347.                     'docs' => null,
  2348.                     'message' => $message
  2349.                 );
  2350.                 if ($affair->status != 10 && $affair->motif_cloture != 'Dossier incomplet') { // affair is closed for "Dossier incomplet" reason
  2351.                     $message "";
  2352.                     if ($affair->documents_saisine) {
  2353.                         if ($affair->autorised_demande_docs_at) {
  2354.                             $message .= "Vous avez autorisé la médiation des communications électroniques à demander les pièces manquantes à l'opérateur.<br>";
  2355.                         } else {
  2356.                             $message .= "Vos documents sont en cours d'analyse par nos services.<br>";
  2357.                         }
  2358.                     }
  2359.                     $message .= "Vous serez prévenu par email de l'avancement de votre dossier.";
  2360.                     $datas_dates[$fin_saisine_at->format('Y-m-d')][] =  array(
  2361.                         'field' => 'fin_saisine_at',
  2362.                         'date' => $affair->fin_saisine_at,
  2363.                         'from' => 'amce',
  2364.                         'docs' => null,
  2365.                         'message' => $message
  2366.                     );
  2367.                 }
  2368.             }
  2369.             
  2370.             if($affair->waiting_representant_mandat) {
  2371.                 $message "Vous devez nous transmettre le mandat et la copie recto/verso de la carte d'identité du consommateur représenté";
  2372.                 $datas_dates[$fin_saisine_at->format('Y-m-d')][] =  array(
  2373.                     'field' => 'fin_saisine_at_mandat',
  2374.                     'date' => $affair->fin_saisine_at,
  2375.                     'from' => 'amce',
  2376.                     'docs' => null,
  2377.                     'message' => $message
  2378.                 );
  2379.             }
  2380.         }
  2381.         
  2382.         if($affair->rep_type == 'Membre de la famille' && !$affair->waiting_representant_mandat && $affair->envoi_mandat_at && ($affair->status != 10 && $affair->motif_cloture != 'Dossier incomplet')){
  2383.             $message "Votre mandat de représentation a bien été réceptionné et est en cours d’analyse par nos services.";
  2384.             $envoi_mandat_at = new \Datetime($affair->envoi_mandat_at);
  2385.             $datas_dates[$envoi_mandat_at->format('Y-m-d')][] =  array(
  2386.                 'field' => 'envoi_mandat_at',
  2387.                 'date' => $affair->envoi_mandat_at,
  2388.                 'from' => 'amce',
  2389.                 'docs' => null,
  2390.                 'message' => $message
  2391.             );
  2392.         }
  2393.         
  2394.         if($affair->notification_at && $affair->is_mixte){
  2395.             if($affair->is_passage_auto_prequalif){ // si les pièces ne sont pas réceptionnées et le dossier est basculé en préqualification
  2396.                 $message "Vos documents ne nous sont pas parvenus dans les délais. Votre demande est en cours d’analyse par nos services.<br>Vous serez prévenu par email de l'avancement de votre dossier.";
  2397.             } else {
  2398.                 $message "Vos documents sont réceptionnés et sont en cours d’analyse par nos services.<br>Vous serez prévenu par email de l'avancement de votre dossier.";
  2399.             }
  2400.             $notification_at = new \Datetime($affair->notification_at);
  2401.             $datas_dates[$notification_at->format('Y-m-d')][] =  array(
  2402.                 'field' => 'notification_at',
  2403.                 'date' => $affair->notification_at,
  2404.                 'from' => 'amce',
  2405.                 'docs' => null,
  2406.                 'message' => $message
  2407.             );
  2408.         }
  2409.         if($affair->envoi_global_at){
  2410.             $recevabilite $affair->recevabilite;
  2411.             $is_recevable 0;
  2412.             switch($recevabilite){
  2413.                 case 1
  2414.                     $is_recevable 1;
  2415.                     $message "Votre demande a été validée par nos services.<br>Vous serez prévenu en cas de besoin de documents complémentaires.";
  2416.                     break;
  2417.                 //~ case 2: 
  2418.                     //~ $message = "Votre dossier est déclaré irrecevable";
  2419.                     //~ break;
  2420.                 //~ case 3: 
  2421.                     //~ $message = "Votre dossier ne peut pas être pris en compte";
  2422.                     //~ break;
  2423.                 default: 
  2424.                     $message "";
  2425.             }
  2426.             $envoi_global_at = new \Datetime($affair->envoi_global_at);
  2427.             if($is_recevable){
  2428.                 $datas_dates[$envoi_global_at->format('Y-m-d')][] =  array(
  2429.                     'field' => 'envoi_global_at',
  2430.                     'date' => $affair->envoi_global_at,
  2431.                     'from' => 'amce',
  2432.                     'docs' => null,
  2433.                     'message' => $message
  2434.                 );
  2435.             }
  2436.         }
  2437.         if(!\is_null($affair->view_pro) && !$affair->view_pro) {
  2438.             $prequalification_at = new \Datetime($affair->envoi_global_at);
  2439.             $datas_dates[$prequalification_at->format('Y-m-d')][] =  array(
  2440.                 'field' => 'prequalification_at',
  2441.                 'date' => $affair->envoi_global_at,
  2442.                 'from' => 'client',
  2443.                 'docs' => null,
  2444.                 'message' => 'Je m’oppose à la transmission de ma saisine à l’opérateur'
  2445.             );
  2446.         }
  2447.         
  2448.         $nb_messages_amce 0;
  2449.         $nb_messages_conso 0;
  2450.         if($affair->messages){
  2451.             foreach($affair->messages as $msg){
  2452.                 if($msg->from == "amce"){
  2453.                     $nb_messages_amce ++;
  2454.                     $field 'message';
  2455.                 } else {
  2456.                     if($msg->content && $msg->type != 7) { // n'est pas message TYPE_CLIENT_MISE_EN_OEUVRE => peut être affiché
  2457.                         $nb_messages_conso ++;
  2458.                         $field 'message_conso';
  2459.                     }
  2460.                 }
  2461.                 if($msg->content && $msg->type != 7) { // n'est pas message TYPE_CLIENT_MISE_EN_OEUVRE => peut être affiché
  2462.                     $date_message = new \Datetime($msg->date);
  2463.                     $datas_dates[$date_message->format('Y-m-d')][] =  array(
  2464.                         'field' => $field,
  2465.                         'date' => $msg->date,
  2466.                         'from' => $msg->from,
  2467.                         'docs' => $msg->from == "amce" null $msg->docs,
  2468.                         'message' => $msg->content
  2469.                     );
  2470.                 }
  2471.             }
  2472.         }
  2473.         if($affair->missing_docs) {
  2474.             $affair->missing_docs json_decode($affair->missing_docstrue);
  2475.         }
  2476.         // reorder by dates ASC 
  2477.         ksort($datas_dates);
  2478. //        Sort messages for each date
  2479.         foreach ($datas_dates as $data_date) {
  2480.             usort($data_date, function($a$b) {
  2481.                 $date_a = new \DateTime($a['date']);
  2482.                 $date_b = new \DateTime($b['date']);
  2483.                 return $date_a >= $date_b : -1;
  2484.             });
  2485.         }
  2486.         
  2487.         
  2488.         /////////
  2489.         $template 'Front/Default/detail_affair_messages.html.twig';
  2490.         return $this->render($template, array("affair" => $affair"datas_dates" => $datas_dates));
  2491.     }
  2492.     
  2493.      /**
  2494.      * @Route("/affair_load_infos_representant", name="affair_load_infos_representant")
  2495.      */
  2496.     public function loadInfoRepresentantAction(Request $request)
  2497.     {
  2498.         $id $request->get('id');
  2499.         $session $request->getSession();
  2500.         if (!$session->has("user_token")) {
  2501.             return new Response(-1);
  2502.         }
  2503.         if(!$id) return new Response(-1);
  2504.         
  2505.         $url $this->getParameter('api_url') . "/representant_info_find/". (int)$id;
  2506.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"), 'Content-Type' => 'application/json; charset=utf-8');
  2507.         $response $this->client->get($url, array('headers' => $header));    
  2508.         
  2509.         return new Response($response->getBody()->getContents());
  2510.     }
  2511.     /**
  2512.      * @Route("/detail_affaire_messagerie_reply/{id}", name="detail_affaire_messagerie_reply")
  2513.      * @param int $id
  2514.      */
  2515.     public function detailAffairMessagerieReplyAction(Request $request$id)
  2516.     {
  2517.         $session $request->getSession();
  2518.         if (!$session->has("user_token")) {
  2519.             return $this->redirectToRoute('espace');
  2520.         }
  2521.         $answerMediatrice '';
  2522.         if ($request->request->get('answer-mediatrice')) {
  2523.             $answerMediatrice $request->request->get('answer-mediatrice');
  2524.         }
  2525.         $datas = array(
  2526.             "affair_id" => $id,
  2527.             "message" => $request->request->get('message'),
  2528.             "answer_mediatrice" => $answerMediatrice,
  2529.             "message_type" => $request->request->get('message_type'),
  2530.         );
  2531.         $tmpFiles = [];
  2532.         $baseurl $request->getScheme() . '://' $request->getHttpHost() . $request->getBasePath();
  2533.         for ($i 1$i <= 10$i++) {
  2534.             if ($request->get("type_doc_" $i)) {
  2535.                 $file $request->files->get("document_file_" $i);
  2536.                 if ($file) {
  2537.                     $datas["type_doc_" $i] = $request->get("type_doc_" $i);
  2538.                     $ext $file->getClientOriginalExtension();
  2539.                     if (null == $ext || $ext == '') {
  2540.                         $this->addFlash("error""Extension du fichier invalide. Veuillez vérifier votre fichier.");
  2541.                         return $this->redirectToRoute('saisine'$request->query->all());
  2542.                     }
  2543.                     $name $file->getClientOriginalName();
  2544.                     $filename uniqid() . "." $ext;
  2545.                     $this->storage->moveFileToStorage('app.affair_files_directory'$filename$file);
  2546.                     $datas["document_file_" $i] = $baseurl $this->storage->getFileStorageUrl('app.affair_files_directory'$filename );
  2547.                     $datas["document_name_" $i] = $name;
  2548.                     $tmpFiles[] = $filename;
  2549.                 }
  2550.             }
  2551.         }
  2552.         $url $this->getParameter('api_url') . "/messagerie_reply";
  2553.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"), 'Content-Type' => 'application/json; charset=utf-8');
  2554.         $reponse $this->client->post($url, array('headers' => $header'body' => json_encode($datas)));
  2555.         if ($reponse == 'OUI') {
  2556.             foreach ($tmpFiles as $fileName) {
  2557.                 $this->storage->deleteFileFromStorage('app.affair_files_directory'$fileName);
  2558.             }
  2559.         }
  2560.         return $this->redirectToRoute('detail_affair_messages', array('id' => $id));
  2561.     }
  2562.     /**
  2563.      * @Route("/detail_affair_representant_mandat/{id}", name="detail_affair_representant_mandat")
  2564.      * @param int $id
  2565.      */
  2566.     public function detailAffairRepresentantMandatAction(Request $request$id)
  2567.     {
  2568.         $session $request->getSession();
  2569.         if (!$session->has("user_token")) {
  2570.             return $this->redirectToRoute('espace');
  2571.         }
  2572.         if(!$id) return $this->redirectToRoute('affaires');
  2573.         $url $this->getParameter('api_url') . "/get_representant_mandat/" $id;
  2574.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"));
  2575.         try {
  2576.             $response $this->client->get($url, array('headers' => $header));
  2577.         } catch (RequestException $r) {
  2578.             $this->addFlash("error",$r->getMessage());
  2579.             return $this->redirectToRoute('affaires');
  2580.         }
  2581.         $mandat json_decode($response->getBody()->getContents());
  2582.         if ($mandat->code == '200' && $mandat->link) {
  2583.             return $this->redirect($mandat->link);
  2584.         } else {
  2585.             if ($mandat->message) {
  2586.                 $this->addFlash("error",$mandat->message);
  2587.             }
  2588.         }
  2589.         return $this->redirectToRoute('affaires');
  2590.     }
  2591.     /**
  2592.      * @Route("/imprimer_form", name="imprimer_form")
  2593.      */
  2594.     public function imprimerFormAction(Request $requestKnpSnappyPdf $knpSnappyPdf)
  2595.     {
  2596.         $session $request->getSession();
  2597.         $affaire_id $request->getSession()->get("affair_id");
  2598.         /* $client = new \Zend\XmlRpc\Client($this->container->getParameter('url_webservice'));
  2599.         $datas = array("user_id" => $request->getSession()->get("user_id"));
  2600.         $client->call('saisine.connexion', array('datas' => $datas)); */
  2601.         // affaire
  2602.         //$response_affair = $client->call('saisine.affairView', (int)$affaire_id);
  2603.         //$result_affair = new \SimpleXMLElement($response_affair);
  2604.         $url $this->getParameter('api_url') . "/affaires/details/" . (int)$session->get("affair_id");
  2605.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"));
  2606.         $response $this->client->get($url, array('headers' => $header));
  2607.         $result_affair json_decode($response->getBody()->getContents());
  2608.         // representant
  2609.         /* $result_representative = null;
  2610.         if((int)$result_affair->representative_id > 0) {
  2611.             $response_representative = $client->call('saisine.representativeView', (int)$result_affair->representative_id);
  2612.             $result_representative = new \SimpleXMLElement($response_representative);
  2613.         }  */
  2614.         $filename "saisine-du-mediateur-des-communications-electroniques";
  2615.         if ($result_affair->rep_type == 'Membre de la famille') {
  2616.             $tmpDirectory \sys_get_temp_dir();
  2617.             $file_path $tmpDirectory '/' $filename;
  2618.             if(file_exists$file_path )){
  2619.                 unlink$file_path );
  2620.             }
  2621.             $file $knpSnappyPdf->generateFromHtml(
  2622.                 $this->renderView('Front/Default/affaire.pdf.html.twig', array("affair" => $result_affair)),
  2623.                 $file_path
  2624.             );
  2625.             $url $this->getParameter('api_url') . "/get_representant_mandat/" .  (int)$session->get("affair_id");
  2626.             $header = array('Authorization' => 'Bearer ' $session->get("user_token"));
  2627.             try {
  2628.                 $response $this->client->get($url, array('headers' => $header));
  2629.             } catch (RequestException $r) {
  2630.                 $this->addFlash("error",$r->getMessage());
  2631.                 return $this->redirectToRoute('affaires');
  2632.             }
  2633.             $mandat_path $tmpDirectory '/mandat.pdf';
  2634.             if(file_exists$mandat_path )){
  2635.                 unlink$mandat_path );
  2636.             }
  2637.             $mandat json_decode($response->getBody()->getContents());
  2638.             if (copy($mandat->link$mandat_path)) {
  2639.                 $pdf = new PDFMerger();
  2640.                 foreach (array($file_path$mandat_path) as $f) {
  2641.                     try {
  2642.                         $pdf->addPDF($f'all');
  2643.                     } catch (\Exception $e) {
  2644.                     }
  2645.                 }
  2646.                 
  2647.                 $pdf->merge('download'$filename ".pdf");
  2648.             }
  2649.         } else {
  2650.             return new Response(
  2651.                 $knpSnappyPdf->getOutputFromHtml(
  2652.                     $this->renderView('Front/Default/affaire.pdf.html.twig', array("affair" => $result_affair)),
  2653.                     array('encoding' => 'utf-8')
  2654.                 ),
  2655.                 200,
  2656.                 array(
  2657.                     'Content-Type' => 'application/pdf',
  2658.                     'Content-Disposition' => 'attachment; filename="' $filename '.pdf"'
  2659.                 )
  2660.             );
  2661.         }
  2662.     }
  2663.     /**
  2664.      * @Route("/print_empty_form", name="print_empty_form")
  2665.      */
  2666.     public function imprimerEmptyFormAction(Request $requestKnpSnappyPdf $knpSnappyPdf)
  2667.     {
  2668.         $filename "saisine-du-mediateur-des-communications-electroniques.pdf";
  2669.         return new Response(
  2670.             $knpSnappyPdf->getOutputFromHtml(
  2671.                 $this->renderView('Front/Default/pdf.vide.html.twig'),
  2672.                 array('encoding' => 'utf-8')
  2673.             ),
  2674.             200,
  2675.             array(
  2676.                 'Content-Type' => 'application/pdf',
  2677.                 'Content-Disposition' => 'attachment; filename="' $filename '"'
  2678.             )
  2679.         );
  2680.     }
  2681.     /**
  2682.      * @Route("/block_quiz", name="block_quiz")
  2683.      */
  2684.     public function blockQuizAction(Request $request)
  2685.     {
  2686.         $blocked $request->get('blocked');
  2687.         if ($blocked) {
  2688.             $request->getSession()->set("block_quiz""blocked");
  2689.         } else {
  2690.             if ($request->getSession()->get("block_quiz") && $request->getSession()->get("block_quiz") != "blocked")
  2691.                 $request->getSession()->remove("block_quiz");
  2692.         }
  2693.         return new Response('');
  2694.     }
  2695.     public function prepare_access_token()
  2696.     {
  2697.         $username 'tonyGee';
  2698.         $password '123456';
  2699.         $url $this->getParameter('api_url') . "/login_check";
  2700.         $data = ['username' => $username'password' => $password];
  2701.         $headers = array('Content-Type' => 'application/json; charset=utf-8');
  2702.         $response $this->client->post($url, ['headers'=>$headers'body' => json_encode($data)]);
  2703.         $result json_decode($response->getBody()->getContents());
  2704.         return $result->token;
  2705.     }
  2706.     
  2707.     public function checkValidityDate($date){
  2708.         $date_ch $date
  2709.         $tab_date explode('/'$date_ch);
  2710.         $day $tab_date[0];
  2711.         $month $tab_date[1];
  2712.         $year $tab_date[2];
  2713.         if(strlen($year) == 2$year "20".$year// cas où la personne saisit l'année que sur 2 chiffres
  2714.         if(!checkdate($month$day$year)){ // date inconnue
  2715.           return 0;
  2716.         }
  2717.         return 1;
  2718.     }
  2719.     
  2720.     /**
  2721.      * @Route("/check_dates_quiz", name="check_dates_quiz")
  2722.      */
  2723.     public function checkDatesQuizAction(Request $request)
  2724.     {
  2725.         $is_valid 0;
  2726.         $is_blocage 0;
  2727.         $error "";
  2728.         $ovh_is_operateur $request->get("ovh_is_operateur", -1);
  2729.         $is_operateur $request->get("is_operateur");
  2730.         $date_service_client $request->get("date_service_client");
  2731.         $date_reponse_service_client $request->get("date_reponse_service_client");
  2732.         $date_service_conso $request->get("date_service_conso");
  2733.         $date_reponse_service_conso $request->get("date_reponse_service_conso");
  2734.         $reponse_service_client $request->get("reponse_service_client");
  2735.         $service_conso_contact $request->get("service_conso_contact");
  2736.         $reponse_service_conso $request->get("reponse_service_conso");
  2737.        
  2738.         $today = new \Datetime();
  2739.         $date_1_year_ago = new \Datetime();
  2740.         $date_1_year_ago->modify('-1 year');
  2741.         $date_1_month_ago = new \Datetime();
  2742.         $date_1_month_ago->modify('-1 month');
  2743.         $date_2_months_ago = new \Datetime();
  2744.         $date_2_months_ago->modify('-2 months');
  2745.         
  2746.         // check validité date de contact service client
  2747.         $format 'd/m/Y';
  2748.         if($this->checkValidityDate($date_service_client)){ // date valide
  2749.             // cas où la personne a saisi l'année sur 2 chiffres au lieu de 4
  2750.             $d_service_client \DateTime::createFromFormat($format$date_service_client);
  2751.             if(substr($d_service_client->format('Y'), 02) == "00"$d_service_client->setDate("20".substr($d_service_client->format('Y'), 22), $d_service_client->format('m'), $d_service_client->format('d'));
  2752.             
  2753.             if($d_service_client $today){ // date supérieure à la date du jour : ne pas bloquer le quiz mais renvoyer une erreur
  2754.                 $error "<br>Veuillez vérifier la date de contact du service client";
  2755.             }
  2756.             elseif( ($is_operateur == || $ovh_is_operateur == 0) && $d_service_client $date_1_year_ago){ // opérateur non télécom et date saisie supérieure à 1 an : bloquer quiz
  2757.                 $is_blocage 1;
  2758.                 $error "<p style=\"text-align:center\">Pour que votre dossier soit recevable, vous devez agir auprès du Médiateur dans le délai maximum d'un an après avoir saisi par écrit le professionnel.</p>";
  2759.             } 
  2760.             elseif( ($is_operateur == || $ovh_is_operateur == 0) && $reponse_service_client == "service_client_pas_repondu_depuis_1_mois"){ // opérateur 
  2761.                 if($d_service_client $date_1_month_ago){ // date saisie supérieure à 30 jours par rapport à la date du jour : bloquer quiz
  2762.                     $is_blocage 1;
  2763.                     $error .= "<p>Pour pouvoir saisir le Médiateur des Communications Electroniques vous devez attendre le délai d’1 mois entre la prise de contact avec le service clients et sa réponse, ce qui n’est pas le cas compte tenu des informations que vous nous avez transmises.</p>
  2764.                             <p>Si vous ne recevez aucune réponse du service recours consommateurs dans un délai d’un mois ou si la solution proposée ne vous satisfait pas, vous pourrez saisir le Médiateur des Communications Electroniques.</p>
  2765.                             <p>Consultez notre <a href=\"".$this->generateUrl('faq')."\">FAQ</a>.</p>";
  2766.                 }
  2767.             }
  2768.             // service_conso_contact => valeurs "service_conso_contacte" ou "service_client_pas_repondu"
  2769.             if(!$is_blocage && $service_conso_contact == "service_client_pas_repondu"){
  2770.                 if($d_service_client $today){ // date supérieure à la date du jour : ne pas bloquer le quiz mais renvoyer une erreur
  2771.                     $error "<br>Veuillez vérifier la date de contact du service client";
  2772.                 }
  2773.                 elseif($d_service_client $date_1_year_ago){ // date saisie supérieure à 1 an : bloquer quiz
  2774.                     $is_blocage 1;
  2775.                     $error "<p style=\"text-align:center\">Vous ne pouvez pas saisir le Médiateur. Le délai d’1 an depuis que vous avez saisi le professionnel par écrit est dépassé.</p>";
  2776.                 } elseif( ($is_operateur == || $ovh_is_operateur == 1) && $d_service_client $date_2_months_ago){ // opérateur télécom et date saisie inférieure à 2 mois : bloquer quiz
  2777.                     $is_blocage 1;
  2778.                     $error "<p>Pour pouvoir saisir le Médiateur des Communications Electroniques, vous devez attendre le délai de 2 mois entre la prise de contact avec le service clients et sa réponse, ce qui n’est pas le cas compte tenu des informations que vous nous avez transmises.</p>
  2779.                             <p>Passé ce délai de 2 mois, vous pourrez saisir le Médiateur des Communications Electroniques.</p>
  2780.                             <p>Vous pouvez également contacter par courrier le service recours consommateurs.</p>
  2781.                             <p>Si vous ne recevez aucune réponse du service recours consommateurs dans un délai d’un mois ou si la solution proposée ne vous satisfait pas, vous pouvez alors saisir le Médiateur des Communications Electroniques</p>";
  2782.                 }
  2783.                 elseif( ($is_operateur == || $ovh_is_operateur == 0) && $d_service_client $date_1_month_ago){ // opérateur non télécom et et date de contact du service client inférieure à 1 mois : bloquer quizz
  2784.                     $is_blocage 1;
  2785.                     $error "<p>Pour pouvoir saisir le Médiateur des Communications Electroniques vous devez attendre le délai d’1 mois entre la prise de contact avec le service clients et sa réponse, ce qui n’est pas le cas compte tenu des informations que vous nous avez transmises.</p>
  2786.                             <p>Si vous ne recevez aucune réponse du service clients dans un délai d’un mois ou si la solution proposée ne vous satisfait pas, vous pouvez saisir le Médiateur des Communications Electroniques.</p>
  2787.                             <p>Consultez notre <a href=\"".$this->generateUrl('faq')."\">FAQ</a>.</p>";
  2788.                 } 
  2789.             }
  2790.             if( ($is_operateur == || $ovh_is_operateur == 0) && !$is_blocage){ // is_operateur = 0 => cas opérateur non télécom ou ovh_is_operateur == 0 => OVH non télécom
  2791.                 if($reponse_service_client == "service_client_repondu" && $this->checkValidityDate($date_reponse_service_client)){ // service client a répondu et date valide
  2792.                     $d_reponse_service_client \DateTime::createFromFormat($format$date_reponse_service_client);
  2793.                     // cas où la personne a saisi l'année sur 2 chiffres au lieu de 4
  2794.                     if(substr($d_reponse_service_client->format('Y'), 02) == "00"$d_reponse_service_client->setDate("20".substr($d_reponse_service_client->format('Y'), 22), $d_reponse_service_client->format('m'), $d_reponse_service_client->format('d'));
  2795.                     
  2796.                     if($d_reponse_service_client $today){ // date supérieure à la date du jour : ne pas bloquer le quiz mais renvoyer une erreur
  2797.                         $error .= "<br>Veuillez vérifier la date de réponse du service client";
  2798.                     }elseif($d_reponse_service_client $d_service_client){ // date saisie inférieure à la date de contact du service client : ne pas bloquer le quiz mais renvoyer une erreur
  2799.                         $error .= "<br>Veuillez vérifier la date de réponse du service client";
  2800.                     } 
  2801.                     //~ elseif($d_service_client > $date_2_months_ago){ // date saisie inférieure à 2 mois : bloquer quizz
  2802.                         //~ $is_blocage = 1;
  2803.                         //~ $error = "<p>Pour pouvoir saisir le Médiateur des Communications Electroniques, vous devez attendre le délai de 2 mois entre la prise de contact avec le service clients et sa réponse, ce qui n’est pas le cas compte tenu des informations que vous nous avez transmises.</p>
  2804.                             //~ <p>Passé ce délai de 2 mois, vous pourrez saisir le Médiateur des Communications Electroniques.</p>
  2805.                             //~ <p>Vous pouvez également contacter par courrier le service recours consommateurs.</p>
  2806.                             //~ <p>Si vous ne recevez aucune réponse du service recours consommateurs dans un délai d’un mois ou si la solution proposée ne vous satisfait pas, vous pouvez alors saisir le Médiateur des Communications Electroniques</p>";
  2807.                     //~ }
  2808.                 
  2809.                 }elseif($reponse_service_client == "service_client_repondu" && !$this->checkValidityDate($date_reponse_service_client)) { // date invalide
  2810.                     $error "<br>Veuillez vérifier la date de réponse du service client";
  2811.                 }
  2812.             }
  2813.             
  2814.             if( $is_operateur || $ovh_is_operateur ){ // cas opérateur télécom ou OVH télécom
  2815.                 // service_conso_contact => valeurs "service_conso_contacte" ou "service_client_pas_repondu"
  2816.                 if(!$is_blocage && $service_conso_contact == "service_conso_contacte"){ // check validité date contact service conso
  2817.                     if($this->checkValidityDate($date_service_conso)){ // date valide
  2818.                         $d_service_conso \DateTime::createFromFormat($format$date_service_conso);
  2819.                         // cas où la personne a saisi l'année sur 2 chiffres au lieu de 4
  2820.                         if(substr($d_service_conso->format('Y'), 02) == "00"$d_service_conso->setDate("20".substr($d_service_conso->format('Y'), 22), $d_service_conso->format('m'), $d_service_conso->format('d'));
  2821.                         
  2822.                         if($d_service_conso $today){ // ne pas bloquer le quiz mais renvoyer une erreur
  2823.                             $error .= "<br>Veuillez vérifier la date de contact du service recours consommateurs";
  2824.                         }
  2825.                         elseif($d_service_conso $date_1_year_ago){ // bloquer quiz
  2826.                             $is_blocage 1;
  2827.                             $error .= "<br>Vous ne pouvez pas saisir le Médiateur. Le délai d’1 an depuis que vous avez saisi le professionnel par écrit est dépassé.";
  2828.                         }
  2829.                         elseif($d_service_conso $d_service_client){ // date saisie inférieure à la date de contact du service client : ne pas bloquer le quiz mais renvoyer une erreur
  2830.                             $error .= "<br>Veuillez vérifier la date de contact du service recours consommateurs";
  2831.                         }
  2832.                         
  2833.                         // reponse_service_conso => valeurs "", "service_conso_repondu" ou "service_conso_pas_repondu"
  2834.                         if(!$is_blocage && $reponse_service_conso == "service_conso_repondu"){ // check validité réponse service conso
  2835.                             $d_reponse_service_conso \DateTime::createFromFormat($format$date_reponse_service_conso);
  2836.                             // cas où la personne a saisi l'année sur 2 chiffres au lieu de 4
  2837.                             if(substr($d_reponse_service_conso->format('Y'), 02) == "00"$d_reponse_service_conso->setDate("20".substr($d_reponse_service_conso->format('Y'), 22), $d_reponse_service_conso->format('m'), $d_reponse_service_conso->format('d'));
  2838.                             
  2839.                             if(!$this->checkValidityDate($date_reponse_service_conso)) {
  2840.                                 $error "<br>Veuillez vérifier la date de réponse du service recours consommateurs";
  2841.                             } elseif($d_reponse_service_conso $today){ // ne pas bloquer le quiz mais renvoyer une erreur
  2842.                                 $error .= "<br>Veuillez vérifier la date de réponse du service recours consommateurs";
  2843.                             }elseif($d_reponse_service_conso $d_service_conso){ // date réponse service conso inférieure à la date de contact du service conso : ne pas bloquer le quiz mais renvoyer une erreur
  2844.                                 $error .= "<br>Veuillez vérifier la date de réponse du service recours consommateurs";
  2845.                             }
  2846.                         }
  2847.                         if(!$is_blocage && $reponse_service_conso == "service_conso_pas_repondu"){ // service conso pas répondu
  2848.                             if($d_service_conso $date_1_month_ago){ // service conso pas répondu et date de contact service conso < 1 mois par rapport à la date du jour : bloquer quiz
  2849.                                 $is_blocage 1;
  2850.                                 $error "<p>Pour pouvoir saisir le Médiateur des Communications Electroniques vous devez attendre le délai d’1 mois entre la prise de contact avec le service recours consommateurs et sa réponse, ce qui n’est pas le cas compte tenu des informations que vous nous avez transmises.</p>
  2851.                             <p>Si vous ne recevez aucune réponse du service recours consommateurs dans un délai d’un mois ou si la solution proposée ne vous satisfait pas, vous pourrez saisir le Médiateur des Communications Electroniques.</p>
  2852.                             <p>Consultez notre <a href=\"".$this->generateUrl('faq')."\">FAQ</a>.</p>";
  2853.                             }
  2854.                         }
  2855.                     } else {
  2856.                         $error .= "<br>Veuillez vérifier la date de contact du service recours consommateurs";
  2857.                     }
  2858.                 }
  2859.             }
  2860.         } else {
  2861.             $error "<br>Veuillez vérifier la date de contact du service client";
  2862.         }
  2863.         // dates valides 
  2864.         if($error == "") { // enregistrement en session des valeurs pour utilisation dans la saisine
  2865.             $request->getSession()->set("date_service_client", isset($d_service_client) ? $d_service_client->format('d/m/Y') : $date_service_client);
  2866.             $request->getSession()->set("date_service_conso", isset($d_service_conso) ? $d_service_conso->format('d/m/Y') : $date_service_conso);
  2867.             $request->getSession()->set("date_reponse_service_client", isset($d_reponse_service_client) ? $d_reponse_service_client->format('d/m/Y') : $date_reponse_service_client);
  2868.             $request->getSession()->set("date_reponse_service_conso",  isset($d_reponse_service_conso) ? $d_reponse_service_conso->format('d/m/Y') : $date_reponse_service_conso);
  2869.             $request->getSession()->set("service_conso_contact"$service_conso_contact);
  2870.             $request->getSession()->set("reponse_service_client"$reponse_service_client);
  2871.             $request->getSession()->set("reponse_service_conso"$reponse_service_conso);
  2872.             
  2873.             return new Response(json_encode(array("blocage" => 0"error" => "")));
  2874.         }
  2875.        
  2876.         return new Response(json_encode(array("blocage" => $is_blocage"error" => $error)));
  2877.     }
  2878.     
  2879.     /**
  2880.      * @Route("/detail_affaire_get_courrier/{type}/{id}", name="detail_affair_get_courrier")
  2881.      */
  2882.     public function getCourrierAffairAction(Request $request$type$id)
  2883.     {
  2884.         // page details
  2885.         $session $request->getSession();
  2886.         if (!$session->has("user_token")) {
  2887.             return $this->redirectToRoute('espace');
  2888.         }
  2889.         $id = (int)$request->get("id");
  2890.         if(!$id) return $this->redirectToRoute('affaires');
  2891.         $url $this->getParameter('api_url') . "/affaire/get_courrier/".$type."/".$id;
  2892.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"));
  2893.         $response $this->client->get($url, array('headers' => $header));
  2894.         $document json_decode($response->getBody()->getContents());
  2895.         
  2896.         if($document != "Not found") {
  2897.             $now = new \Datetime();
  2898.             //~ $test = "http://solutio.dev.goons.mana.paris/uploads/courriers/2021/03/Qualification_affaire_10270403-0928.pdf";
  2899.             $filename "Courrier-$type-$id.".$now->format('dmYhis').".pdf";
  2900.             header('Content-type: application/pdf');
  2901.             header('Content-Disposition: attachment; filename="'.$filename.'"');
  2902.             readfile($document);
  2903.             return new Response('');
  2904.         } else return new Response('Not found');
  2905.     }
  2906.     /**
  2907.      * @Route("/autorisation-chargement-pieces/{id}", name="autorisation_chargement_pieces")
  2908.      */
  2909.     public function autorisationChargementPieces(Request $request$id)
  2910.     {
  2911.         // page details
  2912.         $session $request->getSession();
  2913.         if (!$session->has("user_token")) {
  2914.             return $this->redirectToRoute('espace');
  2915.         }
  2916.         $url $this->getParameter('api_url') . "/autorisation-chargement-pieces";
  2917.         $header = array('Authorization' => 'Bearer ' $session->get("user_token"), 'Content-Type' => 'application/json; charset=utf-8');
  2918.         $response $this->client->post($url, array('headers' => $header'body' => \json_encode(array('affaire'=> $id))));
  2919.         return new Response($response->getBody());
  2920.     }
  2921. //    /**
  2922. //     * @Route("/close-prematurely/{id}", name="close_prematurely")
  2923. //     */
  2924. //    public function closePrematurely(Request $request, $id)
  2925. //    {
  2926. //        // page details
  2927. //        $session = $request->getSession();
  2928. //        if (!$session->has("user_token")) {
  2929. //            return $this->redirectToRoute('espace');
  2930. //        }
  2931. //
  2932. //        $url = $this->getParameter('api_url') . "/close-prematurely";
  2933. //        $header = array('Authorization' => 'Bearer ' . $session->get("user_token"), 'Content-Type' => 'application/json; charset=utf-8');
  2934. //        $response = $this->client->post($url, array('headers' => $header, 'body' => \json_encode(array('affaire'=> $id))));
  2935. //
  2936. //
  2937. //        return new Response($response->getBody());
  2938. //    }
  2939.     public function getUnreadMessages(Request $request)
  2940.     {
  2941.         $session $request->getSession();
  2942.         $id 0;
  2943.         if ($session->get("user_token")) {
  2944.             $header = array('Authorization' => 'Bearer ' $session->get("user_token"));
  2945.             // get unread by consumer messages
  2946.             $url $this->getParameter('api_url') . "/affaires/get_unread_by_consumer_messages/";
  2947.             $response $this->client->get($url, array('headers' => $header));
  2948.             $result json_decode($response->getBody()->getContents());
  2949.             if ($result->code == 200) {
  2950.                 $id $result->next_affair_id;
  2951.             }
  2952.         }
  2953.         return new Response($id);
  2954.     }
  2955.     # get success response from recaptcha and return it to controller
  2956.     private function captchaverify($response$type ="normal"){
  2957.         $url $this->getParameter('url_recaptcha');
  2958.         $secret $this->getParameter('secret_recaptcha');
  2959.         $secret_invisible $this->getParameter('secret_recaptcha_invisible');
  2960.         $ch curl_init();
  2961.         curl_setopt($chCURLOPT_URL$url);
  2962.         curl_setopt($chCURLOPT_HEADER0);
  2963.         curl_setopt($chCURLOPT_RETURNTRANSFERTRUE);
  2964.         curl_setopt($chCURLOPT_POSTtrue);
  2965.         if($type=="invisible") {
  2966.             $data = array(
  2967.                 'secret' => $secret_invisible,
  2968.                 'response' => $response,
  2969.                 'remoteip' => $_SERVER['REMOTE_ADDR']
  2970.             );
  2971.         } else {
  2972.             $data = array(
  2973.                 'secret' => $secret,
  2974.                 'response' => $response
  2975.             );
  2976.         }
  2977.         curl_setopt($chCURLOPT_POSTFIELDS$data);
  2978.         $response curl_exec($ch);
  2979.         curl_close($ch);
  2980.         $res json_decode($response);
  2981.         return $res->success;
  2982.     }
  2983. }