src/Controller/CampaignController.php line 142

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Enum\Role;
  4. use Dompdf\Dompdf;
  5. use Dompdf\Options;
  6. use App\Entity\User;
  7. use App\Enum\TypePack;
  8. use GuzzleHttp\Client;
  9. use App\Entity\Company;
  10. use App\Entity\Mission;
  11. use App\Entity\Product;
  12. use App\Form\AddMissionContactProjectType;
  13. use App\Entity\Service;
  14. use App\Enum\AdminMail;
  15. use App\Entity\Campaign;
  16. use App\Enum\ProductType;
  17. use App\Entity\Historique;
  18. use App\Form\CampaignType;
  19. use App\Entity\FileMission;
  20. use App\Enum\TypeFrequency;
  21. use App\Entity\CreditHistory;
  22. use App\Service\OrderService;
  23. use App\Service\PriceService;
  24. use App\Service\UtilsService;
  25. use App\Service\CompanyService;
  26. use App\Service\MissionService;
  27. use App\Form\CampaignCancelType;
  28. use App\Form\CampaignDeleteType;
  29. use App\Form\CampaignEditWpType;
  30. use App\Service\CampaignService;
  31. use App\Service\ContractService;
  32. use App\Event\ClientUpdatedEvent;
  33. use App\Form\ListMissionFormType;
  34. use App\Repository\JobRepository;
  35. use App\Entity\MissionParticipant;
  36. use App\Repository\UserRepository;
  37. use App\Service\ClientSoldService;
  38. use Symfony\Component\Mime\Address;
  39. use App\Enum\CampaignTypeInitiation;
  40. use App\Service\MyFlowMarginService;
  41. use App\Service\NumberFormatService;
  42. use App\Event\AdminCommandErrorEvent;
  43. use App\Repository\CompanyRepository;
  44. use App\Repository\MissionRepository;
  45. use App\Repository\ProductRepository;
  46. use App\Service\GoogleStorageService;
  47. use App\Repository\CampaignRepository;
  48. use App\Repository\WorkflowRepository;
  49. use App\Service\CampaignWpEditService;
  50. use App\Event\Mission\MissionSendEvent;
  51. use App\Event\Mission\ContactAddedEvent;
  52. use Doctrine\ORM\EntityManagerInterface;
  53. use Symfony\Component\Workflow\Registry;
  54. use App\Event\Client\PremiumPackageEvent;
  55. use App\Repository\FileMissionRepository;
  56. use App\Service\CampaignRecurrentService;
  57. use App\Repository\WorkflowStepRepository;
  58. use App\Service\MissionParticipantService;
  59. use App\Event\Campaign\CampaignResendEvent;
  60. use App\Event\Campaign\CampaignResumeEvent;
  61. use App\Repository\CreditHistoryRepository;
  62. use App\Event\Campaign\CampaignCreatedEvent;
  63. use App\Event\Campaign\CampaignDeclineEvent;
  64. use App\Event\Campaign\CampaignDeletedEvent;
  65. use App\Event\Campaign\CampaignWaitingEvent;
  66. use Symfony\Component\Filesystem\Filesystem;
  67. use Symfony\Component\HttpClient\HttpClient;
  68. use App\Event\Campaign\CampaignModifiedEvent;
  69. use Symfony\Component\HttpFoundation\Request;
  70. use Symfony\Component\Mailer\MailerInterface;
  71. use App\Event\Campaign\CampaignCancelledEvent;
  72. use App\Event\Campaign\CampaignRecurrentEvent;
  73. use App\Event\Campaign\CampaignValidatedEvent;
  74. use App\Event\Mission\MissionCanActivateEvent;
  75. use App\Form\EditSubcontractorParticipantType;
  76. use Symfony\Component\HttpFoundation\Response;
  77. use App\Event\Campaign\DevisCreatedNotFinished;
  78. use App\Service\ActivationSubcontractorService;
  79. use Symfony\Bridge\Twig\Mime\NotificationEmail;
  80. use Symfony\Component\Routing\Annotation\Route;
  81. use App\Event\Campaign\CampaignEvaluationEventt;
  82. use App\Event\Campaign\CampaignNotFinishedEvent;
  83. use App\Repository\MissionParticipantRepository;
  84. use App\Repository\BalanceTransactionsRepository;
  85. use App\Event\Mission\MissionWithoutWorkflowEvent;
  86. use Symfony\Component\HttpFoundation\JsonResponse;
  87. use App\Service\ConsumptionBalanceForCompanyService;
  88. use App\Event\Workflow\Step\WorkflowStepEnteredEvent;
  89. use Symfony\Component\Serializer\SerializerInterface;
  90. use App\Event\SubcontractorActivateOrThereIsABotEvent;
  91. use Symfony\Component\HttpFoundation\RedirectResponse;
  92. use Symfony\Component\HttpFoundation\File\UploadedFile;
  93. use App\Event\Workflow\Step\WorkflowFirstStepEnteredEvent;
  94. use App\Event\Campaign\CampaignValidatedPerActivationEvent;
  95. use App\Event\SubContractor\SubContractorMissionAddedEvent;
  96. use App\Form\DataTransformer\ProductTextToObjectTransformer;
  97. use App\Event\Mission\MissionWithoutSubContractorCheckedEvent;
  98. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  99. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  100. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  101. use App\Event\Campaign\CampaignNotifyThatDeliveryDateChangeEvent;
  102. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  103. use App\Event\Mission\MissionDesiredDeliveryUpdatedAfterValidationEvent;
  104. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  105. use App\Event\Mission\MissionDesiredDeliveryUpdatedBeforeValidationEvent;
  106. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  107. use App\Event\SubContractorVigilanceCertificateAbsentEvent;
  108. use App\Entity\BalanceTransactions;
  109. use App\Event\Campaign\CampaignEvaluationEvent;
  110. use App\Service\DynamicHostService;
  111. use App\Service\CampaignApiService;
  112. use App\Entity\Workflow;
  113. class CampaignController extends AbstractController
  114. {
  115.     public function __construct(
  116.         private CampaignService $campaignService,
  117.         private MissionService $missionService,
  118.         private UtilsService $utilsService,
  119.         private ProductTextToObjectTransformer $productTextToObjectTransformer,
  120.         private ContractService $contractService,
  121.         private GoogleStorageService $googleStorageService,
  122.         private DynamicHostService $dynamicHostService,
  123.         private CampaignApiService $campaignApiService
  124.     ) {
  125.     }
  126.     /**
  127.      * @param UserRepository $userRepository
  128.      * @param Request $request
  129.      * @return JsonResponse
  130.      */
  131.     #[Route('/api/client-infos'name'get_client_info'methods: ['GET'])]
  132.     public function clientInfos(UserRepository $userRepositoryRequest $request): JsonResponse
  133.     {
  134.         $email base64_decode($request->get('emailCli'));
  135.         $user $userRepository->findOneByEmail($email);
  136.         $company =  $user->getCompany(); 
  137.         $response = new JsonResponse(
  138.             [
  139.                 'companyName' =>$company != null ?$company->getName() : '--',
  140.                 'cellPhone' => $user->getCellPhone(),
  141.                 'address'=> $company != null ?$company->getCompanyData()->getAddress() : '--',
  142.             ]
  143.         );
  144.         $response->setEncodingOptions($response->getEncodingOptions() | JSON_UNESCAPED_UNICODE);
  145.         $response->headers->set('Access-Control-Allow-Origin''*');
  146.         $response->headers->set('Access-Control-Allow-Headers''Content-Type');
  147.         return $response;
  148.     }
  149.     /**
  150.      * @param CampaignRepository $campaignRepository
  151.      * @param Request $request
  152.      * @return JsonResponse
  153.      */
  154.     #[Route('/search'name'result_for_search_bar'methods: ['GET'])]
  155.     public function search(CampaignRepository $campaignRepositoryRequest $request): JsonResponse
  156.     {
  157.         
  158.        
  159.         $data = [];
  160.         $query = ($request->get('query'));
  161.         $archived = ($request->get('archived'));
  162.         $deleted = ($request->get('deleted'));
  163.         $company null;
  164.         $subContractorAndAdmin = ($this->isGranted(Role::ROLE_ADMIN->value) or $this->isGranted(Role::ROLE_SUBCONTRACTOR->value)) ? true false;
  165.         $isSubcontractor = ($this->isGranted(Role::ROLE_SUBCONTRACTOR->value)) ? true false;
  166.         //determine who is connected and return result by user
  167.         if ($this->isGranted(Role::ROLE_ADMIN->value)) { //all campaing
  168.             $user null;
  169.         } elseif ($this->isGranted(Role::ROLE_SUBCONTRACTOR->value)) { //only your campaing in all company
  170.             $user $this->getUser();
  171.         } else { //user only all campain in all company
  172.             $user $this->getUser();
  173.             $company $user->getCompany();
  174.         }
  175.         $campaigns $campaignRepository->querySearch($query$archived$user$company$subContractorAndAdmin$deleted,$isSubcontractor);
  176.         foreach ($campaigns as $campaign) {
  177.             $data[] = ['name' => str_pad($campaign['reference'], 50STR_PAD_LEFT) . " " $campaign['name'] . " (" $campaign['nameCompany'] . ") "'key' => $query'idCampaing' => $campaign['id']];
  178.         }
  179.         $response =  new JsonResponse(['data' => $data]);
  180.         $response->setEncodingOptions($response->getEncodingOptions() | JSON_UNESCAPED_UNICODE);
  181.         $response->headers->set('Access-Control-Allow-Origin''*');
  182.         $response->headers->set('Access-Control-Allow-Headers''Content-Type');
  183.         return $response;
  184.     }
  185.     /**
  186.      * @param UserRepository $userRepository
  187.      * @param ProductRepository $productRepository
  188.      * @param Request $request
  189.      * @return JsonResponse
  190.      */
  191.     #[Route('/api/remise-product-credit'name'get_price_product_with_remise_when_credit'methods: ['GET'])]
  192.     public function remiseProduct(UserRepository $userRepositoryProductRepository $productRepositoryRequest $request): JsonResponse
  193.     {
  194.         $email base64_decode($request->get('emailCli'));
  195.         $credit 220;
  196.         $product $productRepository->findOneByFrontId($request->get('product_id'));
  197.         $user $userRepository->findOneByEmail($email);
  198.         $discount $user->getCompany()->getCustomerDiscount();
  199.         $response = new JsonResponse(
  200.             [
  201.                 'product_price' => $product->getPrice(),
  202.                 'discount' => $discount,
  203.                 'price_credit_with_remise' => ($credit - (($credit $discount) / 100))
  204.             ]
  205.         );
  206.         $response->setEncodingOptions($response->getEncodingOptions() | JSON_UNESCAPED_UNICODE);
  207.         $response->headers->set('Access-Control-Allow-Origin''*');
  208.         $response->headers->set('Access-Control-Allow-Headers''Content-Type');
  209.         return $response;
  210.     }
  211.     /**
  212.      * @param CompanyRepository $companyRepository
  213.      * @param Request $request
  214.      * @return JsonResponse
  215.      */
  216.     #[Route('/api/premium-package'name'premium_package'methods: ['POST'])]
  217.     public function premiumPackage(UserRepository $userRepositoryEventDispatcherInterface $dispatcherRequest $request): JsonResponse
  218.     {
  219.         $email =  $request->request->get('email');
  220.         $otherEmail $request->request->get('otherEmail');
  221.         $user $userRepository->findOneByEmail($email);
  222.         try {
  223.             $event = new PremiumPackageEvent($user$otherEmail);
  224.             $dispatcher->dispatch($eventPremiumPackageEvent::NAME);
  225.             $response = new JsonResponse(['success']);
  226.         } catch (\Error $e) {
  227.             $response = new JsonResponse(['failed']);
  228.         }
  229.         $response->setEncodingOptions($response->getEncodingOptions() | JSON_UNESCAPED_UNICODE);
  230.         $response->headers->set('Access-Control-Allow-Origin''*');
  231.         $response->headers->set('Access-Control-Allow-Headers''Content-Type');
  232.         return $response;
  233.     }
  234.     /**
  235.      * @param CompanyRepository $companyRepository
  236.      * @param Request $request
  237.      * @return JsonResponse
  238.      */
  239.     #[Route('/api/discount'name'company_discount'methods: ['POST'])]
  240.     public function discount(CompanyRepository $companyRepositoryRequest $request): JsonResponse
  241.     {
  242.         $id $request->request->get('id');
  243.         $company $companyRepository->findByFrontId((int)$id);
  244.         return new JsonResponse((int)$company[0]->getCustomerDiscount());
  245.     }
  246.      /**
  247.      * @param CompanyRepository $companyRepository
  248.      * @param Request $request
  249.      * @return JsonResponse
  250.      */
  251.     #[Route('/api/discountinBack/{id}'name'company_discount_in_back'methods: ['GET'])]
  252.     public function discountInBack($id,CompanyRepository $companyRepositoryRequest $request): JsonResponse
  253.     {
  254.         $company $companyRepository->findById($id);
  255.         return new JsonResponse($company[0]->getCustomerDiscount());
  256.     }
  257.     /**
  258.      * @param CompanyRepository $companyRepository
  259.      * @param Request $request
  260.      * @return JsonResponse
  261.      */
  262.     #[Route('/api/getAllUser/{id}/{idCampaing}'name'company_getAll_user_in_back'methods: ['GET'])]
  263.     public function allUsersCompany($id,$idCampaingCampaignApiService $campaignApiServiceUserRepository $userRepository,CampaignRepository $campaignRepositoryRequest $request,CompanyRepository $companyRepository): JsonResponse
  264.     {
  265.         /*
  266.         return sprintf('%s - %s (%s)', $user->getLastname(), $user->getFirstname(), $user->getEmail());
  267.          */
  268.         
  269.         $alldataUser = [];
  270.         $alldataUser[] = [
  271.             'id' => 0,
  272.             'text' => 'Choisir un utilisateur',
  273.         ];
  274.         $company $companyRepository->find($id);
  275.         $allUsers $userRepository->findByIdCompany($id,$company);
  276.         //get all user externaly
  277.         
  278.         
  279.         $campaign $campaignRepository->find($idCampaing);
  280.         
  281.         if (!is_null($campaign) and !empty($campaign)) {
  282.             $userExternal $campaign->getAllUserExternal();
  283.             $additionnal $campaignApiService->getAdditionalUserEmail($campaigntrue); 
  284.             
  285.             if (!is_null($userExternal) and !empty($userExternal)) {
  286.                 foreach($userExternal as $user) {
  287.                     $alldataUser []= [
  288.                         'id' => $user->getId(),
  289.                         'text' => sprintf('%s - %s (%s)'$user->getLastname(), $user->getFirstname(), $user->getEmail())
  290.                     ];
  291.                 }
  292.             }
  293.             foreach($additionnal as $user) {
  294.                 $alldataUser []= [
  295.                     'id' => $user->getId(),
  296.                     'text' => sprintf('%s - %s (%s)'$user->getLastname(), $user->getFirstname(), $user->getEmail())
  297.                 ];
  298.             }
  299.         }
  300.         foreach ($allUsers as $user) {
  301.            
  302.                $alldataUser[] = [
  303.                     'id' => $user->getId(),
  304.                     'text' => sprintf('%s - %s (%s)'$user->getLastname(), $user->getFirstname(), $user->getEmail())
  305.                ];
  306.            
  307.         }
  308.         return new JsonResponse($alldataUser);
  309.     }
  310.      /**
  311.      * @param CompanyRepository $companyRepository
  312.      * @param Request $request
  313.      * @return JsonResponse
  314.      */
  315.     #[Route('/api/getAllJob/{id}'name'product_all_id_job'methods: ['GET'])]
  316.     public function allJobId($id,ProductRepository $productRepositoryRequest $request): JsonResponse
  317.     {
  318.         $idJob "";
  319.         $product $productRepository->findById((int) $id );
  320.         if (!empty($product)) {
  321.             foreach ($product[0]->getJobs() as $job) {
  322.                $idJob .= $job->getId().",";
  323.             }
  324.         }
  325.         return new JsonResponse($idJob);
  326.     }
  327.     /**
  328.      * @param CompanyRepository $companyRepository
  329.      * @param Request $request
  330.      * @return JsonResponse
  331.      */
  332.     #[Route('/api/creditHistory/company/{id}'name'company_get_credit_in_back'methods: ['GET'])]
  333.     public function creditHistoryForCompany($id,CreditHistoryRepository $creditHistoryRepositoryCompanyRepository $companyRepositoryRequest $request)
  334.     {
  335.         $company $companyRepository->findById($id);
  336.         $creditHistory $creditHistoryRepository->findAvailableServiceHistory($company[0],new \DateTime());
  337.         return $this->renderForm('credit_history/list.html.twig', [
  338.             'creditHistory' => $creditHistory,
  339.         ]);
  340.     }
  341.     /**
  342.      * @param CompanyRepository $companyRepository
  343.      * @param Request $request
  344.      * @return JsonResponse
  345.      */
  346.     #[Route('/api/imgCompany'name'company_img'methods: ['GET'])]
  347.     public function imgCompany(CompanyRepository $companyRepositoryRequest $requestParameterBagInterface $parameter): JsonResponse
  348.     {
  349.         $idCompany $request->get('companyId');
  350.         $urlDir $parameter->get('dir_logo_company');
  351.         if (empty($idCompany)) {
  352.             $response = new JsonResponse(['failed']);
  353.         }
  354.         $company $companyRepository->findById($idCompany);
  355.         if (is_null($company[0]?->getLogoName())) {
  356.             $response = new JsonResponse(['failed']);
  357.         } else {
  358.             $response = new JsonResponse([$urlDir $company[0]->getLogoName()]);
  359.         }
  360.         $response->setEncodingOptions($response->getEncodingOptions() | JSON_UNESCAPED_UNICODE);
  361.         $response->headers->set('Access-Control-Allow-Origin''*');
  362.         $response->headers->set('Access-Control-Allow-Headers''Content-Type');
  363.         return $response;
  364.     }
  365.     /**
  366.      * Display the view/handle how to edit a campaign
  367.      *
  368.      * @param Request $request
  369.      * @param EntityManagerInterface $entityManager
  370.      * @return Json
  371.      */
  372.     #[Route('/api/preCommande'name'pre_commande'methods: ['POST'])]
  373.     public function preCommande(Request $requestEntityManagerInterface $entityManagerUserRepository $userRepositoryProductRepository $productRepositoryEventDispatcherInterface $dispatcher)
  374.     {
  375.         $campaignData $request->request->get('campaign');
  376.         $missionData $request->request->get('missions');
  377.         $type $request->request->get('type');
  378.         $user $userRepository->findOneBy(['email' => $campaignData['orderedBy']]);
  379.         $admins $this->dynamicHostService->getMailAdmin();
  380.         $campaign = new Campaign();
  381.         $campaign->setName($campaignData['name'])
  382.             ->setBrief($campaignData['brief']);
  383.         $entityManager->persist($campaign);
  384.         $campaign->setCompany($user->getCompany())
  385.             ->setOrderedBy($user);
  386.         foreach ($missionData as $missions) {
  387.             if (isset($missions['product'])) {
  388.                 $mission  = new Mission();
  389.                 $product  $productRepository->findByFrontId($missions['product']);
  390.                 if (!empty($product)) {
  391.                     $mission->setProduct($product[0])
  392.                         ->setPrice(floatval(str_replace(",""."$missions['price'])))
  393.                         ->setQuantity($missions['quantity']);
  394.                 }
  395.                 $campaign->addMission($mission);
  396.             }
  397.         }
  398.         if ($type === "devis") {
  399.             $event = new DevisCreatedNotFinished($campaign$user);
  400.             $dispatcher->dispatch($eventDevisCreatedNotFinished::NAME);
  401.         } else {
  402.             $event = new CampaignNotFinishedEvent($campaign$mission$user);
  403.             $dispatcher->dispatch($eventCampaignNotFinishedEvent::NAME);
  404.         }
  405.         $entityManager->remove($campaign);
  406.         $entityManager->flush();
  407.         return new JsonResponse([]);
  408.     }
  409.     #[Route('/campaigns/draft/edit/{id}'name'edit_draft'methods: ['GET','POST'])] 
  410.     public function editDraft(Campaign $campaign,CampaignWpEditService $campaignWpEditService,  EntityManagerInterface $entityManager,  Request $request,MissionParticipantService $missionParticipantServiceCompanyService $companyServiceCreditHistoryRepository $creditHistoryRepository){
  411.         
  412.         if($campaign->getState() == 'draft'){
  413.             $formWpEdit $this->createForm(CampaignEditWpType::class, $campaign);
  414.             $formWpEdit->handleRequest($request);
  415.     
  416.             if($formWpEdit->isSubmitted()){
  417.                 $observer=[];
  418.                 $ExternalObserver=[];
  419.                 $validator=[];
  420.                 $extenalValidator=[];
  421.                 $campaignWpEditService->removeAllParticipantNotSubcontractor($campaign);
  422.     
  423.                 $participants $request->request->get('participants');
  424.                 $creditHistoryId $request->request->get('campaign_edit_wp')['contract'];
  425.                 $confidentiality = isset($request->request->get('campaign_edit_wp')['confidentiality']) ? true false;
  426.                 
  427.                 $attachements $request->files->get('attachements'); 
  428.     
  429.                 // dd($request->files->get('attachements'));
  430.                 if($creditHistoryId != null){
  431.                     $creditHistory $creditHistoryRepository->findOneById($creditHistoryId);
  432.                     $campaign->setCreditHistory($creditHistory);
  433.                 }
  434.            
  435.                 $campaign->setConfidentiality($confidentiality);
  436.                 
  437.                 
  438.     
  439.                 foreach ($campaign->getMissions() as $mission) {
  440.                     if($participants != null){
  441.     
  442.                         foreach ($participants as $participant) {
  443.     
  444.                                 $email $participant['email_de_participant'];
  445.                                 $role $participant['type_de_participant'];
  446.     
  447.                                 $role =  $campaignWpEditService->formatToValidRole($role); 
  448.                                 $participantPersisted $campaignWpEditService->addPartipant($mission$email$role );
  449.     
  450.                                 switch ($role) {
  451.                                     case 'ROLE_VALIDATOR':
  452.                                         $validator=[...$validator$participantPersisted->getUser()->getEmail()];
  453.                                         break;
  454.                                     case 'ROLE_OBSERVER':
  455.                                         $observer=[...$observer$participantPersisted->getUser()->getEmail()];
  456.                                         break;
  457.                                     case 'ROLE_VALIDATOR_EXTERNAL':
  458.                                         $extenalValidator=[...$extenalValidator$participantPersisted->getUser()->getEmail()];
  459.                                     break;
  460.                                     case 'ROLE_OBSERVER_EXTERNAL':
  461.                                         $ExternalObserver=[...$ExternalObserver$participantPersisted->getUser()->getEmail()];
  462.                                     break;
  463.                                 }   
  464.                             }                                       
  465.                         }
  466.                 }
  467.     
  468.                 
  469.                 $campaign->setDefautObserver($observer);
  470.                 $campaign->setDefautObserverExternal($ExternalObserver);
  471.     
  472.                 $campaign->setDefaultValidator($validator);
  473.                 $campaign->setDefaultValidatorExternal($extenalValidator);
  474.                 $campaign->setLastStepWp(4);
  475.                 $entityManager->flush();
  476.     
  477.                 $pathCampaing 'file_campaing_directory';
  478.                 $pathMission 'file_mission_directory';
  479.                 foreach ($attachements as $file) {
  480.                     $destination $this->getParameter($pathCampaing) . '/' $campaign->getId();
  481.                     $originalFilename pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
  482.                     $newFilename $originalFilename '-' uniqid() . '.' $file->guessExtension();
  483.                     $file->move(
  484.                         $destination,
  485.                         $newFilename
  486.                     );
  487.                     $fileMission = new FileMission();
  488.                     $fileMission->setName($newFilename);
  489.                     $campaign->addFileMission($fileMission);
  490.     
  491.                     //add to mission 
  492.                     foreach ($campaign->getMissions() as $mission) {
  493.                        
  494.                         $destinationFileMission $this->getParameter($pathMission) . '/' $mission->getId();
  495.                         if (!is_dir($destinationFileMission)) {
  496.                             mkdir($destinationFileMission0755true);
  497.                         }
  498.     
  499.                         copy($destination '/' $newFilename$destinationFileMission '/' $newFilename);
  500.                         $fileMission = new FileMission();
  501.                         $fileMission->setName($newFilename);
  502.                         $mission->addFileMission($fileMission);
  503.                     }
  504.                 }
  505.                 $entityManager->flush();
  506.                return  $this->redirectToRoute('campaign_recapitulatif',[
  507.                     'id'=>$campaign->getId(),
  508.                     'showStep'=> 'step'
  509.                 ]);
  510.             }
  511.             $creditHistories$companyService->getAvailableContract(creditHistories$creditHistoryRepository->findAvailableServiceHistory($campaign->getCompany(),new \DateTime()));
  512.             $creditHistoriesFormated array_reduce($creditHistories, function($carry$item){ return  [...$carry, ...$item];},[]);
  513.             $participants =  $missionParticipantService->getParticipants($campaign'user'false);
  514.     
  515.             return $this->render('/draft/edit.html.twig',[
  516.                 'campaign'=>$campaign
  517.                 'form_wp_edit'=> $formWpEdit->createView(),
  518.                 'credit_histories' => $creditHistoriesFormated
  519.                 'participants_client' => $missionParticipantService->getClient($campaign''false), 
  520.                 'participants_subcontractor' => $missionParticipantService->getSubcontractorWithMissing($campaign), 
  521.                 'step'=> $campaign->getLastStepWp() != null ? ($campaign->getLastStepWp() == $campaign->getLastStepWp()) : 1,
  522.                 'show_step'=>true
  523.             ]);
  524.         }
  525.         $this->addFlash('error','Cette commande n\'est pas un brouillon !');
  526.         return $this->redirectToRoute('mission_index');
  527.     }
  528.     #[Route('/campaigns/draft/validate/{id}/{fromRecap}'name'validate_draft'methods: ['GET'], defaults:['fromRecap'=>''])] 
  529.     public function validateDraft(Campaign $campaign,string $fromRecap,CampaignRecurrentService $campaignRecurrentServiceEventDispatcherInterface $dispatcherEntityManagerInterface $entityManagerRequest $request): RedirectResponse
  530.     {
  531.         
  532.         $isDevis sizeof($campaign->getMissions()) == 0  true false
  533.         $campaign->setState($isDevis 'provisional' 'waiting') ;
  534.         if ($campaign->getActiveFrequency()) {
  535.             $now = new \DateTime();
  536.             $startDate $campaign->getFrequency()->getStartDate();
  537.             $hours $now->format('G');
  538.             $minutes $now->format('i');
  539.             $second $now->format('s');
  540.             $newStartDate $startDate->setTime($hours$minutes$second);
  541.             $campaign->getFrequency()->setStartDate($newStartDate);
  542.             $campaign->setIsRecurrent(true);
  543.             $campaign->setRecurringState('in_progress');
  544.             $campaign->setState('recurred');
  545.             
  546.             //create a campaign in new start date
  547.             $eventRecurrent = new CampaignRecurrentEvent($campaigntrue);
  548.             $dispatcher->dispatch($eventRecurrentCampaignRecurrentEvent::NAME);
  549.             if($now->format('y/d/m G:i') >=  $startDate->format('y/d/m G:i')){
  550.                 $campaignRecurrentService->updateLaunchRecurringAt($campaign);
  551.                 $newCampaign =  $campaignRecurrentService->clone($campaign);
  552.                 $entityManager->persist($newCampaign);
  553.                 $campaign $newCampaign;
  554.             }else{
  555.                  $campaignRecurrentService->updateLaunchRecurringAt(campaign:$campaign,dateToLaunch:$newStartDate);
  556.             }
  557.             $entityManager->flush();
  558.      
  559.         }
  560.         
  561.         $event $isDevis ? new CampaignCreatedEvent($campaign'CREATION_DEVIS') :  new CampaignCreatedEvent($campaign);
  562.         $dispatcher->dispatch($eventCampaignCreatedEvent::NAME);
  563.         $this->addFlash('success','Commande enregistrée avec succès');
  564.         $entityManager->flush();
  565.         $fromRecap $fromRecap == "recap" true false
  566.         return  $fromRecap  $this->redirectToRoute('mission_index') : $this->redirect($request->headers->get('referer'));
  567.     }
  568.     #[Route('/api/campaigns'name'api_campaigns_create'methods: ['POST''GET'])]
  569.     public function create(Request $request,CampaignWpEditService $campaignWpEditService,  CampaignRecurrentService $campaignRecurrentServiceEntityManagerInterface $entityManagerSerializerInterface $serializerCreditHistoryRepository $creditHistoryRepository,  WorkflowRepository $workflowRepositoryUserRepository $userRepositoryEventDispatcherInterface $dispatcherUserPasswordHasherInterface $passwordHasherMissionService $missionServiceMailerInterface $mailerMissionRepository $missionRepository,GoogleStorageService $googleStorageService): JsonResponse
  570.     {
  571.         
  572.        
  573.         $campaign = new Campaign();
  574.         $form $this->createForm(CampaignType::class, $campaign);
  575.         $form->handleRequest($request);
  576.        
  577.         // $errors = $form->getErrors(true, true);
  578.         // foreach ($errors as $error) {
  579.         //     mail('r.rado@yopmail.com','name',$error->getOrigin()->getName());
  580.         //     mail('r.rado@yopmail.com','valeur',$error->getOrigin()->getData());
  581.         //     mail('r.rado@yopmail.com','message',$error->getMessage());
  582.         //     mail('r.rado@yopmail.com', 'Erreur : Fichier',$error->getCause() );
  583.         //     mail('r.rado@yopmail.com', 'Erreur : Ligne',$error->getMessageTemplate());
  584.         // }
  585.         
  586.         // mail('r.rado@yopmail.com','kmlkjmlkj',$campaign->getConfidentiality() ? "true": "false");
  587.         // mail('r.rado@yopmail.com','user',$campaign->getOrderedBy()!=null ? $campaign->getOrderedBy()->getFullName(): "false");
  588.         if ($form->isSubmitted() && $form->isValid()) {
  589.             $stateDraft"";
  590.           
  591.             if($campaign->getLastStepWp()!=null){
  592.                 $stateDraft 'draft';
  593.                 //$campaignWpEditService->deleteOldDraft($campaign);  
  594.             }
  595.             $newUserCreateId = [];
  596.             $launchJustOne true;
  597.             $isDevis false;
  598.             $observerList = [];
  599.             $defaultValidator = [];
  600.             $defaultValidatorExternal = [];
  601.             $defaultObserverExernal = [];
  602.             $company $campaign->getOrderedBy()->getCompany();
  603.             $creditHistoryId $form->get('creditserviceId')->getData();
  604.             $orderedByAdmin $request->query->get('ordered_by_admin'"false") == "true" true false;
  605.             $idAdmin = (!is_null($request->query->get('admin_id'))) ? $request->query->get('admin_id') : false;
  606.             $campaignTypeInitiation CampaignTypeInitiation::CAMPAIGN_FROM_TUNNEL_CLIENT->value;
  607.             $historyActionCampaignInitiation 'campaign_initiate_by_tunnel_client';
  608.             $creditHistory $creditHistoryRepository->findOneById($creditHistoryId);
  609.             $campaign->setCompany($company);
  610.             $campaign->setCreditHistory($creditHistory);
  611.             $campaign->setBrief(nl2br($this->utilsService->formatLinkToAnchor($campaign->getBrief())));
  612.             $campaign->setIsOrdoredByAdmin($orderedByAdmin);
  613.             $attachments explode('|'$form->get('attachments')->getData());
  614.             $participants explode('|'$form->get('participants')->getData());
  615.             $verifOrderByIsHer false;
  616.             foreach ($participants as $p) {
  617.                 if (strpos($p$campaign->getOrderedBy()->getEmail()) !== false) {
  618.                     $verifOrderByIsHer true;
  619.                 }
  620.                
  621.             }
  622.             if (!$verifOrderByIsHer ) {
  623.                 $participants[] = "{$campaign->getOrderedBy()->getEmail()},ROLE_VALIDATOR";
  624.             } 
  625.             
  626.             $state 'waiting';
  627.             foreach ($campaign->getMissions() as $mission) {
  628.                 $mission->setInitialBriefing(nl2br($this->utilsService->formatLinkToAnchor($mission->getInitialBriefing())));
  629.                 if ($mission->getProduct()->getType() === ProductType::A_EVALUER) {
  630.                     $state 'waiting';
  631.                 }
  632.             }
  633.           
  634.             if ($campaign->getMissions()->count() === 0) {
  635.                 $state 'provisional';
  636.                 $isDevis true;
  637.                 $campaignTypeInitiation CampaignTypeInitiation::CAMPAIGN_FROM_DEVIS_CLIENT->value;
  638.                 //send mail new user in demande de devis
  639.                 foreach ($participants as $participant) {
  640.                     if (!empty($participant)) {
  641.                         [$email$role] = explode(','$participant);
  642.                         $user $userRepository->findOneBy(['email' => $email]);
  643.                         $role_client = (in_array($role, ['ROLE_OBSERVER_EXTERNAL','ROLE_VALIDATOR_EXTERNAL'])) ? "ROLE_CLIENT" $role ;
  644.                         if (null === $user) {
  645.                             $user = (new User())
  646.                                 ->setEmail($email)
  647.                                 ->setRoles([$role_client])
  648.                                 ->setEnabled(false)
  649.                                 ->setIsNewClient(true)
  650.                                 ;
  651.                             $user->setPassword($passwordHasher->hashPassword($user$user->getPassword()));
  652.                             $entityManager->persist($user);
  653.                             $entityManager->flush();
  654.                             $event = new ClientUpdatedEvent($usertrue);
  655.                             $newUserCreateId[] = $user->getId();
  656.                             $dispatcher->dispatch($eventClientUpdatedEvent::NAME);
  657.                         }
  658.                         //for observer
  659.                         if ($role == "ROLE_OBSERVER") {
  660.                             $observerList = [...$observerList$email];
  661.                         }
  662.                         //for validator
  663.                         if ($role == "ROLE_VALIDATOR") {
  664.                             $defaultValidator = [...$defaultValidator$email];
  665.                         }
  666.                         //for validator EXTERNAL
  667.                         if ($role == "ROLE_VALIDATOR_EXTERNAL") {
  668.                             $defaultValidatorExternal = [...$defaultValidatorExternal$email];
  669.                         }
  670.                         //for observer externe
  671.                         if ($role == "ROLE_OBSERVER_EXTERNAL") {
  672.                             $defaultObserverExernal = [...$defaultObserverExernal$email];
  673.                         }
  674.                         
  675.                     }
  676.                 }
  677.                 //creation piece jointe
  678.                 $filesystem = new Filesystem();
  679.                 foreach ($attachments as $attachment) {
  680.                     if (!empty($attachment)) {
  681.                        $fileContent file_get_contents($attachment);
  682.                         // Créez une instance de fichier téléchargé à partir du contenu téléchargé
  683.                         $tempFilePath tempnam(sys_get_temp_dir(), 'file');
  684.                         file_put_contents($tempFilePath$fileContent);
  685.                         $uploadedFile = new UploadedFile(
  686.                             $tempFilePath,
  687.                             basename($attachment), 
  688.                             mime_content_type($tempFilePath)
  689.                         );
  690.                         $originalFilename pathinfo($uploadedFile->getClientOriginalName(), PATHINFO_FILENAME);
  691.                         $extensionFile =  pathinfo($uploadedFile->getClientOriginalName(), PATHINFO_EXTENSION);
  692.                         $newFilename $originalFilename '-' uniqid() . '.' $extensionFile;
  693.                          //upload file in google storage
  694.                         $nameUniqueCompany strtolower("company-".$campaign->getCompany()->getId());
  695.                         $this->googleStorageService->uploadFile($nameUniqueCompany,$uploadedFile,$newFilename,'Campaigns/'.$campaign->getId());
  696.                         $fileMission = new FileMission();
  697.                         $fileMission->setName($newFilename);
  698.                         $fileMission->setIsNew(1);
  699.                         $fileMission->setUser($campaign->getOrderedBy());
  700.                         $fileMission->setUser($campaign->getOrderedBy());
  701.                         $campaign->addFileMission($fileMission);
  702.                     }
  703.                 }
  704.                 $campaign->setDefautObserver($observerList);
  705.                 $campaign->setDefaultValidator($defaultValidator)
  706.                         ->setDefaultValidatorExternal($defaultValidatorExternal)
  707.                         ->setDefautObserverExternal($defaultObserverExernal);
  708.             }
  709.             
  710.             $state $stateDraft ==  'draft' $stateDraft  $state ;
  711.             
  712.             $campaign->setState($state);
  713.             foreach ($campaign->getMissions() as $mission) {
  714.                 if (empty($mission->getReference())) {
  715.                     $mission->setReference($missionService->generateReference());
  716.                 }
  717.                 if (
  718.                     $state === 'waiting' &&
  719.                     ($mission->getProduct()->getType() === ProductType::AU_FORFAIT) || ($mission->getProduct()->getType() === ProductType::AU_TEMPS_PASSE)
  720.                 ) {
  721.                     $mission->setState('provisional');
  722.                 } else {
  723.                     $mission->setState($state);
  724.                 }
  725.                 $mission->getState() === 'waiting' ?  $mission->setStateProvider('A évaluer') : $mission->setStateProvider('A activer');
  726.                 // recalculate the price of a mission from a product price not from a price of a mission
  727.                 $mission->setOriginalPrice($mission->getProduct()->getPrice());
  728.                 if ($mission->getProduct()->getType() != ProductType::AU_FORFAIT) {
  729.                     $mission->setPrice(null);
  730.                     $mission->setOriginalPrice(null);
  731.                 }
  732.                 $mission->setDiscountForCompany($campaign->getCompany()->getCustomerDiscount());
  733.                 $campaign->setPaymentMethod($campaign->getCompany()->getContract());
  734.                 $campaign->setDiscountForCompany($campaign->getCompany()->getCustomerDiscount());
  735.                 if ($campaign->getCompany()->getContract() == 0) {
  736.                     $DEFAULT_CREADIT_COST 220;
  737.                     $mission->setPrice(round($mission->getOriginalPrice() / $DEFAULT_CREADIT_COST2));
  738.                     $campaign->setIsPaidOnCredit(true);
  739.                 } else {
  740.                     $discountValueForOneCompany $campaign->getCompany()->getCustomerDiscount() / 100;
  741.                     $mission->setPrice($mission->getOriginalPrice() - $mission->getOriginalPrice() * $discountValueForOneCompany);
  742.                     $campaign->setIsPaidOnCredit(false);
  743.                 }
  744.                 $filesystem = new Filesystem();
  745.                 foreach ($attachments as $attachment) {
  746.                     if (!empty($attachment)) {
  747.                         $fileContent file_get_contents($attachment);
  748.                         // Créez une instance de fichier téléchargé à partir du contenu téléchargé
  749.                         $tempFilePath tempnam(sys_get_temp_dir(), 'file');
  750.                         file_put_contents($tempFilePath$fileContent);
  751.                         $uploadedFile = new UploadedFile(
  752.                             $tempFilePath,
  753.                             basename($attachment), 
  754.                             mime_content_type($tempFilePath)
  755.                         );
  756.                         $originalFilename pathinfo($uploadedFile->getClientOriginalName(), PATHINFO_FILENAME);
  757.                         $extensionFile =  pathinfo($uploadedFile->getClientOriginalName(), PATHINFO_EXTENSION);
  758.                         $newFilename $originalFilename '-' uniqid() . '.' $extensionFile;
  759.                          //upload file in google storage
  760.                         $nameUniqueCompany strtolower("company-".$campaign->getCompany()->getId());
  761.                         $this->googleStorageService->uploadFile($nameUniqueCompany,$uploadedFile,$newFilename,'Campaigns/'.$campaign->getId());
  762.                         $fileMission = new FileMission();
  763.                         $fileMission->setName($newFilename);
  764.                         $fileMission->setIsNew(1);
  765.                         $fileMission->setUser($campaign->getOrderedBy());
  766.                         $fileMission->setUser($campaign->getOrderedBy());
  767.                         $campaign->addFileMission($fileMission);
  768.                     }
  769.                 }
  770.                 $workflow $workflowRepository->findOneBy(['template' => true'product' => $mission->getProduct(), 'company' => $campaign->getCompany(), 'active' => true]);
  771.                 if (null === $workflow) {
  772.                     $workflow $workflowRepository->findOneBy(['template' => true'product' => $mission->getProduct(), 'active' => true]);
  773.                     if (null === $workflow) {
  774.                         $mission->setWorkflow(null);
  775.                         $event = new MissionWithoutWorkflowEvent($mission);
  776.                         /*$dispatcher->dispatch($event, MissionWithoutWorkflowEvent::NAME);*/
  777.                         $this->onMissionWithoutWorkflow($event$userRepository$mailer);
  778.                     }
  779.                 }
  780.                 if (null !== $workflow) {
  781.                     $missionWorkflow = clone $workflow;
  782.                     $missionWorkflow->setTemplate(false);
  783.                     $mission->setWorkflow($missionWorkflow);
  784.                     $missionWorkflow->setMission($mission);
  785.                     foreach ($missionWorkflow->getSteps() as $step) {
  786.                         foreach ($step->getActions() as $action) {
  787.                             if ($action->getRecipient() == Role::ROLE_OBSERVER_EXTERNAL or $action->getRecipient() == Role::ROLE_VALIDATOR_EXTERNAL) {
  788.                                 //take user and integrating in external user
  789.                                 foreach ($action->getUser() as $user) {
  790.                                     $participant = (new MissionParticipant())
  791.                                         ->setUser($user)
  792.                                         ->setMission($mission)
  793.                                         ->setRole(Role::tryFrom($action->getRecipient()->value));
  794.                                     $mission->addParticipant($participant);
  795.                                     $event = new ContactAddedEvent($mission$user$participant);
  796.                                     $dispatcher->dispatch($eventContactAddedEvent::NAME);
  797.                                 }
  798.                             }
  799.                         }
  800.                     }
  801.                 }
  802.                 $filesystem = new Filesystem();
  803.                 $listIdUser = [];
  804.                 foreach ($participants as $participant) {
  805.                     if (!empty($participant)) {
  806.                         [$email$role] = explode(','$participant);
  807.                         $user $userRepository->findOneBy(['email' => $email]);
  808.                         if (null === $user) {
  809.                             //role external is just a client
  810.                             $role_client = (in_array($role, ['ROLE_OBSERVER_EXTERNAL','ROLE_VALIDATOR_EXTERNAL'])) ? "ROLE_CLIENT" $role ;
  811.                             $user = (new User())
  812.                                 ->setEmail($email)
  813.                                 ->setRoles([$role_client])
  814.                                 ->setEnabled(false)
  815.                                 ->setIsNewClient(true)
  816.                                 ;
  817.                             if (in_array($role, ['ROLE_OBSERVER_EXTERNAL','ROLE_VALIDATOR_EXTERNAL'])) {
  818.                                 $user->setExternal(true);
  819.                             }
  820.                             $user->setPassword($passwordHasher->hashPassword($user$user->getPassword()));
  821.                             $entityManager->persist($user);
  822.                             $entityManager->flush();
  823.                             $event = new ClientUpdatedEvent($usertrue);
  824.                             $newUserCreateId[] = $user->getId();
  825.                             $dispatcher->dispatch($eventClientUpdatedEvent::NAME);
  826.                         } else {
  827.                             if (!in_array($user->getId(), $newUserCreateId) && true === $launchJustOne) {
  828.                                 if ($user->getId() != $mission->getCampaign()->getOrderedBy()->getId()) {
  829.                                     $event = new MissionSendEvent($mission$user$role);
  830.                                     $dispatcher->dispatch($eventMissionSendEvent::NAME);
  831.                                 }
  832.                             }
  833.                         }
  834.                         $participant = (new MissionParticipant())
  835.                             ->setUser($user)
  836.                             ->setMission($mission)
  837.                             ->setRole(Role::tryFrom($role));
  838.                         if (in_array($user->getId(), $listIdUser)) {
  839.                             $participant->setInitialTime(0)
  840.                                 ->setEstimatedIncome(0)
  841.                                 ->setAdminTime(0)
  842.                                 ->setEstimatedIncomeAdmin(0)
  843.                                 ->setActivated(1);
  844.                         }
  845.                         $listIdUser[] = $user->getId();
  846.                         $mission->addParticipant($participant);
  847.                         if ($role == "ROLE_OBSERVER") {
  848.                             $observerList = [...$observerList$email];
  849.                         }
  850.                     }
  851.                 }
  852.                 $launchJustOne false;
  853.             }
  854.             try {
  855.                 $campaign->setNumberInitialOfMissions(sizeof($campaign->getMissions()));
  856.                 $campaign->setDefautObserver($observerList);
  857.                 $campaign->setTypeInitiation($campaignTypeInitiation);
  858.                 $entityManager->persist($campaign);
  859.                 $entityManager->flush();
  860.                 foreach ($campaign->getMissions() as $mission) {
  861.                     $this->missionService->addHistorique(mission$missionuser:$campaign->getOrderedBy() , action$historyActionCampaignInitiation);
  862.                     $listOfUser = [];
  863.                     foreach ($mission->getParticipants() as $participant) {
  864.                         if ($participant->getRole() == Role::ROLE_SUBCONTRACTOR) {
  865.                             if (in_array($participant->getUser()->getId(), $listOfUser)) {
  866.                                 $participant->setInitialTime(0)
  867.                                     ->setEstimatedIncome(0)
  868.                                     ->setInitialTimeAdmin(0)
  869.                                     ->setEstimatedIncomeAdmin(0)
  870.                                     ->setActivated(1);
  871.                                 $entityManager->persist($participant);
  872.                                 $entityManager->flush();
  873.                             }
  874.                             $listOfUser[] = $participant->getUser()->getId();
  875.                         }
  876.                     }
  877.                 }
  878.                 $missionsPersited $campaign->getMissions();
  879.                 foreach ($missionsPersited as $missionPersisted) {
  880.                     if ($missionPersisted->getWorkflow() !== null && count($missionPersisted->getWorkflow()->getSteps()) > 0) {
  881.                         $missionPersisted->getWorkflow()->getSteps()->first()->setActive(false);
  882.                     }
  883.                     $missionPersisted->setOldCommand("{$missionPersisted->getQuantity()}-{$missionPersisted->getPrice()}-{$missionPersisted->getProduct()->getId()}-{$mission->getDesiredDelivery()->getTimestamp()}");
  884.                 }
  885.                 $entityManager->flush();
  886.                 if ($campaign->getActiveFrequency() && $campaign->getState() != "draft") {
  887.                     $now = new \DateTime();
  888.                     $startDate $campaign->getFrequency()->getStartDate();
  889.                     $campaignTypeInitiation CampaignTypeInitiation::CAMPAIGN_FROM_RECURRENT->value;
  890.                     $historyActionCampaignInitiation 'campaign_initiate_by_recurrent';
  891.                     $hours $now->format('G');
  892.                     $minutes $now->format('i');
  893.                     $second $now->format('s');
  894.                     $newStartDate $startDate->setTime($hours$minutes$second);
  895.                     $campaignTypeInitiation CampaignTypeInitiation::CAMPAIGN_FROM_RECURRENT->value;
  896.                     $historyActionCampaignInitiation 'campaign_initiate_by_recurrent';
  897.                     $campaign->getFrequency()->setStartDate($newStartDate);
  898.                     $campaign->setIsRecurrent(true);
  899.                     $campaign->setRecurringState('in_progress');
  900.                     $campaign->setState('recurred');
  901.                     $campaign->setTypeInitiation($campaignTypeInitiation);
  902.                     //create a campaign in new start date
  903.                     if($campaign->getState() != "draft"){
  904.                         $eventRecurrent = new CampaignRecurrentEvent($campaigntrue);
  905.                         $dispatcher->dispatch($eventRecurrentCampaignRecurrentEvent::NAME);
  906.                     }
  907.                     if($now->format('y/d/m G:i') >=  $startDate->format('y/d/m G:i')){
  908.                       /*   $campaignRecurrentService->updateLaunchRecurringAt($campaign);
  909.                         $newCampaign =  $campaignRecurrentService->clone($campaign);
  910.                         $entityManager->persist($newCampaign);
  911.                         $campaign = $newCampaign; */
  912.                         $this->createCampaignRecurrentFromFrontUntilNow($campaignRecurrentService,$campaign,$now,$entityManager);
  913.                     }else{
  914.                          $campaignRecurrentService->updateLaunchRecurringAt(campaign:$campaign,dateToLaunch:$newStartDate);
  915.                     }
  916.                     $entityManager->flush();
  917.              
  918.                 }
  919.                 if($campaign->getState()!='provisional'){
  920.                     foreach($campaign->getMissions() as $mission) {
  921.                         $this->missionService->addHistorique(mission$missionuser:$campaign->getOrderedBy() , action:$historyActionCampaignInitiation);
  922.                     } 
  923.                 }
  924.                 
  925.                 
  926.                 if($campaign->getState() != "draft"){
  927.                     $event $isDevis ? new CampaignCreatedEvent($campaign'CREATION_DEVIS') :  new CampaignCreatedEvent($campaign);
  928.                     $dispatcher->dispatch($eventCampaignCreatedEvent::NAME);
  929.                 }
  930.                 
  931.                 return new JsonResponse(
  932.                     json_decode($serializer->serialize($campaign'json', [AbstractNormalizer::GROUPS => ['campaign']])),
  933.                     Response::HTTP_CREATED
  934.                 );
  935.             } catch (\Exception $e) {
  936.                 foreach (array_unique($newUserCreateId) as $id) {
  937.                     $user $userRepository->findOneBy(['id' => $id]);
  938.                     $entityManager->remove($user);
  939.                     $entityManager->flush();
  940.                 }
  941.                 $campaign->setErrorCommand($e->getMessage());
  942.                 $event = new AdminCommandErrorEvent($campaign);
  943.                 $dispatcher->dispatch($eventAdminCommandErrorEvent::NAME);
  944.             }
  945.         }
  946.         return new JsonResponse([], Response::HTTP_BAD_REQUEST);
  947.     }
  948.     private function createCampaignRecurrentFromFrontUntilNow($campaignRecurrentService,$originalCampaign,$now,$entityManager){
  949.         $campaignRecurrentService->updateLaunchRecurringAt($originalCampaign);
  950.         $campaignFrequency $originalCampaign->getFrequency()->getLaunchRecurrenceAt();
  951.         $newCampaign =  $campaignRecurrentService->clone($originalCampaign);
  952.         $campaign $newCampaign;
  953.         $entityManager->persist($campaign);
  954.         $entityManager->flush();
  955.         if($campaignFrequency<$now){
  956.             $this->createCampaignRecurrentFromFrontUntilNow($campaignRecurrentService,$originalCampaign$now,$entityManager);
  957.         }
  958.         return;
  959.     }
  960.     /**
  961.      * Display the view/handle how to edit a campaign
  962.      *
  963.      * @param Campaign $campaign - the campaign to edit
  964.      * @param Request $request
  965.      * @param EntityManagerInterface $entityManager
  966.      *
  967.      * @return Response template /mission/handle_campaign.html.twig
  968.      */
  969.     #[Route('/campagnes/{id}'name'campaign_edit')]
  970.     public function edit(Campaign $campaignRequest $requestEntityManagerInterface $entityManager): Response
  971.     {
  972.         $form $this->createForm(CampaignType::class, $campaign);
  973.         $form->handleRequest($request);
  974.         if ($form->isSubmitted() && $form->isValid()) {
  975.             $this->addFlash('success''La campagne a bien été modifiée');
  976.             $entityManager->flush();
  977.             return $this->redirectToRoute('mission_index');
  978.         }
  979.         return $this->renderForm('campaign/edit.html.twig', [
  980.             'form' => $form,
  981.             'campaign' => $campaign,
  982.         ]);
  983.     }
  984.     #[Route('/campaign/{id}/uncancelled'name"campaign_uncancelled")]
  985.     public function campaignUncancelled(Campaign $campaignEntityManagerInterface $entityManagerInterface,EventDispatcherInterface $dispatcher,MissionService $missionService): Response
  986.     {
  987.         $campaign->setState($campaign->getLastState());
  988.         foreach ($campaign->getMissions() as $mission) {
  989.             $mission->setState($mission->getLastState());
  990.         }
  991.         $event = new CampaignResumeEvent($campaigntrue);
  992.         $dispatcher->dispatch($eventCampaignResumeEvent::NAME);
  993.         foreach ($campaign->getMissions() as $mission) {
  994.             $missionService->addHistorique(mission$missionuser$this->getUser(), action"unpause");
  995.         }
  996.         $entityManagerInterface->flush();
  997.         $this->addFlash(
  998.             type'success',
  999.             message"La campagne reprend avec succès ",
  1000.         );
  1001.         return $this->redirectToRoute('mission_index');
  1002.     }
  1003.     /**
  1004.      * If applicable, apply the workflow transition $transition on a campaign
  1005.      * and on all its missions.
  1006.      *
  1007.      * Only validate, pause, unpause, cancel and archived transitions are allowed
  1008.      *
  1009.      * @param Campaign $campaign - the campaign on whom to apply the transition
  1010.      * @param string $transition - the transition to apply
  1011.      * @param Registry $workflows
  1012.      * @param EntityManagerInterface $entityManager
  1013.      * @param EventDispatcherInterface $dispatcher
  1014.      *
  1015.      * @return Response Redirect to the mission's index
  1016.      */
  1017.     #[Route('/campagne/{id}/{transition<validate|pause|unpause|resend|cancel|archive|validation_by_client|activated|closed|delete|decline>}/{currentRouteName}/{firstClickedMissionId?}/{subcontractorId?}'name'campaign_transition'defaults: ['currentRouteName' => null'firstClickedMissionId' => null'subcontractorId' => null])]
  1018.     public function transition(Campaign $campaignMissionParticipantService $missionParticipantServiceClientSoldService $clientSoldServiceNumberFormatService $numberFormatServiceCampaignService $campaignServiceMissionService $missionServicestring $transitionRegistry $workflowsEntityManagerInterface $entityManagerEventDispatcherInterface $dispatcherRequest $requestPriceService $priceServiceWorkflowStepRepository $workflowStepRepositoryBalanceTransactionsRepository $balanceTransactionsRepository$currentRouteName null$firstClickedMissionId null$subcontractorId null): Response
  1019.     {
  1020.         $workflow $workflows->get($campaign'classic');
  1021.         $redirect $this->redirectToRoute('mission_index');
  1022.         if (isset($currentRouteName) && $currentRouteName == 'mission_edit' && isset($firstClickedMissionId)) {
  1023.             $redirect =  $this->redirectToRoute('mission_edit', ['id' => $firstClickedMissionId]);
  1024.         } 
  1025.         // clone original campagne 
  1026.         $originalCampaign =  clone $campaign;
  1027.         $originalMissions $originalCampaign->getMissions();
  1028.         if ($transition === "delete") {
  1029.             if($campaign->getState()=="draft"){
  1030.                 $campaign->setDeleteReason('Brouillon');
  1031.             }
  1032.             else {
  1033.                 $formDeleteCampaign $this->createForm(CampaignDeleteType::class, $campaign);
  1034.                 $formDeleteCampaign->handleRequest($request);
  1035.             }
  1036.             $campaign->setLastState($originalCampaign->getState());
  1037.             $pack $campaign->getCreditHistory();
  1038.             $isDeteleCampaignRecurrend $request->query->get('recurred') == true ?  true false;
  1039.             if (!$isDeteleCampaignRecurrend) {
  1040.                 // remove all price in creditHistory and BalanceTransaction if $transition is delete
  1041.                 $dataCampainState = ['in_progress''closed''cancelled''archived'];
  1042.                 if (in_array($campaign->getState(), $dataCampainState)) {
  1043.                     $totalAmountInBalance 0;
  1044.                     $isNull false;
  1045.                     $isNull count($campaign->getMissions()) === true false;
  1046.                     foreach ($campaign->getMissions() as $mission) {
  1047.                         $balanceTransaction $balanceTransactionsRepository->soldeByMission($pack$mission);
  1048.                         if (is_null($balanceTransaction)) {
  1049.                             $isNull true;
  1050.                             break;
  1051.                         }
  1052.                         $creditHistory $balanceTransaction->getCreditHistory();
  1053.                         $totalAmountInBalance += $balanceTransaction->getAmount();
  1054.                         $entityManager->remove($balanceTransaction);
  1055.                         $this->missionService->addHistorique($mission$this->getUser(),'mission_deleted',$mission);
  1056.                     }
  1057.                     if (!$isNull) {
  1058.                         $oldTotalConsuption $creditHistory->getTotalConsumption();
  1059.                         $oldCurrentBalance $creditHistory->getCurrentBalance();
  1060.                         $creditHistory->setTotalConsumption($oldTotalConsuption $totalAmountInBalance);
  1061.                         $creditHistory->setCurrentBalance($oldCurrentBalance $totalAmountInBalance);
  1062.                     }
  1063.                 }
  1064.               
  1065.                 foreach ($originalCampaign->getMissions() as $mission) {
  1066.                     $mission->setLastState($mission->getState());
  1067.                     $mission->setState('deleted');
  1068.                     $missionService->addHistorique(mission$missionuser$this->getUser(), action"deleted");
  1069.                 }
  1070.                 if($campaign->getState() !== "deleted"){
  1071.                     $event = new CampaignDeletedEvent($campaign$this->getUser());
  1072.                     $dispatcher->dispatch($eventCampaignDeletedEvent::NAME);
  1073.                 }
  1074.                 $campaign->setState('deleted');
  1075.             }
  1076.             else{
  1077.                 $campaign->setRecurringState('deleted');
  1078.             }
  1079.             $entityManager->flush();
  1080.             $this->addFlash(
  1081.                 type'success',
  1082.                 message"La campagne {$campaign->getName()} a bien été supprimée"
  1083.             );
  1084.             if ($isDeteleCampaignRecurrend) {
  1085.                 return $this->redirectToRoute('recurring_service');
  1086.             } elseif (isset($currentRouteName) && $currentRouteName == 'mission_edit' && isset($firstClickedMissionId)) {
  1087.                 return $this->redirectToRoute('mission_edit', ['id' => $firstClickedMissionId]);
  1088.             } else {
  1089.                 return $this->redirectToRoute('mission_index');
  1090.             }
  1091.         }
  1092.         
  1093.         if ($transition === 'decline') {
  1094.             foreach ($campaign->getMissions() as $mission) {
  1095.                 foreach ($mission->getParticipants() as $participant) {
  1096.                     if ($participant->getRole() == Role::ROLE_SUBCONTRACTOR && $participant->getUser()->getId() == $subcontractorId) {
  1097.                         $entityManager->remove($participant);
  1098.                         $entityManager->flush();
  1099.                         $this->missionService->addHistorique($mission$this->getUser(), 'decline_mission');
  1100.                         continue 2;
  1101.                     }
  1102.                 }
  1103.             }
  1104.             $event = new CampaignDeclineEvent($campaigntrue$this->getUser());
  1105.             $dispatcher->dispatch($eventCampaignDeclineEvent::NAME);
  1106.             foreach ($campaign->getMissions() as $mission) {
  1107.                 $missionService->addHistorique(mission$missionuser$this->getUser(), action"refus");
  1108.             }
  1109.             
  1110.             $this->addFlash(
  1111.                 type'success',
  1112.                 message"La mission {$campaign->getName()} a bien été supprimée"
  1113.             );
  1114.         }
  1115.         if ($workflow->can($campaign$transition)) {
  1116.             $workflow->apply($campaign$transition);
  1117.             if ($transition === 'unpause') {
  1118.                 $event = new CampaignResumeEvent($campaigntrue);
  1119.                 $dispatcher->dispatch($eventCampaignResumeEvent::NAME);
  1120.                 foreach ($campaign->getMissions() as $mission) {
  1121.                     $missionService->addHistorique(mission$missionuser$this->getUser(), action"unpause");
  1122.                 }
  1123.             }
  1124.             if ($transition === 'resend') {
  1125.                 foreach ($campaign->getMissions() as $mission) {
  1126.                     $missionService->addHistorique(mission$missionuser$this->getUser(), action"resend");
  1127.                 }
  1128.             }
  1129.             if ($transition === 'pause') {
  1130.                 $event = new CampaignWaitingEvent($campaigntrue);
  1131.                 $dispatcher->dispatch($eventCampaignWaitingEvent::NAME);
  1132.                 foreach ($campaign->getMissions() as $mission) {
  1133.                     $missionService->addHistorique(mission$missionuser$this->getUser(), action"pause");
  1134.                 }
  1135.             }
  1136.             if ($transition === 'cancel') {
  1137.                 $formCancelCampaign $this->createForm(CampaignCancelType::class, $campaign);
  1138.                 $formCancelCampaign->handleRequest($request);
  1139.                 $campaign->setLastState($originalCampaign->getState());
  1140.                 foreach ($originalCampaign->getMissions() as $mission) {
  1141.                     $mission->setLastState($mission->getState());
  1142.                     $missionService->addHistorique(mission$missionuser$this->getUser(), action"cancel");
  1143.                 }
  1144.                 $entityManager->flush();
  1145.                 $event = new CampaignCancelledEvent($campaign$this->getUser(),);
  1146.                 $dispatcher->dispatch($eventCampaignCancelledEvent::NAME);
  1147.             }
  1148.             if ($transition === "closed") {
  1149.                 foreach ($campaign->getMissions() as $mission) {
  1150.                     $mission->setState('finalized');
  1151.                     $campaign->setIsToBeinvoiced(true);
  1152.                     if(sizeof($this->campaignApiService->getSubcontractorNoEstimatedIncome($campaign)) != 0){
  1153.                         $campaign->setState('closing_in_progress');
  1154.                     }
  1155.                     // if ($mission->getProduct()->getType() == ProductType::AU_TEMPS_PASSE) {
  1156.                     $clientSoldService->decreaseCurrentBalanceByMissionCost(mission$mission);
  1157.                     // }
  1158.                     $missionService->addHistorique(mission$missionuser$this->getUser(), action"closed");
  1159.                 }
  1160.             }
  1161.             foreach ($campaign->getMissions() as $mission) {
  1162.                 $workflow $workflows->get($mission'classic');
  1163.                 if ($workflow->can($mission$transition)) {
  1164.                     $workflow->apply($mission$transition);
  1165.                 }
  1166.             }
  1167.             // If we validate the campaign, we dispatch the campaign.validated event
  1168.             if ($transition === 'validate') {
  1169.                 $flag true;
  1170.                 foreach ($campaign->getMissions() as $mission) {
  1171.                     $i 0;
  1172.                     foreach ($mission->getParticipants() as $participant) {
  1173.                         if ($participant->getRole() == Role::ROLE_SUBCONTRACTOR) {
  1174.                             $i++;
  1175.                         }
  1176.                         if ($i || $participant->getMission()->getStateProvider() == 'A évaluer') {
  1177.                             $flag false;
  1178.                         }
  1179.                     }
  1180.                     $missionService->addHistorique(mission$missionuser$this->getUser(), action"validate");
  1181.                 }
  1182.                 if ($flag == true) {
  1183.                     $event = new CampaignValidatedEvent($campaign);
  1184.                     $dispatcher->dispatch($eventCampaignValidatedEvent::NAME);
  1185.                 } else {
  1186.                     return $this->redirectToRoute('handle_mission_campaign', ['id' => $campaign->getId(), 'erreur' => true]);
  1187.                 }
  1188.             }
  1189.             if ($transition === 'activated') {
  1190.                 $canStartCampaign true;
  1191.                 $error false;
  1192.                 $userConnected $this->getUser();
  1193.                
  1194.                 if (in_array("ROLE_SUBCONTRACTOR"$userConnected->getRoles())) {
  1195.                     $message = [];
  1196.                     foreach ($campaign->getMissions() as $mission) {
  1197.                         $missionService->setDefaultValueIfAnUserClickedAnActivationButtonWithoutADelaisAndTimeIsEmpty($mission$priceService);
  1198.                        
  1199.                         //////////////////// Check marge mission  
  1200.                         $getMargeMyFlow $priceService->marginExceeded(mission$mission);
  1201.                         if ($missionService->isMyMission(mission$mission) and $getMargeMyFlow['percentage'] <= and $mission->getProduct()->getType() != ProductType::AU_TEMPS_PASSE) {
  1202.                             if ($this->isGranted(Role::ROLE_SUBCONTRACTOR->value)) {
  1203.                                 $this->addFlash(
  1204.                                     type'error',
  1205.                                     message"Une action de l'administrateur est attendue pour pouvoir valider cette mission.",
  1206.                                 );
  1207.                                 $event = new MissionCanActivateEvent(mission$missionmarge$getMargeMyFlow['percentage'] );
  1208.                                 $dispatcher->dispatch($eventMissionCanActivateEvent::NAME);
  1209.                             }
  1210.                             $campaign->setState($originalCampaign->getState());
  1211.                             $mission->setState($mission->getLastState());
  1212.                             $entityManager->flush();
  1213.                             $canStartCampaign false;
  1214.                             continue; 
  1215.                             //return  $redirect;
  1216.                         }
  1217.                         ////////////////////////
  1218.                         foreach ($mission->getParticipants() as $missionParticipation) {
  1219.                             if (!$missionParticipation->isEvaluate() && !$missionParticipation->isActivated() && !$missionParticipation->isRefused() && $this->getUser() == $missionParticipation->getUser()) {
  1220.                                 $missionParticipation->setActivated(true);
  1221.                                 $missionParticipation->setActivatedAt(new \DateTime());
  1222.                                 $entityManager->flush();
  1223.                                 $this->missionService->addHistorique($mission$this->getUser(), 'accept_mission');
  1224.                                 //break;
  1225.                             }
  1226.                         }
  1227.                         $listUserNotEvaluate "";
  1228.                         $listUserEvaluate "";
  1229.                         $message = [=> "- Mission lancée avec succès"];
  1230.                         foreach ($missionService->determineAllSubcontractorEvaluated(mission$mission) as $userEvaluate) {
  1231.                             if ($userEvaluate != $this->getUser()) {
  1232.                                 $listUserNotEvaluate .= "{$userEvaluate->getFullName()} ,";
  1233.                             }
  1234.                             if (strlen($listUserNotEvaluate) > && $campaign->getState() != "resend") {
  1235.                                 $listUserNotEvaluate rtrim($listUserNotEvaluate",");
  1236.                                 $message[1] = " - Merci pour votre validation. Les intervenants suivants ont réévalué la mission. Nous attendons donc la validation du client pour démarrer le travail :  $listUserNotEvaluate.";
  1237.                             }
  1238.                         }
  1239.                         $allSubcontractorEvaluated $missionService->getListSubcontractorNotActivate(mission$mission);
  1240.                         $msg count($allSubcontractorEvaluated) > "Les intervenants suivants ont réévalué la mission" "L'intervenant suivant a réévalué la mission";
  1241.                         foreach ($allSubcontractorEvaluated as $userNotEvaluate) {
  1242.                             if ($userNotEvaluate != $this->getUser()) {
  1243.                                 $listUserNotEvaluate .= "{$userNotEvaluate->getFullName()} ,";
  1244.                             }
  1245.                             if (strlen($listUserNotEvaluate) > && $campaign->getState() != "resend") {
  1246.                                 $listUserNotEvaluate rtrim($listUserNotEvaluate",");
  1247.                                 $message[2] = " - Vous venez d'accepter la mission, nous attendons maintenant l'activation de l'intervenant ci-dessous pour démarrer le travail :  $listUserNotEvaluate.";
  1248.                             }
  1249.                         }
  1250.                         if ($missionService->lackSubcontractorTest(mission$mission) && sizeof($missionService->getListSubcontractorNotActivate(mission$mission)) == && !$missionService->aSubcontractorBotIsInThisMission(mission$mission)) {
  1251.                             $mission->setState('in_progress');
  1252.                             $entityManager->flush();
  1253.                             foreach ($originalMissions as $missionOriginal) {
  1254.                                 if (in_array($missionOriginal->getState(), ["cancelled""archived""closed"]) && $missionOriginal->getId() == $mission->getId()) {
  1255.                                     $mission->setState($originalMissions->getState());
  1256.                                     $entityManager->flush();
  1257.                                 }
  1258.                             }
  1259.                         } else {
  1260.                             if ($missionService->lackSubcontractorTest(mission$mission) && !$missionService->aSubcontractorBotIsInThisMission(mission$mission)) {
  1261.                                 $message[3] = "- Vous venez d'accepter la mission, nous attendons maintenant l'intervention de l'administrateur pour poursuivre le processus";
  1262.                                 $event = new SubcontractorActivateOrThereIsABotEvent($mission);
  1263.                                 $dispatcher->dispatch($eventSubcontractorActivateOrThereIsABotEvent::NAME);
  1264.                             }
  1265.                             $campaign->setState($campaign->getLastState());
  1266.                             foreach ($originalCampaign->getMissions() as $missionOriginal) {
  1267.                                 if ($missionOriginal->getId() == $mission->getId()) {
  1268.                                     $mission->setState("provisional");
  1269.                                 }
  1270.                             }
  1271.                             $entityManager->flush();
  1272.                             $canStartCampaign false;
  1273.                         }
  1274.                         foreach ($missionService->determineAllSubcontractorEvaluated(mission$mission) as $userEvaluate) {
  1275.                             if ($userEvaluate != $this->getUser()) {
  1276.                                 $listUserEvaluate .= "{$userEvaluate->getFullName()} ,";
  1277.                             }
  1278.                             if (strlen($listUserEvaluate) > 3) {
  1279.                                 $listUserEvaluate rtrim($listUserEvaluate",");
  1280.                                 $message[4] = " - Merci pour votre validation. " $msg ". Nous attendons donc la validation du client pour démarrer le travail :  $listUserEvaluate.";
  1281.                             }
  1282.                         }
  1283.                     }
  1284.                     if ($this->campaignService->canResendOrderToClient(campaign$mission->getCampaign(), missionEvaluate$mission) && $originalCampaign->getState() == "waiting_resend") {
  1285.                         $this->campaignService->resendCampaignForValidation(campaign$mission->getCampaign(), user$this->getUser());
  1286.                         $canStartCampaign false;
  1287.                     }
  1288.                     $missionService->addHistorique(mission$missionuser$this->getUser(), action"activation_campaign");
  1289.                     $allMessage "";
  1290.                     foreach ($message as $msg) {
  1291.                         //$allMessage .= "{$msg} <br> <br>";
  1292.                         $this->addFlash(
  1293.                             type'success',
  1294.                             message$msg,
  1295.                         );
  1296.                     }
  1297.                 } elseif (in_array("ROLE_ADMIN"$userConnected->getRoles())) {
  1298.                    
  1299.                     foreach ($campaign->getMissions() as $mission) {
  1300.                         //////////////////// Check marge mission  
  1301.                         $getMargeMyFlow $priceService->marginExceeded(mission$mission);
  1302.                         if ($getMargeMyFlow['percentage'] <= && $mission->getProduct()->getType() != ProductType::AU_TEMPS_PASSE ) {
  1303.                           
  1304.                                 $this->addFlash(
  1305.                                     type'error',
  1306.                                     message"Nous avons rencontré un problème, une des missions a une marge de {$getMargeMyFlow['percentage']} % .",
  1307.                                 );  
  1308.                                 $campaign->setState($originalCampaign->getState());
  1309.                                 $entityManager->flush();
  1310.                                  $canStartCampaign false;
  1311.                                 continue; 
  1312.                                 //return  $redirect;
  1313.                             }
  1314.                         foreach ($mission->getParticipants() as $missionParticipation) {
  1315.                             if (!$missionParticipation->isActivated() && !$missionParticipation->isRefused()) {
  1316.                                 $missionParticipation->setActivated(true);
  1317.                                 $missionParticipation->setEvaluate(false);
  1318.                                 $missionParticipation->setActivatedAt(new \DateTime());
  1319.                                 $entityManager->flush();
  1320.                             }
  1321.                         }
  1322.                         if ($mission->isEvaluate()) {
  1323.                             $mission->setEvaluate(false);
  1324.                         }
  1325.                         $missionService->addHistorique(mission$missionuser$this->getUser(), action"activation_campaign");
  1326.                     }
  1327.                     $canStartCampaign true;
  1328.                 } else {
  1329.                     foreach ($campaign->getMissions() as $mission) {
  1330.                         //////////////////// Check marge mission  
  1331.                         $missionCanActive true;
  1332.                         $getMargeMyFlow $priceService->marginExceeded(mission$mission);
  1333.                         if ($getMargeMyFlow['percentage'] <= 0) {
  1334.                             if ($this->isGranted(Role::ROLE_SUBCONTRACTOR->value)) {
  1335.                                 $event = new MissionCanActivateEvent($mission$getMargeMyFlow['percentage']);
  1336.                                 $dispatcher->dispatch($eventMissionCanActivateEvent::NAME);
  1337.                                 $missionCanActive false;
  1338.                                 
  1339.                             }
  1340.                             $missionCanActive false;
  1341.                             continue; 
  1342.                         }
  1343.                         foreach ($mission->getParticipants() as $missionParticipation) {
  1344.                             if ($missionParticipation->isEvaluate() && !$missionParticipation->isRefused()) {
  1345.                                 $missionParticipation->setActivated(true);
  1346.                                 $missionParticipation->setEvaluate(false);
  1347.                                 $missionParticipation->setActivatedAt(new \DateTime());
  1348.                                 $entityManager->flush();
  1349.                             }
  1350.                         }
  1351.                         if ($mission->isEvaluate()) {
  1352.                             $mission->setEvaluate(false);
  1353.                         }
  1354.                         if ($missionCanActive && $missionService->lackSubcontractorTest(mission$mission)) {
  1355.                             if (in_array($mission->getState(), ["cancelled""archived""closed"])) {
  1356.                                 foreach ($originalCampaign->getMissions() as $missionOriginal) {
  1357.                                     if ($missionOriginal->getId() == $mission->getId()) {
  1358.                                         $mission->setState($originalCampaign->getState());
  1359.                                         $entityManager->flush();
  1360.                                     }
  1361.                                 }
  1362.                             }
  1363.                         } else {
  1364.                             foreach ($originalCampaign->getMissions() as $missionOriginal) {
  1365.                                 if ($missionOriginal->getId() == $mission->getId()) {
  1366.                                     $mission->setState("provisional");
  1367.                                     $entityManager->persist($mission);
  1368.                                     $entityManager->flush();
  1369.                                 }
  1370.                             }
  1371.                             $canStartCampaign false;
  1372.                         }
  1373.                     }
  1374.                 }
  1375.                 if (!$canStartCampaign) {
  1376.                     $campaign->setState($originalCampaign->getState());
  1377.                     $entityManager->flush();
  1378.                 }
  1379.                 //verification de BOT
  1380.                 if ($campaign->haveBot()) {
  1381.                     if (in_array("ROLE_SUBCONTRACTOR"$userConnected->getRoles())) {
  1382.                         $this->addFlash(
  1383.                             type'error',
  1384.                             message'l\'activation de la campagne nécessite encore l\'intevention de l\'administrateur.',
  1385.                         );
  1386.                     } else {
  1387.                         $this->addFlash(
  1388.                             type'error',
  1389.                             message'Activation impossible car certaines mission sont encore liées a des Bots.',
  1390.                         );
  1391.                     }
  1392.                     $campaign->setState($originalCampaign->getState());
  1393.                     $entityManager->flush();
  1394.                     return  $redirect;
  1395.                 }
  1396.                 if ($canStartCampaign && $campaignService->isCanStart(campaign$campaign)) {
  1397.                     // campaign and setState() in progress managed by symfony workflow in config/packages/workflow
  1398.                     $campaign->setReSendToClient(false);
  1399.                     $campaign->setClientStatus("");
  1400.                     foreach ($campaign->getMissions() as $mission) {
  1401.                         if (!empty($mission->getWorkflow())) {
  1402.                             $stepIsActive false;
  1403.                             //verifié si un step est active // si active alors ne plus faire de mise a jour.
  1404.                             foreach ($mission->getWorkflow()->getSteps() as $step) {
  1405.                                 if ($step->isActive()) {
  1406.                                     $stepIsActive true;
  1407.                                 }
  1408.                             }
  1409.                             $step $workflowStepRepository->getFirstStep($mission->getWorkflow());
  1410.                             if (empty($step) || $step === false) {
  1411.                                 if (in_array("ROLE_SUBCONTRACTOR"$userConnected->getRoles())) {
  1412.                                     $this->addFlash(
  1413.                                         type'error',
  1414.                                         message'l\'activation de la campagne nécessite encore l\'intevention de l\'administrateur.',
  1415.                                     );
  1416.                                 } else {
  1417.                                     $this->addFlash(
  1418.                                         type'error',
  1419.                                         message'Activation impossible car le workflow n\'as pas d\'étape prédéfinie.',
  1420.                                     );
  1421.                                 }
  1422.                                 $campaign->setState($originalCampaign->getState());
  1423.                                 $entityManager->flush();
  1424.                                 return $redirect;
  1425.                             }
  1426.                             if (!$stepIsActive) {
  1427.                                 $step->setActive(true);
  1428.                                 $now = new \DateTime();
  1429.                                 $timezone = new \DateTimeZone("UTC");
  1430.                                 $now->setTimezone($timezone);
  1431.                                 $step->setStartDate($now);
  1432.                                 $event = new WorkflowStepEnteredEvent($step);
  1433.                                 $dispatcher->dispatch($eventWorkflowStepEnteredEvent::NAME);
  1434.                             }
  1435.                         } else {
  1436.                             if (in_array("ROLE_SUBCONTRACTOR"$userConnected->getRoles())) {
  1437.                                 $this->addFlash(
  1438.                                     type'error',
  1439.                                     message'l\'activation de la campagne nécessite encore l\'intevention de l\'administrateur.',
  1440.                                 );
  1441.                             } else {
  1442.                                 $this->addFlash(
  1443.                                     type'error',
  1444.                                     message'Activation impossible car la campagne n\'a pas de workflow',
  1445.                                 );
  1446.                             }
  1447.                             $campaign->setState($originalCampaign->getState());
  1448.                             $entityManager->flush();
  1449.                             return $this->redirectToRoute('mission_index');
  1450.                         }
  1451.                         //fin vérification
  1452.                         if ($step->getManager() == 0) {
  1453.                             $mission->setStateClient('Déclenchement en attente');
  1454.                         } else {
  1455.                             $mission->setStateProvider($step->getName());
  1456.                         }
  1457.                         $mission->setCanInvoiced(true);
  1458.                         $entityManager->flush();
  1459.                         if ($mission->getProduct()->getType() != ProductType::AU_TEMPS_PASSE) {
  1460.                              $missionService->setDefaultValueIfAnUserClickedAnActivationButtonWithoutADelaisAndTimeIsEmpty($mission$priceService);
  1461.                             $clientSoldService->decreaseCurrentBalanceByMissionCost($mission);
  1462.                         }
  1463.                         $missionParticipantService->markAsAllParticipantClickActivationButton(mission$mission);
  1464.                         $missionService->addHistorique(mission$missionuser$this->getUser(), action"start");
  1465.                     }
  1466.                     $event = new CampaignValidatedPerActivationEvent($campaign$this->getUser());
  1467.                     $dispatcher->dispatch($event,CampaignValidatedPerActivationEvent::NAME);
  1468.                 } else {
  1469.                     if ($campaign->getState() !== "waiting_validation") {
  1470.                         $campaign->setState($originalCampaign->getState());
  1471.                         $entityManager->flush();
  1472.                     }
  1473.                     return $redirect;
  1474.                 }
  1475.             }
  1476.             /* if(($transition == "activated" || $transition == "validate") && $currentRouteName == null ){
  1477.                 $campaign->setActivatedAt(new \DateTimeImmutable());
  1478.             } */
  1479.             
  1480.             $entityManager->flush();
  1481.             $message = match ($transition) {
  1482.                 'validate' => 'validée',
  1483.                 'pause' => 'mise en pause',
  1484.                 'unpause' => 'relancée',
  1485.                 'cancel' => 'annulée',
  1486.                 'closed' => 'clôturée',
  1487.                 'activated' => 'activée',
  1488.                 default => 'enregistrée',
  1489.             };
  1490.             $this->addFlash(
  1491.                 type'success',
  1492.                 message"La campagne {$campaign->getName()} a bien été " $message,
  1493.             );
  1494.             
  1495.         }
  1496.         return $redirect;
  1497.     }
  1498.     #[Route('/campagne/{id}/detail/check'name'handle_detail_campaing'methods: ['GET''POST'])]
  1499.     public function campaignDetail(Campaign $campaign,MissionService $missionService,EntityManagerInterface $entityManager,UserRepository $userRepository){
  1500.             if (count($campaign->getMissions()) != 0) {
  1501.                 return  $this->redirectToRoute('mission_edit',['id'=>$campaign->getMissions()->first()->getId()]) ; 
  1502.             }
  1503.             //count nb mission
  1504.             $product = new Product();
  1505.             $product->setName("Espace de discussion");
  1506.             $product->setFrontId(0);
  1507.             $product->setType(ProductType::AU_TEMPS_PASSE);
  1508.             $entityManager->persist($product);
  1509.             $today = new \DateTime();
  1510.             $mission  = new Mission();
  1511.             $campaignDefaultObserver $campaign->getDefautObserver();
  1512.             $campaignDefaultValidator $campaign->getDefaultValidator();
  1513.             $campaignDefaultValidatorExternal $campaign->getDefaultValidatorExternal();
  1514.             $campaignDefaultObserverExternal $campaign->getDefautObserverExternal();
  1515.             if(!empty($campaignDefaultValidator)){
  1516.                 foreach($campaignDefaultValidator as $validatorEmail){
  1517.                     $user $userRepository->findOneBy(['email'=>$validatorEmail]);
  1518.                     $userDefaultValidatorParticipant = (new MissionParticipant())
  1519.                                 ->setUser($user)
  1520.                                 ->setMission($mission)
  1521.                                 ->setRole(Role::ROLE_VALIDATOR);
  1522.                     $mission->addParticipant($userDefaultValidatorParticipant);
  1523.                 }
  1524.             }
  1525.             if(!empty($campaignDefaultObserver)){
  1526.                 foreach($campaignDefaultObserver as $observerEmail){
  1527.                     $user $userRepository->findOneBy(['email'=>$observerEmail]);
  1528.                     $userDefaultObserverParticipant = (new MissionParticipant())
  1529.                                 ->setUser($user)
  1530.                                 ->setMission($mission)
  1531.                                 ->setRole(Role::ROLE_OBSERVER);
  1532.                     $mission->addParticipant($userDefaultObserverParticipant);
  1533.                 }
  1534.             }
  1535.             if(!empty($campaignDefaultValidatorExternal)){
  1536.                 foreach($campaignDefaultValidatorExternal as $validatorExternalEmail){
  1537.                     $user $userRepository->findOneBy(['email'=>$validatorExternalEmail]);
  1538.                     $userDefaultValidatorExternalParticipant = (new MissionParticipant())
  1539.                             ->setUser($user)
  1540.                             ->setMission($mission)
  1541.                             ->setRole(Role::ROLE_VALIDATOR_EXTERNAL);
  1542.                     $mission->addParticipant($userDefaultValidatorExternalParticipant);
  1543.                 }
  1544.             }
  1545.             if(!empty($campaignDefaultObserverExternal)){
  1546.                 foreach($campaignDefaultObserverExternal as $observerExternalEmail){
  1547.                     $user $userRepository->findOneBy(['email'=>$observerExternalEmail]);
  1548.                     $userDefaultValidatorExternalParicipant = (new MissionParticipant())
  1549.                             ->setUser($user)
  1550.                             ->setMission($mission)
  1551.                             ->setRole(Role::ROLE_OBSERVER_EXTERNAL);
  1552.                     $mission->addParticipant($userDefaultValidatorExternalParicipant);
  1553.                 }
  1554.             }
  1555.             $workflow $entityManager->getRepository(Workflow::class)->findOneBy(['template'=>1,'name'=>'Discussion']);
  1556.             $newWorkflow = clone($workflow);
  1557.             $mission->setProduct($product)
  1558.                     ->setQuantity(1)
  1559.                     ->setDesiredDelivery($today->add(new \DateInterval('P1Y')))
  1560.                     ->setState('provisional')
  1561.                     ->setWorkflow($newWorkflow)
  1562.                     ->setCampaign($campaign)
  1563.                     //->setReference($this->missionService->generateReference());
  1564.                     ;
  1565.             $campaign->setState('provisional');
  1566.             $entityManager->persist($mission);
  1567.             $entityManager->persist($campaign);
  1568.             $entityManager->flush();
  1569.             return  $this->redirectToRoute('mission_edit',['id'=> $mission->getId()]) ; 
  1570.         
  1571.     }
  1572.    
  1573.     #[Route('/campagne/{id}/missions'name'handle_mission_campaign'methods: ['GET''POST'])]
  1574.     public function handleAllMission($id,Request $requestCreditHistoryRepository $creditHistoryRepositoryJobRepository $jobRepositoryEntityManagerInterface $entityManagerEventDispatcherInterface $dispatcherMissionParticipant $missionParticipant nullMissionRepository $missionRepositoryMissionParticipantRepository $missionParticipantRepositoryMissionService $missionServiceUserRepository $userRepositoryParameterBagInterface $parameter,CampaignRepository $campaignRepository,CompanyRepository $companyRepository,FileMissionRepository $fileMissionRepository,CampaignRecurrentService $campaignRecurrentService,UserPasswordHasherInterface $passwordHasher,GoogleStorageService $googleStorageService): Response
  1575.     {
  1576.         
  1577.         $newUserCreateId = [];
  1578.         $launchJustOne true;
  1579.         $matriceFrequencyType = [0=>'hours',1=>'months',2=>'days',3=>'years'];
  1580.         $error false;
  1581.         $campaignBrief null;
  1582.         $allMissionsInCampaign = [];
  1583.         $isNewCampaing false;
  1584.         if ($id == "new") {
  1585.             $campaign = new Campaign();
  1586.             $campaign->setOrderedBy($this->getUser())
  1587.                     ->setIsNew(true)
  1588.                     ->setDisabled(true)
  1589.                     ->setTypeInitiation(CampaignTypeInitiation::CAMPAIGN_FROM_ADMIN->value);
  1590.             $isNewCampaing true;
  1591.             $entityManager->persist($campaign);
  1592.             $entityManager->flush();
  1593.             $missionAlreadyExist false;
  1594.             $campaignInitiator $this->getUser();
  1595.             $url $this->generateUrl('handle_mission_campaign', ["id" => $campaign->getId()]);
  1596.             return new RedirectResponse($url);
  1597.         }else{
  1598.             $campaign $campaignRepository->findOneBy(['id'=>$id]);
  1599.             $campaignInitiator $campaign->getOrderedBy();
  1600.             $campaignBeforeState $campaign->getState();
  1601.             $oldCampaign = clone $campaign;
  1602.             $missionAlreadyExist =  (count($oldCampaign->getMissions()) == 0) ? false true;
  1603.             $campaignBrief $campaign->getBrief();
  1604.             $allMissionsInCampaign $missionRepository->findBy(['campaign' => $campaign]);
  1605.         }
  1606.         $stateRecurred $campaign->getState() ;
  1607.         $oldCampaignStateActiveFrequency =  $campaign->getActiveFrequency();
  1608.         $oldPack $campaign->getCreditHistory();
  1609.         $sendEmailDeliveryDateChange true;
  1610.         $missionsInCampaign = [];
  1611.         
  1612.         foreach ($allMissionsInCampaign as $missionInCampaign) {
  1613.             if (!isset($missionsInCampaign[$missionInCampaign->getId()])) {
  1614.                 $missionsInCampaign[$missionInCampaign->getId()] = [];
  1615.             }
  1616.             if (!empty($missionInCampaign->getDesiredDelivery())) {
  1617.                 $missionsInCampaign[$missionInCampaign->getId()] = clone $missionInCampaign->getDesiredDelivery();
  1618.             }
  1619.         }
  1620.         $oldMissionId = [];
  1621.         $oldMission   $campaign->getMissions();
  1622.         $oldParticipantMail= [];
  1623.         foreach ($oldMission as $key => $mission) {
  1624.             $oldMissionId[] = $mission->getId();
  1625.             foreach ($mission->getParticipants() as $participant) {
  1626.                 $oldParticipantMail [] = $participant->getUser()->getEmail();
  1627.             }
  1628.         }
  1629.         //list of user to link of all mission
  1630.         $user $userRepository->findAll();
  1631.         $isadminAgency false;
  1632.         $company null;
  1633.         if (in_array("ROLE_ADMIN_AGENCY"$this->getUser()->getRoles()) ) {
  1634.            
  1635.             $isadminAgency true;
  1636.             $company $this->getUser()->getCompany();
  1637.         }
  1638.        
  1639.         $formEditCampaign $this->createForm(ListMissionFormType::class, $campaign,['user'=>$user,'isadminAgency'=>$isadminAgency,'company'=> $company]);
  1640.         $formEditCampaign->handleRequest($request);
  1641.         $errors $formEditCampaign->getErrors(truetrue);
  1642.         
  1643.         $canResendToClient true;
  1644.         $nbrAU_FORFAIT 0;
  1645.         $nbrA_EVALUER 0;
  1646.         $nbrAU_TEMPS_PASSE 0;
  1647.         $nbrMission 0;
  1648.         $allMissionNewId = [];
  1649.         $pathCampaing 'file_campaing_directory';
  1650.         $pathMission 'file_mission_directory';
  1651.         $newCampaign false;
  1652.         
  1653.         if ($formEditCampaign->isSubmitted() && $formEditCampaign->isValid()) {
  1654.             $contactProjects $request->request->get('contact_project', []);
  1655.             if ($campaign->getDisabled() == 1) {
  1656.                 $newCampaign true;
  1657.             }
  1658.             $state 'waiting';
  1659.             $missions $formEditCampaign->get('missions');
  1660.             //validateur external an user validator / observer----------------
  1661.             //first delete all user in mission
  1662.             foreach ($campaign->getMissions() as $mission) {
  1663.                 if($campaign->getTypeInitiation()==&& $campaignBeforeState == "provisional"){
  1664.                         $listHistoriqueMission $mission->getHistoriques();
  1665.                         $messageHistoryMissionForProvisional "Mission déposée à partir du tunnel de demande de devis";
  1666.                         $isAlreadyAMessageOfThis false;
  1667.                         foreach($listHistoriqueMission as $historique){
  1668.                             if($messageHistoryMissionForProvisional == $historique->getMessage()){
  1669.                                 $isAlreadyAMessageOfThis true;
  1670.                                 break;
  1671.                             }
  1672.                         }
  1673.                         if(!$isAlreadyAMessageOfThis){
  1674.                             $this->missionService->addHistorique(mission$missionuser:$campaignInitiatoraction'campaign_initiate_by_tunnel_devis');
  1675.                         }
  1676.                 }
  1677.                 if($campaign->getTypeInitiation()==5){            
  1678.                     $this->missionService->addHistorique(mission$missionuser$campaign->getOrderedBy(), action'campaign_initiate_by_mail');
  1679.                 
  1680.                 }
  1681.                 foreach ($mission->getParticipants() as $participant) {
  1682.                     if (in_array($participant->getRole()->value, ['ROLE_OBSERVER_EXTERNAL','ROLE_VALIDATOR_EXTERNAL','ROLE_OBSERVER','ROLE_VALIDATOR'])) {
  1683.                         $entityManager->remove($participant);
  1684.                         $entityManager->flush();
  1685.                     }
  1686.                 }
  1687.             }
  1688.             $userAlreadyAdd = [];
  1689.             $userToAdd $formEditCampaign->get('user')->getData();
  1690.             $files $formEditCampaign->get('fileMissions')->getData();
  1691.             /* $droppedFilesMissions = $formEditCampaign->get('droppedFileMissions')->getData(); */
  1692.              //second add participant
  1693.             $defaultObserver = [];
  1694.             $defaultObserverExernal = [];
  1695.             $defaultValidator = [];
  1696.             $defaultValidatorExternal = [];
  1697.             
  1698.             foreach ($userToAdd as $element) {
  1699.                 $user $element['user'];
  1700.                 if (is_null($user)) {
  1701.                     continue;
  1702.                 }
  1703.                 $role $element['role']->value;
  1704.                 switch ($role) {
  1705.                     case 'ROLE_OBSERVER':
  1706.                         $defaultObserver = [...$defaultObserver$user->getEmail()];
  1707.                         break;
  1708.                     case 'ROLE_VALIDATOR':
  1709.                         $defaultValidator = [...$defaultValidator$user->getEmail()];
  1710.                         break;
  1711.                     case 'ROLE_VALIDATOR_EXTERNAL':
  1712.                         $defaultValidatorExternal = [...$defaultValidatorExternal$user->getEmail()];
  1713.                         break;
  1714.                      case 'ROLE_OBSERVER_EXTERNAL':
  1715.                         $defaultObserverExernal = [...$defaultObserverExernal$user->getEmail()];
  1716.                         break;
  1717.                     default:
  1718.                         break;
  1719.                 }
  1720.                 
  1721.                 
  1722.                 if ($user->getNewAdd()) {
  1723.                     //role external is just a client
  1724.                     $role_client = (in_array($role, ['ROLE_OBSERVER_EXTERNAL','ROLE_VALIDATOR_EXTERNAL'])) ? "ROLE_CLIENT" $role ;
  1725.                     $user->setRoles([$role_client])
  1726.                          ->setEnabled(false)
  1727.                          ->setNewAdd(false)
  1728.                          ;
  1729.                     //add company in user new add
  1730.                     $companyUser $formEditCampaign?->get('company')?->getData();
  1731.                     if ($companyUser !== null) {
  1732.                         $user->setCompany($companyUser);
  1733.                     }
  1734.                     //end
  1735.                     if (in_array($role, ['ROLE_OBSERVER_EXTERNAL','ROLE_VALIDATOR_EXTERNAL'])) {
  1736.                         $user->setExternal(true);
  1737.                         $user->setCompany(null);
  1738.                     }
  1739.                     $user->setPassword($passwordHasher->hashPassword($user$user->getPassword()));
  1740.                     $entityManager->persist($user);
  1741.                     $entityManager->flush();
  1742.                     $event = new ClientUpdatedEvent($usertrue);
  1743.                     $newUserCreateId[] = $user->getId();
  1744.                     if (!in_array($user->getEmail(),$oldParticipantMail)) {
  1745.                         $dispatcher->dispatch($eventClientUpdatedEvent::NAME);
  1746.                     }
  1747.                 } else {
  1748.                     if (!in_array($user->getId(), $newUserCreateId) && true === $launchJustOne&& isset($mission) && !is_null($mission)) {
  1749.                         if ($user->getId() != $mission->getCampaign()->getOrderedBy()->getId()) {
  1750.                             $event = new MissionSendEvent($mission$user$role);
  1751.                             
  1752.                             if (!in_array($user->getEmail(),$oldParticipantMail)) {
  1753.                                 $dispatcher->dispatch($eventMissionSendEvent::NAME);
  1754.                             }
  1755.                         }
  1756.                     }
  1757.                 }
  1758.                 foreach ($campaign->getMissions() as $mission) {
  1759.                      $participantAlredyExiste false;
  1760.                      foreach ($mission->getParticipants() as $participant) {
  1761.                             if($participant->getUser()->getId() == $user->getId() && $participant->getRole()->value == $role && $role!="ROLE_SUBCONTRACTOR"){
  1762.                                 $participantAlredyExiste true ;
  1763.                             }
  1764.                      }
  1765.                     if (!is_null($user) and !empty($user) and !in_array($user->getId(),$userAlreadyAdd) && !$participantAlredyExiste) {
  1766.                        //add participant
  1767.                        
  1768.                         $participant = (new MissionParticipant())
  1769.                                 ->setUser($user)
  1770.                                 ->setMission($mission)
  1771.                                 ->setRole(Role::tryFrom($role));
  1772.                        $mission->addParticipant($participant);
  1773.                     }
  1774.                 }
  1775.             }
  1776.             //first remove all contact project
  1777.             foreach ($campaign->getMissions() as $mission) {
  1778.                 foreach ($mission->getParticipants() as $participant) {
  1779.                     if ($participant->getRole() == Role::PROJECT_CONTACT) {
  1780.                         $entityManager->remove($participant);
  1781.                         $entityManager->flush();
  1782.                     }
  1783.                 }
  1784.             }
  1785.             //add contact project in all mission
  1786.             foreach ($campaign->getMissions() as $mission) {
  1787.                 $contactProjects array_unique($contactProjects);
  1788.                 foreach ($contactProjects as $contact) {
  1789.                    $contactUser $userRepository->find($contact);
  1790.                    $participant = (new MissionParticipant())
  1791.                             ->setUser($contactUser)
  1792.                             ->setMission($mission)
  1793.                             ->setRole(Role::PROJECT_CONTACT);
  1794.                    $mission->addParticipant($participant);
  1795.                 }
  1796.             }
  1797.             $campaign->setDefautObserver($defaultObserver)
  1798.                     ->setDefaultValidator($defaultValidator)
  1799.                     ->setDefaultValidatorExternal($defaultValidatorExternal)
  1800.                     ->setDefautObserverExternal($defaultObserverExernal);
  1801.             $launchJustOne false;
  1802.             $fileToDeleted $formEditCampaign->get('listfileMissionsToDeleted')->getData();
  1803.             //delete files 
  1804.             if (!empty($fileToDeleted) and !is_null($fileToDeleted) ) {
  1805.                 $fileExplode explode(';',$fileToDeleted);
  1806.                 foreach ($fileExplode as $file) {
  1807.                     $fileMission $fileMissionRepository->findOneBy(['name'=>$file,'campaign'=>$campaign]);
  1808.                     if (!is_null($fileMission)) {
  1809.                         $fileName =   $fileName "Campaigns/".$campaign->getId()."/".$fileMission->getName();
  1810.                         $bucketName "company-".strtolower($campaign->getCompany()->getId());
  1811.                         $destination $this->getParameter($pathCampaing) . '/' $campaign->getId();
  1812.                         if (file_exists($destination."/".$fileMission->getName())) {
  1813.                             unlink($destination."/".$fileMission->getName());
  1814.                         }
  1815.                         //delete file in repertory
  1816.                         $campaign->removeFileMission($fileMission);
  1817.                         //remove in repertory
  1818.                         foreach ($campaign->getMissions() as $mission) {
  1819.                             $fileMission $fileMissionRepository->findOneBy(['name'=>$file,'mission'=>$mission]);
  1820.                             $destinationFileMission $this->getParameter($pathMission) . '/' $mission->getId();
  1821.                             if (!is_null($fileMission) && file_exists($destinationFileMission."/".$fileMission->getName())) {
  1822.                                 unlink($destinationFileMission."/".$fileMission->getName());
  1823.                             }
  1824.                             if (!is_null($fileMission)) {
  1825.                                 $mission->removeFileMission($fileMission);
  1826.                                 $entityManager->remove($fileMission);
  1827.                             }
  1828.                             //suppression file in storage
  1829.                         }
  1830.                         $googleStorageService->deleteFile($bucketName,$fileName);
  1831.                         $entityManager->flush();
  1832.                     }
  1833.                 }
  1834.             }
  1835.             foreach ($files as $file) {
  1836.                 $destination $this->getParameter($pathCampaing) . '/' $campaign->getId();
  1837.                 $originalFilename pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
  1838.                 $extensionFile =  pathinfo($file->getClientOriginalName(), PATHINFO_EXTENSION);
  1839.                 $newFilename $originalFilename '-' uniqid() . '.' $extensionFile;
  1840.                  //upload file in google storage
  1841.                 $nameUniqueCompany strtolower("company-".$campaign->getCompany()->getId());
  1842.                 $this->googleStorageService->uploadFile($nameUniqueCompany,$file,$newFilename,'Campaigns/'.$campaign->getId());
  1843.                 $fileMission = new FileMission();
  1844.                 $fileMission->setName($newFilename);
  1845.                 $fileMission->setIsNew(1);
  1846.                  $fileMission->setUser($this->getUser());
  1847.                 $campaign->addFileMission($fileMission);
  1848.             }
  1849.             
  1850.             $jobSub $request->request->get('jobsub');
  1851.             $nbrMission sizeof($missions);
  1852.             $otherInformationThanDateChange false;
  1853.   
  1854.             if ($campaign->getNumberInitialOfMissions() != null && intval($campaign->getNumberInitialOfMissions()) != $nbrMission) {
  1855.                 $isCampaignContainsEvaluateProduct $this->checkIfCampaignContainsProductEvaluate($campaign);
  1856.                 $newStateOfThisCampaign 'resend';
  1857.                 $campaign->setReSendToClient(true);
  1858.                 if($isCampaignContainsEvaluateProduct){
  1859.                      $newStateOfThisCampaign 'waiting';
  1860.                 }
  1861.       
  1862.                 $campaign->setState($newStateOfThisCampaign);
  1863.                 $campaign->setNumberInitialOfMissions(sizeof($missions));
  1864.             }
  1865.             
  1866.             if ($campaign->getMissions()->count() === 0) {
  1867.                 $state 'provisional';
  1868.                 $campaignTypeInitiation CampaignTypeInitiation::CAMPAIGN_FROM_DEVIS_CLIENT->value;
  1869.                 $campaign->setTypeInitiation($campaignTypeInitiation);
  1870.             }
  1871.             if (count($campaign->getMissions()) == and $campaign->getMissions()->first()->getProduct()->getName()=="Espace de discussion") {
  1872.                 $campaign->setState('provisional');
  1873.             }
  1874.             $serviceParticipant = new Service();
  1875.             foreach ($missions as $key => $mission) {
  1876.                 //determine if mission is new // add normal state
  1877.                 if ($newCampaign) {
  1878.                     if ($mission->getData()->getProduct()->getType() === ProductType::A_EVALUER) {
  1879.                         $state 'waiting';
  1880.                     }
  1881.                 }
  1882.                 // if (!$missionAlreadyExist) {
  1883.                 //     //add attachment in mission
  1884.                 //     $destination = $parameter->get('file_jointe_devis_directory') . "/" . $campaign->getId();
  1885.                 //     $filesystem = new Filesystem();
  1886.                 //     $attachments = glob($destination . '/*');
  1887.                 //     foreach ($attachments as $attachment) {
  1888.                 //         if (!empty($attachment)) {
  1889.                 //             $destinationMission = $this->getParameter('file_mission_directory') . '/' . $mission->getData()->getId();
  1890.                 //             if (!$filesystem->exists($destinationMission)) {
  1891.                 //                 $filesystem->mkdir($destinationMission);
  1892.                 //             }
  1893.                 //             $originalFilename = basename($attachment);
  1894.                 //             file_put_contents($destinationMission . '/' . $originalFilename, file_get_contents($attachment));
  1895.                 //             $fileMission = new FileMission();
  1896.                 //             $fileMission->setName($originalFilename);
  1897.                 //             $mission->getData()->addFileMission($fileMission);
  1898.                 //         }
  1899.                 //     }
  1900.                 // }
  1901.                 //add brief 
  1902.                 $mission->getData()->setInitialBriefing($campaignBrieftrue);
  1903.                 if (!$missionService->haveAvalidator(mission$mission->getData())) {
  1904.                     $allMissionNewId[] = $missionService->setValidatorUserWhoOrder(mission$mission->getData());
  1905.                 }
  1906.                 if ($mission->getData()->getProduct()->getType() != ProductType::AU_TEMPS_PASSE) {
  1907.                     $nbrAU_TEMPS_PASSE++;
  1908.                 }
  1909.                 if ($mission->getData()->getProduct()->getType() == ProductType::A_EVALUER) {
  1910.                     $nbrA_EVALUER++;
  1911.                 }
  1912.                 if ($mission->getData()->getProduct()->getType() == ProductType::AU_FORFAIT) {
  1913.                     $nbrAU_FORFAIT++;
  1914.                 }
  1915.                 if ($mission->getData()->getOldCommand() != null && sizeof(explode("-"$mission->getData()->getOldCommand())) == 4) {
  1916.                     [$quatity$price$productId$timestamp] =  explode("-"$mission->getData()->getOldCommand());
  1917.                     
  1918.                    
  1919.                     
  1920.                     // Check if timestamp an other information change; 
  1921.                     if ($mission->getData()->getQuantity() != $quatity || $mission->getData()->getProduct()->getId() != $productId) {
  1922.                         
  1923.                         $otherInformationThanDateChange true;
  1924.                         //add information to historique 
  1925.                         $historique = (new Historique())
  1926.                             ->setUser($this->getUser())
  1927.                             ->setMission($mission->getData())
  1928.                             ->setMessage('Le panier a été mis à jour par : ' $this->getUser());
  1929.                         $entityManager->persist($historique);
  1930.                         $entityManager->flush();
  1931.                     }
  1932.                     if (intval($timestamp) != intval($mission->getData()->getDesiredDelivery()->getTimestamp())) {
  1933.                         if (!$otherInformationThanDateChange) {
  1934.                             $missionService->addHistorique(mission$mission->getData(), user$this->getUser(), action"deadline_change");
  1935.                             // Send email in 
  1936.                             // if($sendEmailDeliveryDateChange==true){
  1937.                             //     $event = new CampaignNotifyThatDeliveryDateChangeEvent(campaign: $campaign, mission: $mission->getData());
  1938.                             //     $dispatcher->dispatch($event, CampaignNotifyThatDeliveryDateChangeEvent::NAME);
  1939.                             //     $sendEmailDeliveryDateChange = false;
  1940.                             // }
  1941.                         }
  1942.                     }
  1943.                     
  1944.                     if ($otherInformationThanDateChange and !$newCampaign) {
  1945.                         $campaign->setReSendToClient(true);
  1946.                         $campaign->setState("resend");
  1947.                      
  1948.                         $canResendToClient false;
  1949.                     }
  1950.                 }
  1951.                 
  1952.                 if ($mission->getData()->getOldCommand() != null and !$newCampaign and $otherInformationThanDateChange) {
  1953.                     
  1954.                     $campaign->setReSendToClient(true);
  1955.                     $campaign->setState("resend");
  1956.                  
  1957.                     $entityManager->persist($campaign);
  1958.                     $entityManager->flush();
  1959.                 }
  1960.                 $originalMission =  $missionRepository->find($mission->getData()->getId());
  1961.                 if (!is_null($mission->getData()->getAdminIncome())) {
  1962.                     $mission->getData()->setPrice($mission->getData()->getAdminIncome());
  1963.                 }
  1964.                 //-----------------------add default observer if new mission-------------------
  1965.                 if (!is_null($originalMission) and empty($originalMission->getReference())  ) {
  1966.                   //add default observer
  1967.                    if($campaign->getDefautObserver() != null){
  1968.                         $missionService->addDefaultClient($mission->getData(), 'observer',$stateRecurred);
  1969.                    }
  1970.                   
  1971.                    // add default validator
  1972.                    if($campaign->getDefaultValidator() != null){
  1973.                         $missionService->addDefaultClient($mission->getData(), 'validator',$stateRecurred);
  1974.                    }
  1975.                    
  1976.                
  1977.                  //------------------------------------------------------------------------------
  1978.                 }
  1979.                 if (!is_null($originalMission)) {
  1980.                     if (!$isNewCampaing) {
  1981.                         $mission->getData()->setOldCommand("{$mission->getData()->getQuantity()}-{$originalMission->getPrice()}-{$mission->getData()->getProduct()->getId()}-{$mission->getData()->getDesiredDelivery()->getTimestamp()}");
  1982.                     }
  1983.                 }
  1984.                 if (empty($mission->getData()->getReference())) {
  1985.                     foreach ($campaign->getMissions() as $mis) {
  1986.                         if (!empty($mis->getReference())) {
  1987.                             $mission->getData()->setReference($mis->getReference());
  1988.                             break;
  1989.                         }
  1990.                     }
  1991.                     if (empty($mission->getData()->getReference())) {
  1992.                         $mission->getData()->setReference($missionService->generateReference());
  1993.                     }
  1994.                 }
  1995.                 $missionId $missionRepository->findOneBy(['id' => $mission->get('missionId')->getData()]);
  1996.                 if ($sendEmailDeliveryDateChange and !$newCampaign) {
  1997.                     if (isset($missionsInCampaign[$mission->getData()->getId()]) && $mission->getData()->getDesiredDelivery() != $missionsInCampaign[$mission->getData()->getId()] && !in_array($mission->getData()->getState(), ['provisional''waiting'])) {
  1998.                         $event = new MissionDesiredDeliveryUpdatedAfterValidationEvent($missionId);
  1999.                         $dispatcher->dispatch($eventMissionDesiredDeliveryUpdatedAfterValidationEvent::NAME);
  2000.                         $sendEmailDeliveryDateChange false;
  2001.                     } elseif (isset($missionsInCampaign[$mission->getData()->getId()]) && $mission->getData()->getDesiredDelivery() != $missionsInCampaign[$mission->getData()->getId()] && ($mission->getData()->getState() == 'provisional' || $mission->getData()->getState() == 'waiting')) {
  2002.                         // $campaign->setState('provisional');
  2003.                         $event = new MissionDesiredDeliveryUpdatedBeforeValidationEvent($mission->getData());
  2004.                         $dispatcher->dispatch($eventMissionDesiredDeliveryUpdatedBeforeValidationEvent::NAME);
  2005.                         $sendEmailDeliveryDateChange false;
  2006.                     }
  2007.                 }
  2008.                 //--------------------------add New Subcontractor ------------------------------------------
  2009.                 $jobsubForThisMission $jobSub[$key];
  2010.                 $jobsubForThisMissionInArray explode(";"$jobsubForThisMission);
  2011.                 $newSubcontractorList = [];
  2012.                 foreach ($jobsubForThisMissionInArray as $newSubontractor) {
  2013.                     $newSubontractor explode("-:"$newSubontractor);
  2014.                     if (sizeof($newSubontractor) == 2) {
  2015.                         $newSubcontractorList = [
  2016.                             ...$newSubcontractorList,
  2017.                             [
  2018.                                 "job_id" => $newSubontractor[0],
  2019.                                 "email_user" => $newSubontractor[1],
  2020.                             ]
  2021.                         ];
  2022.                     }
  2023.                 }
  2024.                 $alreadySent = [];
  2025.                 foreach ($newSubcontractorList as $key => $newSuboContractor) {
  2026.                     $errorAddSub false;
  2027.                     $newUser $userRepository->findOneBy(['email' => $newSuboContractor['email_user']]);
  2028.                     $newjob $jobRepository->findOneBy(['id' => $newSuboContractor['job_id']]);
  2029.                     if ($newUser == null) {
  2030.                         $errorAddSub true;
  2031.                         $error true;
  2032.                         $this->addFlash(
  2033.                             type'error',
  2034.                             message"Veuillez vérifier le contact opérationnel suivant " $newSuboContractor['email_user']
  2035.                         );
  2036.                         return $this->redirectToRoute('handle_mission_campaign', ["id" => $campaign->getId()]);
  2037.                     }
  2038.                     $productMission $mission->getData()->getProduct();
  2039.                     foreach ($mission->getData()->getParticipants() as $participant) {
  2040.                         $fullName $newUser->getFullName();
  2041.                         if ($participant->getUser() == $newUser && $participant->getJob() == $newjob) {
  2042.                             $this->addFlash(
  2043.                                 type'error',
  2044.                                 message"Le sous-traitant $fullName vous essayé d'ajouté est deja sur cette mission"
  2045.                             );
  2046.                             $errorAddSub true;
  2047.                             $error true;
  2048.                         }
  2049.                         $services $entityManager->getRepository(Service::class)->findBy(['user' => $newUser]);
  2050.                         $linkService false;
  2051.                         $matriceLink = [];
  2052.                         foreach ($services as $service) {
  2053.                             if ($service->getProduct()->getId() === $productMission->getId()) {
  2054.                                 $linkService true;
  2055.                             }
  2056.                         }
  2057.                         if (!$linkService  && $mission->getData()->getProduct()->getType() != ProductType::AU_FORFAIT) {
  2058.                             $serviceParticipant->setProduct($productMission)
  2059.                                            //->setPrice($productMission->getPrice())
  2060.                                            ->setUser($newUser);
  2061.                         }else{
  2062.                             if (!$linkService) {
  2063.                                 $errorAddSub true;
  2064.                                 $error true;
  2065.                                 $this->addFlash('error'"Veuillez ajouter le produit et le prix pratique par  $fullName au niveau de sa fiche.");
  2066.                             }
  2067.                         }
  2068.                     }
  2069.                     if (!$errorAddSub) {
  2070.                         $missionParticipant = new MissionParticipant();
  2071.                         if (empty($missionId)) {
  2072.                             $missionParticipant->setMission($mission->getData());
  2073.                         } else {
  2074.                             $missionParticipant->setMission($missionId);
  2075.                         }
  2076.                         $missionParticipant->setUser($newUser);
  2077.                         $missionParticipant->setJob($newjob);
  2078.                         $missionParticipant->setRole(Role::ROLE_SUBCONTRACTOR);
  2079.                         $mission->getData()->addParticipant($missionParticipant);
  2080.                         $entityManager->persist($missionParticipant);
  2081.                         $entityManager->flush();
  2082.                         if (!in_array($missionParticipant->getUser(), $alreadySent) && !$newCampaign) {
  2083.                             $event = new SubContractorMissionAddedEvent($missionParticipant->getUser(), $mission->getData());
  2084.                             $dispatcher->dispatch($eventSubContractorMissionAddedEvent::NAME);
  2085.                             $alreadySent[] = $missionParticipant->getUser();
  2086.                         }
  2087.                     }
  2088.                 }
  2089.                 $searchParticipant $missionParticipantRepository->findOneBy(['mission' => $missionId'role' => 'ROLE_SUBCONTRACTOR']);
  2090.                 if (empty($searchParticipant)) {
  2091.                     $event = new MissionWithoutSubContractorCheckedEvent($mission->getData());
  2092.                     $dispatcher->dispatch($eventMissionWithoutSubContractorCheckedEvent::NAME);
  2093.                 }
  2094.                 if (!empty($mission->get('newWorkflow')->getData())) {
  2095.                     $newWorkflow = clone $mission->get('newWorkflow')->getData();
  2096.                     $newWorkflow->setTemplate(false);
  2097.                     $mission->getData()->setWorkflow($newWorkflow);
  2098.                     $entityManager->persist($newWorkflow);
  2099.                 }
  2100.             }
  2101.             $entityManager->persist($serviceParticipant);
  2102.             $entityManager->flush();
  2103.             if ($error) {
  2104.                 foreach ($allMissionNewId as $id) {
  2105.                     if (!in_array($id$oldMissionId) or empty($oldMissionId)) {
  2106.                         $missionToRemove $entityManager->getRepository(Mission::class)->find($id);
  2107.                         $missionToRemove->setWorkflow(null);
  2108.                         $entityManager->persist($missionToRemove);
  2109.                         $entityManager->flush();
  2110.                         $entityManager->remove($missionToRemove);
  2111.                         $entityManager->flush();
  2112.                     }
  2113.                 }
  2114.                 return $this->redirectToRoute('handle_mission_campaign', ["id" => $campaign->getId()]);
  2115.             }
  2116.             
  2117.             foreach ($campaign->getMissions() as $mission) {
  2118.                 //$mission->setState('provisional');
  2119.                 if ($newCampaign) {
  2120.                     if (
  2121.                         $state === 'waiting' &&
  2122.                         ($mission->getProduct()->getType() === ProductType::AU_FORFAIT) || ($mission->getProduct()->getType() === ProductType::AU_TEMPS_PASSE)
  2123.                     ) {
  2124.                         $mission->setState('provisional');
  2125.                     } else {
  2126.                         $mission->setState($state);
  2127.                     }
  2128.                     if ($mission->getState() === 'waiting') {
  2129.                         $mission->setStateProvider('A évaluer');
  2130.                     } else {
  2131.                         $mission->setStateProvider('A activer');
  2132.                     }
  2133.                 }
  2134.             }
  2135.             if ($campaign->getCreditHistory() == null) {
  2136.                 $creditHistory $creditHistoryRepository->findOneBy(['company' => $campaign->getCompany(), "typePack" => 4]);
  2137.                 $campaign->setCreditHistory($creditHistory);
  2138.             }
  2139.             if ($newCampaign) {
  2140.                 $campaign->setState($state);
  2141.                 if(!empty($campaign->getMissions())){
  2142.                     foreach($campaign->getMissions() as $mission)  {
  2143.                         $this->missionService->addHistorique(mission$missionuser:$campaignInitiatoraction'campaign_initiate_by_admin');
  2144.                     }
  2145.                 }
  2146.                 
  2147.             }
  2148.             $campaign->setDisabled(null);
  2149.             $entityManager->persist($campaign);
  2150.             $entityManager->flush();
  2151.  
  2152.             if (!$newCampaign) {
  2153.                 if ($otherInformationThanDateChange &&  $nbrAU_FORFAIT && $nbrAU_FORFAIT == $nbrMission && $this->campaignService->areAllRequiredSubcontractorsPresent(campaign$campaign)) {
  2154.                     $campaign->setReSendToClient(true);
  2155.                     
  2156.                     $entityManager->persist($campaign);
  2157.                     $entityManager->flush();
  2158.                 } elseif ($nbrAU_FORFAIT != $nbrMission && $campaign->getState() != "resend") {
  2159.                     // $campaign->setReSendToClient(false);
  2160.                     // $state = $campaign->getLastState() != null  ? $campaign->getLastState() : "provisional";
  2161.                     // $campaign->setState($state);
  2162.                     // $entityManager->persist($campaign);
  2163.                     // $entityManager->flush();
  2164.                 }
  2165.                 if ($formEditCampaign->getClickedButton() && 'editGlobalMssion' === $formEditCampaign->getClickedButton()->getName()) {
  2166.               
  2167.                     // Btn édit on envoie juste un email.
  2168.                     $event = new CampaignModifiedEvent($campaign);
  2169.                     $dispatcher->dispatch($eventCampaignModifiedEvent::NAME);
  2170.                 } else if ($formEditCampaign->getClickedButton() && 'saveGlobalMission' === $formEditCampaign->getClickedButton()->getName()) {
  2171.        
  2172.                     $nbMission = [];
  2173.                     $nbInitialNotEmpty = [];
  2174.                     foreach ($campaign->getMissions() as $mission) {
  2175.                         $nbMission[] = $mission;
  2176.                         $initialTime $mission->getInitialTime();
  2177.                         if (!empty($initialTime)) {
  2178.                             $nbInitialNotEmpty[] = $initialTime;
  2179.                         }
  2180.                     }
  2181.                     if (count($nbMission) === count($nbInitialNotEmpty)) {
  2182.                         return $this->redirectToRoute('campaign_transition', ['id' => $campaign->getId(), 'transition' => 'unpause']);
  2183.                     }
  2184.                 }
  2185.             }
  2186.             //recurrency
  2187.             if($stateRecurred == 'recurred'){
  2188.                 $campaign->setState('recurred');
  2189.                 $entityManager->flush();
  2190.                 $stateActiveFrequency $oldCampaignStateActiveFrequency == false && $campaign->getActiveFrequency() == true true false
  2191.                 $isActiveFrequency =  $campaign->getActiveFrequency()== true true false
  2192.                 $campaignRecurrentService->toogleRecurrent($campaign,$isActiveFrequency$stateActiveFrequency);
  2193.                 $this->addFlash(
  2194.                     type'success',
  2195.                     message'Votre commande réccurente a été modifier avec succès'
  2196.                 );
  2197.                 
  2198.                 return $this->redirectToRoute('recurring_service');
  2199.             }
  2200.             else{
  2201.                 if ($campaign->getActiveFrequency()) {
  2202.                         $now = new \DateTime();
  2203.                         $startDate $campaign->getFrequency()->getStartDate();
  2204.                         $hours $now->format('G');
  2205.                         $minutes $now->format('i');
  2206.                         $second $now->format('s');
  2207.                         $campaignTypeInitiation CampaignTypeInitiation::CAMPAIGN_FROM_RECURRENT->value;
  2208.                         $newStartDate $startDate->setTime($hours$minutes$second);
  2209.                         $campaign->getFrequency()->setStartDate($newStartDate);
  2210.                         $campaign->setIsRecurrent(true);
  2211.                         $campaign->setRecurringState('in_progress');
  2212.                         $campaign->setState('recurred');
  2213.                         $campaign->setTypeInitiation($campaignTypeInitiation);
  2214.                         //create a campaign in new start date
  2215.                         $eventRecurrent = new CampaignRecurrentEvent($campaigntrue);
  2216.                         $dispatcher->dispatch($eventRecurrentCampaignRecurrentEvent::NAME);
  2217.                         if($now->format('y/d/m G:i') >=  $startDate->format('y/d/m G:i')){
  2218.                             $this->updateCampaignFrequencyDateUntilNow($campaignRecurrentService,$campaign,$now,$entityManager,$dispatcher);
  2219.                         }else{
  2220.                             $campaignRecurrentService->updateLaunchRecurringAt(campaign:$campaign,dateToLaunch:$newStartDate);
  2221.                         }
  2222.                         $this->addFlash(
  2223.                             type'success',
  2224.                             message'Votre commande réccurente a été crée avec succès'
  2225.                         );
  2226.                         
  2227.                         return $this->redirectToRoute('recurring_service');
  2228.                 }
  2229.                 else{
  2230.                     
  2231.                     if ($newCampaign) {
  2232.                         $event = new CampaignCreatedEvent($campaign,'',$contactProjects,true);
  2233.                         $dispatcher->dispatch($eventCampaignCreatedEvent::NAME);
  2234.                         $this->addFlash('success''Votre commande a été enregistrée avec succès');
  2235.                     }else{
  2236.                         $this->addFlash('success''Modification enregistrée');
  2237.                     }
  2238.                     if (count($campaign->getMissions()) == and $campaign->getMissions()->first()->getProduct()->getName()=="Espace de discussion") {
  2239.                         $campaign->setState('provisional');
  2240.                         $entityManager->persist($campaign);
  2241.                         $entityManager->flush();
  2242.                     }
  2243.                 }
  2244.             }
  2245.         
  2246.             if (!is_null($oldPack) and $oldPack != $campaign->getCreditHistory() and isset($mission) and !is_null($mission)) {
  2247.                 $this->missionService->addHistorique(mission$missionuser$this->getUser(), action'credit_campagne_modified');
  2248.                 
  2249.                 $this->contractService->balanceAllocation($campaign$oldPack);
  2250.                 $entityManager $this->getDoctrine()->getManager();
  2251.                 $entityManager->persist($campaign);
  2252.                 $entityManager->flush();
  2253.             }
  2254.             if (count($campaign->getMissions()) == and $campaign->getMissions()->first()->getProduct()->getName()=="Espace de discussion") {
  2255.                 $campaign->setState('provisional');
  2256.                 $entityManager->persist($campaign);
  2257.                 $entityManager->flush();
  2258.             }
  2259.             return $this->redirectToRoute('mission_index');
  2260.         }
  2261.         $formEditSubcontractor $this->createForm(EditSubcontractorParticipantType::class);
  2262.         setcookie('missionIDs','',0,"/");
  2263.         return $this->renderForm('campaign/edit_mission.html.twig', [
  2264.             'campaign' => $campaign,
  2265.             'form' => $formEditCampaign,
  2266.             'formEditSubcontractor' => $formEditSubcontractor,
  2267.             'user' => $user
  2268.         ]);
  2269.     }
  2270.     private function updateCampaignFrequencyDateUntilNow($campaignRecurrentService,$originalCampaign$now,$entityManager,$dispatcher){
  2271.         $campaignRecurrentService->updateLaunchRecurringAt($originalCampaign);
  2272.         $campaignFrequency $originalCampaign->getFrequency()->getLaunchRecurrenceAt();
  2273.         $newCampaign =  $campaignRecurrentService->clone($originalCampaign);
  2274.         $campaign $newCampaign;
  2275.         $entityManager->persist($campaign);
  2276.         $entityManager->flush();
  2277.         $event = new CampaignCreatedEvent($campaign);
  2278.         $dispatcher->dispatch($eventCampaignCreatedEvent::NAME);
  2279.         foreach($newCampaign->getMissions() as $mission ){
  2280.             $this->missionService->addHistorique(mission$missionuser:$newCampaign->getOrderedBy() , action'campaign_initiate_by_recurrent');  
  2281.         }
  2282.         if($campaignFrequency<$now){
  2283.             $this->updateCampaignFrequencyDateUntilNow($campaignRecurrentService,$originalCampaign$now,$entityManager,$dispatcher);
  2284.         }
  2285.         return;
  2286.     }
  2287.     #[Route('/campagne/{id}/demande-evaluation'name'campaign_demande_evaluation')]
  2288.     public function evaluation(Request $requestCampaign $campaignMissionService $missionServiceEventDispatcherInterface $dispatcher): Response
  2289.     {
  2290.         $event = new CampaignEvaluationEvent($campaign);
  2291.         $dispatcher->dispatch($eventCampaignEvaluationEvent::NAME);
  2292.         foreach ($campaign->getMissions() as $mission) {
  2293.             $missionService->addHistorique(mission$missionuser$this->getUser(), action"evaluation_request");
  2294.         }
  2295.         $this->addFlash(
  2296.             type'success',
  2297.             message'La demande d\'évaluation a bien été envoyée'
  2298.         );
  2299.         return $this->redirect($request->headers->get('referer'));
  2300.     }
  2301.     #[Route('/campagne/{id}/recapitulatif/{showStep}'name'campaign_recapitulatif'defaults: ['showStep'=>""])]
  2302.     public function recapPanier(string $showStepPriceService $priceService,MissionParticipantService $missionParticipantServiceNumberFormatService $numberFormatServiceCampaignService $campaignService,  ConsumptionBalanceForCompanyService $consumptionBalanceForCompanyService,  Campaign $campaign): Response
  2303.     {
  2304.         $creditHistory $campaign->getCreditHistory();
  2305.         $typePack =  $creditHistory->getTypePack();
  2306.         $text = match ((int) $typePack) {
  2307.             => 'Votre solde actuel',
  2308.             => 'Solde sur ' $numberFormatService->format($creditHistory->getOrderPrice()) . ' € HT/mois',
  2309.             => 'Solde sur ' $numberFormatService->format($creditHistory->getOrderPrice()) . ' € HT/an',
  2310.             => 'Budget HT consommé depuis le 1er du mois',
  2311.             => '',
  2312.             default => '',
  2313.         };
  2314.         $currency = match ((int) $campaign->getCreditHistory()->getTypePack()) {
  2315.             => '€',
  2316.             default => '€',
  2317.         };
  2318.         $balance $campaign->getCreditHistory()->getTypePack() == $consumptionBalanceForCompanyService->consumptionOfTheMonth(company$campaign->getCompany()) : $campaign->getCreditHistory()->getCurrentBalance();
  2319.         return $this->renderForm('campaign/recapitulatif.html.twig', [
  2320.             'campaign' => $campaign,
  2321.             'participants_subcontractor' => $missionParticipantService->getSubcontractorWithMissing($campaign), 
  2322.             'text' => $text,
  2323.             'price_service' => $priceService,
  2324.             'currency' => $currency,
  2325.             'balance' =>  $balance,
  2326.             'show_step'=> $showStep == "step" true false,
  2327.             'step'=>4
  2328.         ]);
  2329.     }
  2330.     #[Route('/campagne/{id}/accepter/{currentRouteName?}/{firstClickedMissionId?}'name'campaign_accept_all'defaults: ['currentRouteName' => null'firstClickedMissionId' => null])]
  2331.     public function campaignAccept(CampaignService $campaignServiceMissionService $missionServiceCampaign $campaignEntityManagerInterface $entityManagerEventDispatcherInterface $dispatcherClientSoldService $clientSoldService$currentRouteName null$firstClickedMissionId null): Response
  2332.     {
  2333.         $campaign->setState($campaignService->getStateCampaign(campaign$campaign));
  2334.         $campaign->setReSendToClient(false);
  2335.         $campaign->setClientStatus("");
  2336.         $entityManager->flush();
  2337.         // foreach ($campaign->getMissions() as $mission) {
  2338.         //     
  2339.         //     $mission->setState('in_progress');
  2340.         //     $entityManager->persist($mission);
  2341.         //     if ($mission->getWorkflow()) {
  2342.         //         $step = $mission->getWorkflow()->getSteps()->first();
  2343.         //         $step->setActive(true);
  2344.         //         if ($step->getManager() == 0) {
  2345.         //             $mission->setStateClient('Déclenchement en attente');
  2346.         //         } else {
  2347.         //             $mission->setStateProvider($step->getName());
  2348.         //         }
  2349.         //         $event = new WorkflowStepEnteredEvent($step);
  2350.         //         $dispatcher->dispatch($event, WorkflowStepEnteredEvent::NAME);
  2351.         //     }
  2352.         // }
  2353.         $campaignService->setAllMissionAsNotEvaluate(campaign$campaign);
  2354.         $event = new CampaignValidatedEvent($campaign);
  2355.         $dispatcher->dispatch($eventCampaignValidatedEvent::NAME);
  2356.         foreach ($campaign->getMissions() as $mission) {
  2357.             $missionService->addHistorique(mission$missionuser$this->getUser(), action"accepter");
  2358.         }
  2359.         $this->addFlash(
  2360.             type'success',
  2361.             message"Le panier a bien été validé avec succès"
  2362.         );
  2363.         if (isset($currentRouteName) && $currentRouteName == 'mission_edit' && isset($firstClickedMissionId)) {
  2364.             return $this->redirectToRoute('campaign_transition', [
  2365.                 'id' => $campaign->getId(),
  2366.                 "transition" => "activated",
  2367.                 "currentRouteName" => $currentRouteName,
  2368.                 "firstClickedMissionId" => $firstClickedMissionId
  2369.             ]);
  2370.         } else {
  2371.             return $this->redirectToRoute('campaign_transition', ['id' => $campaign->getId(), "transition" => "activated"]);
  2372.         }
  2373.     }
  2374.     #[Route('/campagne/{id}/resoumission'name'campaign_resoumission')]
  2375.     public function campaignResoumission(Request $requestMissionService $missionService,  Campaign $campaignEntityManagerInterface $entityManagerEventDispatcherInterface $dispatcher): Response
  2376.     {
  2377.         
  2378.         $event = new CampaignWaitingEvent($campaignfalse$this->getUser());
  2379.         $dispatcher->dispatch($eventCampaignWaitingEvent::NAME);
  2380.         foreach ($campaign->getMissions() as $mission) {
  2381.             $missionService->addHistorique(mission$missionuser$this->getUser(), action"resoumission");
  2382.         }
  2383.         $campaign->setClientStatus('waiting_for_confirmation');
  2384.         $campaign->setState('waiting_validation');
  2385.         $entityManager->flush();
  2386.         $message "Le panier est bien soumis avec succès";
  2387.         if ($this->isGranted("ROLE_SUBCONTRACTOR")) {
  2388.             $listMissionNotEvaluate $this->campaignService->getMissionListNotEvaluate(user$this->getUser(), campaign$mission->getCampaign());
  2389.             $message "";
  2390.             if ($this->missionService->isMyMission(mission$mission) && $mission->getCampaign()->getState() != "in_progress" && $mission->isEvaluate()) {
  2391.                 $message "Vous avez évalué la mission. Nous attendons maintenant la validation du client {$mission->getCampaign()->getCompany()->getName()}";
  2392.             } elseif ($listMissionNotEvaluate && $this->campaignService->evaluateAllHerMission(campaign$mission->getCampaign(), user$this->getUser()) && $this->missionService->isMyMission(mission$mission)) {
  2393.                 $intervenants "";
  2394.                 foreach ($mission->getCampaign()->getMissions() as $mission) {
  2395.                     foreach ($mission->getParticipants() as $participant) {
  2396.                         if (!$participant->isEvaluate()) {
  2397.                             $intervenants .= "{$participant->getUser()->getFullName()} , ";
  2398.                         }
  2399.                     }
  2400.                 }
  2401.                 $intervenants rtrim($intervenants",");
  2402.                 $message "Vous avez évalué la mission. Nous attendons maintenant le retour de ces partenaires pour resoumettre la proposition au client ( { $intervenants})";
  2403.             }
  2404.             $this->addFlash(
  2405.                 type'success',
  2406.                 message$message
  2407.             );
  2408.         } else {
  2409.             $this->addFlash(
  2410.                 type'success',
  2411.                 message'La campagne à bien été resoumise'
  2412.             );
  2413.         }
  2414.         return $this->redirect($request->headers->get('referer'));
  2415.     }
  2416.    
  2417.     #[Route('/campagne/activated/{id}'name'order_reactivated')]
  2418.     public function orderReactivated(Request $request,OrderService $orderServiceCampaign $campaignEntityManagerInterface $entityManager,CampaignService $campaignServiceEventDispatcherInterface $dispatcher): Response
  2419.     {
  2420.         
  2421.         $orderService->reActive($campaign);
  2422.         $this->addFlash(
  2423.             type'success',
  2424.             message'La campagne a bien été réactiver'
  2425.         );
  2426.         return $this->redirect($request->headers->get('referer'));
  2427.     }
  2428.     #[Route('/campagne/{id}/relancer'name'campaign_relancer')]
  2429.     public function campaignRelancer(Request $requestCampaign $campaignEntityManagerInterface $entityManagerEventDispatcherInterface $dispatcher): Response
  2430.     {
  2431.         $event = new CampaignResendEvent($campaign);
  2432.         $dispatcher->dispatch($eventCampaignResendEvent::NAME);
  2433.         $this->addFlash(
  2434.             type'success',
  2435.             message'La campagne a bien été relancer'
  2436.         );
  2437.         return $this->redirect($request->headers->get('referer'));
  2438.     }
  2439.     public function onMissionWithoutWorkflow(MissionWithoutWorkflowEvent $event$userRepository$mailer)
  2440.     {
  2441.         $mission $event->getMission();
  2442.         if (!$mission instanceof Mission) {
  2443.             return;
  2444.         }
  2445.         $admins $this->dynamicHostService->getMailAdmin();
  2446.         foreach ($admins as $admin) {
  2447.             $notification = (new NotificationEmail())
  2448.                 ->to(new Address($admin->value))
  2449.                 ->subject('Une mission a été créée sans workflow')
  2450.                 ->content('
  2451.                 <p>Bonjour,</p>
  2452.                 <p>La mission ' $mission->getReference() . ' contient un produit "' $mission->getProduct()->getName() . '" qui n\'a pas de Workflow associé.</p>
  2453.                 <p>Merci d\'en créer un pour ce produit et d\'aller le relier à la mission.</p>
  2454.             ')
  2455.                 ->action('Modifier la mission'$this->generateUrl('handle_mission_campaign', ['id' => $mission->getCampaign()->getId()], UrlGeneratorInterface::ABSOLUTE_URL))
  2456.                 ->markAsPublic();
  2457.             $mailer->send($notification);
  2458.         }
  2459.     }
  2460.     #[Route('/campagne/cart/{id}/{type}'name'campaign_pdf_cart'defaults: ['type' => 'pdf'])]
  2461.     public function  getPdfCart(Campaign $campaignstring $typePriceService $priceService)
  2462.     {
  2463.         $update_ref true;
  2464.         foreach ($campaign->getMissionsWithoutEspaceDeDiscussion() as $mission) {
  2465.             $mission->additionnal $this->getAdditionalInformation($mission->getProduct()->getFrontId(), $update_ref);
  2466.             $update_ref false;
  2467.         }
  2468.         $twigRender = [
  2469.             'link' => "campaign/pdf_cart/index.html.twig",
  2470.             'param' => [
  2471.                 'campaign' => $campaign,
  2472.                 'price_service' => $priceService,
  2473.                 'currency' => "€",
  2474.                 'balance' =>  "0",
  2475.             ]
  2476.         ];
  2477.         if ($type == 'pdf') {
  2478.             $pdfOptions = new Options();
  2479.             $pdfOptions->set('defaultFont''Arial');
  2480.             $pdfOptions->set('enable_remote'true);
  2481.             $pdfOptions->setIsRemoteEnabled(true);
  2482.             $dompdf = new Dompdf($pdfOptions);
  2483.             $context stream_context_create([
  2484.                 'ssl' => [
  2485.                     'verify_peer' => FALSE,
  2486.                     'verify_peer_name' => FALSE,
  2487.                     'allow_self_signed' => TRUE
  2488.                 ]
  2489.             ]);
  2490.             $dompdf->setHttpContext($context);
  2491.             $html $this->renderView($twigRender['link'], $twigRender['param']);
  2492.             $dompdf->loadHtml($html);
  2493.             $dompdf->setPaper('A4''portrait');
  2494.             $dompdf->render();
  2495.             $fichier "commande_myflow_" date('dmY');
  2496.             $dompdf->stream($fichier, [
  2497.                 'attachement' => true
  2498.             ]);
  2499.             return new JsonResponse(['status' => "Ok"], Response::HTTP_CREATED, ["Content-type" => "application/pdf"]);
  2500.         } else {
  2501.             return $this->render($twigRender['link'], $twigRender['param']);
  2502.         }
  2503.     }
  2504.     private function getAdditionalInformation(string $productFrontIdbool $updateRef false)
  2505.     {
  2506.         $param $updateRef "$productFrontId&update_id=true" $productFrontId;
  2507.         $frontWebSiteUrl $this->getParameter('front_website_url');
  2508.         $client = new Client();
  2509.         $response $client->request('GET'"$frontWebSiteUrl/wp-json/my-flow/v1/product_info?product_id=$param", []);
  2510.         $responseDecode json_decode($response->getBody()->getContents());
  2511.         return [
  2512.             "ref" => $responseDecode->ref,
  2513.             "attachement" => gettype($responseDecode->attachement) == "array" && sizeof($responseDecode->attachement) > $responseDecode->attachement[0] : "",
  2514.             "link" =>  $responseDecode->link,
  2515.         ];
  2516.     }
  2517.     private function updateUserDataDateCertificate($userData){
  2518.         $dateAddCertificate = new \DateTime();
  2519.         //if(is_null($userData->getVigilanceCertificate())){
  2520.             $userData->setDateUpdateCertificate($dateAddCertificate);
  2521.         //}
  2522.    }
  2523.    #[Route('/campagne/modification/price'name'campaign_modif_price')]
  2524.     public function  modificationPrestation(Request $request,PriceService $priceService,EntityManagerInterface $entityManager,ClientSoldService $clientSoldService)
  2525.     {   
  2526.         $neddToReajustSold false;
  2527.         $allData $request->request->all();
  2528.         foreach ($allData as $missionId => $value) {
  2529.             $mission $entityManager->getRepository(Mission::class)->find($missionId);
  2530.             $campaign $mission->getCampaign();
  2531.             $firstIdMission $campaign->getMissions()->first()->getId();
  2532.             $creditHistory $campaign->getCreditHistory();
  2533.             $dateActidatedAt $campaign->getActivatedAt();
  2534.             //price mission after update price prestation
  2535.             $priceMissionNotTouch $priceService->priceAndTimeMissionBasedOnPriceSale($mission)['price'];
  2536.             if ($priceMissionNotTouch != $value) {
  2537.                 $neddToReajustSold true;
  2538.                 //update priceSales mission if price original <> de new price
  2539.                 //first update price sales mission
  2540.                 $mission->setPriceSale($value);
  2541.                 $entityManager->persist($mission);
  2542.                 $entityManager->flush();
  2543.                 //second need to delete all balance transaction
  2544.                 $balanceTransaction $entityManager->getRepository(BalanceTransactions::class)->soldeByMission($creditHistory,$mission);
  2545.                 if (is_null($balanceTransaction)) {
  2546.                     $oldTotalConsuption $creditHistory->getTotalConsumption();
  2547.                     $oldCurrentBalance $creditHistory->getCurrentBalance();
  2548.                     $creditHistory->setTotalConsumption($oldTotalConsuption $value );
  2549.                     $creditHistory->setCurrentBalance($oldCurrentBalance $value);
  2550.                     //remove balance transaction
  2551.                 }
  2552.                 //third decrease all value in balance transactions.
  2553.                 $clientSoldService->decreaseCurrentBalanceByMissionCost($mission,$dateActidatedAt);
  2554.             }
  2555.         }
  2556.         $entityManager->flush();
  2557.         $this->addFlash('success','Prix de la prestation changé avec succées');
  2558.         return $this->redirectToRoute('mission_edit', ['id' => $firstIdMission], Response::HTTP_SEE_OTHER);
  2559.     }
  2560.     //  private function createCampaignRecurrentFromFrontUntilNow($campaignRecurrentService,$originalCampaign,$now,$entityManager){
  2561.     //     $campaignRecurrentService->updateLaunchRecurringAt($originalCampaign);
  2562.     //     $campaignFrequency = $originalCampaign->getFrequency()->getLaunchRecurrenceAt();
  2563.     //     $newCampaign =  $campaignRecurrentService->clone($originalCampaign);
  2564.     //     $campaign = $newCampaign;
  2565.     //     $entityManager->persist($campaign);
  2566.     //     $entityManager->flush();
  2567.     //     if($campaignFrequency<$now){
  2568.     //         $this->createCampaignRecurrentFromFrontUntilNow($campaignRecurrentService,$originalCampaign, $now,$entityManager);
  2569.     //     }
  2570.     //     return;
  2571.     // }
  2572.     private function checkIfCampaignContainsProductEvaluate(Campaign $campaign){
  2573.         foreach($campaign->getMissions() as $mission){
  2574.             if($mission->getProduct()->getType()==ProductType::A_EVALUER){
  2575.                 return true;
  2576.             }
  2577.         }
  2578.         return false;
  2579.     }
  2580.     #[Route('/contact-project/html/add'name'campaing_contact_project_html_add'methods: ['GET''POST'])]
  2581.     public function modalContactProjectCampaing(Request $request): Response
  2582.     {
  2583.          $formAddMissionContactProject $this->createForm(AddMissionContactProjectType::class);
  2584.         return  $this->render('campaign/_contact_project.html.twig', [
  2585.             'formAddMissionContactProject' => $formAddMissionContactProject->createView()
  2586.         ]);
  2587.     }
  2588.      #[Route('/contact-project/take-info/{email}'name'campaing_contact_project_take_info'methods: ['GET''POST'])]
  2589.     public function contactTakeInfos(Request $request,EntityManagerInterface $entityManager,$email null): Response
  2590.     {
  2591.         $user null;
  2592.         if ($email !== null and !empty($email) ) {
  2593.             $user $entityManager->getRepository(User::class)->findOneByEmail($email);
  2594.         }
  2595.         return  $this->render('campaign/_contact_project_list.html.twig', [
  2596.             'user' => $user
  2597.         ]);
  2598.     }
  2599. }