src/Controller/CampaignController.php line 750

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