src/Controller/DossierController.php line 1911

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpFoundation\JsonResponse
  8. use Symfony\Contracts\Translation\TranslatorInterface;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use App\Entity\Dossier;
  11. use App\Entity\DossierEtat;
  12. use App\Entity\DossierSegment;
  13. use App\Entity\DossierSegmentService AS SegService;
  14. use App\Entity\DossierSegmentServiceGroupement;
  15. use App\Entity\DossierSegmentServicePax;
  16. use App\Entity\Evenement;
  17. use App\Entity\PlanDeTransport;
  18. use App\Entity\RoadmapItem;
  19. use App\Entity\Document;
  20. use App\Entity\EditorialDocument;
  21. use App\Entity\ChangePeriode;
  22. use App\Entity\DossierSegmentPax;
  23. use App\Entity\DossierSegmentPaxEtat;
  24. use App\Entity\DossierSegmentPaxRooming;
  25. use App\Entity\DossierSegmentTransfertAerienPax;
  26. use App\Entity\DossierSegmentTransfertAerienService;
  27. use App\Entity\DossierSegmentTransfertAerien;
  28. use App\Entity\DossierSegmentPlanDeVol;
  29. use App\Entity\DossierSegmentTodo;
  30. use App\Entity\PaxType;
  31. use App\Entity\PaxRooming;
  32. use App\Entity\EvenementType;
  33. use App\Entity\TransfertAerien;
  34. use App\Entity\TaskListe;
  35. use App\Entity\TransfertAerienPlanDeVol;
  36. use App\Entity\PlanDeVol;
  37. use App\Entity\DocumentGenerator;
  38. use App\Entity\DocumentGeneratorModele;
  39. use App\Entity\DocumentGeneratorPage;
  40. use App\Entity\DocumentGeneratorPageTemplate;
  41. use App\Entity\DossierCommandeFournisseurEtat;
  42. use App\Entity\DossierCommandeFournisseurTampon;
  43. use App\Entity\EditorialCategorie;
  44. use App\Entity\Service;
  45. use App\Entity\ServiceType;
  46. use App\Entity\DossierGuide;
  47. use App\Entity\DossierSegmentActiviteEdito;
  48. use App\Form\DossierFormType;
  49. use App\Form\PlanDeVolFormType;
  50. use App\Form\DocumentGeneratorPageFormType;
  51. use App\Form\DossierSegmentFormType;
  52. use App\Form\TransfertAerienType;
  53. use App\Form\DossierSegmentPaxFormType;
  54. use App\Service\CompanyService;
  55. use App\Service\DossierService;
  56. use App\Service\VoyageService;
  57. use App\Service\DossierSegmentService;
  58. use App\Service\DocumentService;
  59. use App\Service\EditorialService;
  60. use App\Service\PatternService;
  61. use App\Service\DocumentGeneratorService;
  62. use App\Service\UserService;
  63. use App\Service\GraphService;
  64. use App\Enum\ServiceTypeEnum;
  65. use App\Enum\DossierTypeEnum;
  66. use App\Enum\VoyageTypeEnum;
  67. use App\Enum\EditorialEnum;
  68. use App\Enum\VoyagePdfModeleEnum;
  69. use App\Enum\VoyagePdfPageTemplateType;
  70. use App\Form\DossierSegmentTodoListFormType;
  71. use App\Form\DossierTodoListFormType;
  72. use App\Form\DossierSegmentCompositionDaysFormType;
  73. use App\Form\DossierSegmentCompositionTypesFormType;
  74. use App\Form\DossierVentesFormType;
  75. use App\Service\PaxService;
  76. use App\Service\TraductionService;
  77. use App\Service\CustomImportService;
  78. use App\Service\DossierSegmentServiceService;
  79. use App\Service\ServiceService;
  80. use App\Utils\Encoding;
  81. use App\Utils\Functions;
  82. use ErrorException;
  83. use Psr\Log\LoggerInterface;
  84. use Segment;
  85. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  86. /**
  87.  * @Route("/", name="dossier_", methods={"GET","POST","FILES"})
  88.  */
  89. class DossierController extends AbstractController
  90. {
  91.     /**
  92.      * @var CompanyService $companyService
  93.      */
  94.     private $companyService;
  95.     /**
  96.      * @var EntityManagerInterface $em
  97.      */
  98.     private $em;
  99.     /**
  100.      * @var DossierSegmentService $dossierSegmentService
  101.      */
  102.     private $dossierSegmentService;
  103.     public function __construct(
  104.         CompanyService $companyService,
  105.         EntityManagerInterface $em,
  106.         DossierSegmentService $dossierSegmentService
  107.     ) {
  108.         $this->companyService $companyService;
  109.         $this->em $em;
  110.         $this->dossierSegmentService $dossierSegmentService;
  111.     }
  112.     /**
  113.      * @Route("/dossiers", name="index")
  114.      */
  115.     public function index(Request $requestDossierService $dossierServiceTranslatorInterface $translator)
  116.     {
  117.         // Params
  118.         $user $this->getUser();
  119.         $userId $this->getUser() && $this->getUser()->getId() ? $this->getUser()->getId() : 0;
  120.         $guidePaxTypeId = \App\Enum\PaxType::GUIDE_ID;
  121.         $destinationId $request->query->get('destinationId');
  122.         $destinationsId $this->get('session')->get('destinationsId');
  123.         $etatId $request->query->get('etatId');
  124.         $categorieId $request->query->get('categorieId');
  125.         $proprietaireInstance $this->getParameter('instance_proprietaire');
  126.         if ($destinationsId
  127.         {
  128.             $destinations "AND (EXISTS (SELECT dode.destination_id FROM dossier_destination dode WHERE dode.destination_id IN($destinationsId) AND dode.dossier_id = walkinn_dossier.id) OR NOT EXISTS (SELECT dode.destination_id FROM dossier_destination dode WHERE dode.dossier_id = walkinn_dossier.id))";
  129.         } else 
  130.         {
  131.             $destinations "";
  132.         }
  133.         if ($destinationId
  134.         {
  135.             $destination "AND EXISTS (SELECT dode.destination_id FROM dossier_destination dode WHERE dode.destination_id = $destinationId AND dode.dossier_id = walkinn_dossier.id)";
  136.         } else 
  137.         {
  138.             $destination "";
  139.         }
  140.         if ($categorieId) {
  141.             $categorie "AND walkinn_dossier.dossier_type_id = " $categorieId " ";
  142.         } else {
  143.             $categorie "";
  144.         }
  145.         if ($etatId) {
  146.             $etat "AND walkinn_dossier.dossier_etat_id = " $etatId " ";
  147.         } else {
  148.             $etat "";
  149.         }
  150.         // SQL
  151.         $sql_list 
  152.             ' SELECT walkinn_dossier.id
  153.             , CONCAT("<span class=\'fa fa-circle fa-lg mr-1\' style=\'color:", walkinn_dossier_etat.color, "\'></span> ", walkinn_dossier_etat.libelle) AS `walkinn_dossier_etat-libelle`
  154.             , walkinn_dossier.code_walkinn
  155.             , walkinn_dossier.code 
  156.             , walkinn_dossier.libelle
  157.             , walkinn_dossier.annee
  158.             , ( 
  159.                 SELECT GROUP_CONCAT("<div class=\'m-2\'>", de.libelle ,"</div>" SEPARATOR "")
  160.                 FROM dossier_destination dode 
  161.                 LEFT JOIN walkinn_destination de ON de.id = dode.destination_id
  162.                 WHERE dode.dossier_id = walkinn_dossier.id
  163.             )  AS "_esc_destinations"
  164.             , CONCAT(ba_user.firstname, " ", ba_user.lastname) AS `ba_user-lastname`
  165.             , ( 
  166.                 SELECT GROUP_CONCAT("<div class=\'m-2\'>", doli_societe.nom ,"</div>" ORDER BY date_depart SEPARATOR "")
  167.                 FROM walkinn_dossier_segment 
  168.                 LEFT JOIN doli_societe doli_societe ON doli_societe.rowid = client_id
  169.                 WHERE dossier_id = walkinn_dossier.id AND actif = 1
  170.             )  AS "_esc_clients" 
  171.             , ( 
  172.                 SELECT GROUP_CONCAT("<a href=\'", CONCAT("/symfony/public/dossier/", dossier_id, "/segment/", id, "/composition") ,"\' class=\'btn btn-link p-1 mt-1 mb-1\'>#", code_walkinn ,"</a>" ORDER BY date_depart SEPARATOR "<br>")
  173.                 FROM walkinn_dossier_segment
  174.                 WHERE dossier_id = walkinn_dossier.id AND actif = 1
  175.             )  AS "_esc_segments"
  176.             , IF(walkinn_dossier_type.is_taux_de_remplissage = 1
  177.                 , ( 
  178.                     SELECT GROUP_CONCAT("<div class=\'segment-stats m-1\' style=\'width:100px\' data-pax=\'", ( SELECT COUNT(id) FROM walkinn_dossier_segment_pax WHERE segment_id = walkinn_dossier_segment.id AND actif = 1 AND pax_type_id != ' $guidePaxTypeId .'), "\' data-min=\'", min_pax, "\' data-max=\'", max_pax, "\'></div>" ORDER BY walkinn_dossier_segment.date_depart ASC SEPARATOR "<br>")
  179.                     FROM walkinn_dossier_segment walkinn_dossier_segment
  180.                     WHERE walkinn_dossier_segment.dossier_id = walkinn_dossier.id AND walkinn_dossier_segment.actif = 1
  181.                 )
  182.                 , ( 
  183.                     SELECT GROUP_CONCAT("<div class=\'m-2\'>", ( SELECT COUNT(id) FROM walkinn_dossier_segment_pax WHERE segment_id = walkinn_dossier_segment.id AND actif = 1 AND pax_type_id != ' $guidePaxTypeId .'), " PAX</div> " ORDER BY walkinn_dossier_segment.date_depart SEPARATOR "")
  184.                     FROM walkinn_dossier_segment walkinn_dossier_segment
  185.                     WHERE walkinn_dossier_segment.dossier_id = walkinn_dossier.id AND walkinn_dossier_segment.actif = 1
  186.                 )
  187.             )  AS "_esc_infos"
  188.             , ( 
  189.                 SELECT GROUP_CONCAT("<div class=\'m-2\'>", DATE_FORMAT(date_depart , "%d/%m/%Y"), IF(nb_jours > 1, CONCAT(" - ", DATE_FORMAT(DATE_ADD(date_depart, INTERVAL (nb_jours -1) DAY) , "%d/%m/%Y")), ""), " (", nb_jours," jour", IF(nb_jours > 1, "s", ""), ")</div>" ORDER BY date_depart SEPARATOR "")
  190.                 FROM walkinn_dossier_segment
  191.                 WHERE dossier_id = walkinn_dossier.id AND actif = 1
  192.             )  AS "_esc_dates"
  193.             , walkinn_dossier_type.libelle AS `walkinn_dossier_type-libelle`
  194.              '
  195.             ' FROM walkinn_dossier walkinn_dossier '
  196.             // . ' LEFT JOIN walkinn_dossier_segment walkinn_dossier_segment ON walkinn_dossier_segment.dossier_id = walkinn_dossier.id '
  197.             ' LEFT JOIN walkinn_dossier_etat walkinn_dossier_etat ON walkinn_dossier_etat.id = walkinn_dossier.dossier_etat_id '
  198.             ' LEFT JOIN walkinn_dossier_type walkinn_dossier_type ON walkinn_dossier_type.id = walkinn_dossier.dossier_type_id '
  199.             ' LEFT JOIN ba_user ba_user ON ba_user.id = walkinn_dossier.charge_dossier_id '
  200.             ' WHERE walkinn_dossier.actif = 1 AND walkinn_dossier.is_valide = 1 ' $destinations $destination $categorie $etat
  201.         ;
  202.         // Widgets
  203.         $widgets =  
  204.             [
  205.                 [
  206.                     'titre' => 'Liste des dossiers en production',
  207.                     'code' => 'dossier_list',
  208.                     'taille' => 12,
  209.                     'sql' => $sql_list,
  210.                     'champs' =>
  211.                         [
  212.                             "id" => 
  213.                                 [
  214.                                     'affichage' => false,
  215.                                     'filtre' => false,
  216.                                     'label' => $translator->trans('ID')
  217.                                 ],
  218.                             "walkinn_dossier_etat-libelle" => 
  219.                                 [
  220.                                     'affichage' => true,
  221.                                     'filtre' => true,
  222.                                     'label' => $translator->trans('Etat')
  223.                                 ],
  224.                             "code_walkinn" => 
  225.                                 [
  226.                                     'affichage' => true,
  227.                                     'filtre' => true,
  228.                                     'label' => $translator->trans('Code ' $proprietaireInstance)
  229.                                 ],
  230.                             "code" => 
  231.                                 [
  232.                                     'affichage' => false,
  233.                                     'filtre' => true,
  234.                                     'label' => $translator->trans('Code client')
  235.                                 ],
  236.                             "libelle" => 
  237.                                 [
  238.                                     'affichage' => true,
  239.                                     'filtre' => true,
  240.                                     'label' => $translator->trans('Libellé')
  241.                                 ],
  242.                             "slug" => 
  243.                                 [
  244.                                     'affichage' => true,
  245.                                     'filtre' => true,
  246.                                     'label' => $translator->trans('Slug')
  247.                                 ],
  248.                             "annee" => 
  249.                                 [
  250.                                     'affichage' => false,
  251.                                     'filtre' => true,
  252.                                     'label' => $translator->trans('Année')
  253.                                 ],
  254.                             "nb_jours" => 
  255.                                 [
  256.                                     'affichage' => true,
  257.                                     'filtre' => true,
  258.                                     'label' => $translator->trans('Durée en jours')
  259.                                 ],
  260.                             "walkinn_destination-libelle" => 
  261.                                 [
  262.                                     'affichage' => true,
  263.                                     'filtre' => true,
  264.                                     'label' => $translator->trans('Destination')
  265.                                 ],
  266.                             "walkinn_dossier_theme-libelle" => 
  267.                                 [
  268.                                     'affichage' => true,
  269.                                     'filtre' => true,
  270.                                     'label' => $translator->trans('Thème')
  271.                                 ],
  272.                             "walkinn_dossier_type-libelle" => 
  273.                                 [
  274.                                     'affichage' => true,
  275.                                     'filtre' => true,
  276.                                     'label' => $translator->trans('Type')
  277.                                 ],
  278.                             "walkinn_dossier_categorie-libelle" => 
  279.                                 [
  280.                                     'affichage' => false,
  281.                                     'filtre' => true,
  282.                                     'label' => $translator->trans('Catégorie')
  283.                                 ],
  284.                             "doli_societe-nom" => 
  285.                                 [
  286.                                     'affichage' => true,
  287.                                     'filtre' => true,
  288.                                     'label' => $translator->trans('Client')
  289.                                 ],
  290.                             "ba_user-lastname" => 
  291.                                 [
  292.                                     'affichage' => false,
  293.                                     'filtre' => true,
  294.                                     'label' => $translator->trans('Chargé dossier')
  295.                                 ],
  296.                             "_esc_destinations" => 
  297.                                 [
  298.                                     'affichage' => false,
  299.                                     'filtre' => true,
  300.                                     'label' => $translator->trans('Destination(s)'),
  301.                                     'attr' => array(
  302.                                         'type' => 'varchar',
  303.                                         'search' => '(
  304.                                             ( 
  305.                                              SELECT COUNT(desti.libelle)
  306.                                              FROM dossier_destination dode
  307.                                              LEFT JOIN walkinn_destination desti ON dode.destination_id = desti.id
  308.                                              WHERE dossier_id = walkinn_dossier.id AND desti.libelle LIKE "%%%s%%" LIMIT 1) > 0
  309.                                             )'
  310.                                     )
  311.                                 ],
  312.                             "_esc_clients" => 
  313.                                 [
  314.                                     'affichage' => true,
  315.                                     'filtre' => true,
  316.                                     'label' => $translator->trans('Client'),
  317.                                     'attr' => array(
  318.                                         'type' => 'varchar',
  319.                                         'search' => '(
  320.                                             ( 
  321.                                              SELECT COUNT(doli_societe.nom)
  322.                                              FROM walkinn_dossier_segment
  323.                                              LEFT JOIN doli_societe doli_societe ON doli_societe.rowid = client_id
  324.                                              WHERE dossier_id = walkinn_dossier.id AND actif = 1 AND doli_societe.nom LIKE "%%%s%%" LIMIT 1) > 0
  325.                                             )'
  326.                                     )
  327.                                 ],
  328.                             "_esc_segments" => 
  329.                                 [
  330.                                     'affichage' => true,
  331.                                     'filtre' => true,
  332.                                     'label' => $translator->trans('Segment'),
  333.                                     'attr' => array(
  334.                                         'type' => 'varchar',
  335.                                         'search' => '(
  336.                                             ( 
  337.                                                 SELECT COUNT(code_walkinn)
  338.                                                 FROM walkinn_dossier_segment
  339.                                                 WHERE dossier_id = walkinn_dossier.id AND actif = 1 AND code_walkinn LIKE "%%%s%%") > 0
  340.                                             )'
  341.                                     )
  342.                                 ],
  343.                             "_esc_infos" => 
  344.                                 [
  345.                                     'affichage' => true,
  346.                                     'filtre' => false,
  347.                                     'label' => $translator->trans('Infos Pax')
  348.                                 ],
  349.                             "_esc_dates" => 
  350.                                 [
  351.                                     'affichage' => true,
  352.                                     'filtre' => true,
  353.                                     'label' => $translator->trans('Dates'),
  354.                                     'attr' => array(
  355.                                         'type' => 'date',
  356.                                         'search' => '(
  357.                                             (
  358.                                                 SELECT COUNT(date_depart)
  359.                                                 FROM walkinn_dossier_segment
  360.                                                 WHERE dossier_id = walkinn_dossier.id AND actif = 1 
  361.                                                 AND 
  362.                                                     ( "%1$s" BETWEEN DATE_FORMAT(date_depart, "%%Y-%%m-%%d") AND DATE_FORMAT(DATE_ADD(date_depart, INTERVAL (nb_jours -1) DAY), "%%Y-%%m-%%d"))
  363.                                             ) > 0
  364.                                         )'
  365.                                     )
  366.                                 ],
  367.                                 
  368.                         ]
  369.                     ,
  370.                     'config' =>
  371.                         [
  372.                             'new' => true,
  373.                             'newPath' => "/dossier/new?isValide=1",
  374.                             'edit' => true,
  375.                             'delete' => true,
  376.                             'inline' => false,
  377.                             'print' => true,
  378.                             'copy' => true,
  379.                             'excel' => true,
  380.                             'csv' => true,
  381.                             'pdf' => true,
  382.                             'reset' => true,
  383.                             'viewAll' => false,
  384.                             'selectAll' => true,
  385.                             'selectNone' => true,
  386.                             'colvis' => true,
  387.                         ],
  388.                 
  389.                 ]
  390.             ]  
  391.         ;
  392.         $dossiersListForNew null;
  393.         return $this->render('dossier/index.html.twig', [
  394.            'controller_name' => 'DossierController',
  395.            'widgets' => $widgets,
  396.            'dossiersListForNew' => $dossiersListForNew,
  397.            'user' => $user
  398.         ]);
  399.     }
  400.     /**
  401.      * @Route("/dossiers/contact/{contactId}", name="index_by_contact")
  402.      */
  403.     public function indexByContact(Request $request$contactIdTranslatorInterface $translator)
  404.     {
  405.         // Params
  406.         $user $this->getUser();
  407.         $userId $this->getUser() && $this->getUser()->getId() ? $this->getUser()->getId() : 0;
  408.         $guidePaxTypeId = \App\Enum\PaxType::GUIDE_ID;
  409.         $isDolibarr $request->query->get('dolibarr');
  410.         if ($isDolibarr)
  411.         {
  412.             $request->query->set('iframe'1);
  413.             $link "/externalsite/frames.php?idmenu=13&mainmenu=externalsite&leftmenu=&path=/dossier/{{id}}";
  414.         } else
  415.         {
  416.             $link "/dossier/{{id}}";
  417.         }
  418.         $proprietaireInstance $this->getParameter('instance_proprietaire');
  419.         // SQL
  420.         $sql_list 
  421.             ' SELECT walkinn_dossier.id
  422.             , CONCAT("<span class=\'fa fa-circle fa-lg mr-1\' style=\'color:", walkinn_dossier_etat.color, "\'></span> ", walkinn_dossier_etat.libelle) AS `walkinn_dossier_etat-libelle`
  423.             , walkinn_dossier.code_walkinn 
  424.             , walkinn_dossier.code 
  425.             , walkinn_dossier.libelle
  426.             , CONCAT("<div class=\'m-2\'>", doli_societe.nom ,"</div>") AS"_esc_clients"
  427.             , CONCAT("<a href=\'", "/symfony/public/dossier/", walkinn_dossier_segment.dossier_id, "/segment/", walkinn_dossier_segment.id, "/composition" ,"\' class=\'btn btn-link p-1\'>#", walkinn_dossier_segment.code_walkinn ,"</a>")  AS "_esc_segments"
  428.             , CONCAT("<div class=\'m-2\'>", DATE_FORMAT(walkinn_dossier_segment.date_depart , "%d/%m/%Y"), IF(walkinn_dossier_segment.nb_jours > 1, CONCAT(" - ", DATE_FORMAT(DATE_ADD(walkinn_dossier_segment.date_depart, INTERVAL (walkinn_dossier_segment.nb_jours -1) DAY) , "%d/%m/%Y")), ""), " (", walkinn_dossier_segment.nb_jours," jour", IF(walkinn_dossier_segment.nb_jours > 1, "s", ""), ")</div>") AS "_esc_dates"
  429.             , walkinn_dossier_type.libelle AS `walkinn_dossier_type-libelle`
  430.             FROM walkinn_dossier walkinn_dossier
  431.             LEFT JOIN walkinn_dossier_segment walkinn_dossier_segment ON walkinn_dossier_segment.dossier_id = walkinn_dossier.id
  432.             LEFT JOIN walkinn_dossier_segment_pax walkinn_dossier_segment_pax ON walkinn_dossier_segment_pax.segment_id = walkinn_dossier_segment.id
  433.             LEFT JOIN doli_socpeople doli_socpeople ON doli_socpeople.rowid = walkinn_dossier_segment_pax.contact_id
  434.             LEFT JOIN doli_societe doli_societe ON doli_societe.rowid = walkinn_dossier_segment.client_id
  435.             LEFT JOIN walkinn_dossier_etat walkinn_dossier_etat ON walkinn_dossier_etat.id = walkinn_dossier.dossier_etat_id
  436.             LEFT JOIN walkinn_dossier_type walkinn_dossier_type ON walkinn_dossier_type.id = walkinn_dossier.dossier_type_id
  437.             LEFT JOIN ba_user ba_user ON ba_user.id = walkinn_dossier.charge_dossier_id
  438.             WHERE walkinn_dossier.actif = 1 AND walkinn_dossier_segment_pax.actif = 1 AND walkinn_dossier_segment_pax.contact_id = ' $contactId '  '
  439.         ;
  440.         // Widgets
  441.         $widgets =  
  442.             [
  443.                 [
  444.                     'titre' => 'Liste des dossiers',
  445.                     'code' => 'dossier_list',
  446.                     'taille' => 12,
  447.                     'sql' => $sql_list,
  448.                     'champs' =>
  449.                         [
  450.                             "id" => 
  451.                                 [
  452.                                     'affichage' => false,
  453.                                     'filtre' => false,
  454.                                     'label' => $translator->trans('ID')
  455.                                 ],
  456.                             "walkinn_dossier_etat-libelle" => 
  457.                                 [
  458.                                     'affichage' => true,
  459.                                     'filtre' => true,
  460.                                     'label' => $translator->trans('Etat')
  461.                                 ],
  462.                             "walkinn_dossier-code_walkinn" => 
  463.                                 [
  464.                                     'affichage' => true,
  465.                                     'filtre' => true,
  466.                                     'label' => $translator->trans('Code ' $proprietaireInstance)
  467.                                 ],
  468.                             "walkinn_dossier-code" => 
  469.                                 [
  470.                                     'affichage' => false,
  471.                                     'filtre' => true,
  472.                                     'label' => $translator->trans('Code client')
  473.                                 ],
  474.                             "slug" => 
  475.                                 [
  476.                                     'affichage' => true,
  477.                                     'filtre' => true,
  478.                                     'label' => $translator->trans('Slug')
  479.                                 ],
  480.                             "annee" => 
  481.                                 [
  482.                                     'affichage' => false,
  483.                                     'filtre' => true,
  484.                                     'label' => $translator->trans('Année')
  485.                                 ],
  486.                             "walkinn_dossier-nb_jours" => 
  487.                                 [
  488.                                     'affichage' => true,
  489.                                     'filtre' => true,
  490.                                     'label' => $translator->trans('Durée en jours')
  491.                                 ],
  492.                             "walkinn_destination-libelle" => 
  493.                                 [
  494.                                     'affichage' => true,
  495.                                     'filtre' => true,
  496.                                     'label' => $translator->trans('Destination')
  497.                                 ],
  498.                             "walkinn_dossier-libelle" => 
  499.                                 [
  500.                                     'affichage' => true,
  501.                                     'filtre' => true,
  502.                                     'label' => $translator->trans('Dossier')
  503.                                 ],
  504.                             "walkinn_dossier_theme-libelle" => 
  505.                                 [
  506.                                     'affichage' => true,
  507.                                     'filtre' => true,
  508.                                     'label' => $translator->trans('Thème')
  509.                                 ],
  510.                             "walkinn_dossier_type-libelle" => 
  511.                                 [
  512.                                     'affichage' => true,
  513.                                     'filtre' => true,
  514.                                     'label' => $translator->trans('Type')
  515.                                 ],
  516.                             "walkinn_dossier_categorie-libelle" => 
  517.                                 [
  518.                                     'affichage' => false,
  519.                                     'filtre' => true,
  520.                                     'label' => $translator->trans('Catégorie')
  521.                                 ],
  522.                             "_esc_clients" => 
  523.                                 [
  524.                                     'affichage' => true,
  525.                                     'filtre' => true,
  526.                                     'label' => $translator->trans('Client'),
  527.                                     'attr' => array(
  528.                                         'type' => 'varchar',
  529.                                         'search' => '(
  530.                                             ( 
  531.                                              SELECT COUNT(doli_societe.nom)
  532.                                              FROM walkinn_dossier_segment
  533.                                              LEFT JOIN doli_societe doli_societe ON doli_societe.rowid = client_id
  534.                                              WHERE dossier_id = walkinn_dossier.id AND actif = 1 AND doli_societe.nom LIKE "%%%s%%" LIMIT 1) > 0
  535.                                             )'
  536.                                     )
  537.                                 ],
  538.                             "_esc_segments" => 
  539.                                 [
  540.                                     'affichage' => true,
  541.                                     'filtre' => true,
  542.                                     'label' => $translator->trans('Segment'),
  543.                                     'attr' => array(
  544.                                         'type' => 'varchar',
  545.                                         'search' => '(
  546.                                             ( 
  547.                                                 SELECT COUNT(code_walkinn)
  548.                                                 FROM walkinn_dossier_segment
  549.                                                 WHERE dossier_id = walkinn_dossier.id AND actif = 1 AND code_walkinn LIKE "%%%s%%") > 0
  550.                                             )'
  551.                                     )
  552.                                 ],
  553.                             "_esc_infos" => 
  554.                                 [
  555.                                     'affichage' => true,
  556.                                     'filtre' => false,
  557.                                     'label' => $translator->trans('Infos Pax')
  558.                                 ],
  559.                             "_esc_dates" => 
  560.                                 [
  561.                                     'affichage' => true,
  562.                                     'filtre' => true,
  563.                                     'label' => $translator->trans('Dates'),
  564.                                     'attr' => array(
  565.                                         'type' => 'date',
  566.                                         'search' => '(
  567.                                             (
  568.                                                 SELECT COUNT(date_depart)
  569.                                                 FROM walkinn_dossier_segment
  570.                                                 WHERE dossier_id = walkinn_dossier.id AND actif = 1 
  571.                                                 AND 
  572.                                                     ( "%1$s" BETWEEN DATE_FORMAT(date_depart, "%%Y-%%m-%%d") AND DATE_FORMAT(DATE_ADD(date_depart, INTERVAL (nb_jours -1) DAY), "%%Y-%%m-%%d"))
  573.                                             ) > 0
  574.                                         )'
  575.                                     )
  576.                                 ],
  577.                         ]
  578.                     ,
  579.                     'config' =>
  580.                         [
  581.                             'new' => false,
  582.                             'edit' => true,
  583.                             'editPath' => $link,
  584.                             'delete' => false,
  585.                             'inline' => false,
  586.                             'print' => false,
  587.                             'copy' => false,
  588.                             'excel' => false,
  589.                             'csv' => false,
  590.                             'pdf' => false,
  591.                             'reset' => false,
  592.                             'viewAll' => false,
  593.                             'selectAll' => false,
  594.                             'selectNone' => false,
  595.                             'colvis' => true,
  596.                         ],
  597.                 
  598.                 ]
  599.             ]  
  600.         ;
  601.         $dossiersListForNew null;
  602.         return $this->render('dossier/index.html.twig', [
  603.            'controller_name' => 'DossierController',
  604.            'widgets' => $widgets,
  605.            'dossiersListForNew' => $dossiersListForNew,
  606.            'user' => $user
  607.         ]);
  608.     }
  609.     /**
  610.      * @Route("/dossiers/tiers/{tiersId}", name="index_by_customer")
  611.      */
  612.     public function indexByTiers(Request $request$tiersIdTranslatorInterface $translator)
  613.     {
  614.         // Params
  615.         $user $this->getUser();
  616.         $userId $this->getUser() && $this->getUser()->getId() ? $this->getUser()->getId() : 0;
  617.         $guidePaxTypeId = \App\Enum\PaxType::GUIDE_ID;
  618.         $isDolibarr $request->query->get('dolibarr');
  619.         if ($isDolibarr)
  620.         {
  621.             $request->query->set('iframe'1);
  622.             $link "/externalsite/frames.php?idmenu=13&mainmenu=externalsite&leftmenu=&path=/dossier/{{id}}";
  623.         } else
  624.         {
  625.             $link "/dossier/{{id}}";
  626.         }
  627.         $proprietaireInstance $this->getParameter('instance_proprietaire');
  628.     
  629.         // SQL
  630.         $sql_list 
  631.             ' SELECT walkinn_dossier.id
  632.             , CONCAT("<span class=\'fa fa-circle fa-lg mr-1\' style=\'color:", walkinn_dossier_etat.color, "\'></span> ", walkinn_dossier_etat.libelle) AS `walkinn_dossier_etat-libelle`
  633.             , walkinn_dossier.code_walkinn 
  634.             , walkinn_dossier.code 
  635.             , walkinn_dossier.libelle
  636.             , CONCAT("<div class=\'m-2\'>", doli_societe.nom ,"</div>") AS "_esc_clients"
  637.             -- , CONCAT("<div class=\'m-2\'>", walkinn_dossier_segment_pax.libelle ,"</div>") AS "_esc_contact"
  638.             , CONCAT("<a href=\'", "/symfony/public/dossier/", walkinn_dossier_segment.dossier_id, "/segment/", walkinn_dossier_segment.id, "/composition" ,"\' class=\'btn btn-link p-1\'>#", walkinn_dossier_segment.code_walkinn ,"</a>")  AS "_esc_segments"
  639.             , CONCAT("<div class=\'m-2\'>", DATE_FORMAT(walkinn_dossier_segment.date_depart , "%d/%m/%Y"), IF(walkinn_dossier_segment.nb_jours > 1, CONCAT(" - ", DATE_FORMAT(DATE_ADD(walkinn_dossier_segment.date_depart, INTERVAL (walkinn_dossier_segment.nb_jours -1) DAY) , "%d/%m/%Y")), ""), " (", walkinn_dossier_segment.nb_jours," jour", IF(walkinn_dossier_segment.nb_jours > 1, "s", ""), ")</div>") AS "_esc_dates"
  640.             , walkinn_dossier_type.libelle AS `walkinn_dossier_type-libelle`
  641.             FROM walkinn_dossier walkinn_dossier
  642.             LEFT JOIN walkinn_dossier_segment walkinn_dossier_segment ON walkinn_dossier_segment.dossier_id = walkinn_dossier.id
  643.             LEFT JOIN walkinn_dossier_segment_pax walkinn_dossier_segment_pax ON walkinn_dossier_segment_pax.segment_id = walkinn_dossier_segment.id
  644.             LEFT JOIN doli_socpeople doli_socpeople ON doli_socpeople.rowid = walkinn_dossier_segment_pax.contact_id
  645.             LEFT JOIN doli_societe doli_societe ON doli_societe.rowid = walkinn_dossier_segment.client_id
  646.             LEFT JOIN walkinn_dossier_etat walkinn_dossier_etat ON walkinn_dossier_etat.id = walkinn_dossier.dossier_etat_id
  647.             LEFT JOIN walkinn_dossier_type walkinn_dossier_type ON walkinn_dossier_type.id = walkinn_dossier.dossier_type_id
  648.             LEFT JOIN ba_user ba_user ON ba_user.id = walkinn_dossier.charge_dossier_id
  649.             WHERE walkinn_dossier.actif = 1 AND walkinn_dossier_segment_pax.actif = 1 AND doli_socpeople.fk_soc = ' $tiersId ' GROUP BY walkinn_dossier.id '
  650.         ;
  651.         // Widgets
  652.         $widgets =  
  653.             [
  654.                 [
  655.                     'titre' => 'Liste des dossiers',
  656.                     'code' => 'dossier_list',
  657.                     'taille' => 12,
  658.                     'sql' => $sql_list,
  659.                     'champs' =>
  660.                         [
  661.                             "id" => 
  662.                                 [
  663.                                     'affichage' => false,
  664.                                     'filtre' => false,
  665.                                     'label' => $translator->trans('ID')
  666.                                 ],
  667.                             "walkinn_dossier_etat-libelle" => 
  668.                                 [
  669.                                     'affichage' => true,
  670.                                     'filtre' => true,
  671.                                     'label' => $translator->trans('Etat')
  672.                                 ],
  673.                             "walkinn_dossier-code_walkinn" => 
  674.                                 [
  675.                                     'affichage' => true,
  676.                                     'filtre' => true,
  677.                                     'label' => $translator->trans('Code ' $proprietaireInstance)
  678.                                 ],
  679.                             "walkinn_dossier-code" => 
  680.                                 [
  681.                                     'affichage' => false,
  682.                                     'filtre' => true,
  683.                                     'label' => $translator->trans('Code client')
  684.                                 ],
  685.                             "slug" => 
  686.                                 [
  687.                                     'affichage' => true,
  688.                                     'filtre' => true,
  689.                                     'label' => $translator->trans('Slug')
  690.                                 ],
  691.                             "annee" => 
  692.                                 [
  693.                                     'affichage' => false,
  694.                                     'filtre' => true,
  695.                                     'label' => $translator->trans('Année')
  696.                                 ],
  697.                             "walkinn_dossier-nb_jours" => 
  698.                                 [
  699.                                     'affichage' => true,
  700.                                     'filtre' => true,
  701.                                     'label' => $translator->trans('Durée en jours')
  702.                                 ],
  703.                             "walkinn_destination-libelle" => 
  704.                                 [
  705.                                     'affichage' => true,
  706.                                     'filtre' => true,
  707.                                     'label' => $translator->trans('Destination')
  708.                                 ],
  709.                             "walkinn_dossier-libelle" => 
  710.                                 [
  711.                                     'affichage' => true,
  712.                                     'filtre' => true,
  713.                                     'label' => $translator->trans('Dossier')
  714.                                 ],
  715.                             "walkinn_dossier_theme-libelle" => 
  716.                                 [
  717.                                     'affichage' => true,
  718.                                     'filtre' => true,
  719.                                     'label' => $translator->trans('Thème')
  720.                                 ],
  721.                             "walkinn_dossier_type-libelle" => 
  722.                                 [
  723.                                     'affichage' => true,
  724.                                     'filtre' => true,
  725.                                     'label' => $translator->trans('Type')
  726.                                 ],
  727.                             "walkinn_dossier_categorie-libelle" => 
  728.                                 [
  729.                                     'affichage' => false,
  730.                                     'filtre' => true,
  731.                                     'label' => $translator->trans('Catégorie')
  732.                                 ],
  733.                             /*
  734.                             "_esc_contact" => 
  735.                                 [
  736.                                     'affichage' => true,
  737.                                     'filtre' => true,
  738.                                     'label' => $translator->trans('Pax'),
  739.                                     'attr' => array(
  740.                                         'type' => 'varchar',
  741.                                         'search' => 'walkinn_dossier_segment_pax.libelle LIKE "%%%s%%"', 
  742.                                     )
  743.                                 ],
  744.                             */
  745.                             "_esc_clients" => 
  746.                                 [
  747.                                     'affichage' => true,
  748.                                     'filtre' => true,
  749.                                     'label' => $translator->trans('Client'),
  750.                                     'attr' => array(
  751.                                         'type' => 'varchar',
  752.                                         'search' => '(
  753.                                             ( 
  754.                                              SELECT COUNT(doli_societe.nom)
  755.                                              FROM walkinn_dossier_segment
  756.                                              LEFT JOIN doli_societe doli_societe ON doli_societe.rowid = client_id
  757.                                              WHERE dossier_id = walkinn_dossier.id AND actif = 1 AND doli_societe.nom LIKE "%%%s%%" LIMIT 1) > 0
  758.                                             )'
  759.                                     )
  760.                                 ],
  761.                             "_esc_segments" => 
  762.                                 [
  763.                                     'affichage' => true,
  764.                                     'filtre' => true,
  765.                                     'label' => $translator->trans('Segment'),
  766.                                     'attr' => array(
  767.                                         'type' => 'varchar',
  768.                                         'search' => '(
  769.                                             ( 
  770.                                                 SELECT COUNT(code_walkinn)
  771.                                                 FROM walkinn_dossier_segment
  772.                                                 WHERE dossier_id = walkinn_dossier.id AND actif = 1 AND code_walkinn LIKE "%%%s%%") > 0
  773.                                             )'
  774.                                     )
  775.                                 ],
  776.                             "_esc_infos" => 
  777.                                 [
  778.                                     'affichage' => true,
  779.                                     'filtre' => false,
  780.                                     'label' => $translator->trans('Infos Pax')
  781.                                 ],
  782.                             "_esc_dates" => 
  783.                                 [
  784.                                     'affichage' => true,
  785.                                     'filtre' => true,
  786.                                     'label' => $translator->trans('Dates'),
  787.                                     'attr' => array(
  788.                                         'type' => 'date',
  789.                                         'search' => '(
  790.                                             (
  791.                                                 SELECT COUNT(date_depart)
  792.                                                 FROM walkinn_dossier_segment
  793.                                                 WHERE dossier_id = walkinn_dossier.id AND actif = 1 
  794.                                                 AND 
  795.                                                     ( "%1$s" BETWEEN DATE_FORMAT(date_depart, "%%Y-%%m-%%d") AND DATE_FORMAT(DATE_ADD(date_depart, INTERVAL (nb_jours -1) DAY), "%%Y-%%m-%%d"))
  796.                                             ) > 0
  797.                                         )'
  798.                                     )
  799.                                 ],
  800.                         ]
  801.                     ,
  802.                     'config' =>
  803.                         [
  804.                             'new' => false,
  805.                             'edit' => true,
  806.                             'editPath' => $link,
  807.                             'delete' => false,
  808.                             'inline' => false,
  809.                             'print' => false,
  810.                             'copy' => false,
  811.                             'excel' => false,
  812.                             'csv' => false,
  813.                             'pdf' => false,
  814.                             'reset' => false,
  815.                             'viewAll' => false,
  816.                             'selectAll' => false,
  817.                             'selectNone' => false,
  818.                             'colvis' => true,
  819.                         ],
  820.                 
  821.                 ]
  822.             ]  
  823.         ;
  824.         $dossiersListForNew null;
  825.         return $this->render('dossier/index.html.twig', [
  826.            'controller_name' => 'DossierController',
  827.            'widgets' => $widgets,
  828.            'dossiersListForNew' => $dossiersListForNew,
  829.            'user' => $user
  830.         ]);
  831.     }
  832.     /**
  833.     * @Route("/dossier/new-custom", name="new_custom", methods={"GET","POST"})
  834.     */
  835.     public function newCustom(Request $requestEntityManagerInterface $emDossierService $dossierService): Response
  836.     {
  837.         /* 
  838.         // TO DO LATER
  839.         // Params
  840.         $params = [];
  841.         $params['type'] = $request->request->get('type');
  842.         $params['year'] = $request->request->get('year');
  843.         $modelId = $request->request->get('model');
  844.         // Parent
  845.         $dossier = $em->getRepository(Dossier::class)->find($modelId);
  846.         if (!$dossier) {
  847.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  848.         }
  849.         // Check enfant existe
  850.         if ($params['type'] == "enfant" && $params['year']) {
  851.             $enfantExists = $em->getRepository(Dossier::class)->findOneBy(['parent' => $dossier, 'actif' => true, 'annee' => $params['year']]);
  852.             if ($enfantExists) {
  853.                 $this->addFlash(
  854.                     'warning',
  855.                     "Une dossier existe déjà pour l'année " . $params['year'] . ", veuillez choisir une autre année ou créer un nouveau dossier  !"
  856.                 );
  857.         
  858.                 $referer = $request->headers->get('referer');
  859.                 return $this->redirect($referer);
  860.             } elseif ($dossier->getAnnee() == $params['year']) {
  861.                 $this->addFlash(
  862.                     'warning',
  863.                     "Une dossier existe déjà pour l'année " . $params['year'] . ", veuillez choisir une autre année ou créer une variante  !"
  864.                 );
  865.         
  866.                 $referer = $request->headers->get('referer');
  867.                 return $this->redirect($referer);
  868.             }
  869.         }
  870.         // Duplication
  871.         $newDossier = $dossierService->duplicateDossier($dossier, $params);
  872.         if ($newDossier && $newDossier->getId()) {
  873.             $this->addFlash(
  874.                 'success',
  875.                 "Le dossier " . $dossier->getLibelle() . ' a été dupliqué !'
  876.             );
  877.             return $this->redirectToRoute('dossier_edit', [
  878.                 'id' => $newDossier->getId(),
  879.             ]);
  880.         }
  881.         $this->addFlash(
  882.             'warning',
  883.             "Le dossier " . $dossier->getLibelle() . " n'a pas pu être dupliqué !"
  884.         );
  885.         */
  886.         $referer $request->headers->get('referer');
  887.         return $this->redirect($referer);
  888.     }
  889.     /**
  890.     * @Route("/new_walkinn_dossier", name="newWalkinnDossier", methods={"GET","POST"})
  891.     * @Route("/dossier/new", name="new", methods={"GET","POST"})
  892.     */
  893.     public function new(Request $request): Response
  894.     {
  895.         // Params
  896.         $user $this->getUser();
  897.         $isValide $request->query->get('isValide');
  898.         $dossier = new Dossier();
  899.         if ($isValide)
  900.         {
  901.             $dossier->setIsValide(1);
  902.             $defautEtatId $this->getParameter('dossier_etat_defaut');
  903.             $defautEtat $this->getDoctrine()->getManager()->getRepository(DossierEtat::class)->find($defautEtatId);
  904.         } else
  905.         {
  906.             $defautEtatId $this->getParameter('devis_etat_defaut');
  907.             $defautEtat $this->getDoctrine()->getManager()->getRepository(DossierEtat::class)->find($defautEtatId);
  908.         }
  909.         if($defautEtat)
  910.         {
  911.             $dossier->setDossierEtat($defautEtat);
  912.         }
  913.         $date = new \Datetime();
  914.         $dossier->setAnnee($date->format('Y'));
  915.         $dossier->setChargeDossier($user);
  916.         $form $this->createForm(DossierFormType::class, $dossier);
  917.         $form->handleRequest($request);
  918.         if ($form->isSubmitted() && $form->isValid()) {
  919.             $entityManager $this->getDoctrine()->getManager();
  920.             $entityManager->persist($dossier);
  921.             $entityManager->flush();
  922.             
  923.             $this->addFlash(
  924.                 'info',
  925.                 "Le dossier " $dossier->getLibelle() . ' a été ajouté !'
  926.             );
  927.             return $this->redirectToRoute('dossier_edit', [
  928.                 'id' => $dossier->getId(),
  929.             ]);
  930.         }
  931.         return $this->render('dossier/new.html.twig', [
  932.             'dossier' => $dossier,
  933.             'form' => $form->createView(),
  934.             'action' => 'Ajouter un dossier',
  935.             'retour' => 'dossier_index'
  936.         ]);
  937.     }
  938.     /**
  939.     * @Route("/edit_walkinn_dossier/{id}", name="editWalkinnDossier", methods={"GET","POST"})
  940.     * @Route("/dossier/{id}", name="edit", methods={"GET","POST"})
  941.     */
  942.     public function edit(Request $requestDossier $dossierCompanyService $companyServiceDossierService $dossierServiceDossierSegmentService $segmentService): Response
  943.     {
  944.         if (!$dossier) {
  945.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  946.         } 
  947.         if(!$dossier->getAnnee())
  948.         {
  949.             $date = new \Datetime();
  950.             $dossier->setAnnee($date->format('Y'));
  951.         }
  952.         if(!$dossier->getChargeDossier())
  953.         {
  954.             $user $this->getUser();
  955.             $dossier->setChargeDossier($user);
  956.         }
  957.      
  958.         // Segments
  959.         $segments $this->getDoctrine()->getManager()->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier'actif' => true], ['dateDepart' => 'ASC']);
  960.         // Paxes
  961.         $paxes $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->findForDossier($dossier->getId());
  962.         $dossier->setPaxesData($paxes);
  963.         foreach($segments as $segment)
  964.         {
  965.             $segment $segmentService->checkSegmentComposition($segment);
  966.             $segment $segmentService->checkAchatsAndVentes($segment);
  967.         }
  968.        
  969.         $exEtat $dossier->getDossierEtat()->getId();
  970.         $form $this->createForm(DossierFormType::class, $dossier);
  971.         $form->handleRequest($request);
  972.         $traductions $dossierService->getTraductions($dossier);
  973.         if ($form->isSubmitted() && $form->isValid()) {
  974.             $data $form->getData();
  975.             // Gestion dans service
  976.             if (!empty($data)) {
  977.                 $dossierService->checkFormData($segments$data$dossier$this->getUser());
  978.         // Dans le cas ou le dossier bascule vers confirmé
  979.         if ($dossier->getDossierEtat()->getId() != $exEtat) {
  980.             if ($dossier->getDossierEtat()->getId() == \App\Enum\DossierEtatEnum::VALIDE && $exEtat == \App\Enum\DossierEtatEnum::EN_COURS_DE_RESERVATION) {
  981.                 $dossier->setDateConfirmation(new \DateTime);
  982.             } else {
  983.                 $dossier->setDateConfirmation(null);
  984.             }    
  985.         }
  986.             }
  987.             if ( null !== $dossier->getDossierSegments()) {
  988.                 $codeClient null;
  989.                 $theme      null;
  990.                 $categorie  null;
  991.                 // Pour ajouter le code client du voyage dans le dossier
  992.                 // le code client est ajouté au segment, c'est le champ code
  993.                 // Trouve le premier code client contenu dans un segment
  994.                 foreach ($dossier->getDossierSegments() as $segment) {
  995.                     $codeClient = (null === $codeClient) ? $segment->getCode() : $segment->getCode() ;
  996.                     // theme
  997.                     $theme = (null === $theme) ? $segment->getVoyageTheme() : $segment->getVoyageTheme() ;
  998.                     // categorie
  999.                     $categorie = (null === $categorie) ? $segment->getVoyageCategorie() : $segment->getVoyageCategorie() ;
  1000.                 }
  1001.                 $dossier->setCode($codeClient);
  1002.                 
  1003.                 // code client
  1004.                 if (null === $dossier->getCodeClient() && null !== $codeClient) {
  1005.                     $dossier->setCodeCLient($codeClient);
  1006.                 }
  1007.                 // theme
  1008.                 if (null === $dossier->getTheme() && null !== $theme) {
  1009.                     $dossier->setTheme($theme);
  1010.                 }
  1011.                 // categorie
  1012.                 if (null === $dossier->getCategorie() && null !== $categorie) {
  1013.                     $dossier->setCategorie($categorie);
  1014.                 }
  1015.             }
  1016.             $this->getDoctrine()->getManager()->flush();
  1017.             $this->addFlash(
  1018.                 'info',
  1019.                 "Le dossier " $dossier->getLibelle() . ' est mis à jour !'
  1020.             );
  1021.             return $this->redirectToRoute('dossier_edit', [
  1022.                 'id' => $dossier->getId(),
  1023.             ]);
  1024.         }
  1025.         return $this->render('dossier/edit.html.twig', [
  1026.             'dossier' => $dossier,
  1027.             'form' => $form->createView(),
  1028.             'action' => 'Dossier: ' $dossier->getLibelle(),
  1029.             'traductions' => $traductions,      
  1030.             'retour' => 'dossier_index'      
  1031.         ]);
  1032.     }
  1033.     /**
  1034.     * @Route("/dossier/{id}/evenements", name="evenements", methods={"GET","POST"})
  1035.     */
  1036.     public function evenements(Request $requestDossier $dossierCompanyService $companyServiceDossierService $dossierService): Response
  1037.     {
  1038.         if (!$dossier) {
  1039.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1040.         }
  1041.         // Events Types
  1042.         $eventsTypes $this->getDoctrine()->getManager()->getRepository(EvenementType::class)->getFiltersForTimeline();
  1043.         return $this->render('dossier/evenements.html.twig', [
  1044.             'dossier' => $dossier,
  1045.             'eventsTypes' => $eventsTypes,
  1046.             'action' => 'Evènements: ' $dossier->getLibelle(),
  1047.             'retour' => 'dossier_index'      
  1048.         ]);
  1049.     }
  1050.     /**
  1051.     * @Route("/dossier/{id}/documents", name="documents", methods={"GET","POST"})
  1052.     */
  1053.     public function documents(Request $requestDossier $dossierCompanyService $companyServiceDossierService $dossierServiceDocumentService $documentService): Response
  1054.     {
  1055.         if (!$dossier) {
  1056.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1057.         }
  1058.         // Check Arbo
  1059.         $dossierService->checkFolders($dossier);
  1060.         $user $this->getUser();
  1061.         $docUrl $this->getParameter('doc_url');
  1062.         $docFolder $this->getParameter('doc_path');
  1063.         $dynamicPath $documentService->getEntityArboPath($dossier);
  1064.         return $this->render('dossier/documents.html.twig', [
  1065.             'dossier' => $dossier,
  1066.             'docUrl' => $docUrl,
  1067.             'docFolder' => $docFolder,
  1068.             'dynamicPath' => $dynamicPath,
  1069.             'user' => $user,
  1070.             'action' => 'Documents: ' $dossier->getLibelle(),
  1071.             'retour' => 'dossier_index'      
  1072.         ]);
  1073.     }
  1074.      /**
  1075.      * @Route("/dossier/{id}/tasks", name="tasks", methods={"GET","POST"})
  1076.      */
  1077.     public function tasks(Request $requestEntityManagerInterface $emDossier $dossier): Response
  1078.     {
  1079.         if (!$dossier) {
  1080.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1081.         }
  1082.         $responsable $this->getDoctrine()->getManager()->getRepository(\App\Entity\User::class)->findOneById($dossier->getChargeDossier()->getId());
  1083.         $form $this->createForm(DossierTodoListFormType::class, $dossier, ['responsable' => $responsable]);
  1084.         $form->handleRequest($request);
  1085.         if ($form->isSubmitted() && $form->isValid()) {
  1086.             $this->getDoctrine()->getManager()->flush();
  1087.             
  1088.             $this->addFlash(
  1089.                 'info',
  1090.                 "Le dossier " $dossier->getLibelle() . ' est mis à jour !'
  1091.             );
  1092.             return $this->redirectToRoute('dossier_tasks', [
  1093.                 'id' => $dossier->getId(),
  1094.                 'iframe' => 1
  1095.             ]);
  1096.         }
  1097.         $retour 'dossier_index';
  1098.         return $this->render('dossier/tasks/tasks.html.twig', [
  1099.             'dossier' => $dossier,
  1100.             'form' => $form->createView(),
  1101.             'action' => 'Tâches: ' $dossier->getLibelle(),
  1102.             'retour' => $retour      
  1103.         ]);
  1104.     }
  1105.     /**
  1106.     * @Route("/dossier/{id}/ventes", name="segment_ventes", methods={"GET","POST"})
  1107.     */
  1108.     public function ventes(Request $requestEntityManagerInterface $emDossier $dossierDossierSegmentService $segmentService): Response
  1109.     {
  1110.         if (!$dossier) {
  1111.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1112.         }
  1113.         // Set Fake DATA for Ventes
  1114.         $dossier $segmentService->setDataForVentes($dossier);
  1115.         $form $this->createForm(DossierVentesFormType::class, $dossier);
  1116.         $form->handleRequest($request);
  1117.         
  1118.        // if ($form->isSubmitted() && $form->isValid()) {
  1119.         if ($form->isSubmitted() && $this->isCsrfTokenValid('maxence'$request->request->get('_token'))) { 
  1120.             $data $form->getData();
  1121.             $dossier->setIsVentesValide(1);
  1122.             $this->getDoctrine()->getManager()->flush();
  1123.             $this->addFlash(
  1124.                 'info',
  1125.                 "Le dossier " $dossier->getLibelle() . ' est mis à jour !'
  1126.             );
  1127.             return $this->redirectToRoute('dossier_segment_ventes', [
  1128.                 'id' => $dossier->getId(),
  1129.             ]);
  1130.         }
  1131.         return $this->render('dossier/ventes.html.twig', [
  1132.             'dossier' => $dossier,
  1133.             'form' => $form->createView(),
  1134.             'action' => 'Ventes: ' $dossier->getLibelle(),
  1135.             'retour' => 'dossier_index'      
  1136.         ]);
  1137.     }
  1138.     /** 
  1139.     * @Route("/dossier/{id}/achats", name="segment_achats", methods={"GET","POST"})
  1140.     */
  1141.     public function achats(Request $requestEntityManagerInterface $emDossier $dossierDossierService $dossierService): Response
  1142.     {
  1143.         if (!$dossier) {
  1144.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1145.         }
  1146.         // Set Fake DATA for Ventes
  1147.         $dossier $dossierService->setDataForAchats($dossier);
  1148.         if($dossier->getTest())
  1149.         {
  1150.             return $this->redirectToRoute('dossier_segment_achats', [
  1151.                 'id' => $dossier->getId(),
  1152.             ]);
  1153.         }
  1154.         $serviceTypes $em->getRepository(ServiceType::class)->findBy(['actif' => true], ['id' => 'ASC']);
  1155.         $dossierAchatsEtats $this->getDoctrine()->getRepository(DossierCommandeFournisseurEtat::class)->findBy(['actif' => true], ['id' => 'ASC']);
  1156.         if($request->isMethod('POST'))
  1157.         {
  1158.             $postParams $request->request->all();
  1159.             foreach($postParams as $key => $param)
  1160.             {  
  1161.                 if (strpos($key'note') !== false && $param)
  1162.                 {
  1163.                     $explode explode("-"$key);
  1164.                     $id end($explode);
  1165.                     $tampon $em->getRepository(DossierCommandeFournisseurTampon::class)->find($id);
  1166.                     $tampon->setNote($param);
  1167.                 } else if (strpos($key'acompte') !== false && $param 0)
  1168.                 {
  1169.                     $explode explode("-"$key);
  1170.                     $id end($explode);
  1171.                     $tampon $em->getRepository(DossierCommandeFournisseurTampon::class)->find($id);
  1172.                     $tampon->setAcompte($param);
  1173.                 }
  1174.             }
  1175.             $dossier->setIsAchatsValide(1);
  1176.             $this->getDoctrine()->getManager()->flush();
  1177.             $this->addFlash(
  1178.                 'info',
  1179.                 "Le dossier " $dossier->getLibelle() . ' est mis à jour !'
  1180.             );
  1181.             return $this->redirectToRoute('dossier_segment_achats', [
  1182.                 'id' => $dossier->getId(),
  1183.             ]);
  1184.         }
  1185.         return $this->render('dossier/achats.html.twig', [
  1186.             'dossier' => $dossier,
  1187.         'doli_email_relance_id_fr' => $this->getParameter('doli_email_relance_id_fr'),
  1188.         'doli_email_relance_id_en' => $this->getParameter('doli_email_relance_id_en'),
  1189.             'serviceTypes' => $serviceTypes,
  1190.             'dossierAchatsEtats' => $dossierAchatsEtats,
  1191.             'action' => 'Achats: ' $dossier->getLibelle(),
  1192.         'filters' => (($this->getParameter('instance') == 'wi') ? 0),
  1193.             'retour' => 'dossier_index'      
  1194.         ]);
  1195.     }
  1196.     /** 
  1197.     * @Route("/dossier/plandetransport/{id}", name="plandetransport_details", methods={"GET","POST"})
  1198.     */
  1199.     public function pdtDetails(Request $requestPlanDeTransport $planDeTransportEntityManagerInterface $em)
  1200.     {
  1201.         if($request->isMethod('POST'))
  1202.         {
  1203.             $planDeTransport->setContent($request->request->get('plantransport-content'));
  1204.             $em->persist($planDeTransport);
  1205.             $em->flush();
  1206.         }
  1207.         $serviceTypes $em->getRepository(ServiceType::class)->findBy(['actif' => true], ['id' => 'ASC']);
  1208.         return $this->render('dossier/plandetransportDetails.html.twig', [
  1209.             'pdt' => $planDeTransport,
  1210.             'dossier' => $planDeTransport->getDossier()
  1211.         ]);
  1212.     }
  1213.     /** 
  1214.     * @Route("/api/plandetransport/delete", name="plandetransport_delete", methods={"POST"})
  1215.     */
  1216.     public function pdtDelete(Request $requestEntityManagerInterface $em)
  1217.     {
  1218.         $data json_decode($request->getContent(), true);
  1219.         $pdt $em->getRepository(PlanDeTransport::class)->findOneBy(['id' => $data['id']]);
  1220.         $pdt->setActif(false);
  1221.         $em->persist($pdt);
  1222.         $em->flush();
  1223.         return $this->json(['message' => 'OK'], 200);
  1224.     }
  1225.     /** 
  1226.     * @Route("/api/plandetransport/create", name="plandetransport_create", methods={"POST"})
  1227.     */
  1228.     public function pdtCreate(Request $requestEntityManagerInterface $emCompanyService $companyServicePaxService $paxService)
  1229.     {
  1230.         $data json_decode($request->getContent(), true);
  1231.         $pdt = new PlanDeTransport();
  1232.         $dossier $em->getRepository(Dossier::class)->findOneBy(['id' => (int)$data['dossierId']]);
  1233.         if (!$dossier) {
  1234.             throw $this->createNotFoundException("Le dossier n'existe pas");
  1235.         }
  1236.     $segment null;
  1237.     $ok true;
  1238.     foreach ($dossier->getDossierSegments() as $seg) {
  1239.         if ($seg->getIsPrestationSeche() != true && true === $ok) {
  1240.             $segment $seg;
  1241.             $ok false// le segment est le premier segment de voyage
  1242.         }
  1243.     }
  1244.         if ($this->getParameter('instance') == 'wi')
  1245.         {
  1246.             $logo 'https://rootcms.elocms.com/assets/images/www.walkinn.fr/logo.png';
  1247.         }
  1248.         else
  1249.         {
  1250.             $logo 'https://www.levelovoyageur.com/web/velov/images/logo-footer.png';
  1251.         }
  1252.         $responses = array();
  1253.     // Le libellé du dossier
  1254.     $codeWalkinn $dossier->getLibelle();
  1255.         $nombrePax 0
  1256.     $DateArrivee '';
  1257.     $client '';
  1258.     $nomGuide = array();
  1259.     $telephoneGuide = array(); 
  1260.     if (null !== $segment) {
  1261.  
  1262.         // Pax
  1263.         $pax $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->findForSegment($segment->getId());
  1264.         $pax $paxService->checkPaxes($pax);
  1265.         
  1266.         $nombrePax count($segment->getDossierSegmentPaxesActifs());
  1267.             foreach ($segment->getDossierSegmentPaxes() as $p) {
  1268.             if ($p->getPaxType()->getId() == 3) {
  1269.                 $guide $companyService->getOneContactById($p->getContactId());
  1270.                 $nomGuide[] = $p->getLibelle();
  1271.                 $telephoneGuide[] = (strlen($guide['phone_mobile']) > 0) ? $guide['phone_mobile'] : ((strlen($guide['phone']) > 0) ? $guide['phone'] : $guide['phone_perso'] );
  1272.             }
  1273.         }
  1274.         $DateArrivee $segment->getDateDepart()->format('d/m/Y');
  1275.         $client      $companyService->getOneById($segment->getClientId());
  1276.     }
  1277.        $responses[] = $this->renderView('dossier/template_plandetransport.html.twig', [
  1278.              'logo'           => $logo
  1279.        'codeWalkinn'    => $codeWalkinn
  1280.        'nombrePax'      => $nombrePax 
  1281.        'DateArrivee'    => $DateArrivee 
  1282.        'client'         => $client
  1283.        'nomGuide'       => implode(', '$nomGuide
  1284.        , 'telephoneGuide' => implode(', '$telephoneGuide
  1285.        , 'pax'            => $pax
  1286.         ]);
  1287.         // #2 Ajoute les plans de vols au pdf
  1288.         $responses[] = '<!-- pagebreak --><div>'// Sur une nouvelle page
  1289.         $n 0;
  1290.         foreach ($dossier->getDossierSegments() as $segment) {
  1291.             $write false;
  1292.             if (true !== $segment->GetIsPrestationSeche()) {
  1293.                 if ( count($segment->getDossierSegmentPlanDeVols()) > ) {
  1294.                     foreach ($segment->getDossierSegmentPlanDeVols() as $planDeVol) {
  1295.                         if (count($planDeVol->getDossierSegmentTransfertAeriens()) > ) {
  1296.                             $write true;
  1297.                         }
  1298.                     }
  1299.                     if ( true === $write ) {
  1300.                         $response $this->forward('App\Controller\DossierController::vols', [
  1301.                             'request'    => $request,
  1302.                             'id'         => $dossier,
  1303.                             'segmentId'  => $segment->getId(),
  1304.                             'isIframe'   => true,
  1305.                             'parent'     => 'vueGuide',
  1306.                     'pdt'        => true
  1307.                         ]);
  1308.                         $regex '~(<body[^>]*>)(.*)(</body>)~s';
  1309.                         preg_match_all($regex$response->getContent(), $out);
  1310.                         if (array_key_exists(3$out) && count($out) > 2) {
  1311.                             if ($n != 0) {
  1312.                                 $responses[] = '<hr class="visible" style="margin: 40px 0">'// Sépare les segment avec <HR> cf mail emmanuel 24/06/21
  1313.                             }
  1314.                 $c str_replace(array($out[1][0], $out[3][0]), array(''), $out[2][0]);
  1315.                 $c str_replace(array('<h4''</h4'), array('<span''</span'), $c);
  1316.                 $c str_replace(array('table-striped'), array(''), $c);
  1317.                 $c str_replace(array('>IN<''>OUT<'), array('><b>IN</b><''><b>OUT</b><'), $c);
  1318.                             $responses[] = '<span style="visibility: visible; font-weight: bold;">'.'PLAN DE VOLS'.'</span>' $c;
  1319.                         }
  1320.                         $n++;
  1321.                     }
  1322.                 }
  1323.             }
  1324.         }
  1325.         $responses[] = '</div>';
  1326.         // #4 Ajoute la vue guide au pdf
  1327.         foreach ($dossier->getDossierSegments() as $segment) {
  1328.             if (true !== $segment->getIsPrestationSeche()) {
  1329.                 $response $this->forward('App\Controller\DossierController::vueGuidePdt', [
  1330.                     'request' => $request,
  1331.                     'id'  => $dossier,
  1332.                     'segmentId'  => $segment->getId(),
  1333.                     'parent'    => 'vueGuide',
  1334.                     'fournList' => $data['fournList'],
  1335.             'pdt'       => true
  1336.                 ]);
  1337.                 //$responses[] = '<!-- pagebreak --><div><h2 style="visibility: visible; font-weight: bold;">'.'Programme'.' '.$dossier->getLibelle().'</h2>'.$response->getContent().'</div>';
  1338.         $c1 $response->getContent();
  1339.         $c1 str_replace(array('<h5 class="text-custom">''</h5'), array('<span style="font-weight: bold">''</span'), $c1);
  1340.         $c1 str_replace(array('class="border"'), array('class=""'), $c1);
  1341.         $c1 str_replace(array('day-unit col-12 p-3'), array('day-unit col-12'), $c1);
  1342.         $c1 str_replace(array('row p-3'), array('row'), $c1);
  1343.                 $responses[] = '<!-- pagebreak --><div class="" style="page-break-before: always;"><div><span style="visibility: visible; font-weight: bold;">'.'Programme'.' '.$dossier->getLibelle().'</span>'.$c1.'</div>';
  1344.             }
  1345.         }
  1346.         $htmlContent implode(''$responses);
  1347.         $pdt->setLibelle($data['libelle']);
  1348.         $pdt->setDossier($dossier);
  1349.         $pdt->setActif(true);
  1350.         $pdt->setCreatedAt(new \DateTime('now'));
  1351.         $pdt->setContent($htmlContent);
  1352.         $em->persist($pdt);
  1353.         $em->flush();
  1354.         return $this->json(['id' => $pdt->getId()], 200);
  1355.     }
  1356.     /**
  1357.     * @Route("/delete_walkinn_dossier/{id}", name="deleteWalkinnDossier", methods={"DELETE"})
  1358.     * @Route("/dossier/{id}", name="delete", methods={"DELETE"})
  1359.     */
  1360.     public function delete(Request $requestDossier $dossier): Response
  1361.     {
  1362.         $eventTypeRepo $this->getDoctrine()->getRepository(EvenementType::class);
  1363.         if (!$dossier) {
  1364.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1365.         }
  1366.             $entityManager $this->getDoctrine()->getManager();
  1367.             $dossier->setActif(0);
  1368.             $event = new Evenement();
  1369.             $event->setLibelle('Suppression manuelle dossier: ' $dossier->getLibelle());
  1370.             $event->setCreatedBy($this->getUser());
  1371.             $event->setUser($this->getUser());
  1372.             $event->setType($eventTypeRepo->findOneBy(['id' => 2]));
  1373.             $event->setCreatedAt(new \Datetime('now'));
  1374.             $event->setUpdatedAt(new \Datetime('now'));
  1375.             $event->setDateDebut(new \Datetime('now'));
  1376.             $event->setDateFin(new \Datetime('now'));
  1377.             $event->setEntite('Dossier');
  1378.             $event->setEntiteId($dossier->getId());
  1379.             $entityManager->persist($event);
  1380.             $entityManager->flush();
  1381.             $this->addFlash(
  1382.                 'info',
  1383.                 "Le dossier " $dossier->getLibelle() . ' a été supprimé !'
  1384.             );
  1385.         $referer $request->headers->get('referer');
  1386.         return $this->redirect($referer);
  1387.     }
  1388.     /**
  1389.     * @Route("/dossier/{id}/validate", name="validate", methods={"GET"})
  1390.     */
  1391.     public function validate(Request $requestDossier $dossier): Response
  1392.     {
  1393.         if (!$dossier) {
  1394.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1395.         }
  1396.             $entityManager $this->getDoctrine()->getManager();
  1397.             $dossier->setIsValide(1);
  1398.             $defautEtatId $this->getParameter('dossier_etat_defaut');
  1399.             if($defautEtatId)
  1400.             {
  1401.                 $etat $this->getDoctrine()->getManager()->getRepository(DossierEtat::class)->find($defautEtatId);
  1402.             } else
  1403.             {
  1404.                 $etat $entityManager->getRepository(DossierEtat::class)->findOneBy(['actif' => 1'isValide' => 1]);
  1405.             }
  1406.             
  1407.             $dossier->setDossierEtat($etat);
  1408.             $entityManager->flush();
  1409.             $this->addFlash(
  1410.                 'info',
  1411.                 "Le dossier " $dossier->getLibelle() . ' a été validé !'
  1412.             );
  1413.         $referer $request->headers->get('referer');
  1414.         return $this->redirect($referer);
  1415.     }
  1416.     
  1417.     /**
  1418.      * @Route("/dossier/{id}/segment/{segmentId}/change", name="segment_change", methods={"GET","POST"})
  1419.      */
  1420.     public function segmentChange(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdDossierService $dossierServiceDossierSegmentService $segmentService): Response
  1421.     {
  1422.         if (!$dossier) {
  1423.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1424.         }
  1425.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  1426.         if (!$segment) {
  1427.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  1428.         }
  1429.         // Params
  1430.         $date $request->query->get('date');
  1431.         // Traitement
  1432.         if($date)
  1433.         {
  1434.             $datetime = \DateTime::createFromFormat('d/m/Y'$date);
  1435.             if($datetime)
  1436.             {
  1437.                 $segment->setDateDepart($datetime);
  1438.                 $segment->setIsCompoValide(0);
  1439.                 $segment->setIsPaxValide(0);
  1440.                 $segment->setIsAchatsValide(0);
  1441.                 $segment->setIsVentesValide(0);
  1442.                 $this->getDoctrine()->getManager()->flush();
  1443.                 $this->addFlash(
  1444.                     'info',
  1445.                     "Le segment " $segment->getLibelle() . ' a été modifié !'
  1446.                 );
  1447.                 return $this->redirectToRoute('dossier_segment_rooming', [
  1448.                     'id' => $dossier->getId(),
  1449.                     'segmentId' => $segment->getId(),
  1450.                 ]);
  1451.             }
  1452.         }
  1453.    
  1454.         $this->addFlash(
  1455.             'info',
  1456.             "La date n'est pas valide !"
  1457.         );
  1458.         $referer $request->headers->get('referer');
  1459.         if ($referer) {
  1460.             return $this->redirect($referer);
  1461.         } else {
  1462.             return $this->redirectToRoute('dossier_index');
  1463.         }
  1464.     }
  1465.     /**
  1466.      * @Route("/dossier/{id}/segment/{segmentId}/duplicate", name="segment_duplicate", methods={"GET","POST"})
  1467.      */
  1468.     public function segmentDuplicate(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdDossierService $dossierServiceDossierSegmentService $segmentService): Response
  1469.     {
  1470.         if (!$dossier) {
  1471.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1472.         }
  1473.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  1474.         if (!$segment) {
  1475.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  1476.         }
  1477.         // Params
  1478.         $date $request->query->get('date');
  1479.         // Traitement dans service
  1480.         $newSegment $segmentService->duplicateSegment($segment$date);
  1481.         $this->addFlash(
  1482.             'info',
  1483.             "Le segment " $segment->getLibelle() . ' a été dupliqué !'
  1484.         );
  1485.         return $this->redirectToRoute('dossier_segment_rooming', [
  1486.             'id' => $dossier->getId(),
  1487.             'segmentId' => $newSegment->getId(),
  1488.         ]);
  1489.     }
  1490.     /**
  1491.      * @Route("/dossier/{id}/segment/{segmentId}/tasks", name="segment_tasks", methods={"GET","POST"})
  1492.      */
  1493.     public function segmentTasks(Request $requestEntityManagerInterface $emDossier $dossier$segmentId): Response
  1494.     {
  1495.         if (!$dossier) {
  1496.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1497.         }
  1498.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  1499.         if (!$segment) {
  1500.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  1501.         }
  1502.     $form $this->createForm(DossierSegmentTodoListFormType::class, $segment, ['responsable' => $dossier->getChargeDossier()]);
  1503.         $form->handleRequest($request);
  1504.         if ($form->isSubmitted() && $form->isValid()) {
  1505.             $this->getDoctrine()->getManager()->flush();
  1506.             
  1507.             $this->addFlash(
  1508.                 'info',
  1509.                 "Le segment " $segment->getLibelle() . ' est mis à jour !'
  1510.             );
  1511.             return $this->redirectToRoute('dossier_segment_tasks', array('id' => $dossier->getId(), 'segmentId' => $segment->getId(), 'iframe' => 1));
  1512.         }
  1513.         $retour 'dossier_index';
  1514.         return $this->render('dossier/tasks/tasks.html.twig', [
  1515.             'dossier' => $dossier,
  1516.             'form' => $form->createView(),
  1517.             'action' => 'Tâches: ' $segment->getLibelle(),
  1518.             'retour' => $retour      
  1519.         ]);
  1520.     }
  1521.     /**
  1522.     * @Route("/dossier/{id}/segment/{segmentId}", name="segment_itineraire", methods={"GET","POST"})
  1523.     */
  1524.     public function itineraire(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdCompanyService $companyServiceDossierSegmentService $segmentServiceTranslatorInterface $translatorEditorialService $editorialServicePaxService $paxService): Response
  1525.     {
  1526.         if (!$dossier) {
  1527.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1528.         }
  1529.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  1530.         if (!$segment) {
  1531.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  1532.         }
  1533.         if (!$segment->getClientId()) 
  1534.         {
  1535.             $this->addFlash(
  1536.                 'warning',
  1537.                 'Aucun client trouvé pour le segment !'
  1538.             );
  1539.             return $this->redirectToRoute('dossier_edit', [
  1540.                 'id' => $dossier->getId(),
  1541.             ]);
  1542.         }
  1543.         // Check Special Walkinn
  1544.         $itiCopyEnabled $this->getParameter('iti_copy_enabled') ? true false;
  1545.         // Liste des documents disponibles
  1546.         // $baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
  1547.         $baseurl $this->getParameter('cdn_url');
  1548.         
  1549.         // Widgets
  1550.         $sql     'SELECT walkinn_document_generator.id 
  1551.                          , CONCAT("<span class=\"btn btn-sm btn-success btn-editorial\">", walkinn_document_generator.langue, "</span>") AS langue
  1552.                          , CONCAT("<b>", walkinn_document_generator_modele.libelle,"</b>") AS "walkinn_document_generator_modele-libelle" 
  1553.                       --   , IFNULL(pax.libelle, "TOUTES/TOUS") AS "_esc_contexte"
  1554.                          , CONCAT("<a href=\"", "'.$baseurl.'/itineraire/", TO_BASE64(CONCAT("dossier/document/", walkinn_document_generator.id, "/preview/single")),"\" target=\"_blank\">'.$baseurl.'/itineraire/", TO_BASE64(CONCAT("dossier/document/", walkinn_document_generator.id, "/preview/single")), "</a>", "<button type=\"button\" id=\"copy-", walkinn_document_generator.id ,"\" class=\"btn btn-link\" data-copy=\"", "'.$baseurl.'/itineraire/", TO_BASE64(CONCAT("dossier/document/", walkinn_document_generator.id, "/preview/single")),"\" onclick=\"copyToClipboard(", walkinn_document_generator.id ,")\"><i class=\"fas fa-clipboard\"></i></button>") AS "entite" 
  1555.                    
  1556.                          , 
  1557.                          CASE
  1558.                              WHEN (walkinn_document_generator.updated_at IS NOT NULL) THEN CONCAT( DATE_FORMAT(walkinn_document_generator.updated_at, "%%d/%%m/%%Y à %%hh%%m"), " par ", modifier.firstname, " ", modifier.lastname)
  1559.                              ELSE CONCAT( walkinn_document_generator.created_at, " par ", createur.firstname, " ", createur.lastname)
  1560.                          END
  1561.                              as created_by
  1562.                     FROM walkinn_document_generator walkinn_document_generator 
  1563.                     LEFT JOIN walkinn_document_generator_modele walkinn_document_generator_modele ON walkinn_document_generator_modele.id = walkinn_document_generator.modele_id
  1564.                     LEFT JOIN walkinn_dossier_segment_pax pax ON pax.id = walkinn_document_generator.segment_pax_id
  1565.                     LEFT JOIN ba_user createur ON createur.id = walkinn_document_generator.created_by
  1566.                     LEFT JOIN ba_user modifier ON modifier.id = walkinn_document_generator.updated_by
  1567.                     WHERE walkinn_document_generator.entite="%s" AND walkinn_document_generator.entite_id="%d" AND walkinn_document_generator.actif=1'
  1568.         $requete sprintf($sql'dossier'$segment->getId());
  1569.         $widgets 
  1570.              [ 
  1571.                 [
  1572.                     'titre' => 'Liste des documents',
  1573.                     'code' => 'document_generator_list',
  1574.                     'taille' => 12,
  1575.                     'sql' => $requete,
  1576.                     'champs' =>
  1577.                         [
  1578.                             "id" => 
  1579.                                 [
  1580.                                     'affichage' => false,
  1581.                                     'filtre' => false,
  1582.                                     'label' => $translator->trans('ID')
  1583.                                 ],
  1584.                             "langue" => 
  1585.                                 [
  1586.                                     'affichage' => true,
  1587.                                     'filtre' => true,
  1588.                                     'label' => $translator->trans('Langue')
  1589.                                 ],
  1590.                             "walkinn_document_generator_modele-libelle" => 
  1591.                                 [
  1592.                                     'affichage' => true,
  1593.                                     'filtre' => true,
  1594.                                     'label' => $translator->trans('Modèle')
  1595.                                 ],
  1596.                             "created_by" => 
  1597.                                 [
  1598.                                     'affichage' => true,
  1599.                                     'filtre' => false,
  1600.                                     'label' => $translator->trans('Dernière modification')
  1601.                                 ],
  1602.                             "entite" => 
  1603.                                 [
  1604.                                     'affichage' => true,
  1605.                                     'filtre' => false,
  1606.                                     'label' => $translator->trans('Lien Web')
  1607.                                 ],
  1608.                            // "_esc_contexte" => 
  1609.                            //     [
  1610.                            //         'affichage' => true,
  1611.                            //         'filtre' => true,
  1612.                            //         'label' => $translator->trans('Contexte voy.'),
  1613.                            //         'attr' => array(
  1614.                            //             'type' => 'varchar',
  1615.                            //             'search' => 'IFNULL(pax.libelle, "TOUTES/TOUS") LIKE "%%%s%%"', 
  1616.                            //         )
  1617.                            //     ],
  1618.                                 
  1619.                         ]
  1620.                     ,
  1621.                     'config' =>
  1622.                         [
  1623.                             'new' => false,
  1624.                             'edit' => true,
  1625.                             'delete' => false,
  1626.                             'inline' => false,
  1627.                             'print' => false,
  1628.                             'copy' => false,
  1629.                             'excel' => false,
  1630.                             'csv' => false,
  1631.                             'pdf' => false,
  1632.                             'reset' => true,
  1633.                             'viewAll' => false,
  1634.                             'selectAll' => false,
  1635.                             'selectNone' => false,
  1636.                             'colvis' => false,
  1637.                         ],
  1638.                 ]
  1639.             ];
  1640.         // Retrouve les langues disponibles
  1641.         $langues   $editorialService->getDolibarrFavoriteLanguage();
  1642.         // Retrouve les modeles disponibles
  1643.         $modeles   $em->getRepository(DocumentGeneratorModele::class)->findBy(array('entite' => 'dossier''actif' => 1));
  1644.         $modeles   = array(); 
  1645.         // Pax
  1646.         $pax $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->findForSegment($segment->getId());
  1647.         $pax $paxService->checkPaxes($pax);
  1648.         // Client
  1649.         $client $companyService->getOneById($segment->getClientId());
  1650.         // Segments       
  1651.         $linked $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier'actif' => true], ['dateDepart' => 'ASC']);
  1652.      
  1653.         $form $this->createForm(DossierSegmentFormType::class, $segment);
  1654.         $form->handleRequest($request);
  1655.    
  1656.         if ($form->isSubmitted() && $form->isValid()) {
  1657.             $data $form->getData();
  1658.             $this->getDoctrine()->getManager()->flush();
  1659.             
  1660.             $this->addFlash(
  1661.                 'info',
  1662.                 "Le segment " $segment->getLibelle() . ' est mis à jour !'
  1663.             );
  1664.             return $this->redirectToRoute('dossier_segment_itineraire', [
  1665.                 'id' => $dossier->getId(),
  1666.                 'segmentId' => $segment->getId(),
  1667.             ]);
  1668.         } 
  1669.         
  1670.         return $this->render('dossier/itineraire.html.twig', [
  1671.             'dossier' => $dossier,
  1672.             'widgets'  => $widgets
  1673.             'langues'  => $langues
  1674.             'modeles'  => $modeles
  1675.             'linked' => $linked,
  1676.             'segment' => $segment,
  1677.             'form' => $form->createView(),
  1678.             'client' => $client,
  1679.             'pax' => $pax,
  1680.             'action' => 'Itinéraire: ' $dossier->getLibelle() . ' - ' $segment->getLibelle(),
  1681.             'itiCopyEnabled' => $itiCopyEnabled
  1682.             'retour' => 'dossier_index'      
  1683.         ]);
  1684.     }
  1685.     /**
  1686.     * @Route("/dossier/{id}/segment/{segmentId}/itineraire_duplicate", name="segment_itineraire_duplicate", methods={"GET","POST"})
  1687.     */
  1688.     public function itineraireDuplicate(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdCustomImportService $customImportService): Response
  1689.     {
  1690.         if (!$dossier) {
  1691.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1692.         }
  1693.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  1694.         if (!$segment) {
  1695.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  1696.         }
  1697.         $test $customImportService->handleSegmentVoyageItinaire($segment);
  1698.         
  1699.         $referer $request->headers->get('referer');
  1700.         if($referer)
  1701.         {
  1702.             return $this->redirect($referer);
  1703.         } else
  1704.         {
  1705.             return $this->redirectToRoute('dossier_segment_itineraire', [
  1706.                 'id' => $dossier->getId(),
  1707.                 'segmentId' => $segment->getId(),
  1708.             ]);
  1709.         }
  1710.     }
  1711.     /**
  1712.     * @Route("/dossier/{id}/edit_document_generator_dossier/{documentId}", name="edit_segment_document_dossier", methods={"GET","POST"}, defaults={})
  1713.     * @Route("/dossier/{id}/edit_document_generator_dossier", name="new_segment_document_dossier", methods={"GET","POST"}, defaults={"documentId"=null})
  1714.     */
  1715.     public function edit_itineraire($save falseRequest $requestEntityManagerInterface $emDossier $dossierCompanyService $companyServiceDossierSegmentService $segmentServiceTranslatorInterface $translatorEditorialService $editorialService$documentIdPatternService $patternServiceDocumentGeneratorService $documentGeneratorServiceTraductionService $traductionServiceDossierSegmentServiceService $segmentServiceService): Response
  1716.     {
  1717.         if (!$dossier) {
  1718.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1719.         }
  1720.         // Retrouve les langues disponibles
  1721.         $langues   $editorialService->getDolibarrFavoriteLanguage();
  1722.         $add_day      = ($request->query->get('add_day'0) == 0) ? false true;
  1723.         $segments     $request->query->get('segments'false);
  1724.         $modele_id    $request->query->get('modele'1);
  1725.         $segmentPaxId $request->query->get('paxContexte'null);
  1726.         $saveAuto     $request->query->get('save'0);
  1727.         $instance     $this->getParameter('instance');
  1728.         $langue       = ($request->query->get('langue'0) == 0) ? $request->query->get('langue') : 'FR';
  1729.         if ($saveAuto == "1")
  1730.             $save true;
  1731.         $document null;
  1732.   
  1733.         if (null === $documentId) {
  1734.             $segmentId $request->query->get('entiteId'null);
  1735.             if (null !== $segmentId) {
  1736.                 $segment  $em->getRepository(DossierSegment::class)->find($segmentId);
  1737.                 $modele   $em->getRepository(DocumentGeneratorModele::class)->findOneById($modele_id);
  1738.                 $document $documentGeneratorService->getDocumentGeneratorByModeleAndLangueAndEntite($segmentId'dossier'$modele$languetrue$add_day$segmentPaxId$segments);
  1739.                 return $this->redirectToRoute('dossier_edit_segment_document_dossier', [
  1740.                     'id'         => $dossier->getId(),
  1741.                     'documentId' => $document->getId(),
  1742.                     'save' => $saveAuto == "1" || $saveAuto == || $saveAuto == '1' true false,
  1743.                 ]);
  1744.             }
  1745.         } else {
  1746.             $document $em->getRepository(DocumentGenerator::class)->findOneById($documentId);
  1747.             $segment  $em->getRepository(DossierSegment::class)->find($document->getEntiteId());
  1748.         }
  1749.         if (!$segment) {
  1750.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  1751.         }
  1752.         // Templates disponibles
  1753.         $templates $em->getRepository(DocumentGeneratorPageTemplate::class)->findBy(array('actif' => 1'langue' => $document->getLangue()));
  1754.         // Retrouve les modeles disponibles
  1755.         $modeles   $em->getRepository(DocumentGeneratorModele::class)->findBy(array('entite' => 'dossier''actif' => 1'langue' => $document->getLangue()));
  1756.         // Locale
  1757.         $locale strtolower($traductionService->getLanguageCodeFromCountryCode($document->getLangue()));
  1758.         $request->setLocale($locale);
  1759.         // Client
  1760.         $client $companyService->getOneById($segment->getClientId());
  1761.         // Segments       
  1762.         $linked $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier'actif' => true], ['dateDepart' => 'ASC']);
  1763.         $langue    $document->getLangue();
  1764.         $modele    $document->getModele();
  1765.         // Retrouve les champs Custom affichés par défaut
  1766.         $customs = array(); 
  1767.         if (null !== $langue) { // que lorsqu'une langue est définie
  1768.             $contexte EditorialEnum::CATEGORIE_ACTIVITE
  1769.             $customs $editorialService->getEditorialContentCustomByLangue($languenull$contextenull);
  1770.         }
  1771.         $baseurl      $this->getParameter('cdn_url');
  1772.         $bg_color     $this->getParameter('document_generator_title_background');
  1773.         $color2       $this->getParameter('document_generator_editorial_title_color');
  1774.         $previewLink  $baseurl "/itineraire/" base64_encode("dossier/document/" $documentId ."/preview/single");
  1775.         $downloadLink $baseurl "/itineraire/" base64_encode("dossier/document/" $documentId ."/single");
  1776. //        $entities = (strlen($document->getEntityIds()) > 0) ? $document->getEntityIds() : $segment->getId();
  1777.     $entities = (strlen($document->getEntityIds()) > 0) ? implode(',', array($document->getEntityIds(), $segment->getId())) : $segment->getId();
  1778.         $patterns $patternService->getPatterns('dossier'$segment->getId(), array('Langue' => $document->getLangue()), array(':entities' => $entities ));
  1779.         $form   $this->createForm(DocumentGeneratorPageFormType::class, null, [ 'document' => $document ]);
  1780.         $form->handleRequest($request);
  1781.         if ($form->isSubmitted() && $form->isValid()) {
  1782.             $data     $request->request->get('document_generator_page_form');
  1783.             $toSubmit = array();
  1784.             // reconstruit les datas
  1785.             foreach ($data as $key => $value) {
  1786.                 $arrKey explode('_'$key);
  1787.                 if (count($arrKey) == 3) {
  1788.                     list($field,$pdfId,$id) = $arrKey;
  1789.                     if (strlen($value) > 0) {
  1790.                         $toSubmit[$id][$field] = $value;
  1791.                     }
  1792.                 }
  1793.             }
  1794.             // persiste les pages
  1795.             foreach ($toSubmit as $id => $fields) {
  1796.         // force la suppression des contours oranges
  1797.         $fields['contenu'] = str_replace('style="border: 1px dashed orange; border-radius: 5px;"'''$fields['contenu']);
  1798.                 $page $this->getDoctrine()->getManager()->getRepository(DocumentGeneratorPage::class)->findOneById($id);
  1799.                 if (array_key_exists('libelle'$fields)) {
  1800.                     $page->setLibelle($fields['libelle']);
  1801.                 }
  1802.                 if (array_key_exists('contenu'$fields)) {
  1803.                     $page->setHtml($fields['contenu']);
  1804.                 }
  1805.                 $this->getDoctrine()->getManager()->persist($page);
  1806.             }
  1807.             // Session
  1808.             $currentNavPage $request->request->get('current-nav-page');
  1809.             $this->get('session')->set('dossier-nav-page'$currentNavPage);
  1810.             $this->getDoctrine()->getManager()->flush();
  1811.             
  1812.             $this->addFlash(
  1813.                 'info',
  1814.                 'Le dossier est mis à jour !'
  1815.             );
  1816.             // Save to Arbo
  1817.             $documentGeneratorService->saveDocumentInArbo($document);
  1818.             //return $this->redirectToRoute('voyage_itineraire_v2', [
  1819.             //    'id' => $voyage->getId(),
  1820.             //]);
  1821.         }
  1822.         $retour 'dossier_segment_itineraire';
  1823.         return $this->render('dossier/itineraire_v2.html.twig', [
  1824.               'dossier'                 => $dossier
  1825.             'linked'                  => null 
  1826.             'segment'                 => $segment
  1827.             'client'                  => $client
  1828.             'form'                    => $form->createView()
  1829.             , 'action'                  => 'Itinéraire: ' $segment->getLibelle()
  1830.             , 'retour'                  => $retour      
  1831.             'document'                => $document
  1832.             'modeles'                 => $modeles
  1833.             'bg_color'                => $bg_color
  1834.             'color2'                  => $color2
  1835.             'langues'                 => $langues
  1836.             'langue'                  => $langue
  1837.             'new'                     => (null === $document) ? 0
  1838.             'templates'               => $templates
  1839.             'patterns'                => $patterns
  1840.             'customs'                 => $customs
  1841.             'previewLink'             => $previewLink
  1842.             'downloadLink'            => $downloadLink
  1843.             'modeleLock'              => VoyagePdfModeleEnum::LIBRE 
  1844.             'templateLock'            => array(VoyagePdfPageTemplateType::FREEVoyagePdfPageTemplateType::DAY)
  1845.             , 'save'                    => $save
  1846.             'instance'                => $instance            
  1847.         ]);
  1848.     }  
  1849.     /**
  1850.     * @Route("/dossier/edit_document_generator_dossier/save-page", name="save_page_segment_document_dossier", methods={"GET","POST"})
  1851.     */
  1852.     public function save_page_itineraire(Request $requestEntityManagerInterface $emDocumentGeneratorService $documentGeneratorServiceTraductionService $traductionService)
  1853.     {
  1854.         $id      $request->request->get('id'  null);
  1855.         $html    $request->request->get('html'null);
  1856.         $libelle $request->request->get('libelle'null);
  1857.         if (null === $id || null === $html) {
  1858.             return new Response(1);
  1859.         }
  1860.         $page $this->getDoctrine()->getManager()->getRepository(DocumentGeneratorPage::class)->findOneById($id);
  1861.         if (null === $page) {
  1862.             return new Response(1);
  1863.         }
  1864.         
  1865.     $html str_replace('style="border: 1px dashed orange; border-radius: 5px;"'''$html);
  1866.         $page->setLibelle($libelle);
  1867.         $page->setHtml($html);
  1868.         $this->getDoctrine()->getManager()->flush();
  1869.         return new Response(0);
  1870.     }
  1871.     /**
  1872.     * @Route("/dossier/{id}/segment/{segmentId}/rooming/groupements/select2", name="segment_rooming_groupement_liste", methods={"GET","POST"})
  1873.     */
  1874.     public function getGroupementRoomingForSelect2(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdPaxService $paxService): Response
  1875.     {
  1876.         if (!$dossier) {
  1877.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1878.         }
  1879.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  1880.       
  1881.         if (!$segment) {
  1882.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  1883.         }
  1884.     $term $request->query->get('term'null);
  1885.         // Multi Pax
  1886.         $multiPossibilites $paxService->getPaxTiersForForm($segmentIdfalse$term);
  1887.     //dd($multiPossibilites);
  1888.     $responseCode 200;
  1889.         $response = new Response(json_encode($multiPossibilites), $responseCode);
  1890.         $response->headers->set('Content-Type''application/json');
  1891.         return $response;
  1892.     }
  1893.     /**
  1894.     * @Route("/dossier/{id}/segment/{segmentId}/rooming", name="segment_rooming", methods={"GET","POST"}, defaults={"iframe" = false, "parent" = null})
  1895.     */
  1896.     public function rooming(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdCompanyService $companyServiceDossierSegmentService $segmentService,PaxService $paxService$iframe false$parent null): Response
  1897.     {
  1898.         if (!$dossier) {
  1899.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1900.         }
  1901.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  1902.       
  1903.         if (!$segment) {
  1904.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  1905.         }
  1906.         if (!$segment->getClientId()) 
  1907.         {
  1908.             $this->addFlash(
  1909.                 'warning',
  1910.                 'Aucun client trouvé pour le segment !'
  1911.             );
  1912.             return $this->redirectToRoute('dossier_edit', [
  1913.                 'id' => $dossier->getId(),
  1914.             ]);
  1915.         }
  1916.         $segment->setIsPaxValide(1);
  1917.         $this->getDoctrine()->getManager()->flush();
  1918.         // Client
  1919.         $client $companyService->getOneById($segment->getClientId());
  1920.         // Segments       
  1921.         $linked $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier'actif' => true], ['dateDepart' => 'ASC']);
  1922.         // PaxRooming 
  1923.         $roomingTypes $em->getRepository(PaxRooming::class)->findBy(['actif' => true], ['value' => 'ASC']);
  1924.         // PaxEtat 
  1925.         $paxEtats $em->getRepository(DossierSegmentPaxEtat::class)->findForForm();
  1926.       
  1927.         // Auto Pax
  1928.         $autoPossibilites $client['is_pax'] ? $paxService->getPaxWithOrigine($segmentId$segment->getClientId()) : null;
  1929.         // Multi Pax
  1930.         $multiPossibilites = []; //$paxService->getPaxTiersForForm($segmentId);
  1931.         // Check
  1932.         $check $em->getRepository(DossierSegmentPaxRooming::class)->checkForSegment($segment->getId());
  1933.  
  1934.         // Pax
  1935.         $pax $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->findForSegment($segment->getId());
  1936.         $pax $paxService->checkPaxes($pax);
  1937.         return $this->render('dossier/rooming.html.twig', [
  1938.             'dossier'          => $dossier,
  1939.             'linked'           => $linked,
  1940.             'segment'          => $segment,
  1941.             'client'           => $client,
  1942.             'roomingTypes'     => $roomingTypes,
  1943.             'paxEtats'         => $paxEtats,
  1944.             'autoPossibilites' => $autoPossibilites,
  1945.             'multiPossibilites' => $multiPossibilites,
  1946.             'check'            => $check,
  1947.             'pax'              => $pax,
  1948.             'iframe'           => $iframe,
  1949.             'parent'           => $parent,
  1950.             'action'           => 'Pax: ' $dossier->getLibelle() . ' - ' $segment->getLibelle(),
  1951.             'retour'           => 'dossier_index'      
  1952.         ]);
  1953.     }
  1954.      /**
  1955.      * @Route("/dossier/{id}/segment/{segmentId}/rooming/drag-and-drop", name="segment_rooming_drag_and_drop", methods={"GET","POST"})
  1956.      */
  1957.     public function roomingDragAndDrop(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdCompanyService $companyServicePaxService $paxService): Response
  1958.     {
  1959.         if (!$dossier) {
  1960.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1961.         }
  1962.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  1963.         if (!$segment) {
  1964.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  1965.         }
  1966.       
  1967.         // PaxRooming 
  1968.         $roomingTypes $em->getRepository(PaxRooming::class)->findBy(['actif' => true], ['value' => 'ASC']);
  1969.          
  1970.         // Rooming 
  1971.         $rooming $em->getRepository(DossierSegmentPaxRooming::class)->findForSegment($segment->getId());
  1972.         // Pax
  1973.         $paxes $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->findForSegment($segment->getId());
  1974.         $paxService->checkPaxes($paxes);
  1975.        
  1976.         return $this->render('dossier/rooming/drag.html.twig', [
  1977.             'segment' => $segment,
  1978.             'roomingTypes' => $roomingTypes,
  1979.             'rooming' => $rooming,
  1980.             'paxes' => $paxes,
  1981.             'action' => 'Gestion du rooming',
  1982.             'retour' => 'dossier_index'
  1983.         ]);
  1984.     }
  1985.     /**
  1986.     * @Route("/dossier/{id}/segment/{segmentId}/vols", name="segment_vols", methods={"GET","POST"}, defaults={"isIframe" = false, "parent" = null, "pdt" = false})
  1987.     * @Route("/dossier/{id}/segment/{segmentId}/vols-iframe", name="segment_vols_iframe", methods={"GET","POST"}, defaults={"isIframe" = true, "parent" = null, "pdt" = false})
  1988.     */
  1989.     public function vols(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdCompanyService $companyServiceDossierSegmentService $segmentService$isIframe$parent$pdt): Response
  1990.     {
  1991.         if (!$dossier) {
  1992.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  1993.         }
  1994.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  1995.         if (!$segment) {
  1996.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  1997.         }
  1998.         $AllPaxes      $segment->getDossierSegmentPaxes();
  1999.         $freePaxes     = array();
  2000.         foreach ($AllPaxes as $pax) {
  2001.             $isFree true;
  2002.             if (true == $pax->getActif()) {
  2003.                 $data $pax->getDossierSegmentTransfertAerienPaxes();      
  2004.                 if (count($data) == 0) {
  2005.                     $isFree = ($pax->getDossierSegmentPaxEtat()->getId() == \App\Enum\DossierSegmentPaxEtat::ANNULE_ID) ? false $isFree;
  2006.         }
  2007.         else {
  2008.                     foreach ($data as $i) {
  2009.                         if ($segmentId == $i->getPlanDeVol()->getSegment()->getId()) { // filtre sur le segment
  2010.                             $isFree false;
  2011.                         }
  2012.                     }
  2013.         }
  2014.                 if (true === $isFree) {
  2015.                     $freePaxes[] = $pax;
  2016.                 }
  2017.             }
  2018.         }
  2019.         // Client
  2020.         $client $companyService->getOneById($segment->getClientId());
  2021.         // Segments       
  2022.         $linked $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier'actif' => true], ['dateDepart' => 'ASC']);
  2023.         // Transfers aériens
  2024.         $tables     = array(); 
  2025.         // Plan de vols
  2026.         $plansDeVol $this->getDoctrine()->getManager()->getRepository(DossierSegmentPlanDeVol::class)->findBy(array('segment' => $segment));
  2027.         $pdvs = array(); // pour contenir tous les plan de vol des segments
  2028.         // Plan de vols des autres segments
  2029.         foreach ($dossier->getDossierSegments() as $dossierSegment) {
  2030.             foreach ($dossierSegment->getDossierSegmentPlanDeVols() as $plan) {
  2031.                 $pdvs[] = array(
  2032.                     'text'  => implode'/', array( $dossierSegment->getLibelle(), implode(' ', array($plan->getPlanDeVol()->getLibelle())))),
  2033.                     'id'   => $plan->getId()
  2034.                 );
  2035.             }
  2036.         }
  2037.         foreach ($plansDeVol as $planDeVol) {
  2038.             if ($planDeVol->getPlanDeVol()->getActif() == 1) {
  2039.                 $arr        = array();
  2040.                 $transferts $planDeVol->getDossierSegmentTransfertAeriens();
  2041.                 $paxes      $planDeVol->getDossierSegmentTransfertAerienPaxes(); 
  2042.                 foreach ($transferts as &$transfert) {
  2043.                     foreach ($transfert->getDossierSegmentTransfertAerienServices() as &$relation) {
  2044.                         // Calcul de la date
  2045.                         $days         $relation->getDossierSegmentService()->getDossierSegmentServiceDays()->toArray();
  2046.                         //$day          = $days[0]->getJour();
  2047.                         $day = (array_key_exists(0,$days)) ? $days[0]->getJour() : 1;
  2048.                         $date = clone $segment->getDateDepart();
  2049.                         $dayDiff $day 1;
  2050.                         $dateInterval = new \DateInterval('P' abs($dayDiff) . 'D');
  2051.                         if ($dayDiff 0$dateInterval->invert 1;
  2052.                         $date->add($dateInterval);
  2053.                         $date $date->format('d/m/Y');
  2054.             
  2055.                         $fournisseur $companyService->getOneById($relation->getDossierSegmentService()->getService()->getPrestataireId());
  2056.                         $nomFournisseur '';
  2057.                         if (null !== $fournisseur) {
  2058.                             $nomFournisseur implode(" - ", array($fournisseur['nom'], $fournisseur['code_fournisseur']));
  2059.                         }
  2060.                         $nomService implode(' - ', array("J{$day}"$nomFournisseursubstr($relation->getDossierSegmentService()->getService()->getLibelle(),0,10).'...'));
  2061.                         $relation->setName($nomService);
  2062.                     }
  2063.                     $arr[] = $transfert;
  2064.                 }
  2065.                 $tables[$planDeVol->getId()]['transferts'] = $arr;
  2066.                 $tables[$planDeVol->getId()]['paxes']      = $paxes;
  2067.                 $tables[$planDeVol->getId()]['libelle']    = $planDeVol->getPlanDeVol()->getLibelle();
  2068.                 $tables[$planDeVol->getId()]['note']       = $planDeVol->getPlanDeVol()->getNote();
  2069.             }
  2070.         }
  2071.         //$transferts = $this->getDoctrine()->getManager()->getRepository(TransfertAerien::class)->findAllBySegment($segment->getId());
  2072.         $template = (true === $isIframe) ? 'dossier/vols-iframe.html.twig' 'dossier/vols.html.twig';
  2073.         
  2074.         if ($request->isMethod('POST')) {
  2075.             $segment->setIsTransferValide(1);
  2076.             $em->flush();
  2077.         }
  2078.         return $this->render($template, [
  2079.              'dossier'    => $dossier  
  2080.            'linked'     => $linked   
  2081.            'segment'    => $segment  
  2082.            'isIframe'   => $isIframe  
  2083.            'client'     => $client   
  2084.            'tables'     => $tables   
  2085.            'freePaxes'  => $freePaxes   
  2086.            'pdvs'       => $pdvs   
  2087.            'transferts' => null//$transferts
  2088.            'parent'     => $parent
  2089.            'pdt'        => $pdt
  2090.            'action'     => 'Vols: ' $dossier->getLibelle() . ' - ' $segment->getLibelle()
  2091.            , 'retour'     => 'dossier_index'      
  2092.         ]);
  2093.     }
  2094.     /**
  2095.      * @Route("/dossier/{id}/segment/{segmentId}/vols/dupliquer/{planId}", name="dupliquer_plan_de_vol", methods={"GET", "POST"})
  2096.      */
  2097.     public function dupliquer_plan_de_vol(Request $request$idEntityManagerInterface $emTranslatorInterface $translator$segmentId$planId) : Response 
  2098.     {
  2099.         $responseCode 200;
  2100.         $data         = array();
  2101.         $transferts   = array();
  2102.         $relation         $em->getRepository(DossierSegmentPlanDeVol::class)->findOneById($planId);
  2103.         $segment          $em->getRepository(DossierSegment::class)->findOneById($segmentId);
  2104.         $transfertAeriens $em->getRepository(DossierSegmentTransfertAerien::class)->findBy(array('planDeVol' => $relation));
  2105.         $planDeVol = clone $relation->getPlanDeVol();
  2106.         $em->persist($planDeVol);
  2107.         $em->flush();
  2108.         $newRelation = clone $relation;
  2109.         $newRelation->setSegment($segment);
  2110.         $newRelation->setPlanDeVol($planDeVol);
  2111.         $em->persist($newRelation);
  2112.         $em->flush();
  2113.         if (null !== $transfertAeriens) {
  2114.             foreach ($transfertAeriens as $transfert) {
  2115.                 $newTransfert = clone $transfert;
  2116.                 $newTransfert->setPlanDeVol($newRelation);
  2117.                 $em->persist($newTransfert);
  2118.                 $em->flush();
  2119.             }
  2120.         }
  2121.         $response = new Response(json_encode($data), $responseCode);
  2122.         $response->headers->set('Content-Type''application/json');
  2123.         return $response;
  2124.     }
  2125.     /**
  2126.     * @Route("/dossier/{id}/segment/{segmentId}/vols/manage-pax", name="segment_vols_manage_pax", methods={"GET","POST"})
  2127.     */
  2128.     public function vols_manage_pax(Request $requestEntityManagerInterface $emDossier $dossier$segmentId): Response
  2129.     {
  2130.         if (!$dossier) {
  2131.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  2132.         }
  2133.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  2134.         if (!$segment) {
  2135.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  2136.         }
  2137.         // Retrouve les datas
  2138.         $params       $request->request->all();
  2139.         $pax          $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->findOneById($params['paxId']);
  2140.         $plan         $this->getDoctrine()->getManager()->getRepository(DossierSegmentPlanDeVol::class)->findOneById($params['planId']);
  2141.         $transfertPax $this->getDoctrine()->getManager()->getRepository(DossierSegmentTransfertAerienPax::class)->findOneBy(array('planDeVol' => $plan'segmentPax' => $pax)) ;
  2142.         
  2143.         if (null === $transfertPax) { // Ajoute si inconnu
  2144.             $transfertPax = new DossierSegmentTransfertAerienPax();
  2145.             $transfertPax->setPlanDeVol($plan)->setSegmentPax($pax)->setActif(1);
  2146.             $this->getDoctrine()->getManager()->persist($transfertPax);
  2147.         }  else { // Supprime si connu
  2148.             $this->getDoctrine()->getManager()->remove($transfertPax);
  2149.         }
  2150.         $statut = ($pax->getDossierSegmentPaxEtat()->getId() == \App\Enum\DossierSegmentPaxEtat::ANNULE_ID) ? false $pax->getActif();
  2151.         $this->getDoctrine()->getManager()->flush();
  2152.         return new Response(json_encode(array('actif' => $statut)), 200, ['Content-Type' => 'application/json']); 
  2153.     }
  2154.     /**
  2155.     * @Route("/dossier/{id}/segment/{segmentId}/vols/delete-transfert/{planId}/{transfertId}", name="segment_vols_delete_transfert", methods={"GET","POST"} , defaults={"isIframe" = false})
  2156.     * @Route("/dossier/{id}/segment/{segmentId}/vols/delete-transfert/{planId}/{transfertId}/iframe", name="segment_vols_delete_transfert_iframe", methods={"GET","POST"}, defaults={"isIframe" = true})
  2157.     */
  2158.     public function vols_delete_transfert(Request $requestEntityManagerInterface $emDossier $dossier$segmentId$planId$transfertId$isIframe) : Response
  2159.     {
  2160.         if (!$dossier) {
  2161.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  2162.         }
  2163.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  2164.         if (!$segment) {
  2165.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  2166.         }
  2167.         // Retrouve les datas
  2168.         $relation  $this->getDoctrine()->getManager()->getRepository(DossierSegmentTransfertAerien::class)->findOneById($transfertId) ;
  2169.         foreach ($relation->getDossierSegmentTransfertAerienServices() as $service) {
  2170.             $em->remove($service);
  2171.         }
  2172.         $em->remove($relation);
  2173.         $em->flush();
  2174.         if (true === $isIframe) {
  2175.             return $this->redirectToRoute('dossier_segment_vols_iframe', array('id' => $dossier->getId(), 'segmentId' => $segment->getId()));
  2176.         }
  2177.         return $this->redirectToRoute('dossier_segment_vols', array('id' => $dossier->getId(), 'segmentId' => $segment->getId()));
  2178.     }
  2179.     /**
  2180.     * @Route("/dossier/{id}/segment/{segmentId}/vols/delete/{planId}", name="segment_vols_delete_plan", methods={"GET","POST"} , defaults={"isIframe" = false})
  2181.     * @Route("/dossier/{id}/segment/{segmentId}/vols/delete/{planId}/iframe", name="segment_vols_delete_plan_iframe", methods={"GET","POST"}, defaults={"isIframe" = true})
  2182.     */
  2183.     public function vols_delete_plan(Request $requestEntityManagerInterface $emDossier $dossier$segmentId$planId$isIframe) : Response
  2184.     {
  2185.         if (!$dossier) {
  2186.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  2187.         }
  2188.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  2189.         if (!$segment) {
  2190.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  2191.         }
  2192.         $plan      $this->getDoctrine()->getManager()->getRepository(DossierSegmentPlanDeVol::class)->findOneById($planId);
  2193.         // Supprime les relation Plan-pax
  2194.         $paxes     $this->getDoctrine()->getManager()->getRepository(DossierSegmentTransfertAerienPax::class)->findBy(array('planDeVol' => $plan));
  2195.         foreach ($paxes as $planPax) {
  2196.             $em->remove($planPax);
  2197.         }
  2198.         $transferts $plan->getDossierSegmentTransfertAeriens();
  2199.         foreach ($transferts as $transfert) {
  2200.              // relations avec les services
  2201.              foreach ($transfert->getDossierSegmentTransfertAerienServices() as $service) {
  2202.                  $em->remove($service);
  2203.              }
  2204.              $em->remove($transfert);
  2205.         }
  2206.         // supprime le plan
  2207.         $em->remove($plan);
  2208.         $em->flush();
  2209.         if (true === $isIframe) {
  2210.             return $this->redirectToRoute('dossier_segment_vols_iframe', array('id' => $dossier->getId(), 'segmentId' => $segment->getId()));
  2211.         }
  2212.         return $this->redirectToRoute('dossier_segment_vols', array('id' => $dossier->getId(), 'segmentId' => $segment->getId()));
  2213.     }
  2214.     /**
  2215.     * @Route("/dossier/{id}/segment/{segmentId}/vols/edit-transfert/{planId}/{transfertId}", name="segment_vols_edit_transfert", methods={"GET","POST"})
  2216.     * @Route("/dossier/{id}/segment/{segmentId}/vols/edit-transfert/{planId}"              , name="segment_vols_new_transfert" , methods={"GET","POST"}, defaults={ "transfertId" = null })
  2217.     */
  2218.     public function vols_edit_transfert(Request $requestEntityManagerInterface $emDossier $dossier$segmentId$planId$transfertId) : Response
  2219.     {
  2220.         if (!$dossier) {
  2221.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  2222.         }
  2223.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  2224.         if (!$segment) {
  2225.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  2226.         }
  2227.         $rel null;
  2228.         if (null !== $transfertId) {
  2229.             $rel       $em->getRepository(DossierSegmentTransfertAerien::class)->findOneById($transfertId);
  2230.             $transfert $rel->getTransfertAerien();
  2231.             $edit  true;
  2232.         } else {
  2233.             $transfert = new TransfertAerien();
  2234.             $edit  false;
  2235.         }
  2236.         $form $this->createForm(TransfertAerienType::class, $transfert, []);
  2237.         $form->handleRequest($request);
  2238.         if ($form->isSubmitted() && $form->isValid()) {
  2239.             $dateDepart $form->get('dateDepart')->getData()." ".$form->get('heureDepart')->getData();
  2240.             $dateArrive $form->get('dateArrive')->getData()." ".$form->get('heureArrive')->getData();
  2241.             $debut = \DateTime::createFromFormat("dmy Hi",$dateDepart);
  2242.             $fin   = \DateTime::createFromFormat("dmy Hi",$dateArrive);
  2243.             if(!$debut || !$fin){
  2244.                 
  2245.                 $this->addFlash(
  2246.                     'warning',
  2247.                     "Dates invalide"
  2248.                 );
  2249.                 return $this->redirectToRoute('dossier_close_modal', []);
  2250.             }
  2251.             $em $this->getDoctrine()->getManager();
  2252.             $plan $em->getRepository(DossierSegmentPlanDeVol::class)->findOneById($planId);
  2253.             $transfert->setDebutVol($debut);
  2254.             $transfert->setFinVol($fin);
  2255.             //$transfert->setPlanDeVol($plan);
  2256.             $em->persist($transfert);
  2257.             $em->flush();
  2258.             if (null === $rel) {
  2259.                 // ajoute le lien avec le segment
  2260.                 $rel = new DossierSegmentTransfertAerien();
  2261.                 $rel->setSegment($segment);
  2262.                 $rel->setTransfertAerien($transfert);
  2263.                 $rel->setPlanDeVol($plan);
  2264.                 $em->persist($rel);
  2265.                 $em->flush();
  2266.             }
  2267.             $em->flush();
  2268.             return $this->redirectToRoute('dossier_close_modal', []);
  2269.         }
  2270.         
  2271.         return $this->render('dossier/transfert/_transfert_edit.html.twig', [
  2272.              'transfert' => $transfert
  2273.            'form'      => $form->createView()
  2274.            , 'action'    => 'Vols: ' $dossier->getLibelle() . ' - ' $segment->getLibelle()
  2275.            , 'retour'    => 'dossier_index'      
  2276.            'edit'      => $edit      
  2277.         ]);
  2278.     }
  2279.         
  2280.     /**
  2281.     * @Route("/render/dossier/{id}/segment/{segmentId}/vols/new-transfert/{planId}", name="render_segment_vols_new_transfert" , methods={"GET","POST"})
  2282.     * @Route("/render/dossier/{id}/segment/{segmentId}/vols/edit-transfert/{planId}", name="render_segment_vols_edit_transfert", methods={"GET","POST"})
  2283.     */
  2284.     public function vols_new_transfert_render(Request $requestEntityManagerInterface $emDossier $dossier$segmentId$planId) : Response
  2285.     {
  2286.         if (!$dossier) {
  2287.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  2288.         }
  2289.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  2290.         if (!$segment) {
  2291.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  2292.         }
  2293.         $rel null;
  2294.         $transfert = new TransfertAerien();
  2295.         $edit  true;
  2296.         $form $this->createForm(TransfertAerienType::class, $transfert, []);
  2297.         $form->handleRequest($request);
  2298.         
  2299.         if ($form->isSubmitted() && $form->isValid()) {
  2300.             
  2301.             $dateDepart $form->get('dateDepart')->getData()." ".$form->get('heureDepart')->getData();
  2302.             $dateArrive $form->get('dateArrive')->getData()." ".$form->get('heureArrive')->getData();
  2303.             
  2304.             $debut = \DateTime::createFromFormat("dmy Hi",$dateDepart);
  2305.             $fin   = \DateTime::createFromFormat("dmy Hi",$dateArrive);
  2306.             if(!$debut || !$fin){
  2307.             
  2308.                 $this->addFlash(
  2309.                     'warning',
  2310.                     "Dates invalide"
  2311.                 );
  2312.                 return $this->redirectToRoute('dossier_close_modal', []);
  2313.             }
  2314.             
  2315.             $em $this->getDoctrine()->getManager();
  2316.             $plan $em->getRepository(DossierSegmentPlanDeVol::class)->findOneById($planId);
  2317.             $transfert->setDebutVol($debut);
  2318.             $transfert->setFinVol($fin);
  2319.             $em->persist($transfert);
  2320.             $em->flush();
  2321.             if (null === $rel) {
  2322.                 // ajoute le lien avec le segment
  2323.                 $rel = new DossierSegmentTransfertAerien();
  2324.                 $rel->setSegment($segment);
  2325.                 $rel->setTransfertAerien($transfert);
  2326.                 $rel->setPlanDeVol($plan);
  2327.                 $em->persist($rel);
  2328.                 $em->flush();
  2329.             }
  2330.             $em->flush();
  2331.             return $this->redirectToRoute('dossier_close_modal', []);
  2332.         }
  2333.         
  2334.         return $this->render('dossier/transfert/_transfert_edit.html.twig', [
  2335.              'transfert' => $transfert
  2336.            'form'      => $form->createView()
  2337.            , 'action'    => 'Vols: ' $dossier->getLibelle() . ' - ' $segment->getLibelle()
  2338.            , 'retour'    => 'dossier_index'      
  2339.            'edit'      => $edit      
  2340.         ]);
  2341.     }
  2342.     /**
  2343.     * @Route("/dossier/{id}/segment/{segmentId}/vols/add"  , name="segment_vols_new" , methods={"GET","POST"})
  2344.     */
  2345.     public function vols_new(Request $requestEntityManagerInterface $emDossier $dossier$segmentId) : Response
  2346.     {
  2347.         if (!$dossier) {
  2348.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  2349.         }
  2350.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  2351.         if (!$segment) {
  2352.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  2353.         }
  2354.         $entity = new PlanDeVol();
  2355.         $form $this->createForm(PlanDeVolFormType::class, $entity, []);
  2356.         $form->handleRequest($request);
  2357.         if ($form->isSubmitted() && $form->isValid()) {
  2358.             $this->addFlash(
  2359.                 'info',
  2360.                 "Enregistrement OK"
  2361.             );
  2362.             $em $this->getDoctrine()->getManager();
  2363.             $entity->setActif(1);
  2364.             $em->persist($entity);
  2365.             $relation = new DossierSegmentPlanDeVol();
  2366.             $relation->setSegment($segment);
  2367.             $relation->setPlanDeVol($entity);
  2368.             $em->persist($relation);
  2369.             $em->flush();
  2370.             return $this->redirectToRoute('dossier_close_modal', []);
  2371.         }
  2372.         return $this->render('dossier/transfert/_plan_de_vol_edit.html.twig', [
  2373.              'entity'    => $entity
  2374.            'form'      => $form->createView()
  2375.            , 'action'    => 'Vols: ' $dossier->getLibelle() . ' - ' $segment->getLibelle()
  2376.            , 'retour'    => 'dossier_index'      
  2377.         ]);
  2378.     }
  2379.     /**
  2380.      * @Route("/dossier/{id}/segment/{segmentId}/transfert/{transfertId}/add-service/{serviceId}/{planId}"  , name="segment_transfert_add_service" , methods={"GET","POST"})
  2381.      */
  2382.     public function segment_transfert_add_service(Request $request$idEntityManagerInterface $emTranslatorInterface $translatorCompanyService $companyService$segmentId$transfertId$serviceId$planId
  2383.     {
  2384.         $data         = array();
  2385.         $transfert    $em->getRepository(DossierSegmentTransfertAerien::class)->findOneById($transfertId);
  2386.         $service      $em->getRepository(SegService::class)->findOneById($serviceId);
  2387.         $segment      $em->getRepository(DossierSegment::class)->findOneById($segmentId);
  2388.         // Calcul de la date
  2389.         $days         $service->getDossierSegmentServiceDays()->toArray();
  2390.         $day          $days[0]->getJour();
  2391.         $date         = clone $segment->getDateDepart();
  2392.         $dayDiff      $day 1;
  2393.         $dateInterval = new \DateInterval('P' abs($dayDiff) . 'D');
  2394.         if ($dayDiff 0$dateInterval->invert 1;
  2395.         $date->add($dateInterval);
  2396.         $date         $date->format('d/m/Y');
  2397.         $fournisseur $companyService->getOneById($service->getService()->getPrestataireId());
  2398.         $nomFournisseur '';
  2399.         if (null !== $fournisseur) {
  2400.             $nomFournisseur implode(" - ", array($fournisseur['nom'], $fournisseur['code_fournisseur']));
  2401.         }
  2402.         $exists $em->getRepository(DossierSegmentTransfertAerienService::class)->findOneBy(array('TransfertAerien' => $transfert'DossierSegmentService' => $service'DossierSegment' => $segment));
  2403.         //$paxesTransfert  = $em->getRepository(DossierSegmentServicePax::class)->findBy(array('dossierSegmentService' => $service));
  2404.         if (null === $exists) {
  2405.             $relationService = new DossierSegmentTransfertAerienService();
  2406.             $relationService->setTransfertAerien($transfert);
  2407.             $relationService->setDossierSegment($segment);
  2408.             $relationService->setDossierSegmentService($service);
  2409.             $em->persist($relationService);
  2410.             $em->flush();
  2411.             $data         = array(
  2412.                 'type'    => $service->getService()->getType()->getLibelle()
  2413.               , 'libelle' => implode(' - 'array_filter(array( $date$nomFournisseursubstr($service->getService()->getLibelle(),0,10).'...')))
  2414.               , 'color'   => $service->getService()->getType()->getColor()
  2415.               , 'id'      => $service->getId()
  2416.             );
  2417.             // Calcul la différence des paxes
  2418.             $inService     = array();
  2419.             $inTransfert   = array();
  2420.             $paxesService  $em->getRepository(DossierSegmentServicePax::class)->findBy(array('dossierSegmentService' => $service));
  2421.             foreach ($paxesService as $row) {
  2422.                 $inService[] = $row->getDossierSegmentPax()->getId();
  2423.             }
  2424.             $paxesPlanDeVol $em->getRepository(DossierSegmentTransfertAerienPax::class)->findBy(array('planDeVol' => $transfert->getPlanDeVol()));
  2425.             foreach ($paxesPlanDeVol as $row) {
  2426.                 $inTransfert[] = $row->getSegmentPax()->getId();
  2427.             }
  2428.             $diff array_diff($inService$inTransfert);
  2429.             if (count($diff) > 0) {
  2430.                 $data['diff'] = $diff;
  2431.             }
  2432.         }
  2433.         $responseCode 200;
  2434.         $response = new Response(json_encode($data), $responseCode);
  2435.         $response->headers->set('Content-Type''application/json');
  2436.         return $response;
  2437.     }
  2438.     /**
  2439.      * @Route("/dossier/{id}/segment/{segmentId}/transfert/{transfertId}/delete-service/{serviceId}"  , name="segment_transfert_delete_service" , methods={"GET","POST"})
  2440.      */
  2441.     public function segment_transfert_delete_service(Request $request$idEntityManagerInterface $emTranslatorInterface $translator$segmentId$transfertId$serviceId
  2442.     {
  2443.         $data = array();
  2444.         $transfert $em->getRepository(DossierSegmentTransfertAerien::class)->findOneById($transfertId);
  2445.         $service   $em->getRepository(SegService::class)->findOneById($serviceId);
  2446.         $segment   $em->getRepository(DossierSegment::class)->findOneById($segmentId);
  2447.         $exists $em->getRepository(DossierSegmentTransfertAerienService::class)->findOneBy(array('TransfertAerien' => $transfert'DossierSegmentService' => $service'DossierSegment' => $segment));
  2448.         if (null !== $exists) {
  2449.             $em->remove($exists);
  2450.         }
  2451.         $em->flush();
  2452.         $responseCode 200;
  2453.         $response = new Response(json_encode($data), $responseCode);
  2454.         $response->headers->set('Content-Type''application/json');
  2455.         return $response;
  2456.     }
  2457.     /**
  2458.     * @Route("/dossier/{id}/segment/{segmentId}/services-lies", name="segment_services_lies", methods={"GET","POST"})
  2459.     */
  2460.     public function services_lies(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdDossierSegmentService $segmentServiceCompanyService $companyService): Response
  2461.     {
  2462.         if (!$dossier) {
  2463.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  2464.         }
  2465.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  2466.         if (!$segment) {
  2467.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  2468.         }
  2469.         if (!$segment->getClientId()) 
  2470.         {
  2471.             $this->addFlash(
  2472.                 'warning',
  2473.                 'Aucun client trouvé pour le segment !'
  2474.             );
  2475.             return $this->redirectToRoute('dossier_edit', [
  2476.                 'id' => $dossier->getId(),
  2477.             ]);
  2478.         }
  2479.         $groupements $em->getRepository(DossierSegmentServiceGroupement::class)->findForDrag($segment);
  2480.      
  2481.         foreach ($groupements as &$rows) {
  2482.             foreach ($rows as &$row) {
  2483.                 if (null !== $row->getService()->getService()) {
  2484.                     $fournisseur $companyService->getOneById($row->getService()->getService()->getPrestataireId());
  2485.                     $row->setFournisseurData($fournisseur);
  2486.                 }
  2487.             }
  2488.         }
  2489.         $template 'dossier/liaisons-iframe.html.twig';
  2490.         return $this->render($template, [
  2491.              'dossier'  => $dossier  
  2492.            'segment'  => $segment  
  2493.            'groupes'  => $groupements   
  2494.            'action'   => 'Liaisons: ' $dossier->getLibelle() . ' - ' $segment->getLibelle()
  2495.            , 'retour'   => 'dossier_index'      
  2496.         ]);
  2497.     }
  2498.     /**
  2499.      * @Route("/dossier/{id}/segment/{segmentId}/services-lies/{serviceId}/delete"  , name="segment_delete_service_lie" , methods={"GET","POST"})
  2500.      */
  2501.     public function segment_delete_service_lie(Request $request$idEntityManagerInterface $emTranslatorInterface $translator$segmentId$serviceId
  2502.     {
  2503.         $data = array();
  2504.         $service   $em->getRepository(DossierSegmentServiceGroupement::class)->findOneById($serviceId);
  2505.         if (null !== $service) {
  2506.             $em->remove($service);
  2507.         }
  2508.         $em->flush();
  2509.         $responseCode 200;
  2510.         $response = new Response(json_encode($data), $responseCode);
  2511.         $response->headers->set('Content-Type''application/json');
  2512.         return $response;
  2513.     }
  2514.     /**
  2515.     * @Route("/dossier/{id}/segment/{segmentId}/liaison/{serviceId}/{day}/groupement/{groupement}", name="segment_services_link", methods={"GET","POST"})  
  2516.     * @Route("/dossier/{id}/segment/{segmentId}/liaison/{serviceId}/{day}/groupement/", name="segment_services_link_new", methods={"GET","POST"}, defaults={"groupement"=null})  
  2517.     */
  2518.     public function services_link(Request $requestEntityManagerInterface $emDossier $dossierCompanyService $companyService$segmentId$day$serviceId$groupement): Response
  2519.     {
  2520.         if (!$dossier) {
  2521.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  2522.         }
  2523.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  2524.         if (!$segment) {
  2525.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  2526.         }
  2527.         if (!$segment->getClientId()) 
  2528.         {
  2529.             $this->addFlash(
  2530.                 'warning',
  2531.                 'Aucun client trouvé pour le segment !'
  2532.             );
  2533.             return $this->redirectToRoute('dossier_edit', [
  2534.                 'id' => $dossier->getId(),
  2535.             ]);
  2536.         }
  2537.         $service $em->getRepository(SegService::class)->find($serviceId);
  2538.         $data = array('action' => 'edit');
  2539.         if (null === $groupement) {
  2540.             $groupement $em->getRepository(DossierSegmentServiceGroupement::class)->setNewGroupement($segment);
  2541.             $exists null;
  2542.             $data['action'] = 'new';
  2543.         } else {
  2544.             $exists $em->getRepository(DossierSegmentServiceGroupement::class)->findOneBy(array('segment' => $segment'groupement' => intval($groupement), 'service' => $service));
  2545.         }
  2546.         if (null === $exists) {
  2547.             $entity = new DossierSegmentServiceGroupement();
  2548.             $entity->setSegment($segment);
  2549.             $entity->setGroupement(intval($groupement));
  2550.             $entity->setDay($day);
  2551.             $entity->setService($service);
  2552.             $em->persist($entity);
  2553.             $em->flush();
  2554.             $fournisseur $companyService->getOneById($entity->getService()->getService()->getPrestataireId());
  2555.             $libelle = array('Jour '.$day);
  2556.             if (null !== $fournisseur) {
  2557.                 $libelle[] = implode(' ', array($fournisseur['nom'], $fournisseur['code_fournisseur'])); 
  2558.             }
  2559.             $libelle[] = $entity->getService()->getService()->getLibelle();
  2560.             $data['id'     ]    = $entity->getId();
  2561.             $data['type'   ]    = $entity->getService()->getService()->getType()->getLibelle();
  2562.             $data['libelle']    = implode(' - '$libelle);
  2563.             $data['serviceId']  = $entity->getService()->getId();
  2564.             $data['groupement'] = $groupement;
  2565.         }
  2566.         else {
  2567.             $data['action'] = 'exists';
  2568.         }
  2569.         $responseCode 200;
  2570.         $response = new Response(json_encode($data), $responseCode);
  2571.         $response->headers->set('Content-Type''application/json');
  2572.         return $response;
  2573.     }
  2574.     /**
  2575.     * @Route("/dossier/{id}/segment/{segmentId}/composition", name="segment_composition", methods={"GET","POST"})
  2576.     */
  2577.     public function composition(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdCompanyService $companyServiceDossierSegmentService $segmentServiceDossierSegmentServiceService $segmentServiceServicePaxService $paxServiceServiceService $serviceService): Response
  2578.     {
  2579.         if (!$dossier) {
  2580.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  2581.         }
  2582.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  2583.         if (!$segment) {
  2584.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  2585.         }
  2586.         if (!$segment->getClientId()) 
  2587.         {
  2588.             $this->addFlash(
  2589.                 'warning',
  2590.                 'Aucun client trouvé pour le segment !'
  2591.             );
  2592.             return $this->redirectToRoute('dossier_edit', [
  2593.                 'id' => $dossier->getId(),
  2594.             ]);
  2595.         }
  2596.         $instance $this->getParameter('instance''wi');
  2597.         $result $segmentService->checkDuree($segment);
  2598.         // Params
  2599.         $savedIndex $this->get('session')->get('compositionIndex'1);
  2600.         $index $request->query->get('index'$savedIndex) == $request->query->get('index'$savedIndex) : $savedIndex;
  2601.         $newIndex $request->request->get('index') ? $request->request->get('index') : $index;
  2602.         $closeDays $request->query->get('closeDays'false);
  2603.         $newDayIndex $request->query->get('newDayIndex'false);
  2604.         $this->get('session')->set('compositionIndex'$newIndex);
  2605.         // Recovery
  2606.         $recoveryFrom $request->get('recovery');
  2607.         if($recoveryFrom)
  2608.         {
  2609.             $recovers $segmentService->recoverServices($segment$recoveryFrom);
  2610.             if($recovers)
  2611.             {
  2612.                 $this->addFlash(
  2613.                     'info',
  2614.                     $recovers ' service(s) récupéré(s) !'
  2615.                 );
  2616.             }
  2617.         }
  2618.         // Client
  2619.         $client $companyService->getOneById($segment->getClientId());
  2620.      
  2621.         // Segments       
  2622.         $linked $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier'actif' => true], ['dateDepart' => 'ASC']);
  2623.         // Prestations
  2624.         if(!$segment->getIsPrestationSeche())
  2625.         {
  2626.             $segment $segmentService->setSiblingsData($segment);
  2627.         }
  2628.        
  2629.         // Check Days (ANPU Itinéraire V1)
  2630.         /*
  2631.         $result = $segmentService->checkDays($segment);
  2632.       
  2633.         if ($result['diff']) {
  2634.             $this->addFlash(
  2635.                 'warning',
  2636.                 'L\'itinéraire est composé de ' . $result['diff'] . ' jour(s) en plus que le paramètre prévu dans le segment !'
  2637.             );
  2638.         }
  2639.      
  2640.         if ($result['newDaysCount']) {
  2641.             if ($result == 1) {
  2642.                 $message = $result['newDaysCount'] . ' jour a été généré !';
  2643.             } else {
  2644.                 $message = $result['newDaysCount'] . ' jours ont été générés !';
  2645.             }
  2646.             $this->addFlash(
  2647.                 'info',
  2648.                 $message
  2649.             );
  2650.         }
  2651.         */
  2652.         $compositionDate $segment->getDateDepart();
  2653.         // Type
  2654.         if ($segment->getVoyage() && $segment->getVoyage()->getVoyageType() && $segment->getVoyage()->getVoyageType()->getId() == VoyageTypeEnum::GUIDE
  2655.         {
  2656.             $guideParDefaut true;
  2657.         } else {
  2658.             $guideParDefaut false;
  2659.         } 
  2660.         if ($instance === 'wi') { // force à true pour WI
  2661.             $guideParDefaut true;
  2662.         }
  2663.         // Services
  2664.         if ($index == 2) {
  2665.             $services $segmentService->getBySegmentForComposition($segment);
  2666.             // MAJ Compo avec DATA sans Ajax
  2667.             foreach($services as $type => $subData
  2668.             {
  2669.                 foreach($subData as $subDataIndex => $segmentServiceEntity
  2670.                 {
  2671.                     // Sub Services
  2672.                     $params = [];
  2673.                     $params['tarifJour']       = $segmentServiceEntity->getTarifJour() ? "true" "false"
  2674.                     $params['inclus']          = $segmentServiceEntity->getInclus() ? "true" "false"
  2675.                     $params['payantPourGuide'] = $segmentServiceEntity->getPayantPourGuide() ? "true" "false"
  2676.                     $params['payeWalkinn']     = $segmentServiceEntity->getPayeWalkinn() ? "true" "false"
  2677.                     $params['compterGuide']    = $segmentServiceEntity->getCompterLeGuide() ? "true" "false"
  2678.                     $params['compterGroupe']   = $segmentServiceEntity->getCompterLeGroupe() ? "true" "false"
  2679.                     $parent $segmentServiceEntity->getService();
  2680.                 
  2681.                     $joursArray $segmentServiceService->explodeDossierSegmentServiceJoursString($segmentServiceEntity->getJours());
  2682.         
  2683.                     if ($parent && $segment && count($joursArray) > 0
  2684.                     {
  2685.                         $subServices $em->getRepository(Service::class)->getByParentId($parent->getId());
  2686.                         $subServices $serviceService->getSegmentSousServicesForComposition($segment$joursArray$subServices$params);
  2687.                     } else {
  2688.                         $subServices null;
  2689.                     }
  2690.                     $segmentServiceEntity->setSubServicesData($subServices);
  2691.                     // Paxes
  2692.                     $params = [];
  2693.                     $params['inclus']        = $segmentServiceEntity->getInclus()          ? "true" "false";
  2694.                     $params['compterGuide']  = $segmentServiceEntity->getCompterLeGuide()  ? "true" "false";
  2695.                     $params['compterGroupe'] = $segmentServiceEntity->getCompterLeGroupe() ? "true" "false"
  2696.                     $paxes $paxService->getForSegmentService($segmentServiceEntity$params);
  2697.                     $segmentServiceEntity->setPaxesData($paxes);
  2698.                     // Total
  2699.                     $params = [];
  2700.                     $params['segment'] = $segment->getId();
  2701.                     $params['segmentService'] = $segmentServiceEntity->getId();
  2702.                     $params['jours'] = $segmentServiceEntity->getJours();
  2703.                     $params['tarifJour'] = $segmentServiceEntity->getTarifJour() ? "true" "false"
  2704.                     $params['inclus'] = $segmentServiceEntity->getInclus() ? "true" "false"
  2705.                     $params['payantPourGuide'] = $segmentServiceEntity->getPayantPourGuide() ? "true" "false"
  2706.                     $params['payeWalkinn'] = $segmentServiceEntity->getPayeWalkinn() ? "true" "false"
  2707.                     $params['compterGuide'] = $segmentServiceEntity->getCompterLeGuide() ? "true" "false";
  2708.                     $params['compterGroupe'] = $segmentServiceEntity->getCompterLeGroupe() ? "true" "false";
  2709.                     $params['quantite'] = $segmentServiceEntity->getQuantite();
  2710.                     $params['date'] = $segment->getDateDepart();
  2711.                     $service $em->getRepository(Service::class)->findByParentId($segmentServiceEntity->getService()->getId());
  2712.            
  2713.                     $total $serviceService->getTarifForSegmentComposition($service$params);
  2714.                     $segmentServiceEntity->setTotalData($total);
  2715.                 }
  2716.             }
  2717.             $segment->setTransports($services['transports']);
  2718.             $segment->setHebergements($services['hebergements']);
  2719.             $segment->setActivites($services['activites']);
  2720.             $segment->setRepas($services['repas']);
  2721.             $segment->setGuides($services['guides']);
  2722.             $segment->setDivers($services['divers']);
  2723.      
  2724.             // Sup Single
  2725.             $date $segment->getDateDepart();
  2726.             $supSingle $segmentService->getSupSingle($segment$date);
  2727.             $segment->setSupSingleData($supSingle);
  2728.             $rooming $segmentService->getRoomingBySegmentForComposition($segment);
  2729.             $activitiesTypes false;
  2730.             $form $this->createForm(DossierSegmentCompositionTypesFormType::class, $segment, array('instance' => $instance));
  2731.         } else {
  2732.             $services $segmentService->getBySegmentDayByDay($segment);
  2733.             $segment->setDaysJourParJour($services['days']);
  2734.          
  2735.             $rooming false;
  2736.             $activitiesTypes $em->getRepository(EditorialCategorie::class)->findActivites();
  2737.            
  2738.             $form $this->createForm(DossierSegmentCompositionDaysFormType::class, $segment, array('instance' => $instance)); 
  2739.         }
  2740.      
  2741.         $form->handleRequest($request);
  2742.         if ($form->isSubmitted() && $form->isValid()) {
  2743.             // Gestion dans service
  2744.             if ($index == 2) {
  2745.                 $data $form->getData();
  2746.                 if (!empty($data)) {
  2747.                     $segmentService->checkFormData($services$data$segment);
  2748.                 }
  2749.                 $segment->setIsCompoValide(1);
  2750.             } else
  2751.             {
  2752.                 $data $request->request->all();
  2753.                 if (!empty($data)) {
  2754.                     $segmentService->checkDaysFormData($services$data$segment);
  2755.                 }
  2756.             }
  2757.             $this->getDoctrine()->getManager()->flush();
  2758.             
  2759.             $this->addFlash(
  2760.                 'info',
  2761.                 "Le voyage " $segment->getLibelle() . ' est mis à jour !'
  2762.             );
  2763.             $result $segmentService->checkDuree($segment);
  2764.       
  2765.             if ($result) {
  2766.                 $this->addFlash(
  2767.                     'warning',
  2768.                     'La durée du segment a été mise à jour !'
  2769.                 );
  2770.             }
  2771.             return $this->redirectToRoute('dossier_segment_composition', [
  2772.                 'id' => $dossier->getId(),
  2773.                 'segmentId' => $segment->getId(),
  2774.                 'index' => $newIndex
  2775.             ]);
  2776.         } else if ($form->isSubmitted() && !$form->isValid()) {
  2777.             // Message
  2778.             $this->addFlash(
  2779.                 'warning',
  2780.                 "Les informations n\'ont PAS été mises à jour !"
  2781.             );
  2782.          
  2783.             // Erreurs
  2784.             foreach ($form->getErrors(true) as $formError) {
  2785.                 $currentError $formError->getMessage();
  2786.                 foreach($formError->getMessageParameters() as $formErrorParameter) {
  2787.                     $currentError .= " - " $formErrorParameter;
  2788.                 }
  2789.                 $this->addFlash(
  2790.                     'warning',
  2791.                     $currentError
  2792.                 );
  2793.             }  
  2794.         }
  2795.         /*
  2796.         if ($result['newDaysCount']) {
  2797.             return $this->redirectToRoute('dossier_segment_composition', [
  2798.                 'id' => $dossier->getId(),
  2799.                 'segmentId' => $segment->getId(),
  2800.                 'index' => $newIndex
  2801.             ]);
  2802.         }
  2803.         */
  2804.         return $this->render('dossier/composition.html.twig', [
  2805.             'dossier' => $dossier,
  2806.             'linked' => $linked,
  2807.             'segment' => $segment,
  2808.             'rooming' => $rooming,
  2809.             'activitiesTypes' => $activitiesTypes,
  2810.             'client' => $client,
  2811.             'form' => $form->createView(),
  2812.             'action' => 'Composition: ' $dossier->getLibelle() . ' - ' $segment->getLibelle(),
  2813.             'retour' => 'dossier_index',     
  2814.             'compositionDate' => $compositionDate,
  2815.             'guideParDefaut' => $guideParDefaut,    
  2816.             'index' => $index,
  2817.             'closeDays' => $closeDays,
  2818.             'newDayIndex' => $newDayIndex,
  2819.         ]);
  2820.     }
  2821.     /**
  2822.     * @Route("/dossier/{id}/segment/{segmentId}/roadbook", name="segment_roadbook", methods={"GET","POST"})
  2823.     */
  2824.     public function roadbook(Request $requestUserService $userServiceEntityManagerInterface $emDossier $dossier$segmentIdCompanyService $companyServiceDossierSegmentService $segmentServiceDossierSegmentServiceService $segmentServiceServicePaxService $paxServiceServiceService $serviceServiceDocumentService $documentService): Response
  2825.     {
  2826.         // dd($request->request->all());
  2827.         if (!$dossier) {
  2828.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  2829.         }
  2830.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  2831.         if (!$segment) {
  2832.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  2833.         }
  2834.         if (!$segment->getClientId()) 
  2835.         {
  2836.             $this->addFlash(
  2837.                 'warning',
  2838.                 'Aucun client trouvé pour le segment !'
  2839.             );
  2840.             return $this->redirectToRoute('dossier_edit', [
  2841.                 'id' => $dossier->getId(),
  2842.             ]);
  2843.         }
  2844.         $instance $this->getParameter('instance''wi');
  2845.         $result $segmentService->checkDuree($segment);
  2846.         // Params
  2847.         $index 1;
  2848.         $newIndex $request->request->get('index') ? $request->request->get('index') : $index;
  2849.         $closeDays $request->query->get('closeDays'false);
  2850.         $newDayIndex $request->query->get('newDayIndex'false);
  2851.         // Recovery
  2852.         $recoveryFrom $request->get('recovery');
  2853.         if($recoveryFrom)
  2854.         {
  2855.             $recovers $segmentService->recoverServices($segment$recoveryFrom);
  2856.             if($recovers)
  2857.             {
  2858.                 $this->addFlash(
  2859.                     'info',
  2860.                     $recovers ' service(s) récupéré(s) !'
  2861.                 );
  2862.             }
  2863.         }
  2864.         // Client
  2865.         $client $companyService->getOneById($segment->getClientId());
  2866.      
  2867.         // Segments       
  2868.         $linked $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier'actif' => true], ['dateDepart' => 'ASC']);
  2869.         // Prestations
  2870.         if(!$segment->getIsPrestationSeche())
  2871.         {
  2872.             $segment $segmentService->setSiblingsData($segment);
  2873.         }
  2874.         $compositionDate $segment->getDateDepart();
  2875.         // Type
  2876.         if ($segment->getVoyage() && $segment->getVoyage()->getVoyageType() && $segment->getVoyage()->getVoyageType()->getId() == VoyageTypeEnum::GUIDE
  2877.         {
  2878.             $guideParDefaut true;
  2879.         } else {
  2880.             $guideParDefaut false;
  2881.         } 
  2882.         if ($instance === 'wi') { // force à true pour WI
  2883.             $guideParDefaut true;
  2884.         }
  2885.         
  2886.         $rooming false;
  2887.         $activitiesTypes $em->getRepository(EditorialCategorie::class)->findActivites();
  2888.         
  2889.         $form $this->createForm(DossierSegmentCompositionDaysFormType::class, $segment, array('instance' => $instance)); 
  2890.         $form->handleRequest($request);
  2891.         if ($form->isSubmitted() && $form->isValid()) {
  2892.             $dossier $segment->getDossier();
  2893.             // suppression anciennes lignes
  2894.             // $arrItems = $em->getRepository(RoadmapItem::class)->findBy(['dossier' => $dossier]);
  2895.             // foreach($arrItems as $item) {
  2896.             //     $em->remove($item);
  2897.             // }
  2898.             // ajout/edit lignes roadmap
  2899.             foreach($request->request->all() as $key => $value) {
  2900.                 if (strpos($key'roadbook_pos_') !== false) {
  2901.                     $sp explode('_'$key);
  2902.                     $jour $sp[2];
  2903.                     $uid $sp[3];
  2904.                     $objDoc null;
  2905.                     if(is_numeric($uid)) {
  2906.                         $idDoc intval($uid);
  2907.                         $objDoc $em->getRepository(EditorialDocument::class)->find($idDoc);
  2908.                         $sharepointId $objDoc $objDoc->getSharepointId() : null;
  2909.                     }
  2910.                     else {
  2911.                         $sharepointId $uid;
  2912.                     }
  2913.                     $objItem $em->getRepository(RoadmapItem::class)->findByDossierJourAndSharepointId($dossier$jour$sharepointId);
  2914.                     if(is_null($objItem)) {
  2915.                         $objItem = new RoadmapItem();
  2916.                     }
  2917.                     if(!is_null($objDoc)) {
  2918.                         $objItem->setDocument($objDoc);
  2919.                     }
  2920.                     $objItem->setDossier($dossier);
  2921.                     $objItem->setOrdre($value);
  2922.                     $objItem->setJour($jour);
  2923.                     $em->persist($objItem);
  2924.                 }
  2925.             }
  2926.             $em->flush();
  2927.             if($request->request->get("download") !== "1") {
  2928.                 $this->addFlash(
  2929.                     'success',
  2930.                     "Composition du roadbook sauvegardée avec succès."
  2931.                 );
  2932.                 if(!is_null($request->request->get("redirect"))) {
  2933.                     return $this->redirect($request->request->get("redirect"));
  2934.                 }
  2935.             }
  2936.             // Téléchargement du roadbook
  2937.             else {
  2938.                 $token $userService->getUserOfficeToken($this->getUser());
  2939.                 return $documentService->generateDossierRoadbook($dossier$token);
  2940.             }
  2941.             
  2942.         } else if ($form->isSubmitted() && !$form->isValid()) {
  2943.             // Message
  2944.             $this->addFlash(
  2945.                 'warning',
  2946.                 "Les informations n\'ont PAS été mises à jour !"
  2947.             );
  2948.          
  2949.             // Erreurs
  2950.             foreach ($form->getErrors(true) as $formError) {
  2951.                 $currentError $formError->getMessage();
  2952.                 foreach($formError->getMessageParameters() as $formErrorParameter) {
  2953.                     $currentError .= " - " $formErrorParameter;
  2954.                 }
  2955.                 $this->addFlash(
  2956.                     'warning',
  2957.                     $currentError
  2958.                 );
  2959.             }  
  2960.         }
  2961.         // Services
  2962.         $langue = isset(explode("_"$client["default_lang"])[1]) ? explode("_"$client["default_lang"])[1] : "GB";
  2963.         $services $segmentService->getBySegmentDayByDay($segment$langue);
  2964.         $segment->setDaysJourParJour($services['days']);
  2965.         // dd($services['activites_documents']);
  2966.         return $this->render('dossier/composition_roadbook.html.twig', [
  2967.             'dossier' => $dossier,
  2968.             'linked' => $linked,
  2969.             'segment' => $segment,
  2970.             'rooming' => $rooming,
  2971.             'activitiesTypes' => $activitiesTypes,
  2972.             'client' => $client,
  2973.             'form' => $form->createView(),
  2974.             'action' => 'Composition: ' $dossier->getLibelle() . ' - ' $segment->getLibelle(),
  2975.             'retour' => 'dossier_index',     
  2976.             'compositionDate' => $compositionDate,
  2977.             'guideParDefaut' => $guideParDefaut,    
  2978.             'index' => $index,
  2979.             'closeDays' => $closeDays,
  2980.             'newDayIndex' => $newDayIndex,
  2981.             'roadbook' => $services['activites_documents'],
  2982.             'langue' => $langue
  2983.         ]);
  2984.     }
  2985.     /**
  2986.     * @Route("/dossier/{id}/dossier-guide/fiche-recapitulative", name="fiche_recapitulative_guide", methods={"GET","POST"})
  2987.     */
  2988.     public function ficheRecapitulative(Request $requestEntityManagerInterface $emDossier $dossierCompanyService $companyServiceDossierSegmentService $segmentServiceDocumentGeneratorService $documentService): Response
  2989.     {
  2990.         if (!$dossier) {
  2991.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  2992.         }
  2993.         $guideNames = array();
  2994.         $montant    0      ;
  2995.         foreach ($dossier->getDossierSegments() as $segment) {
  2996.             $guides $segment->getDossierSegmentGuidesActifs();
  2997.             if (null !== $guides) {
  2998.                foreach ($guides as $guide) {
  2999.                    $guideNames[] = $guide->getLibelle();
  3000.                }
  3001.                $guideNames array_unique($guideNames);
  3002.             }
  3003.             // traite le montant payé guide
  3004.             $services $em->getRepository(SegService::class)->findBy(array('segment' => $segment'actif' => 1'payeWalkinn' => 0));
  3005.             if (null !== $services) {
  3006.                 foreach ($services as $service) {
  3007.                     $montant $montant $service->getPrixAchatFixe();
  3008.                 }
  3009.             }
  3010.         }
  3011.         $segment $dossier->getDossierSegments()[0];
  3012.         $client $companyService->getOneById($segment->getClientId());
  3013.         return $this->render('document-generator/fiche-recapitulative.html.twig', [
  3014.             'dossier'    => $dossier,
  3015.             //'linked'     => $linked ,
  3016.             'segment'    => $segment,
  3017.             'client'     => $client ,
  3018.             'guideNames' => $guideNames,
  3019.             'montant'    => ceil($montant/10)*10   // il faut arrondir aux 10 euros supérieur  
  3020.         ]);
  3021.     }
  3022.     /**
  3023.     * @Route("/dossier/{id}/dossier-guide/budget-guide", name="budget_guide", methods={"GET","POST"})
  3024.     */
  3025.     public function ficheBudgetGuide(Request $requestEntityManagerInterface $emDossier $dossierCompanyService $companyServiceDossierSegmentService $segmentServiceDocumentGeneratorService $documentServiceDossierSegmentServiceService $segmentServiceServiceServiceService $serviceServicePaxService $paxServiceVoyageService $voyageService): Response
  3026.     {
  3027.         if (!$dossier) {
  3028.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  3029.         }
  3030.         $guideNames  = array();
  3031.         $montant     0      ;
  3032.         $mesServices = array();
  3033.         $devise      = array();
  3034.         foreach ($dossier->getDossierSegments() as $seg) {
  3035.             $guides $seg->getDossierSegmentGuidesActifs();
  3036.             if (null !== $guides) {
  3037.                foreach ($guides as $guide) {
  3038.                    $guideNames[] = $guide->getLibelle();
  3039.                }
  3040.                $guideNames array_unique($guideNames);
  3041.             }
  3042.             // traite le montant payé guide
  3043.             $services $em->getRepository(SegService::class)->findBy(array('segment' => $seg'actif' => 1'payeWalkinn' => 0), array('ordre'=>'ASC'));
  3044.             if (null !== $services) {
  3045.                 foreach ($services as $service) {
  3046.                     if (null !== $service->getService()) {
  3047.                 $paxData = array();
  3048.             $paxes $em->getRepository(DossierSegmentServicePax::class)->findBy(array('actif' => 1'dossierSegmentService' => $service));
  3049.                 foreach ($paxes as $pax) {
  3050.                     if ($pax->getDossierSegmentPax()->getPaxType()->getId() != \App\Enum\PaxType::GUIDE_ID) {
  3051.                         $isInclude 0;
  3052.                         foreach ($paxData as $test)
  3053.                         {
  3054.                             if ($test->getDossierSegmentPax()->getLibelle() == $pax->getDossierSegmentPax()->getLibelle())
  3055.                             {
  3056.                                 $isInclude 1;
  3057.                             }
  3058.                         }
  3059.                         if ($isInclude == 0)
  3060.                             $paxData[] = $pax;
  3061.                     } else {
  3062.                         if ( $service->getPayantPourGuide() == true) {
  3063.                             $isInclude 0;
  3064.                             foreach ($paxData as $test)
  3065.                             {
  3066.                                 if ($test->getDossierSegmentPax()->getLibelle() == $pax->getDossierSegmentPax()->getLibelle())
  3067.                                 {
  3068.                                     $isInclude 1;
  3069.                                 }
  3070.                             }
  3071.                             if ($isInclude == 0)
  3072.                                 $paxData[] = $pax;
  3073.                         }
  3074.                     }
  3075.                 }
  3076.                         $service->setPaxesDatacount($paxData) );
  3077.                         // Converti le tarif en fonction de la devise du fournisseur
  3078.                         //$prix   = (null === $service->getPrixAchatFixeDevises()) ? $service->getPrixAchatFixe() : $service->getPrixAchatFixeDevises();
  3079.                         $devise $voyageService->getPrestataireDeviseByService($service->getService()); 
  3080.                         //if (array_key_exists('multicurrency_code', $devise) && null !== $devise['multicurrency_code'] ) {
  3081.                             //$prix = $em->getRepository(ChangePeriode::class)->getConvertByDevise( $prix, $devise['multicurrency_code'] );
  3082.                             //$service->setPrixAchatFixeDevises($prix);
  3083.                         //}
  3084.                         // Retrouve les dates par services
  3085.                         $arrLesDates = array();
  3086.                         foreach ($seg->getDaysJourParJour() as $jour) {
  3087.                             if (array_key_exists('services'$jour) && null !== $jour['services']) {
  3088.                                 foreach ($jour['services']  as $serviceDay) {
  3089.                                     if ($serviceDay->getId() === $service->getId()) {
  3090.                                         $arrLesDates[] = $jour['datee'] ;
  3091.                                     }
  3092.                                 }
  3093.                             }
  3094.                         }
  3095.                         $laDate     = new \Datetime()         ;
  3096.                         $strOrdered $laDate->format('Y-m-d');
  3097.                         if (count($arrLesDates) > 0) {
  3098.                             $laDate = new \Datetime($arrLesDates[0]);
  3099.                             $strOrdered $laDate->format('Y-m-d');
  3100.                             foreach ($arrLesDates as &$date) {
  3101.                                 $date = new \Datetime($date);
  3102.                                 $date $date->format('d/m');
  3103.                             }
  3104.                         } else {
  3105.                             $arrLesDates[] = $laDate->format('Y-m-d');
  3106.                         }
  3107.                         $service->setDates(implode('<br>'$arrLesDates));
  3108.                         $mesServices[$strOrdered][$service->getService()->getType()->getLibelle()][] = $service;
  3109.                     }
  3110.                 }
  3111.             }
  3112.         }
  3113.         // tri par date
  3114.         ksort($mesServices);
  3115.         $sortedServices = array();
  3116.         foreach ($mesServices as $key1 => $serv) {
  3117.             foreach ($serv as $key => $ser) {
  3118.                 foreach ($ser as $se) {
  3119.                     $sortedServices[$key][] = $se;
  3120.                 }
  3121.             }
  3122.         }
  3123.         $segment $dossier->getDossierSegments()[0];
  3124.         $client  $companyService->getOneById($segment->getClientId());
  3125.         return $this->render('document-generator/fiche-budget-guide.html.twig', [
  3126.             'dossier'    => $dossier,
  3127.             //'linked'     => $linked ,
  3128.             'segment'    => $segment,
  3129.             'client'     => $client ,
  3130.             'guideNames' => $guideNames,
  3131.             'mesServices'=> $sortedServices,
  3132.             'devise'     => (array_key_exists('symbol'$devise) && null !== $devise['symbol']) ? $devise['symbol'] : '€',
  3133.             'montant'    => ($montant 0) ? ceil($montant/10)*10 0  // il faut arrondir aux 10 euros supérieur  
  3134.         ]);
  3135.     }
  3136.     /**
  3137.     * @Route("/dossier/{id}/dossier-guide/prestataires", name="prestataire_guide", methods={"GET","POST"})
  3138.     */
  3139.     public function prestatairesGuide(Request $requestEntityManagerInterface $emDossier $dossierDossierService $dossierService): Response
  3140.     {
  3141.         if (!$dossier) {
  3142.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  3143.         }
  3144.         $dossier $dossierService->setDataForAchats($dossier);
  3145.         return $this->render('document-generator/liste-prestataires-guide.html.twig', [
  3146.             'dossier'    => $dossier,
  3147.         ]);
  3148.     }
  3149.     /**
  3150.     * @Route("/dossier/{id}/dossier-guide/intro", name="intro_guide", methods={"GET","POST"})
  3151.     */
  3152.     public function introDossierGuide(Request $requestEntityManagerInterface $emDossier $dossierCompanyService $companyServiceDossierSegmentService $segmentServiceDocumentGeneratorService $documentService): Response
  3153.     {
  3154.         if (!$dossier) {
  3155.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  3156.         }
  3157.         $dates = array();
  3158.         $paxes = array();
  3159.         foreach ($dossier->getDossierSegments() as $segment) {
  3160.             // Trouve les dates
  3161.             $dates[] = $segment->getDateDepart()->format('Y-m-d');
  3162.             $dates[] = $segment->getDateFin()->format('Y-m-d');
  3163.             $paxes[] = count($segment->getDossierSegmentPaxesActifs());
  3164.         }
  3165.         // Traitement des dates
  3166.         sort($dates);
  3167.         $dateDebut array_shift($dates);
  3168.         $dateFin   array_pop($dates);
  3169.         // Traitement nombre de pax
  3170.         sort($paxes);
  3171.         // Utilise le premier segment pour récupérer les infos du voyage/client 
  3172.         $segment    $dossier->getDossierSegments()[0];
  3173.         $projet_dir $this->getParameter('kernel.project_dir');
  3174.         $rootDir    $this->getParameter('doli_root');
  3175.         // Client
  3176.         $client $companyService->getOneById($segment->getClientId());
  3177.         $logoTo $rootDir."/documents/societe/".$client['rowid']."/logos/".$client['logo'];
  3178.         if (is_file($logoTo)) {
  3179.             $temp = \sys_get_temp_dir().'/'.$client['rowid'].$client['logo'];
  3180.             if (copy($logoTo$temp)) {
  3181.                 $client['logo'] = $temp
  3182.             }
  3183.         }
  3184.         $dates  = array(implode('/'array_reverse(explode('-'$dateDebut))), implode('/'array_reverse(explode('-'$dateFin))));
  3185.         return $this->render('document-generator/intro-dossier-guide.html.twig', [
  3186.             'dossier'   => $dossier,
  3187.             //'linked'    => $linked ,
  3188.             'segment'   => $segment,
  3189.             'client'    => $client ,
  3190.             'dates'     => $dates  ,   
  3191.             'nombrePax' => array_pop($paxes),   
  3192.         ]);
  3193.     }
  3194.     /**
  3195.     * @Route("/dossier/{id}/dossier-guide-saving", name="guide_save", methods={"GET","POST"})
  3196.     */
  3197.     public function save_guide(Request $requestEntityManagerInterface $emDossier $dossierCompanyService $companyServiceDossierSegmentService $segmentServiceDocumentGeneratorService $documentService): Response
  3198.     {
  3199.         if (!$dossier) {
  3200.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  3201.         }
  3202.         $htmlContent $request->request->get('html'false);
  3203.         if (false === $htmlContent) {
  3204.             throw $this->createNotFoundException("Le HTTML n'a pas été fourni"); 
  3205.         }
  3206.         if (null === $dossier->getDossierGuide()) {
  3207.             $dossierGuide = new DossierGuide();
  3208.             $dossierGuide->setHtml($htmlContent);
  3209.             $dossier->setDossierguide($dossierGuide);
  3210.             $this->getDoctrine()->getManager()->persist($dossierGuide);
  3211.         }
  3212.         else {
  3213.             $dossierGuide $dossier->getDossierGuide();
  3214.             $dossierGuide->setHtml($htmlContent);
  3215.         }
  3216.         
  3217.         $this->getDoctrine()->getManager()->flush();
  3218.         $data json_encode(array(true), TRUE);
  3219.         $response = new Response($data200);
  3220.         $response->headers->set('Content-Type''application/json');
  3221.         return $response;
  3222.     }
  3223.     /**
  3224.     * @Route("/dossier/{id}/dossier-guide-get", name="guide_get", methods={"GET","POST"})
  3225.     */
  3226.     public function get_guide(Request $requestEntityManagerInterface $emDossier $dossierCompanyService $companyServiceDossierSegmentService $segmentServiceDocumentGeneratorService $documentService): Response
  3227.     {
  3228.         if (!$dossier) {
  3229.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  3230.         }
  3231.         if (null !== $dossier->getDossierGuide()) {
  3232.             $html $dossier->getDossierGuide()->getHtml();
  3233.         }
  3234.         
  3235.         $data json_encode(array('html' => $html), TRUE);
  3236.         $response = new Response($data200);
  3237.         $response->headers->set('Content-Type''application/json');
  3238.         return $response;
  3239.     }
  3240.     /**
  3241.     * @Route("/dossier/{id}/dossier-guide", name="guide", methods={"GET","POST"})
  3242.     */
  3243.     public function guide(Request $requestEntityManagerInterface $emDossier $dossierCompanyService $companyServiceDossierSegmentService $segmentServiceDocumentGeneratorService $documentService): Response
  3244.     {
  3245.         if (!$dossier) {
  3246.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  3247.         }
  3248.         $htmlContent $request->request->get('html'false);
  3249.         if (false === $htmlContent) {
  3250.             throw $this->createNotFoundException("Le HTTML n'a pas été fourni"); 
  3251.         }
  3252.         $htmlContent str_replace('<!-- pagebreak -->''<div style="display:block; clear:both; page-break-after:always;" class="mce-pagebreak"></div>'$htmlContent);
  3253.         // chaque page transformé en pdf
  3254.         //$projet_dir = $this->params->get('kernel.project_dir'); // "/var/www/intura-erp/htdocs/symfony"
  3255.         $projet_dir $this->getParameter('kernel.project_dir');
  3256.         $file tmpfile();
  3257.         $path stream_get_meta_data($file)['uri'].'.html';
  3258.         // Crée le fichier html
  3259.         $header '<html>
  3260.         <head>
  3261.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  3262.         <style>
  3263.             html body *
  3264.             {
  3265.                 visibility: hidden;
  3266.                 font-size: 100%;
  3267.                 /* height: 0px; */
  3268.             }
  3269.             html body table    ,
  3270.             html body table *  , 
  3271.             html body h4 span  ,
  3272.             html body h5 
  3273.             {
  3274.                 visibility: visible;
  3275.                 height: auto;
  3276.                 margin: 10px 0;
  3277.             }
  3278.             html body table button 
  3279.             {
  3280.                 visibility: hidden;
  3281.             }
  3282.             html body table {
  3283.                 border: 1px solid black;
  3284.                 border-collapse: collapse;
  3285.                 margin: 10px auto;
  3286.             }   
  3287.             html body table th,
  3288.             html body table td,
  3289.             table th,
  3290.             table td 
  3291.             {
  3292.                 border: 1px solid black;
  3293.                 padding: 5px;
  3294.                 margin: 0;
  3295.                 font-size: 90%;
  3296.             }   
  3297.             .page {
  3298.               page-break-before: always;
  3299.             }
  3300.             .modal ,
  3301.             .align-items-center {
  3302.                 display: none;
  3303.             }
  3304. /*
  3305.             html body   #rooming--container table td:first-child, 
  3306.             html body   #rooming--container table th:first-child 
  3307.             {
  3308.                 display: none;
  3309.             }
  3310.             */
  3311.             .visible,
  3312.             .visible * {
  3313.                 visibility: visible;
  3314.             }
  3315.             .hide {
  3316.                 display: none;
  3317.             }
  3318.             .badge {
  3319.                 border: 1px solid black;
  3320.             }
  3321.             h5 {
  3322.                 margin: 15px 0;
  3323.             }
  3324.         </style></head><body>';
  3325.         $footer '</body></html>';
  3326.         $html implode('', array($header$htmlContent$footer));
  3327.         $html str_replace('/symfony'$projet_dir$html);
  3328.         $html str_replace('badge-info'''$html);
  3329.         file_put_contents($path$html);
  3330.         // Retrouve la référence du dossier
  3331.         $commandeRef $dossier->getCodeWalkinn();
  3332.         if (!is_dir('uploads/Dossier/'.$commandeRef.'/arbo/Documents_divers')) {
  3333.             mkdir('uploads/Dossier/'.$commandeRef.'/arbo/Documents_divers'0777true);
  3334.         }
  3335.         $dest   'uploads/Dossier/'.$commandeRef.'/arbo/Documents_divers/vue-guide.pdf';
  3336.         // Convertit le html to pdf
  3337.         `wkhtmltopdf --margin-top 10 --margin-bottom 10 --margin-left 10 --margin-right 10 --print-media-type --enable-local-file-access {$path} {$dest}`;
  3338.     
  3339.         $dest   '/symfony/public/'.$dest;         
  3340.         $data json_encode($destTRUE);
  3341.         $code 200;
  3342.         $response = new Response($data$code);
  3343.         $response->headers->set('Content-Type''application/json');
  3344.         return $response;
  3345.     }
  3346.     /**
  3347.     * @Route("/dossier/{id}/download-dossier-guide", name="guide_download", methods={"GET","POST"})
  3348.     */
  3349.     public function guide_download(Request $requestEntityManagerInterface $emDossier $dossierCompanyService $companyServiceDossierSegmentService $segmentServiceDocumentGeneratorService $documentService): Response
  3350.     {
  3351.         if (!$dossier) {
  3352.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  3353.         }
  3354.         $projet_dir $this->getParameter('kernel.project_dir');
  3355.         // Retrouve la référence du dossier
  3356.         $commandeRef $dossier->getCodeWalkinn();
  3357.         $dest  'uploads/Dossier/'.$commandeRef.'/arbo/Documents_divers/vue-guide.pdf';
  3358.         if (!is_file($dest)) {
  3359.             $code 404;
  3360.             $dest "Le fichier pdf n'a pas été trouvé";
  3361.         }
  3362.         else {
  3363.             $code 200;
  3364.             $dest   '/symfony/public/'.$dest;         
  3365.         }
  3366.         $data json_encode($destTRUE);
  3367.         $response = new Response($data$code);
  3368.         $response->headers->set('Content-Type''application/json');
  3369.         return $response;
  3370.     }
  3371.     /**
  3372.     * @Route("/dossier/{id}/dossier-guide-html", name="guide_html", methods={"GET","POST"})
  3373.     */
  3374.     public function guide_html(Request $requestEntityManagerInterface $emDossier $dossierCompanyService $companyServiceDossierSegmentService $segmentServiceDocumentGeneratorService $documentService): Response
  3375.     {
  3376.         if (!$dossier) {
  3377.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  3378.         }
  3379.         $pdfFiles  = array();
  3380.         $responses = array();
  3381.         // #1 Ajoute la page de couverture
  3382.         $response $this->forward('App\Controller\DossierController::introDossierGuide', [
  3383.             'request' => $request,
  3384.             'id'  => $dossier,
  3385.         ]);
  3386.         $responses[] = '<div class="">' $response->getContent() .'</div>';
  3387.         // #2 Ajoute les plans de vols au pdf
  3388.         $responses[] = '<!-- pagebreak --><div>'// Sur une nouvelle page
  3389.         $n 0;
  3390.         foreach ($dossier->getDossierSegments() as $segment) {
  3391.             $write false;
  3392.             if (true !== $segment->GetIsPrestationSeche()) {
  3393.                 if ( count($segment->getDossierSegmentPlanDeVols()) > ) {
  3394.                     foreach ($segment->getDossierSegmentPlanDeVols() as $planDeVol) {
  3395.                         if (count($planDeVol->getDossierSegmentTransfertAeriens()) > ) {
  3396.                             $write true;
  3397.                         }
  3398.                     }
  3399.                     if ( true === $write ) {
  3400.                     
  3401.                         $response $this->forward('App\Controller\DossierController::vols', [
  3402.                             'request' => $request,
  3403.                             'id'  => $dossier,
  3404.                             'segmentId'  => $segment->getId(),
  3405.                             'isIframe' => true,
  3406.                 'parent' => 'vueGuide',
  3407.                 'pdt' => false
  3408.                         ]);
  3409.                         $regex '~(<body[^>]*>)(.*)(</body>)~s';
  3410.                         preg_match_all($regex$response->getContent(), $out);
  3411.                         if (array_key_exists(3$out) && count($out) > 2) {
  3412.                             if ($n != 0) {
  3413.                                 $responses[] = '<hr class="visible" style="margin: 40px 0">'// Sépare les segment avec <HR> cf mail emmanuel 24/06/21
  3414.                             }
  3415.                             $responses[] = '<h2 style="visibility: visible; font-weight: bold;">'.'Plan de vols'.'</h2>' str_replace(array($out[1][0], $out[3][0]), array(''), $out[2][0]);
  3416.                         }
  3417.                         $n++;
  3418.                     }
  3419.                 }
  3420.             }
  3421.         }
  3422.         $responses[] = '</div>';
  3423.         // #3 Ajoute les paxs au pdf
  3424.         $responses[] = '<!-- pagebreak --><div>'// Sur une nouvelle page
  3425.         $n 0;
  3426.         foreach ($dossier->getDossierSegments() as $segment) {
  3427.             if (true !== $segment->GetIsPrestationSeche()) {
  3428.                 $dateDepart  $segment->getDateDepart()->format('d/m/Y');
  3429.                 $dateArrivee = (clone $segment->getDateDepart())->modify('+'.($segment->getNbJours() -).' day')->format('d/m/Y');
  3430.                 $response $this->forward('App\Controller\DossierController::rooming', [
  3431.                     'request'   => $request,
  3432.                     'id'        => $dossier,
  3433.                     'segmentId' => $segment->getId(),
  3434.                     'iframe'    => true,
  3435.                     'parent'    => 'vueGuide'
  3436.                 ]);
  3437.                 $regex '~(<body[^>]*>)(.*)(</body>)~s';
  3438.                 preg_match_all($regex$response->getContent(), $out);
  3439.                 if (array_key_exists(3$out) && count($out) > 2) {
  3440.                     if ($n != 0) {
  3441.                         $responses[] = '<hr class="visible" style="margin: 40px 0">'// Sépare les segment avec <HR> cf mail emmanuel 24/06/21
  3442.                     }
  3443.                     $responses[] = '<h2 style="visibility: visible; font-weight: bold;">'.'Rooming list'.'</h2><h3 style="visibility: visible; font-weight: bold;">'.$dateDepart.' - '.$dateArrivee.'</h3>' str_replace(array($out[1][0], $out[3][0]), array(''), $out[2][0]);
  3444.                 }
  3445.                 $n++;
  3446.             }
  3447.         }
  3448.         $responses[] = '</div>';
  3449.         // #4 Ajoute la vue guide au pdf
  3450.         $segmentsIds $dossier->getDossierSegments()
  3451.             ->filter(function (DossierSegment $segment) {
  3452.                 return !$segment->getIsPrestationSeche();
  3453.             }) 
  3454.             ->map(function (DossierSegment $segment) {
  3455.                 return $segment->getId();
  3456.             });
  3457.         $responses[] = $this->renderVueGuideMultiSegment($segmentsIds->toArray());
  3458.         // Ancienne méthode (pas possible de fusionner les différents jorus des segments)
  3459.         // foreach ($dossier->getDossierSegments() as $segment) {
  3460.         //     if (true !== $segment->getIsPrestationSeche()) {
  3461.         //         $response = $this->forward('App\Controller\DossierController::vueGuide', [
  3462.         //             'request' => $request,
  3463.         //             'id'  => $dossier,
  3464.         //             'segmentId'  => $segment->getId(),
  3465.         //             'parent'    => 'vueGuide'
  3466.         //         ]);
  3467.         //         $responses[] = '<!-- pagebreak --><div><h2 style="visibility: visible; font-weight: bold;">'.'Programme'.' '.$segment->getLibelle().'</h2>'.$response->getContent().'</div>';
  3468.         //     }
  3469.         // }
  3470.         // #5 Ajoute la fiche recapitulative des dépenses au pdf
  3471.         $response $this->forward('App\Controller\DossierController::ficheRecapitulative', [
  3472.             'request' => $request,
  3473.             'id'  => $dossier,
  3474.         ]);
  3475.         $responses[] = '<!-- pagebreak --><div><h2 style="visibility: visible; font-weight: bold;">'.'Fiche récapitulative des dépenses'.'</h2>' $response->getContent() .'</div>';
  3476.         // #6 Ajoute la fiche budget-guide au pdf
  3477.         $response $this->forward('App\Controller\DossierController::ficheBudgetGuide', [
  3478.             'request' => $request,
  3479.             'id'  => $dossier,
  3480.         ]);
  3481.         $responses[] = '<!-- pagebreak --><div><h2 style="visibility: visible; font-weight: bold;">'.'Fiche budget guide'.'</h2>' $response->getContent() .'</div>';
  3482.         // #7 Ajoute la liste des prestataires
  3483.         $response $this->forward('App\Controller\DossierController::prestatairesGuide', [
  3484.             'request' => $request,
  3485.             'id'  => $dossier,
  3486.         ]);
  3487.         $responses[] = '<!-- pagebreak --><div><h2 style="visibility: visible; font-weight: bold;">'.'Liste des prestataires'.'</h2>' $response->getContent() .'</div>';
  3488.         $htmlContent implode(''$responses);
  3489.         $data json_encode($htmlContentTRUE);
  3490.         $code 200;
  3491.         $response = new Response($data$code);
  3492.         $response->headers->set('Content-Type''application/json');
  3493.         return $response;
  3494.     }
  3495.     /**
  3496.      * @Route("/dossier/{id}/segment/{segmentId}/vue-guide-pdt", name="segment_vue_guide_pdt", methods={"GET","POST"}, defaults={"parent" = null})
  3497.      */
  3498.     public function vueGuidePdt(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdCompanyService $companyServiceDossierSegmentService $segmentService$parent null$fournList = [], $pdt false): Response
  3499.     {
  3500.         if (!$dossier) {
  3501.             throw $this->createNotFoundException("Le dossier n'existe pas");
  3502.         }
  3503.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  3504.         if (!$segment) {
  3505.             throw $this->createNotFoundException("Le segment n'existe pas");
  3506.         }
  3507.         if (!$segment->getClientId())
  3508.         {
  3509.             $this->addFlash(
  3510.                 'warning',
  3511.                 'Aucun client trouvé pour le segment !'
  3512.             );
  3513.             throw $this->createNotFoundException("Aucun client trouvé pour le segment !");
  3514.         }
  3515.         $result $segmentService->checkDuree($segment);
  3516.         // Params
  3517.         $savedIndex $this->get('session')->get('compositionIndex'1);
  3518.         $index $request->query->get('index'$savedIndex) == $request->query->get('index'$savedIndex) : $savedIndex;
  3519.         $newIndex $request->request->get('index') ? $request->request->get('index') : $index;
  3520.         $this->get('session')->set('compositionIndex'$newIndex);
  3521.         // Client
  3522.         $client $companyService->getOneById($segment->getClientId());
  3523.         // Segments
  3524.         $linked $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier'actif' => true], ['dateDepart' => 'ASC']);
  3525.         // Prestations
  3526.         if(!$segment->getIsPrestationSeche())
  3527.         {
  3528.             $segment $segmentService->setSiblingsData($segment);
  3529.         }
  3530.         $compositionDate $segment->getDateDepart();
  3531.         // Type
  3532.         if ($segment->getVoyage() && $segment->getVoyage()->getVoyageType() && $segment->getVoyage()->getVoyageType()->getId() == VoyageTypeEnum::GUIDE)
  3533.         {
  3534.             $guideParDefaut true;
  3535.         } else {
  3536.             $guideParDefaut false;
  3537.         }
  3538.         $fournisseurs = array();
  3539.         $services $segmentService->getBySegmentDayByDay($segment);
  3540.         if (array_key_exists('days'$services) && count($services['days']) > 0) {
  3541.             foreach ($services['days'] as $day) {
  3542.                 if (array_key_exists('services'$day) && (null !== $day['services']) && count($day['services']) > 0) {
  3543.                     foreach ($day['services'] as $service) {
  3544.                         $fournisseur $companyService->getOneById($service->getService()->getPrestataireId());
  3545.                         $fournisseurs[$service->getService()->getPrestataireId()] = $fournisseur['four_nom'];
  3546.                     }
  3547.                     foreach ($day['activites'] as $service) {
  3548.                         if (null !== $service->getEditorial() && null !== $service->getEditorial()->getSocieteId() ) {
  3549.                             $fournisseur $companyService->getOneById($service->getEditorial()->getSocieteId());
  3550.                             $fournisseurs[$service->getEditorial()->getSocieteId()] = $fournisseur['four_nom'];
  3551.                         }
  3552.                     }
  3553.                 }
  3554.             }
  3555.         }
  3556.         $segment->setDaysJourParJour($services['days']);
  3557.         $theDays = array();
  3558.         foreach ($segment->getDaysJourParJour() as $key => $theDay) {
  3559.             $array = array();
  3560.             if (array_key_exists('activites'$theDay) && null !== $theDay['activites']) {
  3561.                 foreach ($theDay['activites'] as $activite) {
  3562.                     if (true === $activite->getIsVueGuide()) {
  3563.                         $arr = array(
  3564.                             'currentType'   => 3
  3565.                         'isPrestation'  => $activite->getIsPrestation()
  3566.                         , 'segmentId'     => $activite->getDossierSegment()->getId()
  3567.                         , 'id'            => $activite->getId()
  3568.                         , 'ordre'         => $activite->getOrdre()
  3569.                         , 'libelle'       => $activite->getEditorialContenu()->getLibelle()
  3570.                         , 'note'          => $activite->getNote()
  3571.                         , 'isVueGuide'    => $activite->getIsVueGuide()
  3572.                         , 'payeWalkinn'   => ''
  3573.                         'fournisseur'   => (null !== $activite->getEditorial()->getSocieteId() && array_key_exists($activite->getEditorial()->getSocieteId(), $fournisseurs)) ? $fournisseurs[$activite->getEditorial()->getSocieteId()] : ''
  3574.                         );
  3575.                         $array[] = $arr;
  3576.                     }
  3577.                 }
  3578.             }
  3579.             if (array_key_exists('services'$theDay) && null !== $theDay['services']) {
  3580.                 foreach ($theDay['services'] as $service) {
  3581.                     if (true === $service->getIsVueGuide()) {
  3582.                         $arr = array(
  3583.                             'currentType'   => $service->getService()->getType()->getId()
  3584.                         , 'isPrestation'  => $service->getIsPrestation()
  3585.                         , 'segmentId'     => $service->getSegment()->getId()
  3586.                         , 'id'            => $service->getId()
  3587.                         , 'ordre'         => $service->getOrdre()
  3588.                         , 'libelle'       => $service->getService()->getLibelle()
  3589.                         , 'note'          => $service->getNote()
  3590.                         , 'isVueGuide'    => $service->getIsVueGuide()
  3591.                         , 'payeWalkinn'   => (true === $service->getPayeWalkinn()) ? 'Walkinn' 'Guide'
  3592.                         'fournisseur'   => $fournisseurs[$service->getService()->getPrestataireId()]
  3593.                         );
  3594.                         $array[] = $arr;
  3595.                     }
  3596.                 }
  3597.             }
  3598.             if (count($array) > 1) { // ré-ordonne les activités et les services selon 'ordre'
  3599.                 usort($array, function ($item1$item2) {
  3600.                     return $item1['ordre'] <=> $item2['ordre'];
  3601.                 });
  3602.             }
  3603.             $theDays[$key] = $array;
  3604.         }
  3605.         $rooming false;
  3606.         $activitiesTypes $em->getRepository(EditorialCategorie::Class)->findActivites();
  3607.         $form $this->createForm(DossierSegmentCompositionDaysFormType::class, $segment);
  3608.         $form->handleRequest($request);
  3609.         if ($form->isSubmitted() && $form->isValid()) {
  3610.             // Gestion dans service
  3611.             if ($index == 2) {
  3612.                 $data $form->getData();
  3613.                 if (!empty($data)) {
  3614.                     $segmentService->checkFormData($services$data$segment);
  3615.                 }
  3616.                 $segment->setIsCompoValide(1);
  3617.             } else
  3618.             {
  3619.                 $data $request->request->all();
  3620.                 if (!empty($data)) {
  3621.                     $segmentService->checkDaysFormData($services$data$segment);
  3622.                 }
  3623.             }
  3624.             $this->getDoctrine()->getManager()->flush();
  3625.             $this->addFlash(
  3626.                 'info',
  3627.                 "Le voyage " $segment->getLibelle() . ' est mis à jour !'
  3628.             );
  3629.             $result $segmentService->checkDuree($segment);
  3630.             if ($result) {
  3631.                 $this->addFlash(
  3632.                     'warning',
  3633.                     'La durée du segment a été mise à jour !'
  3634.                 );
  3635.             }
  3636.             return $this->redirectToRoute('dossier_segment_composition', [
  3637.                 'id' => $dossier->getId(),
  3638.                 'segmentId' => $segment->getId(),
  3639.                 'index' => $newIndex
  3640.             ]);
  3641.         } else if ($form->isSubmitted() && !$form->isValid()) {
  3642.             // Message
  3643.             $this->addFlash(
  3644.                 'warning',
  3645.                 "Les informations n\'ont PAS été mises à jour !"
  3646.             );
  3647.             // Erreurs
  3648.             foreach ($form->getErrors(true) as $formError) {
  3649.                 $currentError $formError->getMessage();
  3650.                 foreach($formError->getMessageParameters() as $formErrorParameter) {
  3651.                     $currentError .= " - " $formErrorParameter;
  3652.                 }
  3653.                 $this->addFlash(
  3654.                     'warning',
  3655.                     $currentError
  3656.                 );
  3657.             }
  3658.         }
  3659.         /*
  3660.         if ($result['newDaysCount']) {
  3661.             return $this->redirectToRoute('dossier_segment_composition', [
  3662.                 'id' => $dossier->getId(),
  3663.                 'segmentId' => $segment->getId(),
  3664.                 'index' => $newIndex
  3665.             ]);
  3666.         }
  3667.         */
  3668.         return $this->render('dossier/vue-guide-pdt.html.twig', [
  3669.             'dossier' => $dossier,
  3670.             'linked' => $linked,
  3671.             'segment' => $segment,
  3672.             'theDays' => $theDays// Contient les services/activités ordonnés par jour
  3673.             'rooming' => $rooming,
  3674.             'activitiesTypes' => $activitiesTypes,
  3675.             'client' => $client,
  3676.             'fournisseurs' => $fournisseurs,
  3677.             'form' => $form->createView(),
  3678.             'action' => 'Composition: ' $dossier->getLibelle() . ' - ' $segment->getLibelle(),
  3679.             'retour' => 'dossier_index',
  3680.             'compositionDate' => $compositionDate,
  3681.             'guideParDefaut' => $guideParDefaut,
  3682.             'index' => $index,
  3683.             'parent' => $parent,
  3684.         'fournList' => $fournList,
  3685.         'pdt' => $pdt
  3686.         ]);
  3687.     }
  3688.     /**
  3689.     * @Route("/dossier/{id}/segment/{segmentId}/vue-guide", name="segment_vue_guide", methods={"GET","POST"}, defaults={"parent" = null})
  3690.     */
  3691.     public function vueGuide(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdCompanyService $companyServiceDossierSegmentService $segmentService$parent null): Response
  3692.     {
  3693.         if (!$dossier) {
  3694.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  3695.         }
  3696.         /** @var DossierSegment $segment */
  3697.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  3698.         if (!$segment) {
  3699.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  3700.         }
  3701.         if (!$segment->getClientId()) 
  3702.         {
  3703.             $this->addFlash(
  3704.                 'warning',
  3705.                 'Aucun client trouvé pour le segment !'
  3706.             );
  3707.             throw $this->createNotFoundException("Aucun client trouvé pour le segment !"); 
  3708.         }
  3709.         $result $segmentService->checkDuree($segment);
  3710.         // Params
  3711.         $savedIndex $this->get('session')->get('compositionIndex'1);
  3712.         $index $request->query->get('index'$savedIndex) == $request->query->get('index'$savedIndex) : $savedIndex;
  3713.         $newIndex $request->request->get('index') ? $request->request->get('index') : $index;
  3714.         $this->get('session')->set('compositionIndex'$newIndex);
  3715.         // Client
  3716.         $client $companyService->getOneById($segment->getClientId());
  3717.         // Segments       
  3718.         $linked $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier'actif' => true], ['dateDepart' => 'ASC']);
  3719.         // Prestations
  3720.         if(!$segment->getIsPrestationSeche())
  3721.         {
  3722.             $segment $segmentService->setSiblingsData($segment);
  3723.             //$segment = $segmentService->setAllData($segment);
  3724.         }
  3725.         $compositionDate $segment->getDateDepart();
  3726.         // Type
  3727.         if ($segment->getVoyage() && $segment->getVoyage()->getVoyageType() && $segment->getVoyage()->getVoyageType()->getId() == VoyageTypeEnum::GUIDE
  3728.         {
  3729.             $guideParDefaut true;
  3730.         } else {
  3731.             $guideParDefaut false;
  3732.         } 
  3733.         $fournisseurs = array();
  3734.         $services $segmentService->getBySegmentDayByDay($segment);
  3735.         if (array_key_exists('days'$services) && count($services['days']) > 0) {
  3736.             foreach ($services['days'] as $day) {
  3737.                 if (array_key_exists('services'$day) && (null !== $day['services']) && count($day['services']) > 0) {
  3738.                     foreach ($day['services'] as $service) {
  3739.                         $fournisseur $companyService->getOneById($service->getService()->getPrestataireId());
  3740.                         $fournisseurs[$service->getService()->getPrestataireId()] = $fournisseur['four_nom'];
  3741.                     }
  3742.                     foreach ($day['activites'] as $service) {
  3743.                         if (null !== $service->getEditorial() && null !== $service->getEditorial()->getSocieteId() ) {
  3744.                             $fournisseur $companyService->getOneById($service->getEditorial()->getSocieteId());
  3745.                             $fournisseurs[$service->getEditorial()->getSocieteId()] = $fournisseur['four_nom'];
  3746.                         }
  3747.                     }
  3748.                 }
  3749.             }
  3750.         }
  3751.         $theDays $this->getVueGuideDaysInfos($segment);
  3752. //        /** @var DossierSegment $segment */
  3753. //        $segment->setDaysJourParJour($services['days']);
  3754. //        
  3755. //        $theDays = array();
  3756. //
  3757. //        foreach ($segment->getDaysJourParJour() as $key => $theDay) {
  3758. //            $array = array();
  3759. //
  3760. //            if (array_key_exists('activites', $theDay) && null !== $theDay['activites']) {
  3761. //                foreach ($theDay['activites'] as $activite) {
  3762. //                    if (true === $activite->getIsVueGuide()) {
  3763. //                        $arr = array(
  3764. //                              'currentType'       => (null !== $activite->getEditorialWrapper()->getCategorie()) ? $activite->getEditorialWrapper()->getCategorie()->getId() : ""
  3765. //                            , 'currentTypeLabel'  => (null !== $activite->getEditorialWrapper()->getCategorie()) ? $activite->getEditorialWrapper()->getCategorie()->getLibelle() : ""
  3766. //                            , 'date'              => $theDay['datee']
  3767. //                            , 'isPrestation'      => $activite->getIsPrestation()
  3768. //                            , 'segmentId'         => $activite->getDossierSegment()->getId()
  3769. //                            , 'isPrestationSeche' => $activite->getDossierSegment()->getIsPrestationSeche()
  3770. //                            , 'id'                => $activite->getId()
  3771. //                            , 'ordre'             => $activite->getOrdre()
  3772. //                            , 'libelle'           => (null !== $activite->getEditorialContenu()) ? $activite->getEditorialContenu()->getLibelle() : ''
  3773. //                            , 'note'              => $activite->getNote()
  3774. //                            , 'isVueGuide'        => $activite->getIsVueGuide()
  3775. //                            , 'payeWalkinn'       => '' 
  3776. //                            , 'type'              => 'activite' 
  3777. //                            , 'fournisseur'       => (null !== $activite->getEditorial()->getSocieteId() && array_key_exists($activite->getEditorial()->getSocieteId(), $fournisseurs)) ? $fournisseurs[$activite->getEditorial()->getSocieteId()] : ''
  3778. //                        );
  3779. //                        $array[] = $arr;
  3780. //                    }
  3781. //                }
  3782. //            }
  3783. //            if (array_key_exists('services', $theDay) && null !== $theDay['services']) {
  3784. //                foreach ($theDay['services'] as $service) {
  3785. //                    if (true === $service->getIsVueGuide()) {
  3786. //                        $arr = array(
  3787. //                              'currentType'       => $service->getService()->getType()->getId()
  3788. //                            , 'currentTypeLabel'  => $service->getService()->getType()->getLibelle()
  3789. //                            , 'date'              => $theDay['datee']
  3790. //                            , 'isPrestation'      => $service->getIsPrestation()
  3791. //                            , 'segmentId'         => $service->getSegment()->getId()
  3792. //                            , 'isPrestationSeche' => $service->getSegment()->getIsPrestationSeche()
  3793. //                            , 'id'                => $service->getId()
  3794. //                            , 'ordre'             => $service->getOrdre()
  3795. //                            , 'libelle'           => $service->getService()->getLibelle()
  3796. //                            , 'note'              => $service->getNote()
  3797. //                            , 'isVueGuide'        => $service->getIsVueGuide()
  3798. //                            , 'payeWalkinn'       => (true === $service->getPayeWalkinn()) ? 'Walkinn' : 'Guide' 
  3799. //                            , 'type'              => 'service' 
  3800. //                            , 'fournisseur'       => $fournisseurs[$service->getService()->getPrestataireId()] 
  3801. //                        );
  3802. //                        $array[] = $arr;
  3803. //                    }
  3804. //                }
  3805. //            }
  3806. //
  3807. //            if (count($array) > 1) { // ré-ordonne les activités et les services selon 'ordre'
  3808. //                usort($array, function ($item1, $item2) {
  3809. //                    return $item1['ordre'] <=> $item2['ordre'];
  3810. //                });
  3811. //            }
  3812. //            $theDays[$key] = $array;
  3813. //        }
  3814.         $rooming false;
  3815.         $activitiesTypes $em->getRepository(EditorialCategorie::Class)->findActivites();
  3816.         
  3817.         $form $this->createForm(DossierSegmentCompositionDaysFormType::class, $segment);
  3818.      
  3819.         $form->handleRequest($request);
  3820.         if ($form->isSubmitted() && $form->isValid()) {
  3821.             // Gestion dans service
  3822.             if ($index == 2) {
  3823.                 $data $form->getData();
  3824.                 if (!empty($data)) {
  3825.                     $segmentService->checkFormData($services$data$segment);
  3826.                 }
  3827.                 $segment->setIsCompoValide(1);
  3828.             } else
  3829.             {
  3830.                 $data $request->request->all();
  3831.                 if (!empty($data)) {
  3832.                     $segmentService->checkDaysFormData($services$data$segment);
  3833.                 }
  3834.             }
  3835.             $this->getDoctrine()->getManager()->flush();
  3836.             
  3837.             $this->addFlash(
  3838.                 'info',
  3839.                 "Le voyage " $segment->getLibelle() . ' est mis à jour !'
  3840.             );
  3841.             $result $segmentService->checkDuree($segment);
  3842.       
  3843.             if ($result) {
  3844.                 $this->addFlash(
  3845.                     'warning',
  3846.                     'La durée du segment a été mise à jour !'
  3847.                 );
  3848.             }
  3849.             return $this->redirectToRoute('dossier_segment_composition', [
  3850.                 'id' => $dossier->getId(),
  3851.                 'segmentId' => $segment->getId(),
  3852.                 'index' => $newIndex
  3853.             ]);
  3854.         } else if ($form->isSubmitted() && !$form->isValid()) {
  3855.             // Message
  3856.             $this->addFlash(
  3857.                 'warning',
  3858.                 "Les informations n\'ont PAS été mises à jour !"
  3859.             );
  3860.          
  3861.             // Erreurs
  3862.             foreach ($form->getErrors(true) as $formError) {
  3863.                 $currentError $formError->getMessage();
  3864.                 foreach($formError->getMessageParameters() as $formErrorParameter) {
  3865.                     $currentError .= " - " $formErrorParameter;
  3866.                 }
  3867.                 $this->addFlash(
  3868.                     'warning',
  3869.                     $currentError
  3870.                 );
  3871.             }  
  3872.         }
  3873.         /*
  3874.         if ($result['newDaysCount']) {
  3875.             return $this->redirectToRoute('dossier_segment_composition', [
  3876.                 'id' => $dossier->getId(),
  3877.                 'segmentId' => $segment->getId(),
  3878.                 'index' => $newIndex
  3879.             ]);
  3880.         }
  3881.         */
  3882.         return $this->render('dossier/vue-guide.html.twig', [
  3883.             'dossier' => $dossier,
  3884.             'linked' => $linked,
  3885.             'segment' => $segment,
  3886.             'theDays' => $theDays// Contient les services/activités ordonnés par jour
  3887.             'rooming' => $rooming,
  3888.             'activitiesTypes' => $activitiesTypes,
  3889.             'client' => $client,
  3890.             'fournisseurs' => $fournisseurs,
  3891.             'form' => $form->createView(),
  3892.             'action' => 'Composition: ' $dossier->getLibelle() . ' - ' $segment->getLibelle(),
  3893.             'retour' => 'dossier_index',     
  3894.             'compositionDate' => $compositionDate,
  3895.             'guideParDefaut' => $guideParDefaut,    
  3896.             'index' => $index,  
  3897.             'parent' => $parent
  3898.         ]);
  3899.     }
  3900.     private function getVueGuideDaysInfos(DossierSegment $segment)
  3901.     {
  3902.         if (!$segment->getClientId()) {
  3903.             throw $this->createNotFoundException("Aucun client trouvé pour le segment !"); 
  3904.         }
  3905.         $result $this->dossierSegmentService->checkDuree($segment);
  3906.         // Prestations
  3907.         if(!$segment->getIsPrestationSeche()) {
  3908.             $segment $this->dossierSegmentService->setSiblingsData($segment);
  3909.         }
  3910.        
  3911.         $fournisseurs = array();
  3912.         $services $this->dossierSegmentService->getBySegmentDayByDay($segment);
  3913.         if (array_key_exists('days'$services) && count($services['days']) > 0) {
  3914.             foreach ($services['days'] as $day) {
  3915.                 if (array_key_exists('services'$day) && (null !== $day['services']) && count($day['services']) > 0) {
  3916.                     foreach ($day['services'] as $service) {
  3917.                         $fournisseur $this->companyService->getOneById($service->getService()->getPrestataireId());
  3918.                         $fournisseurs[$service->getService()->getPrestataireId()] = $fournisseur['four_nom'];
  3919.                     }
  3920.                     foreach ($day['activites'] as $service) {
  3921.                         if (null !== $service->getEditorial() && null !== $service->getEditorial()->getSocieteId() ) {
  3922.                             $fournisseur $this->companyService->getOneById($service->getEditorial()->getSocieteId());
  3923.                             $fournisseurs[$service->getEditorial()->getSocieteId()] = $fournisseur['four_nom'];
  3924.                         }
  3925.                     }
  3926.                 }
  3927.             }
  3928.         }
  3929.         /** @var DossierSegment $segment */
  3930.         $segment->setDaysJourParJour($services['days']);
  3931.         
  3932.         $daysInfos = array();
  3933.         foreach ($segment->getDaysJourParJour() as $key => $dayInfos) {
  3934.             $array = array();
  3935.             if (array_key_exists('activites'$dayInfos) && null !== $dayInfos['activites']) {
  3936.                 /** @var DossierSegmentActiviteEdito $activite */
  3937.                 foreach ($dayInfos['activites'] as $activite) {
  3938.                     if (true === $activite->getIsVueGuide()) {
  3939.                         $arr = array(
  3940.                               'currentType'       => (null !== $activite->getEditorialWrapper()->getCategorie()) ? $activite->getEditorialWrapper()->getCategorie()->getId() : ""
  3941.                             'currentTypeLabel'  => (null !== $activite->getEditorialWrapper()->getCategorie()) ? $activite->getEditorialWrapper()->getCategorie()->getLibelle() : ""
  3942.                             'date'  => $dayInfos['datee']
  3943.                             , 'isPrestation'  => $activite->getIsPrestation()
  3944.                             , 'segmentId'     => $activite->getDossierSegment()->getId()
  3945.                             , 'isPrestationSeche'     => $activite->getDossierSegment()->getIsPrestationSeche()
  3946.                             , 'id'            => $activite->getId()
  3947.                             , 'ordre'         => $activite->getOrdre()
  3948.                             , 'libelle'       => (null !== $activite->getEditorialContenu()) ? $activite->getEditorialContenu()->getLibelle() : ''
  3949.                             'note'          => $activite->getNote()
  3950.                             , 'isVueGuide'    => $activite->getIsVueGuide()
  3951.                             , 'payeWalkinn'   => '' 
  3952.                             'type'          => 'activite' 
  3953.                             'fournisseur'   => (null !== $activite->getEditorial()->getSocieteId() && array_key_exists($activite->getEditorial()->getSocieteId(), $fournisseurs)) ? $fournisseurs[$activite->getEditorial()->getSocieteId()] : ''
  3954.                         );
  3955.                         $array[] = $arr;
  3956.                     }
  3957.                 }
  3958.             }
  3959.             if (array_key_exists('services'$dayInfos) && null !== $dayInfos['services']) {
  3960.                 /** @var SegService $service */
  3961.                 foreach ($dayInfos['services'] as $service) {
  3962.                     if (true === $service->getIsVueGuide()) {
  3963.                         $arr = array(
  3964.                               'currentType'       => $service->getService()->getType()->getId()
  3965.                             , 'currentTypeLabel'  => $service->getService()->getType()->getLibelle()
  3966.                             , 'date'              => $dayInfos['datee']
  3967.                             , 'isPrestation'      => $service->getIsPrestation()
  3968.                             , 'segmentId'         => $service->getSegment()->getId()
  3969.                             , 'isPrestationSeche' => $service->getSegment()->getIsPrestationSeche()
  3970.                             , 'id'                => $service->getId()
  3971.                             , 'ordre'             => $service->getOrdre()
  3972.                             , 'libelle'           => $service->getService()->getLibelle()
  3973.                             , 'note'              => $service->getNote()
  3974.                             , 'isVueGuide'        => $service->getIsVueGuide()
  3975.                             , 'payeWalkinn'       => (true === $service->getPayeWalkinn()) ? 'Walkinn' 'Guide' 
  3976.                             'type'              => 'service' 
  3977.                             'fournisseur'       => $fournisseurs[$service->getService()->getPrestataireId()] 
  3978.                         );
  3979.                         $array[] = $arr;
  3980.                     }
  3981.                 }
  3982.             }
  3983.             if (count($array) > 1) { // ré-ordonne les activités et les services selon 'ordre'
  3984.                 usort($array, function ($item1$item2) {
  3985.                     return $item1['ordre'] <=> $item2['ordre'];
  3986.                 });
  3987.             }
  3988.             $daysInfos[$key] = $array;
  3989.         }
  3990.         return $daysInfos;
  3991.     }
  3992.     /**
  3993.      * @return string|false HTML Response content - Response::getContent()
  3994.      */
  3995.     public function renderVueGuideMultiSegment(array $segmentsIds = [])
  3996.     {
  3997.         $segmentsDaysInfos = [];
  3998.         foreach ($segmentsIds as $segmentId) {
  3999.             /** @var DossierSegment $segment */
  4000.             $segment $this->em->getRepository(DossierSegment::class)->find($segmentId);
  4001.             if (!$segment) {
  4002.                 throw $this->createNotFoundException("Le segment n'existe pas"); 
  4003.             }
  4004.             $result $this->dossierSegmentService->checkDuree($segment);
  4005.             
  4006.             if(!$segment->getIsPrestationSeche()) {
  4007.                 $segment $this->dossierSegmentService->setSiblingsData($segment);
  4008.             }
  4009.             $segmentsDaysInfos[$segmentId] = [
  4010.                 'segment' => $segment,
  4011.                 'daysInfos' => $this->getVueGuideDaysInfos($segment),
  4012.             ];
  4013.         }
  4014.         $existingService = [];
  4015.         foreach ($segmentsDaysInfos as &$segmentDaysInfos) {
  4016.             foreach ($segmentDaysInfos['daysInfos']  as $jour => &$services) {
  4017.                 foreach ($services as $key => $service) {
  4018.                     $date $service['date'];
  4019.                     if ($service['date'] instanceof \DateTime) {
  4020.                         $date $service['date']->format('Y-m-d');
  4021.                     }
  4022.                     $uniqueServiceString $service['id'].'-'.$date;
  4023.                     if (!in_array($uniqueServiceString$existingService)) {
  4024.                         $existingService[] = $uniqueServiceString;
  4025.                     } else {
  4026.                         unset($services[$key]);
  4027.                     }
  4028.                 }
  4029.             }
  4030.         }
  4031.         return $this->render('dossier/vue-guide/_multi_segment.html.twig', [
  4032.             'segmentsDaysInfos' => $segmentsDaysInfos,
  4033.         ])->getContent();
  4034.     }
  4035.     /**
  4036.      * @Route("/dossier/{id}/segment/{segmentId}/pax/auto", name="segment_pax_auto", methods={"GET","POST"})
  4037.      */
  4038.     public function autoPax(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdPaxService $paxService): Response
  4039.     {
  4040.         if (!$dossier) {
  4041.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  4042.         }
  4043.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  4044.         if (!$segment) {
  4045.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  4046.         }
  4047.         $paxService->autoAddPaxToSegment($segment);
  4048.         $this->addFlash(
  4049.             'info',
  4050.             "L'ajout automatique de Pax a bien été réalisé !"
  4051.         );
  4052.         $referer $request->headers->get('referer');
  4053.         if ($referer) {
  4054.             return $this->redirect($referer);
  4055.         } else {
  4056.             return $this->redirectToRoute('dossier_index');
  4057.         }
  4058.     }
  4059.     /**
  4060.      * @Route("/dossier/{id}/traductions/save", name="save_traductions", methods={"POST"})
  4061.      */
  4062.     public function saveTraductions(Request $requestEntityManagerInterface $emDossier $dossierDossierService $dossierService): Response    
  4063.     {
  4064.         if (!$dossier) {
  4065.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  4066.     }
  4067.     $libelle $dossier->getLibelle();
  4068.     $traductions $request->request->get('traduction'null);
  4069.     $save $dossierService->saveTraductions($libelle$traductions);
  4070.         $data json_encode($saveTRUE);
  4071.         $code 200;
  4072.         $response = new Response($data$code);
  4073.         $response->headers->set('Content-Type''application/json');
  4074.         return $response;
  4075.     }
  4076.     /**
  4077.      * @Route("/dossier/{id}/segment/{segmentId}/pax/multi", name="segment_pax_multi", methods={"GET"})
  4078.      */
  4079.     public function multiPax(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdPaxService $paxService): Response    
  4080.     {
  4081.         if (!$dossier) {
  4082.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  4083.         }
  4084.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  4085.      
  4086.         if (!$segment) {
  4087.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  4088.         }
  4089.         // Params
  4090.         $tiersIds $request->query->get('tiersIds');
  4091.   
  4092.         $paxService->multiAddPaxToSegment($segment$tiersIds);
  4093.         $this->addFlash(
  4094.             'info',
  4095.             "L'ajout de Groupement(s) a bien été réalisé !"
  4096.         );
  4097.         $referer $request->headers->get('referer');
  4098.         if ($referer) {
  4099.             return $this->redirect($referer);
  4100.         } else {
  4101.             return $this->redirectToRoute('dossier_index');
  4102.         }
  4103.     }
  4104.     /**
  4105.      * @Route("/dossier/{id}/segment/{segmentId}/pax/segment", name="segment_pax_segment", methods={"GET"})
  4106.      */
  4107.     public function segmentPax(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdDossierSegmentService $segmentService): Response    
  4108.     {
  4109.         if (!$dossier) {
  4110.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  4111.         }
  4112.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  4113.      
  4114.         if (!$segment) {
  4115.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  4116.         }
  4117.         $segmentModelId $request->query->get('segmentModel');
  4118.         $rooming $request->query->get('rooming');
  4119.         $segmentModel $em->getRepository(DossierSegment::class)->find($segmentModelId);
  4120.      
  4121.         if (!$segmentModel) {
  4122.             throw $this->createNotFoundException("Le segment modèle n'existe pas"); 
  4123.         }
  4124.   
  4125.         $segmentService->duplicateSegmentPaxes($segmentModel$segment$rooming);
  4126.         $this->addFlash(
  4127.             'info',
  4128.             "Les Pax ont bien été dupliqués !"
  4129.         );
  4130.         $referer $request->headers->get('referer');
  4131.         if ($referer) {
  4132.             return $this->redirect($referer);
  4133.         } else {
  4134.             return $this->redirectToRoute('dossier_index');
  4135.         }
  4136.     }
  4137.     /**
  4138.      * @Route("/dossier/{id}/segment/{segmentId}/pax/new", name="segment_pax_new", methods={"GET","POST"})
  4139.      */
  4140.     public function newPax(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdCompanyService $companyServiceDossierSegmentService $segmentService): Response
  4141.     {
  4142.         if (!$dossier) {
  4143.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  4144.         }
  4145.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  4146.         if (!$segment) {
  4147.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  4148.         }
  4149.         
  4150.         $request->query->set('iframe'1);
  4151.         $segmentPax = new DossierSegmentPax();
  4152.         $segmentPax->setSegment($segment);
  4153.         // Etat par défaut
  4154.         $defautEtatId $this->getParameter('pax_etat_defaut') ?: \App\Enum\DossierSegmentPaxEtat::NOUVEAU_ID;
  4155.         $etat $em->getRepository(DossierSegmentPaxEtat::class)->find($defautEtatId);
  4156.         if(!$etat)
  4157.         {
  4158.             $etat $em->getRepository(DossierSegmentPaxEtat::class)->find(\App\Enum\DossierSegmentPaxEtat::NOUVEAU_ID );
  4159.         }
  4160.         if ($etat)
  4161.         {
  4162.             $segmentPax->setDossierSegmentPaxEtat($etat);
  4163.              
  4164.         }
  4165.         // Guide
  4166.         $guide $request->query->get('guide'0);
  4167.         if ($guide)
  4168.         {
  4169.             $type $em->getRepository(PaxType::class)->findOneById(\App\Enum\PaxType::GUIDE_ID);
  4170.              
  4171.         } else
  4172.         {
  4173.             $type $em->getRepository(PaxType::class)->findOneById(\App\Enum\PaxType::PAX_ID);
  4174.         }
  4175.         $segmentPax->setPaxType($type);
  4176.         if (!$segmentPax->getTauxRemise() && $segmentPax->getPaxType())
  4177.         {
  4178.             $segmentPax->setTauxRemise($segmentPax->getPaxType()->getTauxRemiseParDefaut()); 
  4179.         }
  4180.         if (!$segmentPax->getMontantRemise() && $segmentPax->getPaxType())
  4181.         {
  4182.             $segmentPax->setMontantRemise($segmentPax->getPaxType()->getMontantRemiseParDefaut()); 
  4183.         }
  4184.         $form $this->createForm(DossierSegmentPaxFormType::class, $segmentPax);
  4185.         $form->handleRequest($request);
  4186.         if ($form->isSubmitted() && $form->isValid() && $segmentPax->getContactId()) {
  4187.             $entityManager $this->getDoctrine()->getManager();
  4188.             $segment->setIsCompoValide(0);
  4189.             $segment->setIsAchatsValide(0);
  4190.             $segment->setIsVentesValide(0);
  4191.             $entityManager->persist($segmentPax);
  4192.             $entityManager->flush();
  4193.             
  4194.             $this->addFlash(
  4195.                 'info',
  4196.                 "Le Pax " $segmentPax->getLibelle(). ' a été ajouté !'
  4197.             );
  4198.             return $this->redirectToRoute('dossier_segment_pax_edit', ['id' => $dossier->getId(), 'segmentId' => $segment->getId(), 'segmentPaxId' => $segmentPax->getId(), 'close' => 1]);
  4199.         
  4200.         } else if($form->isSubmitted() && $form->isValid() && !$segmentPax->getContactId())
  4201.         {
  4202.             $this->addFlash(
  4203.                 'info',
  4204.                 "Le formulaire n'est pas valide, veuillez renseigner un PAX !"
  4205.             );
  4206.         }
  4207.         return $this->render('dossier/segment-pax/new.html.twig', [
  4208.             'segmentPax' => $segmentPax,
  4209.             'form' => $form->createView(),
  4210.             'action' => 'Ajouter un Pax',
  4211.             'retour' => 'dossier_index'
  4212.         ]);
  4213.     }
  4214.      /**
  4215.      * @Route("/dossier/{id}/segment/{segmentId}/pax/multiple/status", name="segment_multiple_pax_status", methods={"GET"})
  4216.      */
  4217.     public function multipleStatusPax(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdCompanyService $companyServiceDossierSegmentService $segmentService): Response
  4218.     {
  4219.         if (!$dossier) {
  4220.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  4221.         }
  4222.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  4223.      
  4224.         if (!$segment) {
  4225.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  4226.         }
  4227.         // Params
  4228.         $ids $request->query->get('ids');
  4229.         $status $request->query->get('statut');
  4230.         $entityManager $this->getDoctrine()->getManager();
  4231.         $segmentPaxEtat $entityManager->getRepository(DossierSegmentPaxEtat::class)->find($status);
  4232.    
  4233.         if ($ids && $segmentPaxEtat)
  4234.         {
  4235.             $idsArray explode(','$ids);
  4236.             
  4237.             foreach($idsArray as $id)
  4238.             {
  4239.                 $segmentPax $entityManager->getRepository(DossierSegmentPax::class)->find($id);
  4240.                 $segmentPax->setDossierSegmentPaxEtat($segmentPaxEtat);
  4241.             }
  4242.             // Si le nouveau statut est annulé, celà impacte les transfert aeriens
  4243.             if ($status == \App\Enum\DossierSegmentPaxEtat::ANNULE_ID) {
  4244.                 $segment->setIsTransferValide(0);
  4245.             }
  4246.             $entityManager->flush();
  4247.             $this->addFlash(
  4248.                 'info',
  4249.                 "La liste des participants a été mise à jour !"
  4250.             );
  4251.         }
  4252.         $referer $request->headers->get('referer');
  4253.         if ($referer) {
  4254.             return $this->redirect($referer);
  4255.         } else {
  4256.             return $this->redirectToRoute('dossier_index');
  4257.         }
  4258.     }
  4259.     /**
  4260.      * @Route("/dossier/{id}/segment/{segmentId}/pax/multiple/delete", name="segment_multiple_pax_delete", methods={"GET"})
  4261.      */
  4262.     public function multipleDeletePax(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdCompanyService $companyServiceDossierSegmentService $segmentService): Response
  4263.     {
  4264.         if (!$dossier) {
  4265.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  4266.         }
  4267.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  4268.      
  4269.         if (!$segment) {
  4270.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  4271.         }
  4272.         // Params
  4273.         $ids $request->query->get('ids');
  4274.         $entityManager $this->getDoctrine()->getManager();
  4275.         if ($ids)
  4276.         {
  4277.             $idsArray explode(','$ids);
  4278.             foreach($idsArray as $id)
  4279.             {
  4280.                 $segmentPax $entityManager->getRepository(DossierSegmentPax::class)->find($id);
  4281.                 $segment->setIsCompoValide(0);
  4282.                 $segment->setIsAchatsValide(0);
  4283.                 $segment->setIsVentesValide(0);
  4284.                 $segment->setIsTransferValide(0);
  4285.                 $segmentPax->setActif(0);
  4286.             }
  4287.             $entityManager->flush();
  4288.             $this->addFlash(
  4289.                 'info',
  4290.                 "La liste des participants a été mise à jour !"
  4291.             );
  4292.         }
  4293.         $referer $request->headers->get('referer');
  4294.         if ($referer) {
  4295.             return $this->redirect($referer);
  4296.         } else {
  4297.             return $this->redirectToRoute('dossier_index');
  4298.         }
  4299.     }
  4300.     /**
  4301.      * @Route("/dossier/{id}/segment/{segmentId}/pax/{segmentPaxId}/edit", name="segment_pax_edit", methods={"GET","POST"})
  4302.      */
  4303.     public function editPax(Request $requestEntityManagerInterface $emDossier $dossier$segmentId$segmentPaxIdCompanyService $companyServiceDossierSegmentService $segmentService): Response
  4304.     {
  4305.         if (!$dossier) {
  4306.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  4307.         }
  4308.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  4309.         if (!$segment) {
  4310.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  4311.         }
  4312.         $segmentPax $em->getRepository(DossierSegmentPax::class)->find($segmentPaxId);
  4313.         if (!$segmentPax) {
  4314.             throw $this->createNotFoundException("Le Pax n'existe pas"); 
  4315.         }
  4316.         $request->query->set('iframe'1);
  4317.         if (!$segmentPax->getTauxRemise() && $segmentPax->getPaxType())
  4318.         {
  4319.             $segmentPax->setTauxRemise($segmentPax->getPaxType()->getTauxRemiseParDefaut()); 
  4320.         }
  4321.         if (!$segmentPax->getMontantRemise() && $segmentPax->getPaxType())
  4322.         {
  4323.             $segmentPax->setMontantRemise($segmentPax->getPaxType()->getMontantRemiseParDefaut()); 
  4324.         }
  4325.         $form $this->createForm(DossierSegmentPaxFormType::class, $segmentPax);
  4326.         $form->handleRequest($request);
  4327.         if ($form->isSubmitted() && $form->isValid()) {
  4328.             // Lorsque le pax est au statut annulé, on impact la gestion des vols
  4329.             if ($segmentPax->getDossierSegmentPaxEtat()->getId() == \App\Enum\DossierSegmentPaxEtat::ANNULE_ID) {
  4330.                 $segment->setIsTransferValide(0);
  4331.             }
  4332.             $this->getDoctrine()->getManager()->flush();
  4333.             
  4334.             $this->addFlash(
  4335.                 'info',
  4336.                 "Le Pax " $segmentPax->getLibelle(). ' est mis à jour !'
  4337.             );
  4338.             return $this->redirectToRoute('dossier_segment_pax_edit', ['id' => $dossier->getId(), 'segmentId' => $segment->getId(), 'segmentPaxId' => $segmentPax->getId(), 'close' => 1]);
  4339.         }
  4340.         return $this->render('dossier/segment-pax/edit.html.twig', [
  4341.             'segmentPax' => $segmentPax,
  4342.             'form' => $form->createView(),
  4343.             'action' => $segmentPax->getLibelle(),
  4344.             'retour' => 'dossier_index'      
  4345.         ]);
  4346.     }
  4347.     /**
  4348.      * @Route("/dossier/{id}/segment/{segmentId}/pax/{segmentPaxId}/duplicate", name="segment_pax_duplicate", methods={"GET"})
  4349.      */
  4350.     public function duplicatePax(Request $requestEntityManagerInterface $emDossier $dossier$segmentId$segmentPaxIdCompanyService $companyServiceDossierSegmentService $segmentService): Response
  4351.     {
  4352.         if (!$dossier) {
  4353.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  4354.         }
  4355.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  4356.         if (!$segment) {
  4357.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  4358.         }
  4359.         $segmentPax $em->getRepository(DossierSegmentPax::class)->find($segmentPaxId);
  4360.         if (!$segmentPax) {
  4361.             throw $this->createNotFoundException("Le Pax n'existe pas"); 
  4362.         }
  4363.         $entityManager $this->getDoctrine()->getManager();
  4364.         $segment->setIsCompoValide(0);
  4365.         $segment->setIsAchatsValide(0);
  4366.         $segment->setIsVentesValide(0);
  4367.         $segmentPax->setActif(1);
  4368.         $entityManager->flush();
  4369.         $this->addFlash(
  4370.             'info',
  4371.             "Le Pax " $segmentPax->getLibelle(). ' a été dupliqué !'
  4372.         );
  4373.         $referer $request->headers->get('referer');
  4374.         if ($referer) {
  4375.             return $this->redirect($referer);
  4376.         } else {
  4377.             return $this->redirectToRoute('dossier_index');
  4378.         }
  4379.     }
  4380.     /**
  4381.      * @Route("/dossier/{id}/segment/{segmentId}/pax/{segmentPaxId}/delete", name="segment_pax_delete", methods={"GET"})
  4382.      */
  4383.     public function deletePax(Request $requestEntityManagerInterface $emDossier $dossier$segmentId$segmentPaxIdCompanyService $companyServiceDossierSegmentService $segmentService): Response
  4384.     {
  4385.         if (!$dossier) {
  4386.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  4387.         }
  4388.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  4389.         if (!$segment) {
  4390.             throw $this->createNotFoundException("Le segment n'existe pas"); 
  4391.         }
  4392.         $segmentPax $em->getRepository(DossierSegmentPax::class)->find($segmentPaxId);
  4393.         if (!$segmentPax) {
  4394.             throw $this->createNotFoundException("Le Pax n'existe pas"); 
  4395.         }
  4396.         $entityManager $this->getDoctrine()->getManager();
  4397.         $segment->setIsCompoValide(0);
  4398.         $segment->setIsAchatsValide(0);
  4399.         $segment->setIsVentesValide(0);
  4400.         $segment->setIsTransferValide(0);
  4401.         
  4402.         $segmentPax->setActif(0);
  4403.         $entityManager->flush();
  4404.         $this->addFlash(
  4405.             'info',
  4406.             "Le Pax " $segmentPax->getLibelle(). ' a été supprimé !'
  4407.         );
  4408.         $referer $request->headers->get('referer');
  4409.         if ($referer) {
  4410.             return $this->redirect($referer);
  4411.         } else {
  4412.             return $this->redirectToRoute('dossier_index');
  4413.         }
  4414.     }
  4415.     /**
  4416.     * @Route("/dossier/{id}/segment/{segmentId}/rooming/importXls", name="segment_rooming_import_xls")
  4417.     */
  4418.     public function rooming_import(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdCompanyService $companyServicePaxService $paxServiceParameterBagInterface $paramsLoggerInterface $logger): Response
  4419.     {
  4420.         // Va permettre d'importer les données d'après un fichier XLS
  4421.         if (!$dossier
  4422.         {
  4423.             throw $this->createNotFoundException("Le dossier n'existe pas");
  4424.         }
  4425.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  4426.         if (!$segment
  4427.         {
  4428.             throw $this->createNotFoundException("Le segment n'existe pas");
  4429.         }
  4430.         if (!$segment->getClientId()) 
  4431.         {
  4432.             $this->addFlash(
  4433.                 'warning',
  4434.                 'Aucun client trouvé pour le segment !'
  4435.             );
  4436.             return $this->redirectToRoute('dossier_edit', [
  4437.                 'id' => $dossier->getId(),
  4438.             ]);
  4439.         }
  4440.         // Params
  4441.         $request->query->set('iframe'1);
  4442.         $file       $request->files->get('file')                ;
  4443.         $post       $request->request->all()                    ;
  4444.         $get        $request->query->all()                      ;
  4445.         $webDir     '/uploads/importXlsx/'                      // Chemin relatif URL
  4446.         $uploadDir  $_SERVER['DOCUMENT_ROOT'].'symfony'.$webDir // Chemin sous la forme /var/www/...
  4447.         $newPax     = array()                                     ; // Contient les paxs importés
  4448.         $results    = array()                                     ;
  4449.         $doublons   = array()                                     ;
  4450.         $selectRoomingOptions = array()                           ;
  4451.         // Pax présents dans la database
  4452.         $paxOld $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->findBy(['segment' => $segment'actif' => true]);
  4453.         // Pour le select libelle rooming
  4454.         $roomingOptions $this->getDoctrine()->getManager()->getRepository(PaxRooming::class)->findAll();
  4455.         foreach ($roomingOptions as $option
  4456.         {
  4457.             $selectRoomingOptions[$option->getId()] = $option->getLibelle();                     ;
  4458.         }
  4459.         //------------------------------------------------------------------
  4460.         //    Cas 1 Upload fichier puis renvoi le nom du fichier (ajax)
  4461.         //------------------------------------------------------------------
  4462.         // On enregistre le fichier puis retourne le nom du fichier
  4463.         if (null !== $file
  4464.         { 
  4465.             // Un fichier a été reçu
  4466.             // dropzone filtre le type de fichier        
  4467.             $extension $file->guessExtension();
  4468.             // fichier OK 
  4469.             $fileName md5(uniqid()).'.'.$extension;
  4470.             if (!file_exists($uploadDir) && !is_dir($uploadDir)) 
  4471.             {
  4472.                 mkdir($uploadDir0775true);
  4473.             }
  4474.             if ($file->move($uploadDir$fileName)) 
  4475.             { 
  4476.                 // Tout OK on retourne le nom du fichier 
  4477.                 return new Response(json_encode($fileName), 200, ['Content-Type' => 'application/json']); 
  4478.             }
  4479.         }
  4480.         //---------------------------------------------------------------------
  4481.         //     Cas 2 Enregistre les modifications lorsque $_POST est non vide
  4482.         //---------------------------------------------------------------------
  4483.         // Si $_POST alors on save les données 
  4484.         if ( count($post) > 
  4485.         { 
  4486.             // si $_POST on traite le formulaire
  4487.             foreach($post as $key => $item
  4488.             {
  4489.                 // édition ou création
  4490.             $edit true;   
  4491.                 if (substr($key,0,3) == 'pax'
  4492.                 {
  4493.                     // Params
  4494.                     $defautEtatId $this->getParameter('pax_etat_defaut') ?: \App\Enum\DossierSegmentPaxEtat::NOUVEAU_ID;
  4495.                     $etat $this->getDoctrine()->getManager()->getRepository(DossierSegmentPaxEtat::class)->find($defautEtatId);
  4496.                     if(!$etat)
  4497.                     {
  4498.                         $etat $em->getRepository(DossierSegmentPaxEtat::class)->findOneById(\App\Enum\DossierSegmentPaxEtat::NOUVEAU_ID);
  4499.                     }
  4500.                     $type $em->getRepository(PaxType::class)->findOneById(\App\Enum\PaxType::PAX_ID );
  4501.                     if($this->getParameter('auto_pax_by_age'))
  4502.                     {
  4503.                         // Type selon âge
  4504.                  
  4505.                         $dateNaissance = \DateTime::createFromFormat('d/m/Y'$item['date_naissance']);
  4506.                         if($dateNaissance)
  4507.                         {
  4508.                             $difference $dateNaissance->diff($segment->getDateDepart());
  4509.                             $specialType $em->getRepository(PaxType::class)->getByAge($difference->y);
  4510.                             
  4511.                             if($specialType)
  4512.                             {
  4513.                                 $type $specialType;
  4514.                             }
  4515.                         }
  4516.                     }
  4517.                     // Edit
  4518.                     if ((array_key_exists('id'$item)) && ($item['id'] > 0)) 
  4519.                     {
  4520.                         $pax $em->getRepository(DossierSegmentPax::class)->findOneById($item['id']);
  4521.                         $pax->SetPaxType($type);
  4522.                     // New
  4523.                     } else 
  4524.                     {
  4525.                         $edit false
  4526.                         $pax = new DossierSegmentPax();
  4527.                         $pax->SetPaxType($type);
  4528.                     }
  4529.                     // Rooming
  4530.                     if ($pax->getRooming()) 
  4531.                     {
  4532.                         $segmentPaxRooming $pax->getRooming();
  4533.                     } else 
  4534.                     {
  4535.                         // Check
  4536.                         /*
  4537.                         if(!$item['rooming_numeroChambre'])
  4538.                         {
  4539.                             $logger->critical(
  4540.                                 'Custom Log: Import Pax XLS findOneBySegmentAndNumeroChambre -> DossierController -> numéro de chambre ($item["rooming_numeroChambre"]) manquant', 
  4541.                                 [
  4542.                                     '$item' => $item,
  4543.                                     '$segmentId' => $segmentId,
  4544.                                     '$_GET' => $_GET,
  4545.                                     '$_POST' => $_POST,
  4546.                                     '$_SERVER' => $_SERVER,
  4547.                                 ]
  4548.                             );
  4549.                         }
  4550.                         */
  4551.                         // Vérifie que la chambre n'existe pas déjà pour ce segment
  4552.                         // auquel cas c'est une chambre avec plusieurs Pax
  4553.                         // Avec 1 seule entrée dans DossierSegmentPaxRooming
  4554.                         $segmentPaxRooming $em->getRepository(DossierSegmentPaxRooming::class)->findOneBySegmentAndNumeroChambre($segmentId$item['rooming_numeroChambre']);
  4555.                         if (null === $segmentPaxRooming
  4556.                         {
  4557.                             $segmentPaxRooming = new DossierSegmentPaxRooming();
  4558.                         }
  4559.                     }
  4560.                     // Tiers & Contact DOLIBARR
  4561.                     $item['origine']= $segment->getClientId();
  4562.                     $pax $paxService->handlePaxTiersAndContact($pax$item);
  4563.                     
  4564.                     // Rooming
  4565.                     $rooming $em->getRepository(PaxRooming::class)->findOneById($item['rooming_libelle']);
  4566.                     // Modifie DossierSegmentPaxRooming() 
  4567.                     $segmentPaxRooming->setPaxRooming($rooming);
  4568.                     $segmentPaxRooming->setNumeroChambre($item['rooming_numeroChambre']);
  4569.                     //$segmentPaxRooming->setLibelle($rooming->getLibelle()); // plus besoin ?
  4570.                     $em->persist($segmentPaxRooming);
  4571.                     // Set Values
  4572.                     $pax->SetSegment($segment);
  4573.                     $pax->SetDossierSegmentPaxEtat($etat); 
  4574.                     $pax->SetRooming($segmentPaxRooming); 
  4575.                     $pax->SetPrestations($item['prestations']); 
  4576.                     $pax->SetNote($item['note']); 
  4577.                     $pax->setActif(true); 
  4578.                     if (!$edit)
  4579.                     {
  4580.                         $em->persist($pax);
  4581.                     }
  4582.                 }
  4583.             
  4584.                 $segment->setIsCompoValide(0);
  4585.                 $segment->setIsAchatsValide(0);
  4586.                 $segment->setIsVentesValide(0);
  4587.                 $em->flush();
  4588.              
  4589.                 $request->query->set('close'1);
  4590.          
  4591.             }
  4592.         }
  4593.         //-------------------------------------------------------------------
  4594.         //    Cas 3 Récupère les infos dans le fichier XLSX
  4595.         //------------------------------------------------------------------
  4596.         // 
  4597.         elseif ((count($get) > 0) && (array_key_exists('file'$get))) 
  4598.         { 
  4599.             // un fichier est passé en paramètre _GET 
  4600.             $obj    = new \App\Utils\ImportPax($uploadDir.$get['file'], $params);
  4601.             $datas  $obj->getDataAll(); // array
  4602.             //---------------------------------------------------------------------
  4603.             //     Dédoublonne / Tri
  4604.             //---------------------------------------------------------------------
  4605.             // Doublon : même nom/prénom/date_naissance
  4606.             // * Soit nouveau
  4607.             // * soit déjà existant
  4608.             // * Soit doublon 
  4609.             if($datas)
  4610.             {
  4611.                 foreach ($datas as &$pax
  4612.                 {
  4613.       
  4614.             if (count($pax) < 22) {
  4615.             continue;
  4616.                     }                
  4617.             
  4618.             $toTrim = array(1,2,3,5,6,7,11,12,13,14);
  4619.                     // Fix espaces impossibles à virer avec trim()
  4620.                     foreach($pax as $index => $data)
  4621.             {
  4622.                       //if (in_array($index, $toTrim)) {
  4623.                       //    $pax[$index] = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $data);
  4624.                       //} else {
  4625.                       //    $pax[$index] = preg_replace('/[^\- 0-9a-zA-ZéèçùÉÈÇ\+\.\:]/', '', $data); // La à pose problème
  4626.                       //}
  4627.                        $data preg_replace('/^\p{Z}+/u'''$data);
  4628.                        $data preg_replace('/\p{Z}+$/u'''$data);
  4629.                        $pax[$index] = $data;
  4630.                     }
  4631.                     // Ajouter les champs ici
  4632.                 $numero                 $pax['numero']             =    trim($pax[1] )  ;         
  4633.                 $civilite               $pax['civilite']           =    trim($pax[2] )  ;         
  4634.                 $nom                    $pax['nom']                =    trim($pax[3] )  ;           
  4635.                 $prenom                 $pax['prenom']             =    trim($pax[4] )  ;              
  4636.                 $rooming                $pax['rooming']            =    trim($pax[5] )  ;              
  4637.                 $date_naissance         $pax['date_naissance']     =    trim($pax[6] )  ;             
  4638.                 $age                    $pax['age']                =    trim($pax[7] )  ;              
  4639.                 $regime_alimentaire     $pax['regime_alimentaire'] =    trim($pax[8] )  ;                
  4640.                 $prestations            $pax['prestations']        =    trim($pax[9] )  ;                
  4641.                 $regime_remarque        $pax['regime_remarque']    =    trim($pax[10])  ;             
  4642.                 $telephone              $pax['telephone']          =    trim($pax[11])  ;           
  4643.                 $nationalite            $pax['nationalite']        =    trim($pax[12])  ;           
  4644.                 $numero_passeport       $pax['numero_passeport']   =    trim($pax[13])  ;            
  4645.                 $validite_passeport     $pax['validite_passeport'] =    trim($pax[14])  ;               
  4646.                 $assurance              $pax['assurance']          =    trim($pax[15])  ;          
  4647.                 $nom_assurance          $pax['nom_assurance']      =    trim($pax[16])  ;          
  4648.                 $numero_assurance       $pax['numero_assurance']   =    trim($pax[17])  ;        
  4649.                 $contact_assurance      $pax['contact_assurance']  =    trim($pax[18])  ;           
  4650.                 $location_materiel      $pax['location_materiel']  =    trim($pax[19])  ;          
  4651.                 $location_poids         $pax['location_poids']     =    trim($pax[20])  ;           
  4652.                 $remarque               $pax['note']               =    trim($pax[21])  ;           
  4653.             if ($params->get('instance') == 'vv' && strlen(trim($pax[22])) > 0) {
  4654.                     $pax['note'] = (strlen($pax['note']) > 0) ? implode("\n", array($pax['note'], trim($pax[22]))) : trim($pax[22]);
  4655.             }
  4656.                     //extract( $pax, EXTR_IF_EXISTS );
  4657.                     if ($nom == '0' || strlen($nom) == 0)  
  4658.                     {
  4659.                         continue; // filtre les colonnes dont le nom est 0 ou vide            
  4660.                     }
  4661.                     $pax['id'] = null;
  4662.                     $pax['rooming_numeroChambre'] = "";
  4663.                     // Les informations ROOMING sont dans 1 champs
  4664.             if ($params->get('instance') == 'vv') {
  4665.                 $rooming_infos explode('/'trim($rooming)); 
  4666.                 $checkLibelle $this->getDoctrine()->getManager()->getRepository(PaxRooming::class)->findOneByLibelle($rooming_infos[0]);
  4667.                             $pax['rooming_libelle'] = $checkLibelle->getLibelle() ?: $pax['rooming_libelle'];
  4668.             } else {
  4669.                         if (preg_match('/^([0-9]*)([a-zA-Z]*)$/'trim($rooming), $rooming_infos)) 
  4670.                         {
  4671.                             if (isset($rooming_infos[2])) {
  4672.                                 $rooming_infos[2] = str_replace(array('TPL'), array('TRP'), $rooming_infos[2]);
  4673.                             }
  4674.                             $pax['rooming_libelle']       = isset($rooming_infos[2]) ? $rooming_infos[2] : $rooming;
  4675.                             $pax['rooming_numeroChambre'] = isset($rooming_infos[1]) ? $rooming_infos[1] : $rooming;
  4676.                             // Check RoomingPax Libellé
  4677.                             $checkLibelle $this->getDoctrine()->getManager()->getRepository(PaxRooming::class)->getLibelleByCodeLike($pax['rooming_libelle']);
  4678.                             $pax['rooming_libelle'] = $checkLibelle ?: $pax['rooming_libelle'];
  4679.                         } else
  4680.                         {
  4681.                             $pax['rooming_libelle']       = "";
  4682.                 }
  4683.             }
  4684.              
  4685.                     $pax['doublons'] = array();
  4686.                     // Fix Date Naissance
  4687.                     $dateNaissance = \DateTime::createFromFormat('Y-m-d'$date_naissance);
  4688.              
  4689.                     if(!$dateNaissance)
  4690.                     {
  4691.                         $dateNaissance = \DateTime::createFromFormat('d-m-Y'$date_naissance);
  4692.                         if(!$dateNaissance)
  4693.                         {
  4694.                             $dateNaissance = \DateTime::createFromFormat('d/m/Y'$date_naissance);
  4695.                         }
  4696.                         if(!$dateNaissance)
  4697.                         {
  4698.                             if (strtotime($date_naissance))
  4699.                             {
  4700.                                 $dateNaissance = new \Datetime($date_naissance);
  4701.     
  4702.                             } else if(is_int(intval($date_naissance)) && strlen(intval($date_naissance)) >= 5)
  4703.                             {
  4704.                                 $dateNaissance = new \Datetime('1899/12/30');
  4705.                                 $dateNaissance->add(new \DateInterval('P' intval($date_naissance) . 'D'));
  4706.                             } else
  4707.                             {
  4708.                                 $dateNaissance null;
  4709.                             }
  4710.                         }
  4711.                     }
  4712.                     // Rustines
  4713.                     $pax['location_materiel'] = str_replace("cm""."$pax['location_materiel']);
  4714.                     $pax['location_materiel'] = str_replace("m"""$pax['location_materiel']);
  4715.                     $pax['location_poids'] = str_replace("kg""."$pax['location_poids']);
  4716.                     $pax['telephone'] = str_replace("GSM : """$pax['telephone']);
  4717.                     $pax['telephone'] = str_replace("GSM"""$pax['telephone']);
  4718.                     $pax['telephone'] = str_replace(":"""$pax['telephone']);
  4719.                     $pax['telephone'] = trim($pax['telephone']);
  4720.                     $pax['civilite']  = str_replace(array("Ms""MS"), "Madame"$pax['civilite'] );
  4721.                     $pax['civilite']  = str_replace(array("Mr""MR"), "Monsieur"$pax['civilite'] );
  4722.                     // Pour VV, on n'importe pas la civilité
  4723.             if ($this->getParameter('instance') == 'vv') {
  4724.                       $pax['civilite'] = '';    
  4725.             }
  4726.                     if($dateNaissance)
  4727.                     {
  4728.                         $pax['date_naissance'] = $dateNaissance->format('Y-m-d');
  4729.                     } else
  4730.                     {
  4731.                         $pax['date_naissance'] = $dateNaissance;
  4732.                     }
  4733.                     // Fix Date Passeport
  4734.                     $dateValiditePasseport = \DateTime::createFromFormat('Y-m-d'$validite_passeport);
  4735.                     if(!$dateValiditePasseport)
  4736.                     {
  4737.                         $dateValiditePasseport = \DateTime::createFromFormat('d-m-Y'$validite_passeport);
  4738.                         if(!$dateValiditePasseport)
  4739.                         {
  4740.                             $dateValiditePasseport = \DateTime::createFromFormat('d/m/Y'$validite_passeport);
  4741.                         }
  4742.                         if(!$dateValiditePasseport)
  4743.                         {
  4744.                             if (strtotime($validite_passeport))
  4745.                             {
  4746.                                 $dateValiditePasseport = new \Datetime($validite_passeport);
  4747.     
  4748.                             } else if(is_int($validite_passeport) && strlen($validite_passeport) >= 5)
  4749.                             {
  4750.                                 $dateValiditePasseport = new \Datetime('1899/12/30');
  4751.                                 $dateValiditePasseport->add(new \DateInterval('P' $validite_passeport 'D'));
  4752.                             } else
  4753.                             {
  4754.                                 $dateValiditePasseport null;
  4755.                             }
  4756.                         }
  4757.                     }
  4758.                     if($dateValiditePasseport)
  4759.                     {
  4760.                         $pax['validite_passeport'] = $dateValiditePasseport->format('d/m/Y');
  4761.                         
  4762.                     } else
  4763.                     {
  4764.                         $pax['validite_passeport'] = $dateValiditePasseport;
  4765.                     }
  4766.                 
  4767.                     // Recherche le Pax dans la database
  4768.                     // $isKnown   = $this->getDoctrine()->getManager()->getRepository(Pax::class)->findBy(['nom' => $nom, 'prenom' => $prenom, 'dateNaissance' => $dateNaissance, 'actif' => true, 'dossier' => $dossier]);
  4769.                     $isKnown $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->checkForXlsImport($nom$prenom$dateNaissance);
  4770.                 
  4771.                     // Si aucun trouvé, il s'agit d'un nouveau
  4772.                     $isNew = (count($isKnown) == 0) ? true false;
  4773.                     // Si plusieurs trouvés, alors c'est un doublon
  4774.                     $isDoublon = (count($isKnown) > ) ? true false;
  4775.                     if ($isDoublon
  4776.                     {
  4777.                         $pax['statut'] = 'doublon' ;
  4778.                         foreach ($isKnown as $oldPax
  4779.                         {
  4780.                             $pax['doublons'][] = $oldPax;
  4781.                         }
  4782.                 
  4783.                         $doublons[] = $pax;
  4784.                     }
  4785.                     if ($isNew
  4786.                     {
  4787.                         $pax['statut'] = 'nouveau';
  4788.                         $results[] = $pax;
  4789.                     }
  4790.                     // Si pas nouveau, ni doublon, c'est une mise à jour
  4791.                     if (!$isNew && !$isDoublon) {
  4792.                         $pax['statut'] = 'mise à jour';
  4793.                         $pax['id']     = $isKnown[0]['id'];
  4794.                         $results[] = $pax;
  4795.                     }
  4796.                 }
  4797.             }
  4798. //            unlink($uploadDir.$get['file']); // Supprime le fichier d'import // TODO a voir pour versionning
  4799.         }
  4800.         // Client
  4801.         $client $companyService->getOneById($segment->getClientId());
  4802.         // Segments
  4803.         $linked $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier'actif' => true], ['dateDepart' => 'ASC']);
  4804.         return $this->render('dossier/rooming/_import_xlsx.html.twig', [
  4805.               'dossier'              => $dossier
  4806.             'linked'               => $linked
  4807.             'segment'              => $segment
  4808.             'client'               => $client
  4809.             'pax'                  => $paxOld 
  4810.             'doublons'             => $doublons 
  4811.             'newPax'               => array_values($results
  4812.             , 'action'               => 'Pax: ' $dossier->getLibelle() . ' - ' $segment->getLibelle()
  4813.             , 'retour'               => 'dossier_index'
  4814.             'selectRoomingOptions' => $selectRoomingOptions 
  4815.         ]);
  4816.     }
  4817.     /**
  4818.     * @Route("/dossier/{id}/segment/{segmentId}/transfer/importXls", name="transfert_import_xls")
  4819.     */
  4820.     public function transfert_import(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdParameterBagInterface $params): Response
  4821.     {
  4822.         // Va permettre d'importer les données d'après un fichier XLS
  4823.         $message 'Aucun vol à afficher, cliquer pour en ajouter.';
  4824.         if (!$dossier) {
  4825.             throw $this->createNotFoundException("Le dossier n'existe pas");
  4826.         }
  4827.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  4828.         if (!$segment) {
  4829.             throw $this->createNotFoundException("Le segment n'existe pas");
  4830.         }
  4831.         $file       $request->files->get('file')                ;
  4832.         $post       $request->request->all()                    ;
  4833.         $get        $request->query->all()                      ;
  4834.         $webDir     '/uploads/importXlsx/'                      // Chemin relatif URL
  4835.         $uploadDir  $_SERVER['DOCUMENT_ROOT'].'symfony'.$webDir // Chemin sous la forme /var/www/...
  4836.         $newPax     = array()                                     ; // Contient les paxs importés
  4837.         $results    = array()                                     ;
  4838.         $doublons   = array()                                     ;
  4839.         $selectRoomingOptions = array()                           ;
  4840.         // Pax présents dans la database
  4841.         $paxOld = array(); 
  4842.         // Pour le select libelle rooming
  4843.         $roomingOptions $this->getDoctrine()->getManager()->getRepository(PaxRooming::class)->findAll();
  4844.         foreach ($roomingOptions as $option) {
  4845.             $selectRoomingOptions[$option->getId()] = $option->getLibelle();                     ;
  4846.         }
  4847.         //------------------------------------------------------------------
  4848.         //    Cas 1 Upload fichier puis renvoi le nom du fichier (ajax)
  4849.         //------------------------------------------------------------------
  4850.         // On enregistre le fichier puis retourne le nom du fichier
  4851.         if (null !== $file) { // Un fichier a été reçu
  4852.             // fichier OK 
  4853.             $fileName md5(uniqid()).'.xlsx';
  4854.             if (!file_exists($uploadDir) && !is_dir($uploadDir)) {
  4855.                 mkdir($uploadDir0775true);
  4856.             }
  4857.             if ($file->move($uploadDir$fileName)) { // Tout OK on retourne le nom du fichier 
  4858.                 return new Response(json_encode($fileName), 200, ['Content-Type' => 'application/json']); 
  4859.             }
  4860.         }
  4861.         //---------------------------------------------------------------------
  4862.         //     Cas 2 Enregistre les modifications lorsque $_POST est non vide
  4863.         //---------------------------------------------------------------------
  4864.         // Si $_POST alors on save les données 
  4865.         elseif ((count($get) > 0) && (array_key_exists('file'$get))) { // un fichier est passé en paramètre _GET
  4866.             $obj    = new \App\Utils\ExtractFromXlsx($uploadDir.$get['file'], 'aerien'$params);
  4867.             $datas  $obj->getDatas(); 
  4868.             if (count($datas['RANGE']['PLAN DE VOL']) > 0) { // au moins 1 transfert existe
  4869.                 $plans_de_vol   = array(); 
  4870.                 $le_plan_de_vol $datas['SEARCH']['PLAN DE VOL']; // on récupère le nom du premier plan de vol
  4871.                 foreach ($datas['RANGE']['PLAN DE VOL'] as $key => $transfert) { // Formate les datas
  4872.                     if (count(array_filter($transfert)) == 1) {
  4873.                         $le_plan_de_vol $transfert['date'];
  4874.                     }
  4875.                     elseif ($transfert['date'] != 'DATE') {
  4876.                         $plans_de_vol[$le_plan_de_vol][] = $transfert;
  4877.                     }
  4878.                 }
  4879.                 // Traite les datas
  4880.                 $o 1;
  4881.                 foreach ($plans_de_vol as $alias => $groupe) {
  4882.                     // retrouve le plan de vol s'il existe
  4883.                     $plan_de_vol $em->getRepository(PlanDeVol::class)->findOneBy(['libelle' => $alias'actif' => true]);
  4884.                     $relation    null ;
  4885.                     // crée le plan si pas trouvé
  4886.                     if (null != $plan_de_vol) {
  4887.                         $plan_de_vol->setUpdatedBy($this->getUser());    
  4888.                         $plan_de_vol->setLibelle('PLAN DE VOL '.$o);    
  4889.                     
  4890.                         // trouve la relation sinon crée
  4891.                         $relation $em->getRepository(DossierSegmentPlanDeVol::class)->findOneBy(['segment' => $segment'planDeVol' => $plan_de_vol]);
  4892.                         $o++;
  4893.                     }
  4894.                     else {
  4895.                         $plan_de_vol = new PlanDeVol();
  4896.                         //$plan_de_vol->setLibelle($alias);    
  4897.                         $plan_de_vol->setLibelle('PLAN DE VOL '.$o);    
  4898.                         $plan_de_vol->setActif(true);    
  4899.                         $plan_de_vol->setCreatedBy($this->getUser());    
  4900.                         $em->persist($plan_de_vol);
  4901.                         $em->flush();
  4902.                         $o++;
  4903.                     }
  4904.                     if (null === $relation) {
  4905.                         // ajoute le lien avec le segment
  4906.                         $relation = new DossierSegmentPlanDeVol();
  4907.                         $relation->setSegment($segment);
  4908.                         $relation->setPlanDeVol($plan_de_vol);
  4909.                         $em->persist($relation);
  4910.                         $em->flush();
  4911.                     }
  4912.                     // Ajoute les tranferts
  4913.                     foreach ($groupe as $item) {
  4914.                         $date $debutVol $finVol $aerien $referenceVol $transferts $informations null;        
  4915.                         extract$itemEXTR_IF_EXISTS );
  4916.                         $debutVol  = \DateTime::createFromFormat('Y-m-d H:i'$date.' '.$debutVol);
  4917.                         // retrouve le vol s'il existe
  4918.                         $transfert $em->getRepository(TransfertAerien::class)->findOneBy(['referenceVol' => $referenceVol'debutVol' => $debutVol'actif' => true]);
  4919.                         $rel    null ;
  4920.                         // update le vol ou crée si pas trouvé
  4921.                         if (null != $transfert) {
  4922.                             $transfert->setUpdatedBy($this->getUser());    
  4923.                             $rel $em->getRepository(DossierSegmentTransfertAerien::class)->findOneBy(['segment' => $segment'transfertAerien' => $transfert'planDeVol' => $relation]);
  4924.                         }
  4925.                         else {
  4926.                             $transfert = new TransfertAerien(); 
  4927.                             $transfert->setCreatedBy($this->getUser());    
  4928.                         }
  4929.                         $finVol    = \DateTime::createFromFormat('Y-m-d H:i'$date.' '.$finVol);
  4930.                         $aerien    explode('  '$aerien);
  4931.                         $transfert->setDebutVol($debutVol);
  4932.                         $transfert->setFinVol($finVol);
  4933.                         $transfert->setInformations($informations);
  4934.                         $transfert->setCodeOrigine(trim($aerien[0]));
  4935.                         $transfert->setCodeDestination(trim($aerien[1]));
  4936.                         $transfert->setReferenceVol($referenceVol);
  4937.                         $transfert->setTransferts($transferts);
  4938.                         $transfert->setActif(true);
  4939.                         //$transfert->addplanDeVol($plan_de_vol);
  4940.                         $em->persist($transfert);
  4941.                         $em->flush();
  4942.                         if (null === $rel) {
  4943.                             // ajoute le lien avec le segment
  4944.                             $rel = new DossierSegmentTransfertAerien();
  4945.                             $rel->setSegment($segment);
  4946.                             $rel->setTransfertAerien($transfert);
  4947.                             $rel->setPlanDeVol($relation);
  4948.                             $em->persist($rel);
  4949.                             $em->flush();
  4950.                         }
  4951.                         $em->flush();
  4952.                     }
  4953.                 }
  4954.             }
  4955.             $message 'Les transfert ont été correctement importés, cliquer pour importer un autre fichier';
  4956.         }
  4957.         // Client
  4958.         $client null
  4959.         // Segments
  4960.         $linked $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier'actif' => true], ['dateDepart' => 'ASC']);
  4961.         return $this->render('dossier/transfert/_import_xlsx.html.twig', [
  4962.               'dossier'              => $dossier
  4963.             'linked'               => $linked
  4964.             'segment'              => $segment 
  4965.             'client'               => $client
  4966.             'pax'                  => null //$paxOld 
  4967.             'doublons'             => null //$doublons 
  4968.             'newPax'               => array_values($results
  4969.             , 'action'               => 'Transfert aérien: ' $dossier->getLibelle()
  4970.             , 'retour'               => 'dossier_index'
  4971.         'message'              => $message
  4972.         ]);
  4973.     }
  4974.     /**
  4975.     * @Route("/dossier/{id}/segment/{segmentId}/transfer/importXls-ta", name="transfert_import_xls_ta")
  4976.     */
  4977.     public function transfert_import_ta(Request $requestEntityManagerInterface $emDossier $dossier$segmentIdParameterBagInterface $params): Response
  4978.     {
  4979.         // Va permettre d'importer les données d'après un fichier XLS
  4980.         $message 'Aucun vol à afficher, cliquer pour en ajouter.';
  4981.         if (!$dossier) {
  4982.             throw $this->createNotFoundException("Le dossier n'existe pas");
  4983.         }
  4984.         $segment $em->getRepository(DossierSegment::class)->find($segmentId);
  4985.         if (!$segment) {
  4986.             throw $this->createNotFoundException("Le segment n'existe pas");
  4987.         }
  4988.         $file       $request->files->get('file')                ;
  4989.         $post       $request->request->all()                    ;
  4990.         $get        $request->query->all()                      ;
  4991.         $webDir     '/uploads/importXlsx/'                      // Chemin relatif URL
  4992.         $uploadDir  $_SERVER['DOCUMENT_ROOT'].'symfony'.$webDir // Chemin sous la forme /var/www/...
  4993.         $newPax     = array()                                     ; // Contient les paxs importés
  4994.         $results    = array()                                     ;
  4995.         $doublons   = array()                                     ;
  4996.         $selectRoomingOptions = array()                           ;
  4997.         // Pax présents dans la database
  4998.         $paxOld = array(); 
  4999.         // Pour le select libelle rooming
  5000.         $roomingOptions $this->getDoctrine()->getManager()->getRepository(PaxRooming::class)->findAll();
  5001.         foreach ($roomingOptions as $option) {
  5002.             $selectRoomingOptions[$option->getId()] = $option->getLibelle();                     ;
  5003.         }
  5004.         //------------------------------------------------------------------
  5005.         //    Cas 1 Upload fichier puis renvoi le nom du fichier (ajax)
  5006.         //------------------------------------------------------------------
  5007.         // On enregistre le fichier puis retourne le nom du fichier
  5008.         if (null !== $file) { // Un fichier a été reçu
  5009.             // fichier OK 
  5010.             $fileName md5(uniqid()).'.xlsx';
  5011.             if (!file_exists($uploadDir) && !is_dir($uploadDir)) {
  5012.                 mkdir($uploadDir0775true);
  5013.             }
  5014.             if ($file->move($uploadDir$fileName)) { // Tout OK on retourne le nom du fichier 
  5015.                 return new Response(json_encode($fileName), 200, ['Content-Type' => 'application/json']); 
  5016.             }
  5017.         }
  5018.         //---------------------------------------------------------------------
  5019.         //     Cas 2 Enregistre les modifications lorsque $_POST est non vide
  5020.         //---------------------------------------------------------------------
  5021.         // Si $_POST alors on save les données 
  5022.         elseif ((count($get) > 0) && (array_key_exists('file'$get))) { // un fichier est passé en paramètre _GET
  5023.             $obj  = new \App\Utils\ImportPlanDeVol($uploadDir.$get['file'], $params);
  5024.             $data $obj->getDataTA(); 
  5025.         // retrouve le nombre de plans de vols
  5026.         $existingPlanDeVol $em->getRepository(DossierSegmentPlanDeVol::class)->findBy(['segment' => $segment]);
  5027.             $counter count($existingPlanDeVol);
  5028.             $transports = array();
  5029.         foreach ($data as $key => $planDeVol) {
  5030.                 $counter++;
  5031.                 $plan_de_vol = new PlanDeVol();
  5032.                 $plan_de_vol->setLibelle('PLAN DE VOL '.$counter);    
  5033.                 $plan_de_vol->setActif(true);    
  5034.                 $plan_de_vol->setCreatedBy($this->getUser());    
  5035.                 $em->persist($plan_de_vol);
  5036.                 $em->flush();
  5037.                 // ajoute le lien avec le segment
  5038.                 $relation = new DossierSegmentPlanDeVol();
  5039.                 $relation->setSegment($segment);
  5040.                 $relation->setPlanDeVol($plan_de_vol);
  5041.                 $em->persist($relation);
  5042.                 $em->flush();
  5043.         foreach ($data[$key]['infos'] as $n => $transfer) {
  5044.                     $transfer str_replace('"'''$transfer);            
  5045.             if (preg_match('/^[0-3][0-9]\/[01][0-9]\/[0-9]+/'$transfer$output_array)) { // information vol sinon remarque
  5046.                         $infos explode(' '$transfer);
  5047.                         $debutVol  = \DateTime::createFromFormat('d/m/Y H:i'$infos[0].' '.str_replace('h'':'$infos[4]));
  5048.                         $finVol    = \DateTime::createFromFormat('d/m/Y H:i'$infos[0].' '.str_replace('h'':'$infos[5]));
  5049.                         $transfert = new TransfertAerien(); 
  5050.                         $transfert->setCreatedBy($this->getUser());    
  5051.                         $transfert->setDebutVol($debutVol);
  5052.                         $transfert->setFinVol($finVol);
  5053.                         $transfert->setCodeOrigine(trim($infos[1]));
  5054.                         $transfert->setCodeDestination(trim($infos[2]));
  5055.                         $transfert->setReferenceVol($infos[3]);
  5056.                         $transfert->setTransferts(trim(str_replace('"'''$data[$key]['transferts'][$n])));
  5057.                         $transfert->setActif(true);
  5058.             if (!empty($data[$key]['notes'][$n])) {
  5059.                             $transfert->setInformations(trim(str_replace('"'''$data[$key]['notes'][$n])));
  5060.             }
  5061.                         $em->flush();
  5062.                         $em->persist($transfert);
  5063.                         // ajoute le lien avec le segment
  5064.                         $rel = new DossierSegmentTransfertAerien();
  5065.                         $rel->setSegment($segment);
  5066.                         $rel->setTransfertAerien($transfert);
  5067.                         $rel->setPlanDeVol($relation);
  5068.                         $em->persist($rel);
  5069.                         $em->flush();
  5070.             // Liaison auto service
  5071.             if (!empty($data[$key]['liaisons'][$n])) {
  5072.                 if (strtolower($data[$key]['liaisons'][$n]) == 'oui') {
  5073.                     foreach ($segment->getDossierSegmentServices() as $serv) {
  5074.                                     if (null !== $serv->getService()) {
  5075.                         if ($serv->getService()->getType()->getId() == 1) {
  5076.                                                 //$transports[$rel->getId()] = $serv->getId();
  5077.                                                 $transports[$serv->getId()] = array($rel$serv);
  5078.                     }
  5079.                     }
  5080.                     }
  5081.                 }
  5082.             }
  5083.             }
  5084.             else {
  5085.                         $noteExisting = (strlen($plan_de_vol->getNote()) > 0) ? $plan_de_vol->getNote() : null;
  5086.             //$encoding = mb_detect_encoding($transfer);
  5087.             //if ($encoding != 'UTF-8') {
  5088.                         //    $transfer = mb_convert_encoding($transfer, 'UTF-8', $encoding);
  5089.             //}
  5090.             $newNote = (strlen($transfer) > 0) ? $transfer null;
  5091.             $notes array_filter(array($noteExisting$newNote));
  5092.             if (count($notes) > 0) {
  5093.                             $plan_de_vol->setNote(implode("<br>"$notes));
  5094.                             $em->flush();
  5095.             }
  5096.             }
  5097.         }
  5098.         // Gestion des paxes
  5099.                 $paxes $em->getRepository(DossierSegmentPax::class)->findBy(['segment' => $segment]);
  5100.                 $names = array();
  5101.         $keys  = array();
  5102.         foreach ($paxes as $pax) {
  5103.                     $names[$pax->getId()] = mb_strtolower($pax->getLibelle());
  5104.         }
  5105.         foreach ($data[$key]['users'] as $item) {
  5106.                     $item str_replace('"'''mb_strtolower($item));    
  5107.                     if (in_array($item$names)) {
  5108.                         $key array_search($item$names); 
  5109.                         $pax $em->getRepository(DossierSegmentPax::class)->findOneById($key);
  5110.     
  5111.             $transfertPax = new DossierSegmentTransfertAerienPax();
  5112.             $transfertPax->setActif(true);
  5113.             $transfertPax->setSegmentPax($pax);
  5114.             $transfertPax->setPlanDeVol($relation);
  5115.                         $transfertPax->setCreatedBy($this->getUser());    
  5116.                         $em->persist($transfertPax);
  5117.                         $em->flush();
  5118.             }
  5119.         }
  5120.         }
  5121.             // Liaison auto service
  5122.         foreach ($transports as $key => $value) {
  5123.                 $liaison = new DossierSegmentTransfertAerienService();
  5124.         $liaison->setDossierSegment($segment);
  5125.         $liaison->setTransfertAerien($value[0]);
  5126.         $liaison->setDossierSegmentService($value[1]);
  5127.                 $liaison->setCreatedBy($this->getUser());    
  5128.                 $em->persist($liaison);
  5129.                 $em->flush();
  5130.         }
  5131.         $message 'Les transfert ont été correctement importés, cliquer pour importer un autre fichier';
  5132.         }
  5133.         // Client
  5134.         $client null
  5135.         // Segments
  5136.         $linked $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier'actif' => true], ['dateDepart' => 'ASC']);
  5137.         return $this->render('dossier/transfert/_import_xlsx_ta.html.twig', [
  5138.               'dossier'              => $dossier
  5139.             'linked'               => $linked
  5140.             'segment'              => $segment 
  5141.             'client'               => $client
  5142.             'pax'                  => null //$paxOld 
  5143.             'doublons'             => null //$doublons 
  5144.             'newPax'               => array_values($results
  5145.             , 'action'               => 'Transfert aérien: ' $dossier->getLibelle()
  5146.             , 'retour'               => 'dossier_index'
  5147.         'message'              => $message
  5148.         ]);
  5149.     }
  5150.     /**
  5151.      * @Route("/close-modal", name="close_modal", methods={"GET","POST"})
  5152.      */
  5153.     public function close_modal(Request $request ): Response
  5154.     {
  5155.         return $this->render('close_modale.html.twig', [
  5156.             'action'         => ""  
  5157.         ]);
  5158.     }
  5159.     /**
  5160.     * @Route("/dossier/{id}/segment/{segmentId}/delete-day/{dayIndex}", name="segment_composition_delete_day", methods={"POST"})
  5161.     */
  5162.     public function deleteDay(Dossier $dossier$segmentIdint $dayIndexDossierSegmentService $dossierSegmentService): Response
  5163.     {
  5164.         /** @var DossierSegment $segment */
  5165.         $segment $this->em->getRepository(DossierSegment::class)->find($segmentId);
  5166.         if (!$segment) throw $this->createNotFoundException("Le segment n'existe pas"); 
  5167.         $dossierSegmentService->deleteDay($segment, (int) $dayIndex);
  5168.         return $this->redirectToRoute('dossier_segment_composition', [
  5169.             'id' => $dossier->getId(),
  5170.             'segmentId' => $segment->getId(),
  5171.             'closeDays' => true,
  5172.             'index' => 1,
  5173.         ]);
  5174.     }
  5175.     /**
  5176.     * @Route("/dossier/{id}/segment/{segmentId}/add-day/{dayIndex}", name="segment_composition_add_day", methods={"POST"})
  5177.     */
  5178.     public function addDay(Dossier $dossier$segmentIdint $dayIndexDossierSegmentService $dossierSegmentService): Response
  5179.     {
  5180.         /** @var DossierSegment $segment */
  5181.         $segment $this->em->getRepository(DossierSegment::class)->find($segmentId);
  5182.         if (!$segment) throw $this->createNotFoundException("Le segment n'existe pas"); 
  5183.         $dossierSegmentService->addDay($segment, (int) $dayIndex);
  5184.         return $this->redirectToRoute('dossier_segment_composition', [
  5185.             'id' => $dossier->getId(),
  5186.             'segmentId' => $segment->getId(),
  5187.             'closeDays' => true,
  5188.             'newDayIndex' => $dayIndex,
  5189.             'index' => 1,
  5190.         ]);
  5191.     }
  5192.     /**
  5193.       * @Route("/dossier/select2/task-listes", name="select2TaskListes", methods={"GET"})
  5194.       */
  5195.     public function select2TaskListes(Request $requestEntityManagerInterface $em): Response
  5196.     {
  5197.         $params $request->query->all();
  5198.         $listes $em->getRepository(TaskListe::class)->getForSelect2($params);
  5199.         return new JsonResponse($listes);
  5200.     }
  5201.     /**
  5202.      * @Route("/dossier/{id}/save-listes/{listeId}/{segmentId}", name="task_liste", methods={"GET","POST"})
  5203.      */
  5204.     public function add_task_liste(Request $requestEntityManagerInterface $emDossier $dossier$listeId$segmentId): Response
  5205.     {
  5206.         if (!$dossier) {
  5207.             throw $this->createNotFoundException("Le dossier n'existe pas"); 
  5208.         }
  5209.     $liste   $em->getRepository(TaskListe::class)->findOneById($listeId);
  5210.     $segment $em->getRepository(DossierSegment::class)->findOneById($segmentId);
  5211.     foreach ($liste->getTask() as $task) {
  5212.             if ($task->getActif() && $task->getTypeTache()->getActif()) {
  5213.         $segmentTask = new DossierSegmentTodo();
  5214.         $segmentTask->setDossierSegment($segment);
  5215.         $segmentTask->setLibelle($task->getLibelle());
  5216.         $segmentTask->setDescription($task->getDescription());
  5217.         $segmentTask->setTypeTache($task->getTypeTache());
  5218.         $segmentTask->setActif(true);
  5219.         $segmentTask->setResponsable($dossier->getChargeDossier());
  5220.         $date date_create($segment->getDateDepart()->format('Y-m-d'));
  5221.                 date_sub($date,date_interval_create_from_date_string($task->getDelay()." days"));
  5222.         $segmentTask->setDateLimite($date);
  5223.         $em->persist($segmentTask);
  5224.             }
  5225.     }
  5226.         $em->flush();
  5227.         return new JsonResponse(array('success' => true));
  5228.     }
  5229.     /**
  5230.     * @Route("/new_roadmap_document" , name="newRoadmapDocument" , methods={"GET", "POST"})
  5231.     */
  5232.     public function newRoadmapDocument(Request $requestDocumentService $serviceUserService $userServiceGraphService $microsoft)
  5233.     {
  5234.         $entityManager $this->getDoctrine()->getManager();
  5235.         $dossier_id   $request->query->get('dossier_id'null);
  5236.         $jour        $request->query->get('jour'null);
  5237.         $langue $request->get('langue'null);
  5238.         $get           $request->query->all();
  5239.         $refresh       false;
  5240.         $token $userService->getUserOfficeToken($this->getUser());
  5241.         try {
  5242.             $folders $microsoft->listSharePointSites($token);
  5243.         } catch (\Exception $e) {
  5244.             $folders null;
  5245.         }
  5246.         // Choix du fichier sharepoint
  5247.         if($request->isMethod('POST'))
  5248.         {
  5249.             $errors = [];
  5250.             try {
  5251.                 
  5252.                 // détermination de la position du document
  5253.                 $arrAllItems $entityManager->getRepository(RoadmapItem::class)->findBy(['dossier' => $dossier_id], ['ordre' => 'ASC']);
  5254.                 $lastOrdre 0;
  5255.                 $bon_jour false;
  5256.                 foreach($arrAllItems as $key => $item) {
  5257.                     if($item->getJour() == $jour && $item->getOrdre() > $lastOrdre) {
  5258.                         $lastOrdre $item->getOrdre();
  5259.                         $bon_jour true;
  5260.                     }
  5261.                     elseif(!$bon_jour && $item->getJour() < $jour) {
  5262.                         $lastOrdre $item->getOrdre();
  5263.                     }
  5264.                 }
  5265.                 // add roadmap item
  5266.                 $objItem = new RoadmapItem();
  5267.                 $objItem->setDossier($this->getDoctrine()->getManager()->getRepository(Dossier::class)->find($dossier_id));
  5268.                 $objItem->setSharepointId($request->request->get("fileId"));
  5269.                 $objItem->setSharepointLibelle($request->request->get("libelle"));
  5270.                 $objItem->setJour($jour);
  5271.                 $objItem->setOrdre($lastOrdre 1);
  5272.                 $entityManager->persist($objItem);
  5273.                 // changement positions des autres items
  5274.                 foreach($arrAllItems as $key => $item) {
  5275.                     if($item->getOrdre() >= $objItem->getOrdre()) {
  5276.                         $item->setOrdre($item->getOrdre() + 1);
  5277.                     }
  5278.                 }
  5279.                 $entityManager->flush();
  5280.                 $this->addFlash('success''Document ajouté avec succès au roadbook.');
  5281.                 return $this->json(['success' => true'itemId' => $objItem->getId(), 'message' => 'Document ajouté avec succès']);
  5282.             }
  5283.             catch (\Exception $e) {
  5284.                 $errors[] = $e->getMessage();
  5285.             }
  5286.     
  5287.             return new JsonResponse($errors);
  5288.         }
  5289.         
  5290.         return $this->render('dossier/add-roadbook-item.html.twig', [
  5291.             'retour'         => 'editorial_index' ,     
  5292.             'refresh'        => $refresh,
  5293.             'dossier_id'    => $dossier_id,
  5294.             'jour'         => $jour,
  5295.             'langue'       => $langue,
  5296.             'folders'        => $folders
  5297.         ]);
  5298.     }
  5299.     /**
  5300.     * @Route("/delete_roadmap_document" , name="deleteRoadmapDocument" , methods={"GET", "POST"})
  5301.     */
  5302.     public function deleteRoadmapDocument(Request $requestDocumentService $service)
  5303.     {
  5304.         $entityManager $this->getDoctrine()->getManager();
  5305.         $jour $request->get('jour'null);
  5306.         $doc_id   $request->get('document_id'null);
  5307.         $dossier_id   $request->get('dossier_id'null);
  5308.         $objDossier $entityManager->getRepository(Dossier::class)->find($dossier_id);
  5309.         $objItem $entityManager->getRepository(RoadmapItem::class)->findByDossierJourAndSharepointId($objDossier$jour$doc_id);
  5310.         if($objItem) {
  5311.             $entityManager->remove($objItem);
  5312.             $entityManager->flush();
  5313.         }
  5314.         $this->addFlash('success''Document supprimé avec succès du roadbook.');
  5315.         return new JsonResponse(["success" => true]);
  5316.     }
  5317. }