src/Controller/MissionController.php line 1677

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