src/Controller/MissionController.php line 1711

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Campaign;
  4. use App\Entity\noteCampaing;
  5. use  App\Enum\Note;
  6. use App\Entity\Company;
  7. use App\Entity\FilePermissions;
  8. use App\Entity\SharedResourcesCategory;
  9. use App\Entity\User;
  10. use App\Entity\FileMessage;
  11. use App\Enum\SharedResourcesCategoryEnum;
  12. use App\Form\GroupMessageType;
  13. use App\Entity\DiscussionGroup;
  14. use App\Entity\FileMission;
  15. use App\Entity\Historique;
  16. use App\Entity\InfoMission;
  17. use App\Entity\Message;
  18. use App\Entity\Mission;
  19. use App\Event\AdminNotifiedMissionParticipantEvent;
  20. use App\Repository\FilePermissionsRepository;
  21. use App\Repository\FolderPermissionsRepository;
  22. use App\Repository\SharedResourcesCategoryRepository;
  23. use App\Service\DataHasherService;
  24. use App\Service\SharedResourceCategoryService;
  25. use Symfony\Component\HttpFoundation\StreamedResponse;
  26. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  27. use App\Service\UserService;
  28. use App\Entity\MissionParticipant;
  29. use App\Enum\BillingMethod;
  30. use App\Entity\SubContractorCompany;
  31. use App\Enum\ProductType;
  32. use App\Enum\Role;
  33. use App\Entity\UserData;
  34. use App\Event\Mission\MissionClosedEvent;
  35. use App\Event\Admin\MissionInitialTimeAfterValidationUpdatedEvent;
  36. use App\Event\Admin\MissionNotificationActivatedEvent;
  37. use App\Event\Chat\MessageSentEvent;
  38. use App\Event\Client\NoticeOfInsufficientBudgetEvent;
  39. use App\Event\Mission\MissionAcceptedEvent;
  40. use App\Event\Mission\MissionActivatedEvent;
  41. use App\Event\Mission\MissionCancelledEvent;
  42. use App\Event\Mission\MissionDesiredDeliveryUpdatedAfterValidationEvent;
  43. use App\Event\Mission\MissionInitialTimeEvent;
  44. use App\Event\Mission\MissionRefusedEvent;
  45. use App\Event\Mission\MissionArchivedEvent;
  46. use App\Event\Mission\MissionCanActivateEvent;
  47. use App\Event\Mission\MissionDesiredDeliveryUpdatedBeforeValidationEvent;
  48. use App\Event\Workflow\Step\WorkflowStepEnteredEvent;
  49. use App\Form\AddMissionContactType;
  50. use App\Form\AddMissionContactProjectType;
  51. use App\Event\SubContractorUpdatedEvent;
  52. use App\Form\AddMissionContactExternalType;
  53. use App\Form\AddMissionSubContractorType;
  54. use App\Form\CampaignCancelType;
  55. use App\Form\CampaignDeleteType;
  56. use App\Form\ChangeInitialTimeType;
  57. use App\Form\ChangeRealTimeType;
  58. use App\Form\EditDesiredDeliveryType;
  59. use App\Form\EditSubcontractorParticipantType;
  60. use App\Form\FileMissionType;
  61. use App\Form\InfoMissionType;
  62. use App\Form\CampaignNameType;
  63. use App\Form\InitialBriefType;
  64. use App\Form\MessageType;
  65. use App\Form\MissionCancelType;
  66. use App\Form\MissionEditInitialTimeType;
  67. use App\Form\MissionParticipantDelaisType;
  68. use App\Form\MissionParticipantIncomeType;
  69. use App\Form\MissionParticipantType;
  70. use App\Form\MissionQuantityType;
  71. use App\Form\CampaignCreditHistoryType;
  72. use App\Repository\CampaignRepository;
  73. use App\Repository\HistoriqueRepository;
  74. use App\Repository\SubContractorCompanyRepository;
  75. use App\Repository\InfoMissionRepository;
  76. use App\Repository\MessageRepository;
  77. use App\Repository\MissionParticipantRepository;
  78. use App\Repository\CompanyRepository;
  79. use App\Repository\FileMissionRepository;
  80. use App\Repository\CreditHistoryRepository;
  81. use App\Repository\MissionRepository;
  82. use App\Repository\ServiceRepository;
  83. use App\Repository\UserRepository;
  84. use App\Service\CreditService;
  85. use App\Service\ResaleRateService;
  86. use Doctrine\ORM\EntityManagerInterface;
  87. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  88. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  89. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  90. use Symfony\Component\HttpFoundation\JsonResponse;
  91. use Symfony\Component\HttpFoundation\RedirectResponse;
  92. use Symfony\Component\HttpFoundation\Request;
  93. use Symfony\Component\HttpFoundation\Response;
  94. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  95. use Symfony\Component\Routing\Annotation\Route;
  96. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  97. use Symfony\Component\Routing\RouterInterface;
  98. use Symfony\Component\Workflow\Registry;
  99. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  100. use App\Event\Mission\MissionResendEvent;
  101. use App\Event\User\UserMentionnedEvent;
  102. use App\Form\MissionAddWorkflowType;
  103. use App\Form\FilterType;
  104. use App\Repository\WorkflowRepository;
  105. use App\Service\CampaignService;
  106. use App\Service\ClientSoldService;
  107. use App\Service\MessageService;
  108. use App\Service\MissionService;
  109. use App\Service\MyFlowMarginService;
  110. use App\Service\NumberFormatService;
  111. use Twig\Environment;
  112. use App\Service\PackService;
  113. use App\Service\PriceService;
  114. use Knp\Component\Pager\PaginatorInterface;
  115. use App\Repository\WorkflowStepRepository;
  116. use function PHPSTORM_META\type;
  117. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  118. use App\Service\ContractService;
  119. use App\Form\CampaignType;
  120. use App\Form\SubContractorCompanyType;
  121. use App\Form\DesiredDeliveryType;
  122. use App\Form\StorageMissionType;
  123. use App\Repository\CommandeLoggingRepository;
  124. use App\Repository\JobRepository;
  125. use App\Service\CampaignApiService;
  126. use DateTime;
  127. use Symfony\Component\Filesystem\Filesystem;
  128. use Symfony\Component\Mime\Address;
  129. use App\Service\GoogleStorageService;
  130. use App\Service\DynamicHostService;
  131. use App\Service\MissionParticipantService;
  132. use App\Service\SwitchConnexionService;
  133. use App\Entity\Service;
  134. use Symfony\Component\Validator\Constraints\Email;
  135. use Symfony\Component\Validator\Validator\ValidatorInterface;
  136. use Symfony\Component\Serializer\SerializerInterface;
  137. use App\Service\ChatService;
  138. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  139. use VSC\API\ViruscampAPI;
  140. use App\Service\FilterService;
  141. class MissionController extends AbstractController
  142. {
  143.     const COST_OF_A_CREDIT 220;
  144.     public function __construct(
  145.         private EntityManagerInterface $entityManager,
  146.         private Environment $twig,
  147.         private CampaignService $campaignService,
  148.         private MissionService $missionService,
  149.         private NumberFormatService $numberFormatService,
  150.         private ContractService $contractService,
  151.         private  UserRepository $userRepository,
  152.         private EventDispatcherInterface $dispatcher,
  153.         private MessageService $messageService,
  154.         private GoogleStorageService $googleStorageService,
  155.         private PriceService $priceService,
  156.         private DynamicHostService $dynamicHostService,
  157.         private CampaignApiService $campaignApiService
  158.         private MissionParticipantService $missionParticipantService
  159.         private JobRepository $jobRepository
  160.         private ChatService $chatService
  161.         private SerializerInterface $serializer
  162.         private FolderPermissionsRepository $folderPermissionsRepository,
  163.         private FilePermissionsRepository $filePermissionsRepository,
  164.         private SharedResourcesCategoryRepository $sharedResourcesCategoryRepository,
  165.         private SessionInterface $session,
  166.         private PaginatorInterface $paginator
  167.         private SharedResourceCategoryService $sharedResourceCategoryService
  168.         private CreditHistoryRepository $creditHistoryRepository
  169.     ) {
  170.     }
  171.     /**
  172.      * Displays the missions index
  173.      *
  174.      * The admin views all the missions
  175.      * A company user view only his company's missions
  176.      * A subcontractor view only his missions
  177.      *
  178.      * @param CampaignRepository $campaignRepository
  179.      * @param CreditService $creditService
  180.      *
  181.      * @return Response template /mission/index.html.twig
  182.      */
  183.     #[Route('/mission'name'mission_index')]
  184.     #[Route('/mission/archived'name'mission_index_archived')]
  185.     #[Route('/mission/deleted'name'mission_index_deleted')]
  186.     public function index(Request $request,CampaignService $campaignServiceCommandeLoggingRepository $commandeLoggingRepositoryCampaignRepository $campaignRepositoryClientSoldService $clientSoldServiceCreditService $creditServiceMissionParticipantRepository $missionParticipantRepositoryUserRepository $userRepositoryParameterBagInterface $parameterBagInterfacePackService $packServicePriceService $priceServiceMissionRepository $missionRepositoryPaginatorInterface $paginatorSessionInterface $sessionCompanyRepository $companyRepository,SwitchConnexionService $switchConnexionService): Response
  187.     {
  188.         
  189.             
  190.         $routeName $request->attributes->get('_route');
  191.         $filterDownAndTop = !is_null($session->get('filterDownAndTop')) ? $session->get('filterDownAndTop') : [];
  192.         if (!is_null($request->query->get('nb_mission'))) {
  193.             $session->set('nbrMissionByPage'$request->query->get('nb_mission'));
  194.         }
  195.         $nbMissionByPage =  !is_null($session->get('nbrMissionByPage')) ? $session->get('nbrMissionByPage') : 10;
  196.         
  197.         //top down filter // ASC and DESC
  198.         if (
  199.             !is_null($request->query->get('companyFilter'))
  200.             or !is_null($request->query->get('campaingFilter'))
  201.             or !is_null($request->query->get('statusFilter'))
  202.             or !is_null($request->query->get('priceFilter'))
  203.             or !is_null($request->query->get('referenceFilter'))
  204.             or !is_null($request->query->get('referenceRandomFilter'))
  205.             or !is_null($request->query->get('companyRandomFilter'))
  206.             or !is_null($request->query->get('campaingRandomFilter'))
  207.             or !is_null($request->query->get('statusRandomFilter'))
  208.             or !is_null($request->query->get('priceRandomFilter'))
  209.         ) {
  210.             //random filter for reference
  211.             if (!is_null($request->query->get('referenceRandomFilter'))) {
  212.                 $ord = (isset($filterDownAndTop['referenceFilter']) && $filterDownAndTop['referenceFilter'] == "ASC") ? "DESC" "ASC";
  213.                 $request->query->set('referenceFilter'$ord);
  214.             }
  215.             //random for company
  216.             if (!is_null($request->query->get('companyRandomFilter'))) {
  217.                 $ord = (isset($filterDownAndTop['companyFilter']) && $filterDownAndTop['companyFilter'] == "ASC") ? "DESC" "ASC";
  218.                 $request->query->set('companyFilter'$ord);
  219.             }
  220.             //random for campaing
  221.             if (!is_null($request->query->get('campaingRandomFilter'))) {
  222.                 $ord = (isset($filterDownAndTop['campaingFilter']) && $filterDownAndTop['campaingFilter'] == "ASC") ? "DESC" "ASC";
  223.                 $request->query->set('campaingFilter'$ord);
  224.             }
  225.             //random for status
  226.             if (!is_null($request->query->get('statusRandomFilter'))) {
  227.                 $ord = (isset($filterDownAndTop['statusFilter']) && $filterDownAndTop['statusFilter'] == "ASC") ? "DESC" "ASC";
  228.                 $request->query->set('statusFilter'$ord);
  229.             }
  230.             //random for status
  231.             if (!is_null($request->query->get('priceRandomFilter'))) {
  232.                 $ord = (isset($filterDownAndTop['priceFilter']) && $filterDownAndTop['priceFilter'] == "ASC") ? "DESC" "ASC";
  233.                 $request->query->set('priceFilter'$ord);
  234.             }
  235.             $filterDownAndTop = [
  236.                 'companyFilter' => $request->query->get('companyFilter'),
  237.                 'campaingFilter' => $request->query->get('campaingFilter'),
  238.                 'statusFilter' => $request->query->get('statusFilter'),
  239.                 'priceFilter' => $request->query->get('priceFilter'),
  240.                 'referenceFilter' => $request->query->get('referenceFilter'),
  241.             ];
  242.             $session->set('filterDownAndTop'$filterDownAndTop);
  243.             return $this->redirectToRoute($routeName, [], Response::HTTP_SEE_OTHER);
  244.         }
  245.         //reset filter
  246.         if ($request->get('reset')) {
  247.             $session->set('criteriaFilter', []);
  248.             $session->set('filterDownAndTop', []);
  249.             $this->addFlash(
  250.                 type'success',
  251.                 message'Le filtre a été réinitialisé',
  252.             );
  253.             return $this->redirectToRoute($routeName, [], Response::HTTP_SEE_OTHER);
  254.         }
  255.         $criteriaFilter = !is_null($session->get('criteriaFilter')) ? $session->get('criteriaFilter') : [];
  256.         //creation formulaire 
  257.         $campaignCommand = [];
  258.         $campaignsPrice = [];
  259.         $totalHtPerMonth = [];
  260.         $creditConso = [];
  261.         $invoiced = [];
  262.         $nombreCampaignCommande 0;
  263.         $listSubContractorId = [];
  264.         if($this->isGranted(Role::ROLE_CLIENT->value) || $this->isGranted(Role::ROLE_CLIENT_ADMIN->value) || $this->isGranted(Role::ROLE_SUBCONTRACTOR->value)){
  265.             $listCampaignWithSubContractor $campaignRepository->findAllInterlocutors($this->getUser(), 3);
  266.             foreach ($listCampaignWithSubContractor as $campaign) {
  267.                 foreach ($campaign->getMissions() as $mission) {
  268.                     foreach ($mission->getParticipants() as $participant) {
  269.                         if ($participant->getRole() == Role::ROLE_SUBCONTRACTOR) {
  270.                             if (!in_array($participant->getUser()->getEmail(), $listSubContractorId)) {
  271.                                 $listSubContractorId []= $participant->getUser()->getId(); 
  272.                             }
  273.                         }
  274.                     }
  275.                 }
  276.             }
  277.         }
  278.         $determineIfArchive $routeName == "mission_index_archived" true false;
  279.         $determineIfDelete $routeName == "mission_index_deleted" true false;
  280.         $querySearch $request->get('query'null) ??  null;
  281.         $typeSearch = ($request->get('typeSearch')) ??  null;
  282.         $subContractorAndAdmin = ($this->isGranted(Role::ROLE_ADMIN->value) or $this->isGranted(Role::ROLE_SUBCONTRACTOR->value)) ? true false;
  283.         //only for subcontractor
  284.         $allSubcontractorInCampaing = [];
  285.         if ($this->isGranted(Role::ROLE_SUBCONTRACTOR->value)) {
  286.             $campaignsSubcontractor $campaignRepository->findForSubcontractor($this->getUser(), null$determineIfArchive$querySearch$subContractorAndAdmin$determineIfDelete$filterDownAndTop,null,null);
  287.              $idsCampaigns array_map(fn($campaign) => $campaign->getId(), $campaignsSubcontractor);
  288.              //dd($idsCampaigns);
  289.             $allSubcontractorInCampaing $missionParticipantRepository->getAllParticipantByCampaing($idsCampaigns,$this->getUser());
  290.         }
  291.         $searchFilterForm $this->createForm(FilterType::class, null
  292.             [
  293.                 'user' => $this->getUser(), 
  294.                 'route' => $routeName,
  295.                 'listParticipantIdForSubcontractor' => $allSubcontractorInCampaing,
  296.                 'listParticipantId'=>array_unique($listSubContractorId)
  297.         ]);
  298.         $formMissionQuantity $this->createForm(MissionQuantityType::class);
  299.         $formMissionInitialTime $this->createForm(MissionParticipantType::class);
  300.         $formMissionInitialTimeManually $this->createForm(MissionParticipantDelaisType::class);
  301.         $formMissionIncomeManually $this->createForm(MissionParticipantIncomeType::class);
  302.         
  303.         
  304.         //for filter
  305.         $searchFilterForm->handleRequest($request);
  306.         if ($searchFilterForm->isSubmitted() && $searchFilterForm->isValid()) {
  307.             $criteriaFilter = [
  308.                 'company' => $searchFilterForm->get('company')->getData(),
  309.                 'campaign' => $searchFilterForm->get('campaign')->getData(),
  310.                 'state' => $searchFilterForm->get('state')->getData(),
  311.                 'max' => $searchFilterForm->get('max')->getData(),
  312.                 'min' => $searchFilterForm->get('min')->getData(),
  313.                 'user' => $searchFilterForm->get('user')->getData(),
  314.                 'client' => (in_array('ROLE_ADMIN',$this->getUser()->getRoles()) or in_array('ROLE_ADMIN_AGENCY',$this->getUser()->getRoles())  or in_array('ROLE_MANAGER',$this->getUser()->getRoles())  ) ? $searchFilterForm->get('client')->getData() : null,
  315.             ];
  316.             $session->set('criteriaFilter'$criteriaFilter);
  317.             return $this->redirectToRoute($routeName);
  318.         }
  319.         if (!is_null($request->query->get('query'))) {
  320.             $session->set('filterDownAndTop', []);
  321.             $criteriaFilter = [];
  322.         }
  323.         // $company = ;
  324.         // $isAgency = $this->dynamicHostService->isAgency();
  325.        
  326.         if ($this->isGranted(Role::ROLE_ADMIN->value)) {
  327.             
  328.             $adminCompany =$this->isGranted(Role::ROLE_ADMIN_AGENCY->value) ?  $this->getUser()->getCompany() : null;   
  329.             
  330.             $campaigns $campaignRepository->orderedByDesiredDelivery($this->dynamicHostService->getCompany(), $determineIfArchive$querySearch$determineIfDelete$criteriaFilter$filterDownAndTop);
  331.             $nbCampaigns $campaignRepository->countOrderedByDesiredDeliveryWithoutCritarea($this->dynamicHostService->getCompany());
  332.             $priceCampaign $missionParticipantRepository->findByInitialTime();
  333.             $estimatedIncome = [];
  334.             $initialTime = [];
  335.             $price = [];
  336.             
  337.             foreach ($priceCampaign as $value) {
  338.                 if (!isset($estimatedIncome[$value->getMission()->getId()])) {
  339.                     $estimatedIncome[$value->getMission()->getId()] = [];
  340.                 }
  341.                 $initialTime[$value->getMission()->getId()][] = $value->getInitialTime();
  342.                 $price[$value->getMission()->getId()][] = $value->getEstimatedIncome();
  343.             }
  344.         } elseif ($this->isGranted(Role::ROLE_SUBCONTRACTOR->value)) {
  345.             $campaigns $campaignRepository->findForSubcontractor($this->getUser(), null$determineIfArchive$querySearch$subContractorAndAdmin$determineIfDelete$filterDownAndTop,$criteriaFilter,$this->getUser());
  346.             
  347.            
  348.             $nbCampaigns $campaignRepository->countFindForSubcontractorWithoutCriarea($this->getUser(), null);
  349.             $estimatedIncome $missionParticipantRepository->getMissionForUserGroupById($this->getUser());
  350.         } else {
  351.            
  352.             $clientCompany =$this->isGranted(Role::ROLE_CLIENT_ADMIN->value) ?  $this->getUser()->getCompany() : null
  353.            
  354.             $campaigns $campaignRepository->findForSubcontractor($this->getUser(),  $clientCompany $determineIfArchive$querySearchfalse$determineIfDelete$filterDownAndTop$criteriaFilter);
  355.             $nbCampaigns $campaignRepository->countFindForSubcontractorWithoutCriarea($this->getUser(), $clientCompany);
  356.             if ($this->isGranted(Role::ROLE_CLIENT->value) || $this->isGranted(Role::ROLE_CLIENT_ADMIN->value)) {
  357.                 $estimatedIncome null;
  358.             } else {
  359.                 $estimatedIncome $missionParticipantRepository->getMissionForUserGroupById($this->getUser());
  360.             }
  361.         }
  362.         $company $this->getUser()->getCompany();
  363.         $creditAvailable $creditService->CreditAvailable($company);
  364.         $allCredit 0;
  365.         foreach ($creditAvailable as $credit) {
  366.             $allCredit += $credit->getCredit();
  367.         }
  368.         $formCancelCampaign $this->createForm(CampaignCancelType::class);
  369.         $formDeleteCampaign $this->createForm(CampaignDeleteType::class);
  370.         $formCancelMission $this->createForm(MissionCancelType::class);
  371.         $urlToConnectWp $parameterBagInterface->get('front_website_url') . "?tsso=" hash('sha256'$this->getUser()->getEmail() . $this->getUser()->getEmail());
  372.         if(empty($filterDownAndTop)){
  373.             $campaigns $campaignService->reOrderByNumberMessageUnreadAndState($campaigns);
  374.         }
  375.         $pagination $paginator->paginate(
  376.             $campaigns,
  377.             $request->query->getInt('page'1),
  378.             $nbMissionByPage
  379.         );
  380.         $totalIndividualBilling $campaignRepository->getTotalIndividualBilling($this->getUser(), $company);
  381.         $totalOtherCommande$company!=null $commandeLoggingRepository->getTotalOtherCommande(type:4,user$this->getUser(),company $company ): ['sum'=>0];
  382.         $isFilterMissionOpen false;
  383.         if($session->has('is_filter_open')){
  384.             $isFilterMissionOpen $session->get('is_filter_open') == "true" true false;
  385.         }
  386.  
  387.         $filterExist false;
  388.         //know is filter
  389.         foreach ($criteriaFilter as $criteria) {
  390.             if(!is_null($criteria)){
  391.                 $filterExist true;
  392.                 break;
  393.             }
  394.         }
  395.         if (!is_null($querySearch)) {
  396.              $filterExist true;
  397.         }
  398.         //end filter
  399.         switch ($routeName) {
  400.             case 'mission_index':
  401.             $nameOfPage 'en cours' ;    
  402.                 break;
  403.             case 'mission_index_archived':
  404.             $nameOfPage 'terminée' ;    
  405.                 break;
  406.             case 'mission_index_deleted':
  407.             $nameOfPage 'suprimée' ;    
  408.                 break;
  409.             default:
  410.                 $nameOfPage "";
  411.                 break;
  412.         }
  413.         
  414.         return $this->renderForm('mission/index.html.twig', [
  415.             'nameOfPage' => $nameOfPage,
  416.             'filterExist' => $filterExist,
  417.             'nbCampaigns' => $nbCampaigns,
  418.             'campaigns' => $pagination,
  419.             'isEmpty' => empty($campaigns) ? true false,
  420.             'campaignsTotal' => count($campaigns),
  421.             'creditConso' => $creditConso,
  422.             'searchFilterForm' => $searchFilterForm,
  423.             'invoiced' => $invoiced,
  424.             'formMissionQuantity' => $formMissionQuantity,
  425.             'formMissionInitialTime' => $formMissionInitialTime,
  426.             'formMissionInitialTimeManually' => $formMissionInitialTimeManually,
  427.             'formMissionIncomeManually' => $formMissionIncomeManually,
  428.             'formCancelCampaign' => $formCancelCampaign,
  429.             'formDeleteCampaign' => $formDeleteCampaign,
  430.             'formCancelMission' => $formCancelMission,
  431.             'estimatedIncome' => $estimatedIncome,
  432.             'urlToConnectWp' => $urlToConnectWp,
  433.             'user' => $this->getUser(),
  434.             'archive' => $determineIfArchive,
  435.             'delete' => $determineIfDelete,
  436.             'querySearch' => $querySearch,
  437.             'typeSearch' => $typeSearch,
  438.             'nombreOfresults' => count($campaigns),
  439.             'balanceHistories' => $clientSoldService->groupByTypeOfContractNotDeleted(company$company),
  440.             'totalIndividualBilling' => ($totalIndividualBilling != null $totalIndividualBilling['sum'] : 0)+  $totalOtherCommande['sum'],
  441.             'criteriaFilter' => $criteriaFilter,
  442.             'routeName' => $routeName,
  443.             'nbMissionByPage' => $nbMissionByPage,
  444.             'isFilterMissionOpen' => $isFilterMissionOpen,
  445.             'idCurrentUser'=>$this->getUser()->getId(),
  446.         ]);
  447.     }
  448.     #[Route('/mission/history'name'mission_index_history')]
  449.     public function historyCommande(CampaignRepository $campaignRepository,PriceService $priceService,  ParameterBagInterface $parameterBagInterface)
  450.     {   
  451.         
  452.         $groupedData = [];
  453.         if ($this->isGranted('ROLE_ADMIN')) {
  454.             $company null;
  455.             if ($this->isGranted('ROLE_ADMIN_AGENCY') or $this->isGranted('ROLE_MANAGER')) {
  456.                 $company $this->getUser()->getCompany();
  457.             }
  458.             $history $campaignRepository->findAllCampaignByMonth($company);
  459.         
  460.             foreach ($history as $element) {
  461.                 //dateClosed
  462.                 $date $element['dateClosed'] != null $element['dateClosed']->format('m:Y') : $element['dateActivation']->format('m:Y');
  463.                 $info $element;
  464.                 if (!isset($groupedData[$date])) {
  465.                     $groupedData[$date] = [];
  466.                 }
  467.                 $groupedData[$date][] = $info;
  468.             }
  469.         }
  470.         elseif($this->isGranted('ROLE_SUBCONTRACTOR')){
  471.             $campaigns $campaignRepository->findAllForSubonconctractotCampaignByMonth($this->getUser());
  472.             foreach ($campaigns as $campaign) {
  473.                 $date $campaign->getDateClosed() != null $campaign->getDateClosed()->format('m:Y') : $campaign->getActivatedAt()->format('m:Y');
  474.                 if (!isset($groupedData[$date])) {
  475.                     $groupedData[$date] = [
  476.                         'total'=>0,
  477.                         'missions'=>[]
  478.                     ];
  479.                 }
  480.                 $groupedData[$date]['total'] += $priceService->getTotalPriceAndTimeMissionSubcontractorById($campaign$this->getUser())['price'] ;
  481.                 $groupedData[$date]['missions']=[...$groupedData[$date]['missions'],...$campaign->getMissions()];
  482.             }
  483.         }
  484.         $urlToConnectWp $parameterBagInterface->get('front_website_url') . "?tsso=" hash('sha256'$this->getUser()->getEmail() . $this->getUser()->getEmail());
  485.         uksort($groupedData, function($a$b) {
  486.             $dateA DateTime::createFromFormat('m:Y'$a);
  487.             $dateB DateTime::createFromFormat('m:Y'$b);
  488.             return $dateA <=> $dateB;
  489.         });
  490.         
  491.         return $this->renderForm('mission/history.html.twig', [
  492.             'histories' => $groupedData,
  493.             'historiesTotal' => count($groupedData),
  494.             'urlToConnectWp' => $urlToConnectWp,
  495.             'archive' => 0,
  496.             'delete' => 0,
  497.             'querySearch' => "",
  498.             'typeSearch' => "",
  499.         ]);
  500.     }
  501.     #[Route('/mission/{missionId}/{id}/delete'name'mission_info_delete'methods: ['GET'])]
  502.     public function deleteInfoMission(EntityManagerInterface $emInfoMissionRepository $infoMissionRepository$id$missionId): Response
  503.     {
  504.         $infoMission $infoMissionRepository->find($id);
  505.         $em->remove($infoMission);
  506.         $em->flush();
  507.                  
  508.         $this->addFlash(
  509.             type'success',
  510.             message'Info supprimeé avec succès.'
  511.         );
  512.         return $this->redirectToRoute('mission_edit', ['id' => $missionId]);
  513.     }
  514.     #[Route('/mission/ajaxEditInfoMission'name'mission_info_ajax_edit'methods: ['POST'])]
  515.     public function ajaxEditInfoMission(Request $requestEntityManagerInterface $emInfoMissionRepository $infoMissionRepository): JsonResponse
  516.     {
  517.         $data json_decode($request->getContent());
  518.         $infoMission $infoMissionRepository->find($data[0]);
  519.         $infoMission->setContent($data[1]);
  520.         $em->persist($infoMission);
  521.         try {
  522.             $em->flush();
  523.             return new JsonResponse(['status' => 'OK']);
  524.         } catch (\Exception $e) {
  525.             return new JsonResponse([
  526.                 'status' => 'KO',
  527.                 'message' => $e->getMessage(),
  528.             ]);
  529.         }
  530.     }
  531.     #[Route('/mission/edit/{missionId}/{id}'name'mission_info_edit'methods: ['POST'])]
  532.     public function editInfoMission(Request $requestEntityManagerInterface $entityManagerInfoMissionRepository $infoMissionRepository$id$missionId): Response
  533.     {
  534.         $newContent $request->request->get('info_mission_edit')['content'];
  535.         $infoMission $infoMissionRepository->find($id);
  536.         $infoMission->setContent($newContent);
  537.         
  538.         $entityManager->persist($infoMission);
  539.         $entityManager->flush();
  540.         
  541.         $this->addFlash(
  542.             type'success',
  543.             message'Info enregistré avec succès.'
  544.         );
  545.         return $this->redirectToRoute('mission_edit', ['id' => $missionId], Response::HTTP_SEE_OTHER);
  546.     }
  547.     #[Route('/missionParticipant/{id}/changeInitialTime'name'mission_change_manually_time'methods: ['GET''POST'])]
  548.     public function changeManuallyTime(Request $requestMissionParticipant $missionParticipantEntityManagerInterface $entityManagerEventDispatcherInterface $dispatcherPriceService $priceService): JsonResponse
  549.     {
  550.         $mission $missionParticipant->getMission();
  551.         $MANS_DAY_FROM_7_HOURS_TO_MINUTES 420;
  552.         $isAlreadySendMailResoumissionPanierAdmin false;
  553.         
  554.         // $this->campaignService->changeStateCampaignToRESEND($mission->getCampaign(), $mission, $missionParticipant);
  555.         $mission->setAdminTime($request->query->get('delais'));
  556.         $mission->setAdminIncome($missionParticipant->getUser()->getResaleRate() * $request->query->get('delais') /  $MANS_DAY_FROM_7_HOURS_TO_MINUTES);
  557.         if ($missionParticipant->getUser()->getBillingMethod() == && $missionParticipant->getMission()->getState() == 'in_progress') {
  558.             $missionParticipant->setInitialTime($request->query->get('delais'));
  559.             $entityManager->persist($missionParticipant);
  560.             $entityManager->flush();
  561.             $event = new MissionInitialTimeAfterValidationUpdatedEvent($mission $missionParticipant->getMission());
  562.             $dispatcher->dispatch($eventMissionInitialTimeAfterValidationUpdatedEvent::NAME);
  563.             $this->addFlash(
  564.                 type'success',
  565.                 message'Le délais client a bien été mis à jour',
  566.             );
  567.             return new JsonResponse(['redirect' => $this->generateUrl('mission_index', [], UrlGeneratorInterface::ABSOLUTE_URL)]);
  568.         }
  569.         $ratio null;
  570.         if (!empty($missionParticipant->getEstimatedIncome()) && !empty($missionParticipant->getInitialTime())) {
  571.             $ratio $missionParticipant->getEstimatedIncome() / $missionParticipant->getInitialTime();
  572.         }
  573.         $formMissionInitialTimeManually $this->createForm(MissionParticipantDelaisType::class, $missionParticipant);
  574.         $formMissionInitialTimeManually->handleRequest($request);
  575.         $missionParticipant->setInitialTime($request->query->get('delais'));
  576.         if (empty($ratio)) {
  577.             $missionParticipant->setEstimatedIncome($missionParticipant->getInitialTime() * $missionParticipant->getUser()->getDailyRate() / $MANS_DAY_FROM_7_HOURS_TO_MINUTES);
  578.         } else {
  579.             $missionParticipant->setEstimatedIncome($missionParticipant->getInitialTime() * $ratio);
  580.         }
  581.         $entityManager->persist($missionParticipant);
  582.         $entityManager->flush();
  583.         if ($this->campaignService->canResendOrderToClient(campaign$mission->getCampaign(), missionEvaluate$mission)) {
  584.            
  585.             if(!$isAlreadySendMailResoumissionPanierAdmin){
  586.                 
  587.                 $this->campaignService->resendCampaignForValidation(campaign$mission->getCampaign(), user$this->getUser());
  588.                 $isAlreadySendMailResoumissionPanierAdmin true;
  589.             }
  590.         }
  591.         
  592.         $this->addFlash(
  593.             type'success',
  594.             message'Le délais client a bien été mis à jour',
  595.         );
  596.         return new JsonResponse(['redirect' => $this->generateUrl('mission_index', [], UrlGeneratorInterface::ABSOLUTE_URL)]);
  597.     }
  598.      #[Route('/missionParticipant/changeInitialTimeModal'name'mission_change_manually_modal_all'methods: ['GET''POST'])]
  599.      public function changeManuallyTimeModalAll(Request $requestEntityManagerInterface $entityManagerEventDispatcherInterface $dispatcherPriceService $priceService): JsonResponse
  600.     {
  601.        $formData $request->request->all();
  602.        $currentUser $this->getUser();
  603.        $filteredValues array_filter($formData, function($key) {
  604.             return strpos($key'Mission_') === 0;
  605.        }, ARRAY_FILTER_USE_KEY);
  606.         $idMissions array_values($filteredValues);
  607.         foreach ($idMissions as $idMission) {
  608.             $mission $entityManager->getRepository(Mission::class)->find($idMission);
  609.             $timeSubcontractor $request->request->get('mission_initial_time_'.$idMission);
  610.             $priceSubcontractor $request->request->get('mission_initial_price_'.$idMission);
  611.             //search participant
  612.             $missionParticipant null;
  613.             foreach ($mission->getParticipants() as $participant) {
  614.                 if ($currentUser->getId() == $participant->getUser()->getId()) {
  615.                     $missionParticipant $participant;
  616.                     break;
  617.                 }
  618.             }
  619.             //upldate subcontractor information price and time
  620.             $missionParticipant->setInitialTime($timeSubcontractor);
  621.             $priceFoSubcontractor $priceService->tarifSubcontractor($missionParticipant->getUser()->getDailyRate(), $timeSubcontractor);
  622.             $missionParticipant->setEstimatedIncome($priceFoSubcontractor);
  623.             $missionParticipant->setInitialTimeAdmin($timeSubcontractor);
  624.             //prive for admin / client
  625.             $priceForAdmin =  $priceService->tarifAdminAndClient($missionParticipant->getUser()->getResaleRate(), $timeSubcontractor);
  626.             $missionParticipant->setEstimatedIncomeAdmin($priceForAdmin);
  627.             $entityManager->persist($missionParticipant);
  628.             $entityManager->flush();
  629.             //update information mission based in price and time for admin
  630.             $priceAndTimeMission $priceService->priceAndTimeMission($mission);
  631.             
  632.             $mission->setAdminIncome($priceAndTimeMission['price']);
  633.             $mission->setPrice($priceAndTimeMission['price']);
  634.             $mission->setAdminTime($priceAndTimeMission['time']);
  635.             $entityManager->persist($mission);
  636.            
  637.              //with marge if agency
  638.             $margeMyFlow =  $this->dynamicHostService->getMargeMyFlow();
  639.             if ($margeMyFlow != 0) {
  640.                 $mission->setPriceWithMargeMyFlow($priceService->getPriceMissionWithMargeMyFlow($margeMyFlow,$priceAndTimeMission['price']))->setMargeMyFlow($margeMyFlow);
  641.             }
  642.             $entityManager->flush();
  643.             $this->missionService->addHistorique(mission$missionuser$this->getUser(), action"mission_evaluate"option$missionParticipant);
  644.             $this->campaignService->changeStateEvaluateForParticipant($mission$missionParticipant);
  645.             if ($this->campaignService->canResendOrderToClient(campaign$mission->getCampaign(), missionEvaluate$mission)) {
  646.                 $this->campaignService->resendCampaignForValidation(campaign$mission->getCampaign(), user$this->getUser());
  647.             }
  648.         }
  649.         return new JsonResponse('ok');
  650.     }
  651.     #[Route('/missionParticipant/{id}/changeIncome'name'mission_change_manually_income'methods: ['GET''POST'])]
  652.     public function changeManuallyIncome(Request $requestMissionParticipant $missionParticipantEntityManagerInterface $entityManager)
  653.     {
  654.         $formMissionIncomeManually $this->createForm(MissionParticipantIncomeType::class, $missionParticipant);
  655.         $formMissionIncomeManually->handleRequest($request);
  656.         $missionParticipant->setEstimatedIncome($request->query->get('income'));
  657.         $entityManager->persist($missionParticipant);
  658.         $entityManager->flush();
  659.         $this->addFlash(
  660.             type'success',
  661.             message'Le revenu client a bien été mis à jour',
  662.         );
  663.         return $this->redirect($request->headers->get('referer'), Response::HTTP_SEE_OTHER);
  664.     }
  665.     #[Route('/mission/{id}/relancer'name'mission_relancer')]
  666.     public function campaignRelancer(Request $requestMission $missionMissionService $missionServiceEntityManagerInterface $entityManagerEventDispatcherInterface $dispatcher): Response
  667.     {
  668.         $event = new MissionResendEvent($mission);
  669.         $dispatcher->dispatch($eventMissionResendEvent::NAME);
  670.         $this->addFlash(
  671.             type'success',
  672.             message'La Mission a bien été relancer'
  673.         );
  674.         return $this->redirectToRoute('mission_index');
  675.     }
  676.     #[Route('/mission/{id}/changeQuantity'name'mission_change_quantity'methods: ['GET''POST'])]
  677.     public function changeQuantity(Request $requestMission $missionEntityManagerInterface $entityManagerMissionService $missionServicePriceService $priceService): JsonResponse
  678.     {
  679.         $formMissionQuantity $this->createForm(MissionQuantityType::class, $mission);
  680.         $formMissionQuantity->handleRequest($request);
  681.         $mission->getCampaign()->setReSendToClient(true);
  682.         $mission->setQuantity($request->query->get('quantity'));
  683.         $this->missionService->addHistorique(mission$missionuser$this->getUser(), action"quantity_update");
  684.         $entityManager->flush();
  685.         if ($this->campaignService->canResendOrderToClient(campaign$mission->getCampaign(), missionEvaluate$mission)) {
  686.             $this->campaignService->resendCampaignForValidation(campaign$mission->getCampaign(), user$this->getUser());
  687.         }
  688.         return new JsonResponse($this->getMissionDetailArray(mission$missionmissionService$missionServiceprice$priceService));
  689.     }
  690.     #[Route('/mission/{id}/changeInitialTime'name'mission_change_initial_time'methods: ['GET''POST'])]
  691.     public function changeInitialTime(Request $requestMissionParticipant $missionParticipantMissionService $missionServiceEntityManagerInterface $entityManagerPriceService $priceService): JsonResponse
  692.     {
  693.         $mission $missionParticipant->getMission();
  694.         $formMissionInitialTime $this->createForm(MissionParticipantType::class, $missionParticipant);
  695.         $formMissionInitialTime->handleRequest($request);
  696.         //upldate subcontractor information price and time
  697.         $missionParticipant->setInitialTime($formMissionInitialTime->getData()->getInitialTime());
  698.         $priceFoSubcontractor $priceService->tarifSubcontractor($missionParticipant->getUser()->getDailyRate(), $formMissionInitialTime->getData()->getInitialTime());
  699.         $missionParticipant->setEstimatedIncome($priceFoSubcontractor);
  700.         $missionParticipant->setInitialTimeAdmin($formMissionInitialTime->getData()->getInitialTime());
  701.         //add price suggered
  702.         $missionParticipant->setIncomeSuggested($formMissionInitialTime->getData()->getIncomeSuggested());
  703.         //end price suggered
  704.         //prive for admin / client
  705.         $priceForAdmin =  $priceService->tarifAdminAndClient($missionParticipant->getUser()->getResaleRate(), $formMissionInitialTime->getData()->getInitialTime());
  706.         $missionParticipant->setEstimatedIncomeAdmin($priceForAdmin);
  707.         $entityManager->persist($missionParticipant);
  708.         $entityManager->flush();
  709.         //update information mission based in price and time for admin
  710.         $priceAndTimeMission $priceService->priceAndTimeMission($mission);
  711.         //dd($priceAndTimeMission['price']);
  712.         $mission->setAdminIncome($priceAndTimeMission['price']);
  713.         $mission->setPrice($priceAndTimeMission['price']);
  714.         $mission->setAdminTime($priceAndTimeMission['time']);
  715.         $entityManager->persist($mission);
  716.        
  717.          //with marge if agency
  718.         $margeMyFlow =  $this->dynamicHostService->getMargeMyFlow();
  719.         if ($margeMyFlow != 0) {
  720.             $mission->setPriceWithMargeMyFlow($priceService->getPriceMissionWithMargeMyFlow($margeMyFlow,$priceAndTimeMission['price']))->setMargeMyFlow($margeMyFlow);
  721.         }
  722.        
  723.         $entityManager->flush();
  724.         $this->missionService->addHistorique(mission$missionuser$this->getUser(), action"mission_evaluate"option$missionParticipant);
  725.         $this->campaignService->changeStateEvaluateForParticipant($mission$missionParticipant);
  726.         if ($this->campaignService->canResendOrderToClient(campaign$mission->getCampaign(), missionEvaluate$mission)) {
  727.             $this->campaignService->resendCampaignForValidation(campaign$mission->getCampaign(), user$this->getUser());
  728.         }
  729.         return new JsonResponse($this->getMissionDetailArray(mission$missionmissionService$missionServiceprice$priceService));
  730.     }
  731.     #[Route('/mission/{id}/adminSetTime'name'mission_admin_set_initial_time'methods: ['POST'])]
  732.     #[IsGranted('ROLE_ADMIN')]
  733.     public function adminSetTime(Request $requestMission $missionEntityManagerInterface $entityManagerMissionService $missionServicePriceService $priceService): JsonResponse
  734.     {
  735.         $formMissionInitialTime $this->createForm(MissionParticipantType::class);
  736.         $formMissionInitialTime->handleRequest($request);
  737.         $isAlreadySendMailResoumissionPanierAdmin false;
  738.         foreach ($mission->getParticipants() as $participant) {
  739.             if ($participant->getRole() === Role::ROLE_SUBCONTRACTOR) {
  740.                 $participant->setInitialTime($formMissionInitialTime->getData()->getInitialTime());
  741.                 $participant->setIncomeSuggested($formMissionInitialTime->getData()->getIncomeSuggested());
  742.                 $priceFoSubcontractor $priceService->tarifSubcontractor($participant->getUser()->getDailyRate(), $formMissionInitialTime->getData()->getInitialTime());
  743.                 $participant->setEstimatedIncome($priceFoSubcontractor);
  744.                 $participant->setInitialTimeAdmin($formMissionInitialTime->getData()->getInitialTime());
  745.                 $participant->setEstimatedIncomeAdmin($formMissionInitialTime->getData()->getEstimatedIncome());
  746.                 $entityManager->flush();
  747.                if($isAlreadySendMailResoumissionPanierAdmin == false) {
  748.                     $isAlreadySendMailResoumissionPanierAdmin $this->campaignService->changeStateEvaluateForParticipant($mission$participant);
  749.                 } 
  750.             }
  751.             $missionService->addHistorique(mission$missionuser$this->getUser(), action"mission_evaluate"option$participant);
  752.         }
  753.         $priceAndTimeMission $priceService->priceAndTimeMission($mission);
  754.         $mission->setAdminIncome($priceAndTimeMission['price']);
  755.         $mission->setPrice($priceAndTimeMission['price']);
  756.         $mission->setAdminTime($priceAndTimeMission['time']);
  757.         //with marge if agency
  758.         $margeMyFlow =  $this->dynamicHostService->getMargeMyFlow();
  759.         if ($margeMyFlow != 0) {
  760.             $mission->setPriceWithMargeMyFlow($priceService->getPriceMissionWithMargeMyFlow($margeMyFlow,$priceAndTimeMission['price']))->setMargeMyFlow($margeMyFlow);
  761.         }
  762.        
  763.         //reflush
  764.         $entityManager->persist($mission);
  765.         $entityManager->flush();
  766.         
  767.         if ($this->campaignService->canResendOrderToClient(campaign$mission->getCampaign(), missionEvaluate$mission)) {
  768.            
  769.             if(!$isAlreadySendMailResoumissionPanierAdmin){
  770.                 
  771.                 $this->campaignService->resendCampaignForValidation(campaign$mission->getCampaign(), user$this->getUser());
  772.                 $isAlreadySendMailResoumissionPanierAdmin true;
  773.             }
  774.         }
  775.         return new JsonResponse($this->getMissionDetailArray(mission$missionmissionService$missionServiceprice$priceService));
  776.     }
  777.     private function getMissionDetailArray(Mission $missionMissionService $missionServicePriceService $price): array
  778.     {
  779.         $isSubContractor in_array("ROLE_SUBCONTRACTOR"$this->getUser()->getRoles()) ? $this->getUser()->getId() : false;
  780.         $total $price->totalPriceCampaign($mission->getCampaign(), $isSubContractor);
  781.         $currency $price->currency($mission->getCampaign());
  782.         if($mission->getCampaign()->getState()=='closing_in_progress' &&  sizeof($this->campaignApiService->getSubcontractorNoEstimatedIncome($mission->getCampaign())) == 0){
  783.             $this->campaignApiService->closedCampaign($mission->getCampaign());
  784.         }
  785.         $priceAndTime $this->getPriceAndTimeForTwig(mission$missionmissionService$missionServicepriceService$price);
  786.         // dd((float) $priceAndTime['price']);
  787.         $price $this->numberFormatService->format((float) $priceAndTime['price']);
  788.         $time =  $this->numberFormatService->format((float) $priceAndTime['time']);
  789.         // //credit or euros
  790.         return [
  791.             'incomeSuggested' => $mission?->onlySubcontractorInMission()?->getIncomeSuggested(),
  792.             // 'total' =>  $this->campaignService->getTotalCost(campaign: $mission->getcampaign(), withCurrency: true),
  793.             'total' =>  $this->numberFormatService->format($total) . $currency,
  794.             'price' => $price,
  795.             'time' => $time,
  796.             'id' => $mission->getId(),
  797.             'campaign_id' => $mission->getCampaign()->getId(),
  798.             'campaign_status' => $this->twig->render('services/status_campaign.html.twig', [
  799.                 'campaign' => $mission->getCampaign(),
  800.             ]),
  801.             'subcontractor_status' => $this->twig->render('services/subcontractor_status.html.twig', [
  802.                 'campaign' => $mission->getCampaign(),
  803.                 'mission' => $mission
  804.             ]),
  805.             'campaign_action_button' => $this->twig->render('services/_button_campaign.html.twig', [
  806.                 'campaign' => $mission->getCampaign(),
  807.                 'campaign_service' => $this->campaignService,
  808.             ]),
  809.             'mission_action_button' => $this->twig->render('services/action_button_mission.html.twig', [
  810.                 'campaign' => $mission->getCampaign(),
  811.                 'mission' => $mission
  812.             ]),
  813.             'subcontractor_list' => $this->twig->render('services/subcontractor_list.html.twig', [
  814.                 'campaign' => $mission->getCampaign(),
  815.                 'mission' => $mission
  816.             ]),
  817.             'marge' => $this->twig->render('services/_marge_get_to_ajax.html.twig', [
  818.                 'mission' => $mission
  819.             ]),
  820.             'isAdmin' => in_array("ROLE_ADMIN"$this->getUser()->getRoles()) ? true false,
  821.             'product_type' => $mission->getProduct()->getType()->value
  822.         ];
  823.     }
  824.     private function getPriceAndTimeForTwig(Mission $missionMissionService $missionServicePriceService $priceService)
  825.     {
  826.         $estimatedIncomeAndTime $this->missionService->getEstimatedIncomeAndTime(mission$missionuser$this->getUser());
  827.         $priceOrTimeAdmin $priceService->priceAndTimeMission($mission);
  828.         $price "";
  829.         $time "";
  830.         $validAllAdmin false;
  831.         if (in_array("ROLE_ADMIN"$this->getUser()->getRoles()) 
  832.             or in_array("ROLE_MANAGER"$this->getUser()->getRoles()) 
  833.             or in_array("ROLE_ADMIN_AGENCY"$this->getUser()->getRoles()) 
  834.         ) { 
  835.             $validAllAdmin true;
  836.         }
  837.         if ($mission->getProduct()->getType() == ProductType::A_EVALUER) {
  838.             // if (!$missionService->isAllSubcontractorEvaluate(mission: $mission)) {
  839.             //     $price = $validAllAdmin ? "not-evaluate" : $estimatedIncomeAndTime["income"];
  840.             //     $time = in_array("ROLE_ADMIN", $this->getUser()->getRoles()) ? "not-evaluate" : $estimatedIncomeAndTime["time"];
  841.             // } else {
  842.                 $price $validAllAdmin $priceOrTimeAdmin['price'] : $estimatedIncomeAndTime["income"];
  843.                 $time $validAllAdmin $priceOrTimeAdmin['time'] : $estimatedIncomeAndTime["time"];
  844.            // }
  845.         } else {
  846.             $price $validAllAdmin $priceOrTimeAdmin['price'] : $estimatedIncomeAndTime["income"];
  847.             $time $validAllAdmin $priceOrTimeAdmin['time'] : $estimatedIncomeAndTime["time"];
  848.         }
  849.         return [
  850.             'price' => $price,
  851.             'time' => $time
  852.         ];
  853.     }
  854.     #[Route('/subcontractor/html'name'mission_subcontractor_html'methods: ['GET''POST'])]
  855.     public function getMissionSubcontractorHtml(Request $requestUserRepository $userRepository): Response
  856.     {
  857.         $formEditSubcontractor  $this->createForm(EditSubcontractorParticipantType::class);
  858.         return  $this->render('services/subcontractror_edit_form.html.twig', [
  859.             'formEditSubcontractor' => $formEditSubcontractor->createView(),
  860.             'urlAction' => $request->getContent()
  861.         ]);
  862.     }
  863.     #[Route('/subcontractor/html/add'name'mission_subcontractor_html_add'methods: ['GET''POST'])]
  864.     public function getMissionSubcontractorHtmlAdd(Request $request): Response
  865.     {
  866.         return  $this->render('services/subcontractror_add_form.html.twig', [
  867.             'formAddMissionSubContractor' => $this->createForm(AddMissionSubContractorType::class)->createView(),
  868.             'name' => $request->getContent()
  869.         ]);
  870.     }
  871.     
  872.      #[Route('/modal/contract/{id}'name'get_modal_contract'methods: ['GET''POST'])]
  873.     public function modalChangeContract(Mission $mission){
  874.         $formEditCampaignCredit $this->createForm(CampaignCreditHistoryType::class, $mission->getCampaign());
  875.         return $this->renderForm('mission/_modal_edit_campaign_contract_type_body.htm.twig',['formEditCampaignCredit'=>$formEditCampaignCredit]);
  876.     }
  877.     
  878.     #[Route('/select-all-file-resource/{id}/{type}'name'select_all_file_resource'methods: ['GET''POST'], defaults:['type'=>'toggle'])]
  879.     public function selectAllResourceMission(SharedResourcesCategory $sharedResourcesCategoryRequest $requeststring $type='toggle'){
  880.         $elementAlreadySelected =  $this->session->get('element-resource-mission-selected')?:[];
  881.         $query $this->session->get('query-resource-mission') ?: null;
  882.         $filePermissions $this->filePermissionsRepository->findAllBy($sharedResourcesCategory,  $query); 
  883.         if($type == 'un-select-all'){
  884.             $elementAlreadySelected = [];
  885.         }else{
  886.             if(($type == 'all' && count($elementAlreadySelected)!= count($filePermissions)) || count($elementAlreadySelected) == 0){
  887.                 $elementAlreadySelected = [];
  888.                 foreach ($filePermissions as $file) {
  889.                         $elementAlreadySelected[]= $file->getId();
  890.                 }
  891.     
  892.             }else{
  893.                 $elementAlreadySelected = [];
  894.             }
  895.         }
  896.     
  897.         
  898.         $this->session->set('element-resource-mission-selected',$elementAlreadySelected);
  899.      
  900.         return new JsonResponse([
  901.             'status'=>'ok',
  902.             'data'=>$elementAlreadySelected,
  903.         ]);
  904.     }
  905.     /**
  906.      * Fonction qui met/enlève l'id de la resource livrable sélectionné par l'utilisateur dans la session element-delivrable-resource-selected 
  907.      * @param FilePermissions  $filePermissions
  908.      * @return Array JsonResponse
  909.     */
  910.     #[Route('/toggle-select-one-delivrable-resource/{id}',name:'select_one_delivrable_resource')]
  911.     public function toggleSelectDelivrableSharedResource(FilePermissions $filePermissions){
  912.        $delivrableSharedResourceSelected $this->session->get('element-delivrable-resource-selected')?:[];
  913.        $selectedDelivrableSharedResourceId $filePermissions->getId();
  914.        $alreadySelected in_array($selectedDelivrableSharedResourceId,$delivrableSharedResourceSelected);
  915.        if($alreadySelected){
  916.             $delivrableSharedResourceSelected = (array) array_filter($delivrableSharedResourceSelected, function($item) use ($filePermissions){
  917.             return $item != $filePermissions->getId();
  918.             });
  919.        }else{
  920.             $delivrableSharedResourceSelected[]= $selectedDelivrableSharedResourceId;
  921.        }
  922.        $this->session->set('element-delivrable-resource-selected',$delivrableSharedResourceSelected);
  923.        return new JsonResponse([
  924.         'status'=>'ok',
  925.         'data'=>$delivrableSharedResourceSelected,
  926.         'nbrAllElement'=>$this->session->get('nbr-filePermissions-missions')
  927.         ]);
  928.     }
  929.     #[Route('/toggle-selected-one-file-resource/{id}'name'select_on_file_resource')]
  930.     public function sharedResourcesSeleted(FilePermissions $filePermissions): JsonResponse
  931.     {   
  932.         $elementAlreadySelected =  $this->session->get('element-resource-mission-selected')?:[];
  933.         if(in_array($filePermissions->getId(), $elementAlreadySelected)){
  934.             $elementAlreadySelected = (array) array_filter($elementAlreadySelected, function($item) use ($filePermissions){
  935.                   return $item != $filePermissions->getId();
  936.             });
  937.         }
  938.         else{
  939.             $elementAlreadySelected[]= $filePermissions->getId();
  940.         }
  941.         $this->session->set('element-resource-mission-selected',$elementAlreadySelected);
  942.         return new JsonResponse([
  943.             'status'=>'ok',
  944.             'data'=>$elementAlreadySelected,
  945.             'nbrAllElement'=>$this->session->get('nbr-filePermissions-missions')
  946.         ]);
  947.     }
  948.  
  949.     #[Route('/download-all-file-resource-mission/{id}'name'download-file-shared-file-resource-mission')]
  950.     public function downloadAllFileResourceMissionSelected(Company $companyRequest $request): StreamedResponse|RedirectResponse 
  951.     {   
  952.         
  953.          $idsFileSelected $this->session->get('element-resource-mission-selected') ?? [];
  954.          $fileSelected = []; 
  955.          $fileNAbleToDownload = [] ; 
  956.          $canDownload false
  957.          foreach ($idsFileSelected as  $id) {
  958.             $filePermission $this->filePermissionsRepository->getOneByFileId($id); 
  959.             if($filePermission != null && $filePermission->getCompanyResource()->getFileType() == 'file' && !$filePermission->getCompanyResource()->getFileCompanyResources()->isEmpty()){
  960.               
  961.                     $fileCompanyResource $filePermission->getCompanyResource()->getFileCompanyResources()[0]; 
  962.                     $fileUrl $this->googleStorageService->getUrlBucket("company-" strtolower($company->getId()), "company-resource/{$fileCompanyResource->getName()}); 
  963.                     $fileSelected[] = $fileUrl
  964.                     $canDownload true;
  965.          
  966.             }
  967.             else{
  968.             
  969.                     $fileNAbleToDownload[] = $filePermission->getCompanyResource()->getName(); 
  970.             }
  971.          }
  972.         $zipFilePath sys_get_temp_dir() . '/fichiers_' uniqid() . '.zip';
  973.         $zip = new \ZipArchive();
  974.         if ($zip->open($zipFilePath\ZipArchive::CREATE \ZipArchive::OVERWRITE) !== true) {
  975.             throw new \Exception('Impossible de créer le fichier ZIP.');
  976.         }
  977.          foreach ($fileSelected as $index => $fileUrl) {
  978.             $fileContent file_get_contents($fileUrl);
  979.             
  980.             if ($fileContent === false) {
  981.                 throw new \Exception("Erreur lors du téléchargement du fichier : $fileUrl");
  982.             }
  983.             // Récupérer le nom du fichier depuis l'URL
  984.             $fileName basename(parse_url($fileUrlPHP_URL_PATH));
  985.             
  986.             // Ajouter le fichier dans le ZIP
  987.             $zip->addFromString($fileName$fileContent);
  988.         }
  989.         $zip->close(); 
  990.         if( count($fileNAbleToDownload) > ){
  991.             $stringFile implode(', '$fileNAbleToDownload ); 
  992.             $this->addFlash(
  993.                 'success'
  994.                 "Ces éléments ne peuvent pas être téléchargés, car ce ne sont pas des fichiers. ($stringFile)" 
  995.             ); 
  996.             try{
  997.                 unlink($zipFilePath); 
  998.             }catch(\Exception $e){}
  999.         }
  1000.         
  1001.         return $canDownload &&  count($fileNAbleToDownload) == 
  1002.         new StreamedResponse(function () use ($zipFilePath) {
  1003.             readfile($zipFilePath);
  1004.             unlink($zipFilePath); // Supprimer le fichier temporaire après téléchargement
  1005.         }, 200, [
  1006.             'Content-Type' => 'application/zip',
  1007.             'Content-Disposition' => 'attachment; filename="mes_fichiers.zip"',
  1008.         ]) : $this->redirect($request->headers->get('referer'));
  1009.     }
  1010.     #[Route('/mission/{id}/refus'name'mission_refus'methods: ['GET'])]
  1011.     public function refuse(Mission $missionUserRepository $userRepositoryRequest $requestMissionParticipantRepository $missionParticipantRepositoryEntityManagerInterface $entityManagerEventDispatcherInterface $dispatcher)
  1012.     {
  1013.         $intervenant $userRepository->find($request->query->get('intervenant'));
  1014.         if (null === $intervenant) {
  1015.             throw new NotFoundHttpException();
  1016.         }
  1017.         $event = new MissionRefusedEvent($mission$intervenant);
  1018.         $dispatcher->dispatch($eventMissionRefusedEvent::NAME);
  1019.         $this->addFlash(
  1020.             type'success',
  1021.             message'La mission a bien été refusée',
  1022.         );
  1023.         $this->missionService->addHistorique(mission$missionuser$this->getUser(), action"refus");
  1024.         return $this->redirectToRoute('mission_index');
  1025.     }
  1026.     #[Route('/mission/{id}/accepter'name'mission_accept'methods: ['GET'])]
  1027.     public function accept(Mission $missionClientSoldService $clientSoldServiceUserRepository $userRepositoryRequest $requestEntityManagerInterface $entityManagerEventDispatcherInterface $dispatcher)
  1028.     {
  1029.         if (empty($request->query->get('intervenant'))) {
  1030.             $intervenant $this->getUser();
  1031.         } else {
  1032.             $intervenant $userRepository->find($request->query->get('intervenant'));
  1033.         }
  1034.         if (null === $intervenant) {
  1035.             throw new NotFoundHttpException();
  1036.         }
  1037.         if ($mission->getWorkflow()) {
  1038.             $step $mission->getWorkflow()->getSteps()->first();
  1039.             $step->setActive(true);
  1040.             if ($step->getManager() == 0) {
  1041.                 $mission->setStateClient('Déclenchement en attente');
  1042.             } else {
  1043.                 $mission->setStateProvider($step->getName());
  1044.             }
  1045.             $event = new WorkflowStepEnteredEvent($step);
  1046.             $dispatcher->dispatch($eventWorkflowStepEnteredEvent::NAME);
  1047.         }
  1048.         $campaign $mission->getCampaign();
  1049.         $campaign->setState('in_progress');
  1050.         $mission->setState('in_progress');
  1051.         $entityManager->flush();
  1052.         $event = new MissionAcceptedEvent($mission$intervenant);
  1053.         $dispatcher->dispatch($eventMissionAcceptedEvent::NAME);
  1054.         $this->addFlash(
  1055.             type'success',
  1056.             message'La mission a bien été acceptée',
  1057.         );
  1058.         return $this->redirectToRoute('mission_index');
  1059.     }
  1060.     #[Route('/mission/{id}/{transition<pause|unpause|cancel|archive>}'name'mission_transition')]
  1061.     public function transition(Mission $missionstring $transitionClientSoldService $clientSoldServiceEventDispatcherInterface $dispatcherRequest $requestRegistry $workflowsEntityManagerInterface $entityManager): RedirectResponse
  1062.     {
  1063.         $workflow $workflows->get($mission'classic');
  1064.         $originalMission = clone $mission;
  1065.         $originalCampaign = clone $mission->getCampaign();
  1066.         if ($workflow->can($mission$transition)) {
  1067.             $workflow->apply($mission$transition);
  1068.             $applyToCampaign true;
  1069.             foreach ($mission->getCampaign()->getMissions() as $otherMission) {
  1070.                 if ($otherMission->getState() !== $mission->getState()) {
  1071.                     $applyToCampaign false;
  1072.                     break;
  1073.                 }
  1074.             }
  1075.             if ($applyToCampaign) {
  1076.                 $campaign $mission->getCampaign();
  1077.                 $workflow $workflows->get($campaign'classic');
  1078.                 if ($workflow->can($campaign$transition)) {
  1079.                     $workflow->apply($campaign$transition);
  1080.                 }
  1081.                 $entityManager->persist($campaign);
  1082.             }
  1083.             if ($transition === 'cancel') {
  1084.                 $formCancelMission $this->createForm(MissionCancelType::class, $mission);
  1085.                 $formCancelMission->handleRequest($request);
  1086.                 $mission->setLastState($originalMission->getState());
  1087.                 $this->missionService->addHistorique(mission$missionuser$this->getUser(), action"cancel");
  1088.                 //when all mission is canceled change status campaing
  1089.                 $allmissionIsCanceled true;
  1090.                 foreach ($originalCampaign->getMissions() as $missionP) {
  1091.                     if ($missionP->getState() != "cancelled") {
  1092.                         $allmissionIsCanceled false;
  1093.                     }
  1094.                 }
  1095.                 if ($allmissionIsCanceled) {
  1096.                     $mission->getCampaign()->setLastState($originalCampaign->getState());
  1097.                     $mission->getCampaign()->setState("cancelled");
  1098.                 }
  1099.                 $event = new MissionCancelledEvent($mission);
  1100.                 $dispatcher->dispatch($eventMissionCancelledEvent::NAME);
  1101.             }
  1102.         }
  1103.         if ($transition === 'archive') {
  1104.             $event1 = new MissionClosedEvent($mission);
  1105.             $dispatcher->dispatch($event1MissionClosedEvent::NAME);
  1106.             $mission->setState('finalized');            
  1107.             $mission->setLastState($originalMission->getLastState());
  1108.             $event = new MissionArchivedEvent($mission);
  1109.             $dispatcher->dispatch($eventMissionArchivedEvent::NAME);
  1110.             $numberOfMissionFinalized 0;
  1111.             $campaign $mission->getCampaign();
  1112.             if ($mission->getProduct()->getType() != ProductType::AU_FORFAIT) {
  1113.                 $clientSoldService->decreaseCurrentBalanceByMissionCost(mission$mission);
  1114.             }
  1115.             foreach ($campaign->getMissions() as $missionPersited) {
  1116.                 if ($missionPersited->getProduct()->getName() == "Espace de discussion") {
  1117.                     $numberOfMissionFinalized++;
  1118.                 }
  1119.                 if ($missionPersited->getid() == $mission->getId()) {
  1120.                     $numberOfMissionFinalized++;
  1121.                 } elseif ($missionPersited->getState() ==  "finalized" or $missionPersited->getState() == "cancelled") {
  1122.                     $numberOfMissionFinalized++;
  1123.                 }
  1124.             }
  1125.             if ($numberOfMissionFinalized == sizeof($campaign->getMissions())) {
  1126.                 $campaign->setState('closed');
  1127.                 $campaign->setNewForLivrable(true);
  1128.                 $entityManager->persist($campaign);
  1129.                 $this->addFlash(
  1130.                     type'success',
  1131.                     message'La campagne a bien été clôturée',
  1132.                 );
  1133.             }
  1134.         }
  1135.         $entityManager->flush();
  1136.         $message = match ($transition) {
  1137.             'archive' => 'archivée',
  1138.             'pause' => 'mise en pause',
  1139.             'unpause' => 'relancée',
  1140.             'cancel' => 'annulée',
  1141.             default => 'enregistrée',
  1142.         };
  1143.         $this->missionService->addHistorique(mission$missionuser$this->getUser(), action$transition);
  1144.         $this->addFlash(
  1145.             type'success',
  1146.             message'La mission a bien été ' $message,
  1147.         );
  1148.         return $this->redirect($request->headers->get('referer'));
  1149.     }
  1150.     #[Route('/mission/{id}/list/participant'name'mission_list_participant'methods: ['GET'])]
  1151.     public function ListParticipant($idRequest $requestMissionRepository $missionRepositoryMissionParticipantRepository $missionParticipantRepositoryServiceRepository $serviceRepositoryPriceService $priceService)
  1152.     {
  1153.         $mission $missionRepository->find($id);
  1154.         $formMissionInitialTimeManually $this->createForm(MissionParticipantDelaisType::class);
  1155.         return $this->renderForm(
  1156.             'mission/_modal_list_all_participant.html.twig',
  1157.             [
  1158.                 'mission' => $mission,
  1159.                 'campaign' => $mission->getCampaign(),
  1160.                 'formMissionInitialTimeManually' => $formMissionInitialTimeManually
  1161.             ]
  1162.         );
  1163.     }
  1164.     #[Route('/mission/{id}/activation'name'mission_activate'methods: ['GET''POST'])]
  1165.     public function Activate(NumberFormatService $numberFormatServiceMyFlowMarginService $myFlowMarginServiceMissionService $missionService,  ClientSoldService $clientSoldServiceMission $missionEventDispatcherInterface $dispatcherEntityManagerInterface $entityManagerMissionParticipantRepository $missionParticipantRepositoryRouterInterface $routerPriceService $priceServiceWorkflowStepRepository $workflowStepRepository): RedirectResponse
  1166.     {
  1167.         $error false;
  1168.         if (!$this->missionService->canActivateMission(mission$mission)) {
  1169.             $error true;
  1170.             $this->addFlash(
  1171.                 type'error',
  1172.                 message'La mission n\'est pas activable pour le moment'
  1173.             );
  1174.             return $this->redirectToRoute('mission_index');
  1175.         }
  1176.         if (null === $mission->getWorkflow()) {
  1177.             $error true;
  1178.             $this->addFlash(
  1179.                 type'error',
  1180.                 message'La mission n\'a pas de workflow, merci de contacter l\'administrateur',
  1181.             );
  1182.             return $this->redirectToRoute('mission_index');
  1183.         }
  1184.         $campaign $mission->getCampaign();
  1185.         if ($this->isGranted(Role::ROLE_SUBCONTRACTOR->value) or $this->isGranted(Role::ROLE_ADMIN->value)) {
  1186.             $missionService->setDefaultValueIfAnUserClickedAnActivationButtonWithoutADelaisAndTimeIsEmpty($mission$priceService);
  1187.             if (empty($mission->getPreActivatedAt())) {
  1188.                 $mission->setPreActivatedAt(new \DateTime());
  1189.             }
  1190.             //////////////////// Check marge mission  
  1191.             $getMargeMyFlow $priceService->marginExceeded(mission$mission);
  1192.             if ($getMargeMyFlow['marginExceeded'] == true and $mission->getProduct()->getType() != ProductType::AU_TEMPS_PASSE) {
  1193.                 if ($this->isGranted(Role::ROLE_SUBCONTRACTOR->value)) {
  1194.                     $error true;
  1195.                     $this->addFlash(
  1196.                         type'error',
  1197.                         message"Nous avons rencontré un problème, l'administrateur vient d'être informé pour activer la mission",
  1198.                     );
  1199.                     $event = new MissionCanActivateEvent(mission$mission);
  1200.                     $dispatcher->dispatch($eventMissionCanActivateEvent::NAME);
  1201.                     return $this->redirectToRoute('mission_index');
  1202.                 }
  1203.                 if ($this->isGranted(Role::ROLE_ADMIN->value)) {
  1204.                     $this->addFlash(
  1205.                         type'success',
  1206.                         message"La mission {$mission->getReference()} a bien activée",
  1207.                     );
  1208.                 }
  1209.             }
  1210.             ////////////////////////
  1211.             foreach ($mission->getParticipants() as $missionParticipation) {
  1212.                 if ($this->isGranted(Role::ROLE_SUBCONTRACTOR->value)) {
  1213.                     if ($this->getUser() == $missionParticipation->getUser()) {
  1214.                         // check marge Myflow
  1215.                         $missionParticipation->setActivated(true);
  1216.                         $missionParticipation->setActivatedAt(new \DateTime());
  1217.                         $this->missionService->addHistorique(mission$missionuser$this->getUser(), action"activation");
  1218.                         $entityManager->persist($missionParticipation);
  1219.                         $entityManager->flush();
  1220.                         break;
  1221.                     }
  1222.                 } elseif ($this->isGranted(Role::ROLE_ADMIN->value)) {
  1223.                     $missionParticipation->setActivated(true);
  1224.                     $missionParticipation->setActivatedAt(new \DateTime());
  1225.                     $entityManager->persist($missionParticipation);
  1226.                     $entityManager->flush();
  1227.                 }
  1228.             }
  1229.             if (sizeof($this->missionService->getListSubcontractorNotActivate(mission$mission)) == 0) {
  1230.                 if ($mission->getProduct()->getType() === ProductType::A_EVALUER) {
  1231.                     $client $mission->getCampaign()->getOrderedBy();
  1232.                     $event = new MissionActivatedEvent($mission$client);
  1233.                     $dispatcher->dispatch($eventMissionActivatedEvent::NAME);
  1234.                 }
  1235.                 if ($this->missionService->lackSubcontractorTest(mission$mission)) {
  1236.                     $event = new MissionNotificationActivatedEvent($mission);
  1237.                     $dispatcher->dispatch($eventMissionNotificationActivatedEvent::NAME);
  1238.                     $this->addFlash(
  1239.                         type'success',
  1240.                         message"La mission {$mission->getReference()} a bien activée",
  1241.                     );
  1242.                 } else {
  1243.                     $this->addFlash(
  1244.                         type'success',
  1245.                         message"Votre activation a bien été prise en compte.Nous devons toutefois attendre d'autres intervenants pour démarrer la mission. Vous serez prochainement notifié par Email.",
  1246.                     );
  1247.                 }
  1248.                 if ($mission->getProduct()->getType() != ProductType::AU_TEMPS_PASSE) {
  1249.                     $clientSoldService->decreaseCurrentBalanceByMissionCost(mission$mission);
  1250.                 }
  1251.                 if ($error === false) {
  1252.                     $mission->setState('in_progress');
  1253.                     ////////////////////////////////
  1254.                     //////////////////////
  1255.                     $entityManager->flush();
  1256.                 }
  1257.             } else {
  1258.                 $this->addFlash(
  1259.                     type'success',
  1260.                     message"Votre activation a bien été prise en compte.Nous devons toutefois attendre la validation des autres intervenants pour démarrer la mission. Vous serez prochainement notifié par Email.",
  1261.                 );
  1262.             }
  1263.             //new validation for all subcontractor not activate 
  1264.             foreach ($this->campaignService->getListSubcontractorNotActivate(campaign$campaign) as $participant) {
  1265.                 $event = new MissionAcceptedEvent($mission$participant);
  1266.                 $dispatcher->dispatch($eventMissionAcceptedEvent::NAME);
  1267.             }
  1268.             if ($this->campaignService->isCanStart(campaign$campaign)) {
  1269.                 $campaign->setState('in_progress');
  1270.                 $campaign->setReSendToClient(false);
  1271.                 $campaign->setClientStatus("");
  1272.                 // --------------------------
  1273.                 $campaign->setReSendToClient(false);
  1274.                 foreach ($campaign->getMissions() as $mission) {
  1275.                     if (!empty($mission->getWorkflow())) {
  1276.                         //take a step first by position
  1277.                         $step $workflowStepRepository->getFirstStep($mission->getWorkflow());
  1278.                         $step->setActive(true);
  1279.                     } else {
  1280.                         $this->addFlash(
  1281.                             type'error',
  1282.                             message'Activation impossible car la campagne n\'a pas de workflow',
  1283.                         );
  1284.                         return $this->redirectToRoute('mission_index');
  1285.                     }
  1286.                     if ($step->getManager() == 0) {
  1287.                         $mission->setStateClient('Déclenchement en attente');
  1288.                     } else {
  1289.                         $mission->setStateProvider($step->getName());
  1290.                     }
  1291.                     $event = new WorkflowStepEnteredEvent($step);
  1292.                     $dispatcher->dispatch($eventWorkflowStepEnteredEvent::NAME);
  1293.                 }
  1294.                 // ---------------------------
  1295.                 $this->addFlash(
  1296.                     type'success',
  1297.                     message"La  campagne {$campaign->getName()} à démarrer  ",
  1298.                 );
  1299.                 $this->missionService->addHistorique(mission$missionuser$this->getUser(), action"activation");
  1300.             }
  1301.             //if error not persist
  1302.             if ($error === false) {
  1303.                 $entityManager->flush();
  1304.             }
  1305.         }
  1306.         return $this->redirectToRoute('mission_index');
  1307.     }
  1308.     #[Route('/mission/{id}/uncancelled'name"mission_uncancelled")]
  1309.     public function missionUncancelled(Mission $missionEntityManagerInterface $entityManagerInterface): Response
  1310.     {
  1311.         $mission->setState($mission->getLastState());
  1312.         $entityManagerInterface->flush();
  1313.         $this->addFlash(
  1314.             type'success',
  1315.             message"La mission reprend avec succès ",
  1316.         );
  1317.         return $this->redirectToRoute('mission_index');
  1318.     }
  1319.     #[Route('/mission/desired-delivery/{id}'name"mission_desired_delivery_change")]
  1320.     public function changeDesiredDelivery(Mission $mission,EventDispatcherInterface $dispatcherRequest $requestEntityManagerInterface $entityManager){
  1321.         
  1322.         $date $request->request->get('desired-delivery');
  1323.         $datetime = new DateTime($date);
  1324.         $mission->setDesiredDelivery($datetime);
  1325.         $entityManager->persist($mission);
  1326.         $entityManager->flush();
  1327.      
  1328.         $event = new MissionDesiredDeliveryUpdatedAfterValidationEvent($mission);
  1329.         $dispatcher->dispatch($eventMissionDesiredDeliveryUpdatedAfterValidationEvent::NAME);
  1330.         $this->missionService->addHistorique(mission$missionuser$this->getUser(), action"deadline_change");
  1331.         $this->addFlash('success','Nouvelle échéance enregistrée avec succès');
  1332.         return  $this->redirectToRoute('mission_edit',['id'=>$mission->getId()]) ; 
  1333.     }
  1334.    
  1335.     #[Route('/mission/file-history/{id}/{type}/{fileName}'name"file_history")]
  1336.     public function addFileHistory(Mission $mission,MissionService $missionService,string $type,  string $fileName,EntityManagerInterface $entityManager){
  1337.          //get file by name
  1338.         $fileMessage $entityManager->getRepository(FileMessage::class)->findOneBy(['name' => $fileName]);
  1339.         $fileCampaign $entityManager->getRepository(FileMission::class)->findOneBy(['name' => $fileName]);
  1340.         if($type=='save'){
  1341.             $bucket strtolower("company-".$mission->getCampaign()->getCompany()->getId());
  1342.             $missionService->addHistorique($mission$this->getUser(), 'save_file'$fileName) ;
  1343.            
  1344.             if (!is_null($fileMessage)) {
  1345.                $fileMessage->setIsNotInfected(true);
  1346.                $entityManager->persist($fileMessage);
  1347.                $entityManager->flush();
  1348.             }
  1349.             if (!is_null($fileCampaign)) {
  1350.                $fileCampaign->setIsNotInfected(true);
  1351.                $entityManager->persist($fileCampaign);
  1352.                $entityManager->flush();
  1353.             }
  1354.             
  1355.             
  1356.         }
  1357.         elseif($type=="delete"){
  1358.             $missionService->addHistorique($mission$this->getUser(), 'delete_file'$fileName) ;
  1359.         }
  1360.         return  new JsonResponse([
  1361.             'status'=>'ok',
  1362.             'idFile' => !is_null($fileMessage) ? $fileMessage->getId() : null,
  1363.             'idFileCampaign' => !is_null($fileCampaign) ? $fileCampaign->getId() : null,
  1364.         ]) ;
  1365.     }
  1366.     #[Route('/mission/file-save/{id}/all'name"file_history_save_all")]
  1367.     public function saveFileHistory(Mission $mission,MissionService $missionService,){
  1368.         return  new JsonResponse([
  1369.             'file'=> $this->googleStorageService->saveFileHistory($mission$missionService)
  1370.         ]) ;
  1371.     }
  1372.     #[Route('/mission/test-file-save/{id}/all'name"file_history_save_all_test")]
  1373.     public function testSaveFileHistory(Mission $mission,MissionService $missionService,){
  1374.         return  new JsonResponse([
  1375.             'result'=> $this->googleStorageService->testSaveFileHistory($mission$missionService)
  1376.         ]) ;
  1377.     }
  1378.     #[Route('/mission_notified/notifiy-admin-mission-participants/{id}'name"notify_admin_missin_participants")]
  1379.     public function notifyAdminMissingParticipants(Campaign $campaignRequest $request){
  1380.         
  1381.         $event = new AdminNotifiedMissionParticipantEvent($campaign);
  1382.         $this->dispatcher->dispatch($event,AdminNotifiedMissionParticipantEvent::NAME );
  1383.         $this->addFlash('success''Message envoyé avec succès aux administrateurs');
  1384.         return $this->redirect($request->headers->get('referer'));
  1385.     }
  1386.     #[Route('/mission/file-save-one/{id}'name"file_save")]
  1387.     public function donwloadFile(Mission $missionMissionService $missionService,GoogleStorageService $googleStorageService,Request $request){
  1388.         $url $request->request->get('url');
  1389.         $company $mission->getCampaign()->getCompany();
  1390.         $nameOfBucket strtolower("company-".$company->getId());
  1391.         return new JsonResponse($this->googleStorageService->getUrl($nameOfBucket,$url));
  1392.     }
  1393.     private function addLeadingSlashToImagePath($htmlContent) {
  1394.         // Use preg_replace to find image tags and modify the src attribute
  1395.         $pattern '/<img([^>]+)src="([^"]+)"([^>]+)>/';
  1396.         $replacement '<img$1src="/$2"$3>'// Add a slash at the beginning of the captured src attribute
  1397.         $newHtmlContent preg_replace($pattern$replacement$htmlContent);
  1398.         return $newHtmlContent;
  1399.     }
  1400.     #[Route('/update-active-tab'name"update_active_tab")]
  1401.     public function UpdateActiveTab(Request $request,EntityManagerInterface $entityManager) : JsonResponse
  1402.     {
  1403.         $missionActiveTab $request->request->get('mission-active-tab');
  1404.         $connectedUser $this->getUser();
  1405.         if($connectedUser->getUserData() == null) {
  1406.             $userData = new UserData();
  1407.             $userData->setMissionTabActive($missionActiveTab);           
  1408.         }else{
  1409.             $userData $connectedUser->getUserData();
  1410.             $userData->setMissionTabActive($missionActiveTab);
  1411.         }
  1412.         $entityManager->persist($userData);
  1413.         $connectedUser->setUserData($userData);
  1414.         $entityManager->persist($connectedUser);
  1415.         $entityManager->flush();
  1416.         return new JsonResponse('ok');
  1417.     }
  1418.     #[Route('/note-campaign-modified/{id}'name'note_campaign_modified'methods: ['GET','POST'])]
  1419.     public function noteModificationCampaign(noteCampaing $noteRequest $request): Response
  1420.     
  1421.         $content $request->request->get('info_mission_edit')['content'];
  1422.         if (!is_null($content) and !empty($content)) {
  1423.             $note->setContent($content);
  1424.             $this->entityManager->persist($note);
  1425.             $this->entityManager->flush();
  1426.            
  1427.         }
  1428.         $this->addFlash(
  1429.             type'success',
  1430.             message'Modification effectuée'
  1431.         );
  1432.         return $this->redirect($request->headers->get('referer'));
  1433.     }
  1434.     #[Route('/note-campaign-deleted/{id}'name'note_campaign_deleted'methods: ['GET','POST'])]
  1435.     public function noteDeletedCampaign(noteCampaing $noteRequest $request): Response
  1436.     
  1437.         $this->entityManager->remove($note);
  1438.         $this->entityManager->flush(); 
  1439.         $this->addFlash(
  1440.             type'success',
  1441.             message'Suppression effectuée'
  1442.         );
  1443.         return $this->redirect($request->headers->get('referer'));
  1444.     }
  1445.         /**
  1446.      * @param Mission $mission
  1447.      * @param FileMission|null $fileMission
  1448.      * @param Request $request
  1449.      * @param MessageRepository $messageRepository
  1450.      * @param InfoMissionRepository $infoMissionRepository
  1451.      * @param HistoriqueRepository $historiqueRepository
  1452.      * @return Response
  1453.      */
  1454.     #[Route('/mission/ajouter'name'mission_new'methods: ['GET''POST'])]
  1455.     #[Route('/mission/{id}/{srcId}'name'mission_edit'methods: ['GET''POST'], defaults:['srcId'=>null])]
  1456.     #[Route('/mission/group/{id}/{groupId}/{srcId}'name'mission_discussion_group'methods: ['GET''POST'], defaults:['srcId'=>null])]
  1457.     public function handleMission $missionWorkflowRepository $workflowRepositoryMessageService $messageService,  FileMission $fileMission nullRequest $requestMessageRepository $messageRepositoryInfoMissionRepository $infoMissionRepositoryHistoriqueRepository $historiqueRepositoryEventDispatcherInterface $dispatcherEntityManagerInterface $entityManagerMissionParticipantRepository $missionParticipantRepositoryServiceRepository $serviceRepositoryMissionRepository $missionRepositoryUserRepository $userRepository,CampaignRepository $campaignRepository,FileMissionRepository $fileMissionRepository,ParameterBagInterface $parameterBagInterface,ValidatorInterface $validator,UserService $userService,UserPasswordEncoderInterface $encoder,SubContractorCompanyRepository $subContractorCompanyRepository,RouterInterface $router,FilterService $filterService, ?string $srcId null,CreditService $creditService): Response
  1458.     {   
  1459.         if ("Espace de discussion" == $mission?->getProduct()?->getName() && count($mission->getCampaign()?->getMissionsWithoutEspaceDeDiscussion()) > 0) {
  1460.             return $this->redirectToRoute('mission_edit', ['id' => $mission->getCampaign()->getMissionsWithoutEspaceDeDiscussion()?->first()?->getId()], Response::HTTP_SEE_OTHER);
  1461.         }
  1462.         ini_set("memory_limit""-1");
  1463.         $campaign $mission->getCampaign();
  1464.         foreach($campaign?->getMissions() as $missionWithoutEspaceDisscussion) {
  1465.             foreach ($missionWithoutEspaceDisscussion?->getParticipants() as $part) {
  1466.                 $userParticipantInMission $part->getUser();
  1467.                if ($userParticipantInMission->getIdentifier() == null) {
  1468.                    $userService->generateIdentifierForUser($userParticipantInMission);
  1469.                }
  1470.             }
  1471.         } 
  1472.         $dataInMapped $request->request->all();
  1473.         $note $dataInMapped['note_campaign']['content'] ?? null;
  1474.         $notePrivate $dataInMapped['note_campaign_private']['content'] ?? null;
  1475.         if (!is_null($note) and  !empty($note)) {
  1476.             $newNote = new noteCampaing();
  1477.             $newNote->setContent($note);
  1478.             $newNote->setCreatedAt(new \DateTime());
  1479.             $newNote->setType(Note::NOTE_PUBLIC->value);
  1480.             $newNote->setUserToCommented($this->getUser());
  1481.             $this->entityManager->persist($newNote);
  1482.             $this->entityManager->flush();
  1483.             $campaign->addNoteCampaing($newNote);
  1484.             $entityManager->persist($campaign);
  1485.             $entityManager->flush();
  1486.             $this->addFlash(
  1487.                 type'success',
  1488.                 message"Enregistrement réussi",
  1489.             ); 
  1490.             return $this->redirect($request->headers->get('referer'));
  1491.         }
  1492.         if (!is_null($notePrivate) and !empty($notePrivate) ) {
  1493.             $newNote = new noteCampaing();
  1494.             $newNote->setContent($notePrivate);
  1495.             $newNote->setCreatedAt(new \DateTime());
  1496.             $newNote->setUserToCommented($this->getUser());
  1497.             $newNote->setType(Note::NOTE_PRIVATE->value);
  1498.             $this->entityManager->persist($newNote);
  1499.             $this->entityManager->flush();
  1500.             $campaign->addNoteCampaing($newNote);
  1501.             $entityManager->persist($campaign);
  1502.             $entityManager->flush();
  1503.              $this->addFlash(
  1504.                 type'success',
  1505.                 message"Enregistrement réussi",
  1506.             ); 
  1507.              return $this->redirect($request->headers->get('referer'));
  1508.         }
  1509.         
  1510.         $idGroupMessage $request->attributes->get('groupId');
  1511.         $idSharedResourceCompany $srcId;
  1512.         $discussionGroup null;
  1513.         $group null;
  1514.         if (null !== $idGroupMessage) {
  1515.             $group $this->entityManager->getRepository(DiscussionGroup::class)->find($idGroupMessage);
  1516.             //vérification si pas dans le message de groupe
  1517.             if ( 
  1518.                 !in_array('ROLE_ADMIN',$this->getUser()->getRoles()) and !in_array('ROLE_ADMIN_AGENCY',$this->getUser()->getRoles())
  1519.                 and
  1520.                 empty($this->entityManager->getRepository(DiscussionGroup::class)->isMine($idGroupMessage,$this->getUser()->getId()))
  1521.                 ) {
  1522.                $this->addFlash(
  1523.                     type'error',
  1524.                     message"Vous n'avez pas accès à cette discussion.",
  1525.                 );  
  1526.                return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  1527.             }
  1528.         }
  1529.         
  1530.         $formCreatedGroup $this->createForm(GroupMessageType::class, null, ['listUser' => $campaign->getAllUserInCampaing()]);
  1531.         $routeName $request->attributes->get('_route');
  1532.         $confirmation $request->query->get('confirmation');
  1533.         if ($mission->getCampaign()->getRecurringState() == 'failed') {
  1534.             return $this->redirectToRoute('mission_index');
  1535.         }
  1536.         $isMine false;
  1537.         $companyId $this->getUser()?->getCompany()?->getId();
  1538.         foreach ($mission->getParticipants() as $participant) {
  1539.             if ($participant->getUser()->getId() == $this->getUser()->getId() ||  $mission->getCampaign()?->getOrderedBy()->getId()== $this->getUser()->getId()) {
  1540.                $isMine true;
  1541.             }
  1542.         }
  1543.           if (
  1544.             $this->isGranted(Role::ROLE_ADMIN->value)  || 
  1545.             ($this->isGranted(Role::ROLE_CLIENT_ADMIN->value) && $companyId == $mission->getCampaign()?->getCompany()?->getId()) || ($this->isGranted(Role::ROLE_CLIENT->value) && $companyId == $mission->getCampaign()->getCompany()?->getId() && $mission->getCampaign()->getState()=="recurred")
  1546.            
  1547.         )
  1548.          {
  1549.             $isMine true;
  1550.         }
  1551.         if (!$isMine and $routeName == 'mission_edit') {
  1552.             //suppression de l'utilisateur sur la mission espace de discussion s'il est present
  1553.             $campaignOfMission $mission->getCampaign();
  1554.             foreach ($campaignOfMission->getMissions() as $missionInCampaign) {
  1555.                 if ("Espace de discussion" == $missionInCampaign?->getProduct()?->getName()) {
  1556.                     foreach ($missionInCampaign->getParticipants() as $participantInMission) {
  1557.                         if ($participantInMission->getUser()->getId() == $this->getUser()->getId()) {
  1558.                             $this->entityManager->remove($participantInMission);
  1559.                             $this->entityManager->flush();
  1560.                         }
  1561.                     }
  1562.                 }
  1563.             }
  1564.             $this->addFlash(
  1565.                 type'error',
  1566.                 message"Vous n'etes plus sur cette missions",
  1567.             ); 
  1568.             return $this->redirectToRoute('mission_index');
  1569.         }
  1570.         
  1571.  
  1572.         
  1573.         $message = new Message();
  1574.         $messages $messageRepository->findBy(['campaign' => $mission->getCampaign()->getId()], ['createdAt' => 'ASC']);
  1575.         $informations $infoMissionRepository->findBy(['mission' => $mission->getId()], ['createdAt' => 'ASC']);
  1576.         $oldPack $campaign->getCreditHistory();
  1577.         $formEditCampaignCredit $this->createForm(CampaignCreditHistoryType::class, $campaign);
  1578.         $formEditCampaignCredit->handleRequest($request);
  1579.         if ($formEditCampaignCredit->isSubmitted() && $formEditCampaignCredit->isValid()) {
  1580.             $this->missionService->addHistorique(mission$missionuser$this->getUser(), action'credit_campagne_modified');
  1581.             $this->contractService->balanceAllocation($campaign$oldPack);
  1582.             $entityManager $this->getDoctrine()->getManager();
  1583.             $entityManager->persist($campaign);
  1584.             $entityManager->flush();
  1585.             $creditHistory $campaign->getCreditHistory(); 
  1586.             $currentBlance $creditHistory->getCurrentBalance();
  1587.             $totalPrice $this->priceService->totalPriceCampaign($campaignfalse);
  1588.     
  1589.             if($currentBlance $totalPrice 0) {
  1590.                 $event = new  NoticeOfInsufficientBudgetEvent($campaign->getCompany(), $mission->getCampaign());
  1591.                 $this->dispatcher->dispatch($eventNoticeOfInsufficientBudgetEvent::NAME);
  1592.             }
  1593.             
  1594.             $this->addFlash('success''Le contrat a été mis à jour avec succès');
  1595.             return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  1596.         }
  1597.         /*
  1598.          * Form handle Campaign name
  1599.          */
  1600.         $form1 $this->createForm(CampaignNameType::class, $campaign);
  1601.         $form1->handleRequest($request);
  1602.         if ($form1->isSubmitted() && $form1->isValid()) {
  1603.             $this->missionService->addHistorique(mission$missionuser$this->getUser(), action'title_campagne_modified');
  1604.             $entityManager $this->getDoctrine()->getManager();
  1605.             $entityManager->persist($campaign);
  1606.             $entityManager->flush();
  1607.             $this->addFlash('success''La campagne a bien été modifiée');
  1608.             return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  1609.         }
  1610.         if ($this->isGranted(Role::ROLE_ADMIN->value)) {
  1611.             $priceCampaign $missionParticipantRepository->findByInitialTime();
  1612.             $estimatedIncome = [];
  1613.             $initialTime = [];
  1614.             $price = [];
  1615.             foreach ($priceCampaign as $value) {
  1616.                 if (!isset($estimatedIncome[$value->getMission()->getId()])) {
  1617.                     $estimatedIncome[$value->getMission()->getId()] = [];
  1618.                 }
  1619.                 $initialTime[$value->getMission()->getId()][] = $value->getInitialTime();
  1620.                 $price[$value->getMission()->getId()][] = $value->getEstimatedIncome();
  1621.             }
  1622.         } elseif ($this->isGranted(Role::ROLE_SUBCONTRACTOR->value)) {
  1623.             $visibleCampaign = ['orderedBy' => $this->getUser()];
  1624.             $estimatedIncome $missionParticipantRepository->getSubcontractorForUserAndMission($this->getUser());
  1625.         } else {
  1626.             $estimatedIncome null;
  1627.         }
  1628.         $formMissionInitialTime $this->createForm(MissionParticipantType::class);
  1629.         $formMissionInitialTimeManually $this->createForm(MissionParticipantDelaisType::class);
  1630.         $formMissionIncomeManually $this->createForm(MissionParticipantIncomeType::class);
  1631.         /**
  1632.          * Form handle chatbox
  1633.          */
  1634.         $form $this->createForm(MessageType::class, $message);
  1635.         $form->handleRequest($request);
  1636.         $formAddFileStorage $this->createForm(StorageMissionType::class,$message);
  1637.         /*
  1638.          * Form form add worflow
  1639.          */
  1640.         $haveWorkflowInMission $mission->getWorkflow() !=null true false
  1641.         $formAddWorkflow $this->createForm(MissionAddWorkflowType::class, $mission);
  1642.         $formAddWorkflow->handleRequest($request);
  1643.      
  1644.         if ($formAddWorkflow->isSubmitted() && $formAddWorkflow->isValid()) {
  1645.             $worklowdId $request->request->get('mission_add_workflow');
  1646.             if ($worklowdId != null) {
  1647.                 $worklowdId $worklowdId['workflow'];
  1648.                 $workflow $workflowRepository->findOneBy(['id' => $worklowdId]);
  1649.                 $workflowClone = clone $workflow;
  1650.                 $workflowClone->setTemplate(false);
  1651.                 $mission->setWorkflow($workflowClone);
  1652.                 $this->entityManager->persist($workflowClone);
  1653.                 $this->entityManager->flush();
  1654.             
  1655.                 //if campaing is in progress so active first steps
  1656.                 if ($mission->getState() == 'in_progress') {
  1657.                     $step $mission->getWorkflow()->getSteps()->first();
  1658.                     $step->setActive(true);
  1659.                     if ($step->getManager() == 0) {
  1660.                         $mission->setStateClient('Déclenchement en attente');
  1661.                     } else {
  1662.                         $mission->setStateProvider($step->getName());
  1663.                     }
  1664.                     $this->entityManager->flush();
  1665.                     if(!$haveWorkflowInMission){
  1666.                         $event = new WorkflowStepEnteredEvent($step);
  1667.                         $dispatcher->dispatch($eventWorkflowStepEnteredEvent::NAME);
  1668.                     }
  1669.                
  1670.                 }
  1671.                 
  1672.                 $this->addFlash('success''Le workflow a bien été modifié');
  1673.             }
  1674.             return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  1675.         }
  1676.         
  1677.         /*
  1678.          * Form handle information général
  1679.          */
  1680.         $infoMission = new InfoMission();
  1681.         $form2 $this->createForm(InfoMissionType::class, $infoMission);
  1682.         $form2->handleRequest($request);
  1683.         if ($form2->isSubmitted() && $form2->isValid()) {
  1684.             $entityManager $this->getDoctrine()->getManager();
  1685.             $infoMission->setMission($mission)
  1686.                 ->setUser($this->getUser());
  1687.             $mission->addInfoMission($infoMission);
  1688.             $entityManager->persist($infoMission);
  1689.             $entityManager->flush();
  1690.             $this->addFlash(
  1691.                 type'success',
  1692.                 message'Message enregistré avec succès.'
  1693.             );
  1694.             return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  1695.         }
  1696.         
  1697.         
  1698.         /*
  1699.          * Form handle edit single line in information général
  1700.          */
  1701.         $infoFormArr = [];
  1702.         $infoEditForm = [];
  1703.         foreach ($informations as $information) {
  1704.             $key $information->getId();
  1705.             $infoEditForm[$key] = $this->createform(InfoMissionType::class, $information);
  1706.             $infoFormArr[$key] = $infoEditForm[$key]->createView();
  1707.         }
  1708.         
  1709.         $actualDesiredDelivery null;
  1710.         if (null !== $mission->getDesiredDelivery()) {
  1711.             $actualDesiredDelivery = clone $mission->getDesiredDelivery();
  1712.         }
  1713.         $formChangeDateDelivery $this->createForm(EditDesiredDeliveryType::class, $mission);
  1714.         $formChangeDateDelivery->handleRequest($request);
  1715.         if ($formChangeDateDelivery->isSubmitted() && $formChangeDateDelivery->isValid()) {
  1716.             if (null !== $actualDesiredDelivery && $actualDesiredDelivery->format('Y-m-d') !== $formChangeDateDelivery->getData()->getDesiredDelivery()->format('Y-m-d')) {
  1717.                 $entityManager $this->getDoctrine()->getManager();
  1718.                 $entityManager->persist($mission);
  1719.                 $entityManager->flush();
  1720.                 if ($mission->getState() != 'provisionnal') {
  1721.                     $event = new MissionDesiredDeliveryUpdatedAfterValidationEvent($mission);
  1722.                     $dispatcher->dispatch($eventMissionDesiredDeliveryUpdatedAfterValidationEvent::NAME);
  1723.                 }
  1724.                 $this->addFlash(
  1725.                     type'success',
  1726.                     message'La date de livraison souhaitée à bien été modifiée'
  1727.                 );
  1728.             }
  1729.             return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  1730.         }
  1731.         $formInitialTime $this->createForm(ChangeInitialTimeType::class, $mission);
  1732.         $formInitialTime->handleRequest($request);
  1733.         if ($formInitialTime->isSubmitted() && $formInitialTime->isValid()) {
  1734.             $initialTime $formInitialTime->getData()->getInitialTime();
  1735.             $product $mission->getProduct()->getId();
  1736.             $participant $missionParticipantRepository->findOneBy(['mission' => $mission]);
  1737.             $service $serviceRepository->findOneBy(['user' => $participant->getUser(), 'product' => $product]);
  1738.             $calculPrice $initialTime 60 $service->getResale() * $mission->getQuantity();
  1739.             $mission->setPrice($calculPrice);
  1740.             $entityManager->persist($mission);
  1741.             $entityManager->flush();
  1742.             $event = new MissionInitialTimeEvent($mission);
  1743.             $dispatcher->dispatch($eventMissionInitialTimeEvent::NAME);
  1744.             $this->addFlash(
  1745.                 type'success',
  1746.                 message'Le temps initial a bien été ajouté'
  1747.             );
  1748.             return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  1749.         }
  1750.         $formRealTime $this->createForm(ChangeRealTimeType::class, $mission);
  1751.         $formRealTime->handleRequest($request);
  1752.         if ($formRealTime->isSubmitted() && $formRealTime->isValid()) {
  1753.             $entityManager->persist($mission);
  1754.             $entityManager->flush();
  1755.             $this->addFlash(
  1756.                 type'success',
  1757.                 message'Le temps réel passé a bien été ajouté'
  1758.             );
  1759.             return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  1760.         }
  1761.         /**
  1762.          * Form handle fichier demande initial
  1763.          */
  1764.         $form3 $this->createForm(FileMissionType::class, $fileMission);
  1765.         $form3->handleRequest($request);
  1766.         if ($form3->isSubmitted() && $form3->isValid()) {
  1767.             $path 'file_mission_directory';
  1768.             $entityManager $this->getDoctrine()->getManager();
  1769.             $files $form3->get('fileMissions')->getData();
  1770.             $filesystem = new Filesystem();
  1771.             foreach ($files as $file) {
  1772.                 $destination $this->getParameter($path) . '/' $mission->getId();
  1773.               
  1774.                 $campaignDestination $this->getParameter("file_campaing_directory") . '/' $mission->getCampaign()->getId();
  1775.                 if (!$filesystem->exists($destination)) {
  1776.                     $filesystem->mkdir($destination);
  1777.                 }
  1778.                 
  1779.                 if (!$filesystem->exists($campaignDestination)) {
  1780.                     $filesystem->mkdir($campaignDestination);
  1781.                 }
  1782.                 $originalFilename pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
  1783.                 $newFilename $originalFilename '-' uniqid() . '.' $file->guessExtension();
  1784.                 // $file->move(
  1785.                 //     $destination,
  1786.                 //     $newFilename
  1787.                 // );
  1788.                 // $fileMission = $destination."/".$newFilename;
  1789.                 // copy($fileMission,$campaignDestination."/".$newFilename);
  1790.                 $originalFilename pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
  1791.                 $extensionFile =  pathinfo($file->getClientOriginalName(), PATHINFO_EXTENSION);
  1792.                 $newFilename $originalFilename '-' uniqid() . '.' $extensionFile;
  1793.                  //upload file in google storage
  1794.                 $nameUniqueCompany strtolower("company-".$mission->getCampaign()->getCompany()->getId());
  1795.                 $this->googleStorageService->uploadFile($nameUniqueCompany,$file,$newFilename,'Campaigns/'.$campaign->getId());
  1796.                 $fileMission = new FileMission();
  1797.                 $fileMission->setName($newFilename);
  1798.                 
  1799.                 $mission->getCampaign()->addFileMission($fileMission);
  1800.                 $fileMission->setIsNew(1);
  1801.                 $fileMission->setIsNotInfected(true);
  1802.                 $fileMission->setUser($this->getUser());
  1803.                 $entityManager->persist($fileMission);
  1804.           
  1805.                 
  1806.             }
  1807.             $entityManager->flush();
  1808.             $this->addFlash(
  1809.                 type'success',
  1810.                 message'Le fichier a bien été ajouté à la demande'
  1811.             );
  1812.             return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  1813.         }
  1814.         $mission $mission->getInitialBriefing() == null $mission->setInitialBriefing($mission->getCampaign()->getBrief()) : $mission;
  1815.         $formInitialBrief $this->createForm(InitialBriefType::class, $mission);
  1816.         $formInitialBrief->handleRequest($request);
  1817.         if ($formInitialBrief->isSubmitted() && $formInitialBrief->isValid()) {
  1818.             $mission->getCampaign()->setBrief($mission->getInitialBriefing());
  1819.             $entityManager->persist($mission);
  1820.             // $historique = (new Historique())
  1821.             //     ->setUser($this->getUser())
  1822.             //     ->setMission($mission)
  1823.             //     ->setMessage('Modification de la demande initiale');
  1824.             // $entityManager->persist($historique);
  1825.             $this->missionService->addHistorique(mission$missionuser$this->getUser(), action"initial_time");
  1826.             $campaign->setBrief($mission->getInitialBriefing());
  1827.             //all initial brief is impact of all mission
  1828.             foreach ($mission->getCampaign()->getMissions() as $otherMission) {
  1829.                 if ($otherMission->getId() !== $mission->getId()) {
  1830.                     $otherMission->setInitialBriefing($mission->getInitialBriefing(), false);
  1831.                     $entityManager->persist($otherMission);
  1832.                 }
  1833.             }
  1834.             $entityManager->flush();
  1835.             $this->addFlash(
  1836.                 type'success',
  1837.                 message'Demande initiale modifiée avec succès.'
  1838.             );
  1839.             return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  1840.         }
  1841.         $formAddMissionContact $this->createForm(AddMissionContactType::class, null, ['action' => $this->generateUrl('mission_participant_add', ['mission' => $mission->getId()])]);
  1842.          $formAddMissionContactProject $this->createForm(AddMissionContactProjectType::class, null, ['action' => $this->generateUrl('mission_participant_add', ['mission' => $mission->getId()])]);
  1843.         $formAddMissionContactExternal $this->createForm(AddMissionContactExternalType::class, null, ['action' => $this->generateUrl('mission_participant_add', ['mission' => $mission->getId()])]);
  1844.         $formAddMissionSubContractor $this->createForm(AddMissionSubContractorType::class, null, ['action' => $this->generateUrl('mission_participant_add', ['mission' => $mission->getId()])]);
  1845.         $formEditSubcontractor $this->createForm(EditSubcontractorParticipantType::class);
  1846.         $formCancelMission $this->createForm(MissionCancelType::class);
  1847.         $formDeleteCampaign $this->createForm(CampaignDeleteType::class);
  1848.         $formCancelCampaign $this->createForm(CampaignCancelType::class);
  1849.         //now participant in this mission if edit mission
  1850.         $missionParticipant null;
  1851.         foreach ($mission->getParticipants() as $participant) {
  1852.             if ($participant->getUser()->getId() == $this->getUser()->getId()) {
  1853.                 $missionParticipant $participant;
  1854.             }
  1855.         }
  1856.        $allClientParticipantsMail = [];
  1857.        $allClientParticipants = [];
  1858.         foreach ($mission->getCampaign()->getMissions() as $m) {
  1859.             foreach ($m->getParticipants() as $participant) {
  1860.                 if ($participant->getRole() !== Role::ROLE_SUBCONTRACTOR) {
  1861.                     if (!in_array($participant->getUser()->getEmail(), $allClientParticipantsMail)) {
  1862.                         $allClientParticipantsMail[] = $participant->getUser()->getEmail();
  1863.                         $allClientParticipants[] = $participant;
  1864.                     }
  1865.                 }
  1866.             }
  1867.         }
  1868.         $formDesiredDelivery $this->createForm(DesiredDeliveryType::class,$mission);
  1869.         $formDesiredDelivery->handleRequest($request);
  1870.         $allMission $missionRepository->findBy(['campaign'=>$campaign],['positionOrder'=>'ASC']);
  1871.         //all files in storage
  1872.         $allMissionId = [];
  1873.         
  1874.         foreach ($campaign->getMissions() as $m) {
  1875.             $allMissionId[] = $m->getId();
  1876.         }
  1877.         
  1878.         $allMessageContent $messageRepository->findMessagesContent($campaign,$this->getUser());
  1879.         $allMessageContentGroup $messageRepository->findMessagesContentGroup($campaign,$this->getUser());
  1880.         $allMessageWithLink = [];
  1881.         $allMessageWithLinkGroup = [];
  1882.         $links = [];
  1883.         //get all link in message
  1884.         foreach ($allMessageContent as $message) {
  1885.             $dom = new \DOMDocument();
  1886.             if (!empty($message['content']) and $message['content'] != null) {
  1887.                 @$dom->loadHTML($message['content']);
  1888.                 $anchors $dom->getElementsByTagName('a');
  1889.                 foreach ($anchors as $anchor) {
  1890.                     $links $anchor->getAttribute('href');
  1891.                     $message['linkInMessage'] = $links;
  1892.                     $message['linkInMessageShort'] = mb_substr($links040)."...";
  1893.                     $allMessageWithLink = [...$allMessageWithLink,$message];
  1894.                 }
  1895.             }
  1896.         }
  1897.         //get all link in message Group
  1898.         foreach ($allMessageContentGroup as $messageGroup) {
  1899.             $dom = new \DOMDocument();
  1900.             if (!empty($messageGroup['content']) and $messageGroup['content'] != null) {
  1901.                 @$dom->loadHTML($messageGroup['content']);
  1902.                 $anchors $dom->getElementsByTagName('a');
  1903.                 foreach ($anchors as $anchor) {
  1904.                     $links $anchor->getAttribute('href');
  1905.                     $messageGroup['linkInMessage'] = $links;
  1906.                     $messageGroup['linkInMessageShort'] = mb_substr($links040)."...";
  1907.                     $allMessageWithLinkGroup = [...$allMessageWithLinkGroup,$messageGroup];
  1908.                 }
  1909.             }
  1910.         }
  1911.         $allMessages $messageRepository->allMessageHaveFile($campaign,$this->getUser(),$this->getUser());
  1912.         $allMessagesGroup $messageRepository->allMessageHaveFileGroup($campaign,$this->getUser());
  1913.         $allJointes  $fileMissionRepository->allFile($campaign,$allMissionId,$this->getUser());
  1914.         $allFiles array_merge($allMessageWithLinkGroup,$allMessageWithLink,$allMessages,$allMessagesGroup$allJointes) ;
  1915.         usort($allFiles, function($a,$b){
  1916.             return $b['createdAt'] <=> $a['createdAt'];
  1917.         });
  1918.         
  1919.         $url $parameterBagInterface->get('back_website_url');
  1920.         //end
  1921.         $initialDemande $mission?->getCampaign()?->getBrief();
  1922.         $joinFilesMessage $mission->getCampaign()?->getFileMissions();
  1923.         
  1924.         $futurActions $this->missionParticipantService->getUniqByFutureActions($mission->getCampaign()->getId(),$this->getUser()->getId());
  1925.        
  1926.  
  1927.         $thisUserData$this->getUser()->getUserData();
  1928.         $activeMissionTab = [];
  1929.         if($thisUserData != null){
  1930.             $userActiveMissionTab $thisUserData->getMissionTabActive();
  1931.             if(!is_null($userActiveMissionTab)) {
  1932.                 $arrayActiveTabUser explode('#',$userActiveMissionTab);
  1933.                 if(isset($arrayActiveTabUser[0])){
  1934.                     $activeMissionTab['mission'] = $arrayActiveTabUser[0];
  1935.                 }
  1936.                 if(isset($arrayActiveTabUser[1])){
  1937.                     $activeMissionTab['tab_actif'] = $arrayActiveTabUser[1];
  1938.                 }
  1939.             }        
  1940.         }
  1941.         if ($confirmation) {
  1942.             $this->addFlash(
  1943.                 type'success',
  1944.                 message"Les délais ont été  bien mis à jour",
  1945.             ); 
  1946.         }
  1947.         /**
  1948.          * Form for add subContractor that does not exist to company
  1949.          */
  1950.         $formSubContractorAdd $this->createForm(SubContractorCompanyType::class,new SubContractorCompany());
  1951.         $formSubContractorAdd->handleRequest($request);
  1952.         
  1953.         if ($formSubContractorAdd->isSubmitted() && $formSubContractorAdd->isValid()) {
  1954.             $dailyRate $request->request->all()['dailyRate'];
  1955.             $jobLinkToParticipant $request->request->all()['jobForMission'];
  1956.             $resaleRate $request->request->all()['resaleRate'];
  1957.             $priceProduct = isset($request->request->all()['priceForProductSubcontractor']) ?$request->request->all()['priceForProductSubcontractor'] : null;
  1958.             if ( !isset($dailyRate) or  $dailyRate or $dailyRate == null or !is_numeric($dailyRate)) {
  1959.                 $this->addFlash('error''Veuillez vérifié le tarif journalier');
  1960.                 return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  1961.             }
  1962.             if ( !isset($resaleRate) or  $resaleRate or $resaleRate == null or !is_numeric($resaleRate) ) {
  1963.                 $this->addFlash('error''Veuillez vérifié le tarif revente');
  1964.                 return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  1965.             }
  1966.             
  1967.            
  1968.             $company $campaign->getCompany();
  1969.             $oldServiceSubcontractor = [];
  1970.             $oldJobSubcontractor = [];
  1971.             $email $request->request->get('emailSubContractor');
  1972.             if ($validator->validate($email, [new Email()])->count() > 0) {
  1973.                 $this->addFlash('error''L\'adresse ' $email ' n\'est pas valide. Nous vous invitons à vérifier votre saisie');
  1974.                 return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  1975.             }
  1976.             $checkEmail $userRepository->findOneBy(['email' => $email]);
  1977.             $subContractorCompany = new  SubContractorCompany();
  1978.             $separateEmail explode(" "$email);
  1979.             $email $separateEmail[0];
  1980.             if (empty($checkEmail)) {
  1981.                 $user = new User();
  1982.                 $password $userService->generatePassword();
  1983.                 $encodedPassword $encoder->encodePassword($user$password);
  1984.                 $user->setPassword($encodedPassword);
  1985.                 $user->setEmail($email);
  1986.                 $user->setRoles(['ROLE_SUBCONTRACTOR']);
  1987.                 $user->setEnabled(false);
  1988.             } else {
  1989.                 $user $userRepository->findOneBy(['email' => $email]);
  1990.                 //Si pas vide vérifié si l'utilisateur éxiste déja sur d'autre agence ou sur MyFlow
  1991.                // if (null != $user->getCompany()) {
  1992.                     $isAlreadyExist true;
  1993.                     //alors creez un utilisateur enfant parceque l'utilisateur est dans un autre entreprise
  1994.                     //create new user
  1995.                     $userGenerate = new User;//for just generate the id automaticly
  1996.                     $userChild = clone $user;
  1997.                     $emailUniq uniqid().$user->getEmail();
  1998.                     $userChild->setId($userGenerate->getId())->setEmail($emailUniq)->setEnabled($user->getEnabled())->setNewAdd(false)->setParent($user)->setPassword($user->getPassword())->setOriginalEmail($user->getEmail())->setCompany($this->dynamicHostService->getCompany());
  1999.                     $user->addChild($userChild);
  2000.                     $entityManager->persist($user);
  2001.                     $user $userChild;
  2002.                     //need to add user in child
  2003.                 //}
  2004.             }
  2005.             
  2006.             foreach ($formSubContractorAdd->getData()->getJobs() as $job) {
  2007.                 $user->addJob($job);
  2008.             }
  2009.             
  2010.             $subContractorCompany->setCompany($company)
  2011.                 ->setUser($user)
  2012.                 ->setEmailSend(true);
  2013.            // $user->setCompany($this->dynamicHostService->getCompany());
  2014.             $user->addSubContractorCompany($subContractorCompany);
  2015.             $entityManager->persist($user);
  2016.             //add information of resaleRate / dailyRate
  2017.             $user->setDailyRate($dailyRate);
  2018.             $user->setResaleRate($resaleRate);
  2019.  
  2020.             //end add informations
  2021.             //link subcontractor to the mission
  2022.              $missionParticipantSubcontractor = (new MissionParticipant())
  2023.                                     ->setUser($user)
  2024.                                     ->setMission($mission)
  2025.                                     ->setRole(Role::ROLE_SUBCONTRACTOR)
  2026.                                     ->setJob($this->jobRepository->find($jobLinkToParticipant));
  2027.             $mission->addParticipant($missionParticipantSubcontractor);
  2028.             //end link
  2029.              if ($mission->getProduct()->getType() == ProductType::AU_FORFAIT) {
  2030.                 if ( !isset($priceProduct) or  $priceProduct or $priceProduct == null or !is_numeric($priceProduct) ) {
  2031.                 $this->addFlash('error''Veuillez vérifié le prix de vente');
  2032.                 return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  2033.                 
  2034.                 };
  2035.                 $serviceParticipant = new Service();
  2036.                 $serviceParticipant->setProduct($mission->getProduct());
  2037.                 $serviceParticipant->setTemplate(1);
  2038.                 $serviceParticipant->setResale($priceProduct);
  2039.                 $serviceParticipant->setUser($user);
  2040.                 $serviceParticipant->setPrice($mission->getProduct()->getPrice());
  2041.                 $entityManager->persist($serviceParticipant);
  2042.             }
  2043.             $entityManager->persist($missionParticipantSubcontractor);
  2044.             $entityManager->persist($mission);
  2045.             $entityManager->persist($subContractorCompany);
  2046.             $entityManager->flush();
  2047.             
  2048.             
  2049.             $event true;
  2050.             foreach ($user->getServices() as $service) {
  2051.                 if (empty($service->getResale())) {
  2052.                     $event false;
  2053.                 }
  2054.             }
  2055.             // dispatch the subonctractor.updated event
  2056.             $event =  new SubContractorUpdatedEvent($usertrue);
  2057.             $dispatcher->dispatch($eventSubContractorUpdatedEvent::NAME);
  2058.             
  2059.             $this->addFlash('success''L\'utilisateur a bien été ajouté a la mission');
  2060.          
  2061.             return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  2062.         }
  2063.         $allJob $this->jobRepository->findByAgency($this->dynamicHostService->getCompany($this->getUser()));
  2064.         $allUrlForLiveChat = [];
  2065.         //all url to need for live chat
  2066.         foreach ($campaign->getMissions() as $missionToNeed) {
  2067.              $tempUrl = !is_null($group) ? $router->generate('mission_discussion_group', ['id' => $missionToNeed->getId(),'groupId'=>$group->getId()], RouterInterface::ABSOLUTE_URL): 
  2068.              $router->generate('mission_edit', ['id' => $missionToNeed->getId()], RouterInterface::ABSOLUTE_URL);
  2069.              $allUrlForLiveChat[] = DataHasherService::hash($tempUrl);
  2070.         }
  2071.         $allUrlForLiveChat[] = DataHasherService::hash("message-send-end-not-read");
  2072.         $discussionGroup $this->entityManager->getRepository(DiscussionGroup::class)->getMyGroup($campaign,$this->getUser()?->getId());
  2073.        
  2074.         $idOngletActif "";
  2075.         if ( $routeName == "mission_discussion_group" ) {
  2076.             if (!is_null($group) and $group->isDeleted()) {
  2077.                 return $this->redirectToRoute('mission_edit', ['id' => $mission->getId()], Response::HTTP_SEE_OTHER);
  2078.             }
  2079.             $idOngletActif $idGroupMessage;
  2080.         }
  2081.         $timezone = new \DateTimeZone(date_default_timezone_get());
  2082.         $now = new \DateTime('now'$timezone);
  2083.         $offsetInSeconds $timezone->getOffset($now);
  2084.         $offsetInHours $offsetInSeconds 3600;
  2085.         //message pinnned
  2086.         $pinnedMessage  $this->entityManager->getRepository(Message::class)->pinnedMessage($campaign,$group,$this->getUser());
  2087.         $sharedResourcesCategory $this->sharedResourcesCategoryRepository->findOneById($idSharedResourceCompany); 
  2088.         
  2089.         // $sharedResourcesCategory = $this->sharedResourceCategoryService->buildTree($sharedResourcesCategory);
  2090.         $nbByPage =  !is_null($this->session->get('nbrCompanyResourcePageMission')) ? $this->session->get('nbrCompanyResourcePage') : 10 ;
  2091.         
  2092.         $sortsFilePermission = [
  2093.             'name-sort'=> $request->query->get('name-sort'), 
  2094.             'desc-sort'=> $request->query->get('desc-sort'), 
  2095.             'date-sort'=>$request->query->get('date-sort'),
  2096.         ]; 
  2097.         // dd($sortsFilePermission);
  2098.         $filePermissions = []; 
  2099.         if($sharedResourcesCategory instanceof SharedResourcesCategory){
  2100.             if($sharedResourcesCategory->getType() == SharedResourcesCategoryEnum::DEFAULT->value){
  2101.                 foreach ($mission->getCampaign()->getMissions() as $mission) {
  2102.                     
  2103.                     $filePermissions = [...$filePermissions, ...$this->filePermissionsRepository->filesResourceDeliverableHistory($sharedResourcesCategory,$mission$this->getUser())]; 
  2104.                    
  2105.                 }
  2106.             }else{
  2107.                 $filePermissions =  $this->filePermissionsRepository->findAllBy($sharedResourcesCategory$request->query->get('q'),[],$sortsFilePermission);
  2108.             }
  2109.         }
  2110.         
  2111.         // dd($filePermissions);
  2112.         $this->session->set('nbr-filePermissions-missions'count($filePermissions));
  2113.         $this->session->set('query-resource-mission'$request->query->get('q'));
  2114.         $filePermissionsPagined $this->paginator->paginate(
  2115.             $this->sharedResourceCategoryService->getOnlyMyfile($mission,$this->getUser(),$filePermissions), 
  2116.             $request->query->getInt('page'1), 
  2117.             $nbByPage
  2118.         );
  2119.         
  2120.         $folders $this->folderPermissionsRepository->findAllBy($campaign->getCompany());
  2121.         if($idSharedResourceCompany == null){
  2122.             $this->session->set('element-resource-mission-selected',[]); 
  2123.         }
  2124.         $foldersPagined $this->paginator->paginate(
  2125.             $this->sharedResourceCategoryService->getOnlyMyFolder($mission,$this->getUser(),$folders), 
  2126.             $request->query->getInt('page'1), 
  2127.             $nbByPage
  2128.         );
  2129.         $sessionElementSelectedToGet $this->session->get('element-resource-mission-selected')?:[];
  2130.         if(null !== $sharedResourcesCategory and  $sharedResourcesCategory->getType()=="0"){
  2131.             $sessionElementSelectedToGet $this->session->get('element-delivrable-resource-selected')?:[];
  2132.         }
  2133.         $requirementForClosed =  $this->campaignService->getRequirementToResendOrderToClient($campaign);
  2134.         $btnClosedAnyWayAppear false;
  2135.         foreach ($requirementForClosed as $requirement ) {
  2136.             if ( !empty($requirement['sub_not_evaluate_without_product_type'])) {
  2137.                 $btnClosedAnyWayAppear true;
  2138.             }
  2139.         }
  2140.         // $creditHistories = $this->creditHistoryRepository->findAvalaibleByCompany($campaign->getCompany());
  2141.         // $allCredit = [];
  2142.         // foreach ($creditHistories as $credit) {
  2143.         //     $allCredit[$credit->getId()] = $creditService->contractAvailable($credit,$campaign);
  2144.         // }
  2145.     
  2146.         //end
  2147.         return $this->renderForm('mission/handle_ux.html.twig', [
  2148.             'allUrlForLiveChat' => json_encode($allUrlForLiveChat),
  2149.             'date_off_setHour'=> $offsetInHours,
  2150.             'idOngletActif' => $idOngletActif,
  2151.             "currentUser" => $this->getUser(),
  2152.             'pinnedMessage' => $pinnedMessage,
  2153.             'discussionGroup' => $discussionGroup,
  2154.             'idGroupMessage' => $idGroupMessage,
  2155.             'group' => $group,
  2156.             'allMessages' => $allFiles,
  2157.             'allJob' => $allJob,
  2158.             'formSubContractorAdd' => $formSubContractorAdd,
  2159.             'price_service' => $this->priceService,
  2160.             'futurActions' => $futurActions,
  2161.             'urlDomaine' => $url,
  2162.             'initialDemande' => $initialDemande,
  2163.             'joinFilesMessage' => $joinFilesMessage,
  2164.             'mission' => $mission,
  2165.             'allMission' => $allMission,
  2166.             'form' => $form,
  2167.             'form1' => $form1,
  2168.             'form2' => $form2,
  2169.             'form3' => $form3,
  2170.             'formCreatedGroup' => $formCreatedGroup,
  2171.             'infoFormArr' => $infoFormArr,
  2172.             'messages' => $messages,
  2173.             'informations' => $informations,
  2174.             'formDesiredDelivery'=> $formDesiredDelivery,
  2175.             'formAddMissionContact' => $formAddMissionContact,
  2176.             'formAddMissionContactExternal' => $formAddMissionContactExternal,
  2177.             'formAddMissionContactProject' => $formAddMissionContactProject,
  2178.             'formEditSubcontractor' => $formEditSubcontractor,
  2179.             'formChangeDateDelivery' => $formChangeDateDelivery,
  2180.             'formAddMissionSubContractor' => $formAddMissionSubContractor,
  2181.             'formMissionInitialTime' => $formMissionInitialTime,
  2182.             'formMissionInitialTimeManually' => $formMissionInitialTimeManually,
  2183.             'formMissionIncomeManually' => $formMissionIncomeManually,
  2184.             'formInitialTime' => $formInitialTime,
  2185.             'formRealTime' => $formRealTime,
  2186.             'formInitialBrief' => $formInitialBrief,
  2187.             'campaign' => $campaign,
  2188.             'estimatedIncome' => $estimatedIncome,
  2189.             'formCancelMission' => $formCancelMission,
  2190.             'formDeleteCampaign' => $formDeleteCampaign,
  2191.             'formCancelCampaign' => $formCancelCampaign,
  2192.             'formAddWorkflow' =>  $formAddWorkflow,
  2193.             //'formEditCampaignCredit' => $formEditCampaignCredit,
  2194.             'userConnected' => $this->getUser(),
  2195.             'missionParticipant' => $missionParticipant,
  2196.             'allClientParticipants' => $allClientParticipants,
  2197.             'formAddFileStorage' =>$formAddFileStorage,
  2198.             'userActiveTab' => $activeMissionTab,
  2199.             'folderPermissions'=> $foldersPagined ,
  2200.             'filePermissions'=> $filePermissionsPagined,
  2201.             'nbrFileResource'=> count($filePermissions),
  2202.             'sharedResourcesCategory'=>$sharedResourcesCategory,
  2203.             'idSharedResourceCompany'=> $idSharedResourceCompany,
  2204.             'elementSelected'=>$sessionElementSelectedToGet,
  2205.             'btnClosedAnyWayAppear' => $btnClosedAnyWayAppear,
  2206.             'allCredit' => [],
  2207.         ]);
  2208.     }
  2209. }