src/Controller/ClientController.php line 386

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\SignedContract;
  4. use App\Entity\User;
  5. use App\Entity\CompanyData;
  6. use App\Enum\Role;
  7. use App\Enum\TypeSignedContract;
  8. use App\Event\ClientUpdatedEvent;
  9. use App\Form\ClientProfilType;
  10. use App\Form\ClientType;
  11. use App\Repository\JobRepository;
  12. use App\Service\ConfidentialityService;
  13. use App\Service\ContractService;
  14. use App\Service\CreditService;
  15. use App\Service\PdfService;
  16. use App\Service\UtilsService;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use App\Enum\TypePack;
  19. use PHPUnit\Util\Json;
  20. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  21. use Symfony\Component\HttpFoundation\JsonResponse;
  22. use App\Repository\UserRepository;
  23. use App\Service\UserService;
  24. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  25. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. use Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface;
  30. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  31. use Symfony\Component\Serializer\SerializerInterface;
  32. use GuzzleHttp\Client;
  33. use App\Event\ClientDeleteWpEvent;
  34. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  35. use App\Entity\Company;
  36. use App\Entity\CreditHistory;
  37. use App\Service\FrontAPIService;
  38. use App\Repository\CompanyRepository;
  39. use App\Repository\CampaignRepository;
  40. use App\Service\DynamicHostService;
  41. use Twig\Environment;
  42. class ClientController extends AbstractController
  43. {
  44.      public function __construct(
  45.         private FrontAPIService $frontAPIService,
  46.         private DynamicHostService $dynamicHostService
  47.         private EntityManagerInterface $entityManager,
  48.     ){}
  49.     /**
  50.      * Displays all client deleted
  51.      * Only admin views this interface
  52.      * @param UserRepository $userRepository
  53.      * @return Response
  54.      */
  55.     #[Route('/admin/clients/deleted'name'client_deleted'methods: ['GET'])]
  56.     #[Route('/admin/gestionnaires/deleted'name'client_gestionnaires_deleted'methods: ['GET'])]
  57.     public function deleted(UserRepository $userRepository,DynamicHostService $dynamicHostService,Request $request): Response
  58.     {
  59.         if ( $request->get('_route') === 'client_gestionnaires_deleted' && !in_array(Role::ROLE_ADMIN_AGENCY->value,$this->getUser()->getRoles())) {
  60.             throw new \NotFoundHttpException('La page que vous demandez est introuvable.');
  61.         }
  62.         $list $userRepository->findByDeleted(1);
  63.         $company $dynamicHostService->getCompany();
  64.         if (null !== $company ) {
  65.             $list $userRepository->getClientDeletedCompany($company);
  66.         }
  67.         return $this->render('client/deleted.html.twig', [
  68.             'clients' => $list
  69.         ]);
  70.     }
  71.     #[Route('/admin/client/reactivated/{id}'name'client_toggle_availabilty_status_deleted')]
  72.     public function toggleAvailabilityStatusDeleted(User $userEntityManagerInterface $entityManager): Response
  73.     {
  74.         $user->setDeleted(0);
  75.         $entityManager->flush();
  76.         $this->addFlash(
  77.             type'success',
  78.             message'Le client '.$user.' a bien été réactivé'
  79.         );
  80.         return $this->redirectToRoute('client_deleted');
  81.     }
  82.     #[Route('/admin/client/activate/{id}/{company_id}'name'client_activate')]
  83.     public function clientActivation(string $id,string $company_id,UserRepository $userRepositoryEntityManagerInterface $entityManager,Request $request): Response
  84.     {   
  85.         $agency = !is_null($request->query->get('agency')) ? true false;
  86.         $user $userRepository->findOneBy(['id'=>$id]);
  87.         $user->setEnabled(true);
  88.         $entityManager->flush();
  89.         $this->addFlash(
  90.             type'success',
  91.             message'Le client '.$user.' a bien été activé'
  92.         );
  93.         if ($agency) {
  94.            return $this->redirectToRoute('agency_edit',['id'=>$company_id]);
  95.         }
  96.         return $this->redirectToRoute('company_edit',['id'=>$company_id]);
  97.     }
  98.     /**
  99.      * @param UserRepository $userRepository
  100.      * @return Response
  101.      */
  102.     #[Route('/admin/clients'name'client_index'methods: ['GET'])]
  103.     #[Route('/admin/gestionnaires'name'client_gestionnaire_index'methods: ['GET'])]
  104.     public function index(UserRepository $userRepository,Request $request,DynamicHostService $dynamicHostService): Response
  105.     {
  106.         // if ( $request->get('_route') === 'client_gestionnaire_index' && !in_array(Role::ROLE_ADMIN_AGENCY->value,$this->getUser()->getRoles())) {
  107.         //     throw new \NotFoundHttpException('La page que vous demandez est introuvable.');
  108.         // }
  109.         $role Role::ROLE_CLIENT->value;
  110.         $observer Role::ROLE_OBSERVER->value;
  111.         $validator Role::ROLE_VALIDATOR->value;
  112.         $roleClientAdmin Role::ROLE_CLIENT_ADMIN->value;
  113.         $author Role::ROLE_AUTHOR->value;
  114.         $editor Role::ROLE_EDITOR->value;
  115.         //for adminAgency only
  116.         if (in_array(Role::ROLE_ADMIN_AGENCY->value,$this->getUser()->getRoles())) {
  117.             $company $this->getUser()->getCompany();
  118.             $return = [
  119.                 'clients' => $userRepository->findByRoleClientsByCompany('ROLE_SUBCONTRACTOR','ROLE_BOT','ROLE_MANAGER',$company),
  120.             ]; 
  121.             if ($request->get('_route') === 'client_gestionnaire_index') {
  122.                 $return = [
  123.                     'clients' => $userRepository->findGestionnaireByCompany('ROLE_MANAGER',$company),
  124.                 ]; 
  125.             }
  126.         }
  127.         //for admin only
  128.         if (in_array(Role::ROLE_ADMIN->value,$this->getUser()->getRoles()) or (in_array(Role::ROLE_MANAGER->value,$this->getUser()->getRoles()) and ($this->getUser()?->getCompany()?->isTypeCompany() === false) or $this->getUser()?->getCompany()?->isTypeCompany() == null) ) {
  129.             
  130.             $return = [
  131.                 'clients' => $userRepository->findByRoleClients($role$observer$roleClientAdmin,$validator,$author$editor ),
  132.             ];
  133.             if ($request->get('_route') === 'client_gestionnaire_index') {
  134.                 $return = [
  135.                     'clients' => $userRepository->findGestionnaireMyFlow('ROLE_MANAGER'),
  136.                 ]; 
  137.             }
  138.         }else if ((in_array(Role::ROLE_MANAGER->value,$this->getUser()->getRoles()))) {
  139.             $return = [
  140.                 'clients' => $userRepository->findByRoleClients($role$observer$roleClientAdmin,$validator,$author$editor ),
  141.             ];
  142.         }
  143.         $template $request->get('_route') === 'client_gestionnaire_index' "client/index_agency.html.twig" "client/index.html.twig";
  144.         return $this->render($template$return);
  145.     }
  146.     /**
  147.      * @param User|null $user
  148.      * @param Request $request
  149.      * @param UserService $userService
  150.      * @param UserPasswordHasherInterface $hasher
  151.      * @return Response
  152.      */
  153.     #[Route('/admin/client/ajouter'name'client_new'methods: ['GET','POST'])]
  154.     #[Route('/admin/gestionnaires/ajouter'name'client_gestionaires_new'methods: ['GET','POST'])]
  155.     #[Route('/admin/client/{id}'name'client_edit'methods: ['GET','POST'])]
  156.     #[Route('/admin/gestionnaires/{id}'name'client_gestionaires_edit'methods: ['GET','POST'])]
  157.     public function handleClient(User $user nullRequest $requestUserService $userServiceUserPasswordHasherInterface $hasherEventDispatcherInterface $dispatcher,DynamicHostService $dynamicHostService,UserRepository $userRepository): Response
  158.     {   
  159.         if (null !== $user and in_array('ROLE_MANAGER',  $user->getRoles()) and $request->get('_route') === 'client_edit') {
  160.             return $this->redirectToRoute('client_gestionaires_edit', ['id' => $user->getId()], Response::HTTP_SEE_OTHER);
  161.         }
  162.         $typeAction ='edit';
  163.         $isadminAgency false;
  164.         $isManager false;
  165.         if (in_array("ROLE_ADMIN_AGENCY"$this->getUser()->getRoles())) {
  166.               
  167.                  $isadminAgency true;
  168.             }
  169.         if (in_array("ROLE_MANAGER"$this->getUser()->getRoles())) {
  170.                  $isManager true;
  171.             }
  172.         if ($user === null){
  173.             $typeAction =  'new';
  174.             $user = new User();
  175.             if (in_array("ROLE_ADMIN_AGENCY"$this->getUser()->getRoles())) {
  176.                  $user->setCompany($this->getUser()->getCompany());
  177.                  $isadminAgency true;
  178.             }
  179.             
  180.            
  181.         }
  182.         $isCreationOfGestionary false;
  183.         if ($request->get('_route') === 'client_gestionaires_new' or $request->get('_route') === 'client_gestionaires_edit') {
  184.              $isCreationOfGestionary =  true;
  185.         }
  186.       
  187.         $form $this->createForm(ClientType::class, $user,['isadminAgency'=>$isadminAgency,'isManager'=>$isManager,'isCreationOfGestionary'=>$isCreationOfGestionary,'url'=>$request->get('_route')]);
  188.         $form->handleRequest($request);
  189.         $company $dynamicHostService->getCompany();
  190.         if ($form->isSubmitted() && $form->isValid()) {
  191.             $entityManager $this->getDoctrine()->getManager();
  192.             $userExistInSameDomaine  $userRepository->getUniqUserByCompanyByEmailForSubClientManager($user->getEmail(),$company);
  193.             if (!is_null($userExistInSameDomaine) and ($request->get('_route') === 'client_new' or $request->get('_route') === 'client_gestionaires_new')){
  194.                 $this->addFlash('error'"L'utilisateur que vous tentez de créer existe déjà.");
  195.                 return $this->redirectToRoute('sub_contractor_new', [], Response::HTTP_SEE_OTHER);
  196.             }
  197.             
  198.             if ($request->get('_route') === 'client_new' or $request->get('_route') === 'client_gestionaires_new') {
  199.                 if ($form->getData()->getRoles()[0] == 'ROLE_CLIENT_ADMIN'){
  200.                     $role Role::ROLE_CLIENT_ADMIN->value;
  201.                 }
  202.                 elseif($form->getData()->getRoles()[0] == 'ROLE_CLIENT'){
  203.                     $role Role::ROLE_CLIENT->value;
  204.                 }
  205.                 else{
  206.                     $role Role::ROLE_AUTHOR->value;
  207.                     //changement de Role pour manager et administrateur pour agence
  208.                     if ($form->getData()->getRoles()[0] == 'ROLE_MANAGER') {
  209.                         $role Role::ROLE_MANAGER->value;
  210.                     }
  211.                     if ($form->getData()->getRoles()[0] == 'ROLE_ADMIN_AGENCY') {
  212.                          $role Role::ROLE_ADMIN_AGENCY->value;
  213.                     }
  214.                 }
  215.                 $password $userService->generatePassword();
  216.                 $hashedPassword $hasher->hashPassword($user$password);
  217.                 $user->setRoles([$role])->setIsNewClient(false);
  218.                 if(empty($form->getData()->getPassword())) {
  219.                     $user->setPassword($hashedPassword)
  220.                          ->setEnabled(false);
  221.                 }
  222.                 $entityManager->persist($user);
  223.                 $msg $request->get('_route') === 'client_new' 'Le client a bien été ajouté' 'Le gestionnaire a bien été ajouté';
  224.                 $this->addFlash('success'$msg);
  225.                 $notification true;
  226.                  //si pas de notification par chat tout les jours alors mettre par défaut.
  227.                 $freqNotificationEverytime $form->getData()->getFreqNotificationEverytime();
  228.                 if(!in_array("0"$freqNotificationEverytime)){
  229.                     $freqNotificationEverytime[] = 0;
  230.                     $form->getData()->setFreqNotificationEverytime($freqNotificationEverytime);
  231.                 }
  232.            
  233.             } else {
  234.                 $msg $request->get('_route') === 'client_edit' 'Le client a bien été modifié' 'Le gestionnaire a bien été modifié'
  235.                     $this->addFlash('success'$msg);
  236.               
  237.                 $notification false;
  238.             }
  239.             $file $form->get('picture')->getData();
  240.             if ($file!=null) {
  241.                // $destination = $this->getParameter('file_profil_directory');
  242.                // if(!empty(trim($user->getPictureName())) && !is_null($user->getPictureName()) && file_exists("$destination/{$user->getPictureName()}") ){
  243.                //          unlink("$destination/{$user->getPictureName()}");
  244.                //  }              
  245.                 $user->setPicture($form->get('picture')->getData());
  246.             }
  247.             $entityManager->flush();
  248.             $user->setPicture(null);
  249.             $event = new ClientUpdatedEvent($user$notification);
  250.             $dispatcher->dispatch($eventClientUpdatedEvent::NAME);
  251.             if($this->isGranted("ROLE_CLIENT_ADMIN") and $typeAction == "edit"){
  252.                 if (!is_null($user->getCompany())) {
  253.                     return $this->redirectToRoute('company_edit', ['id' => $user->getCompany()->getId()], Response::HTTP_SEE_OTHER);
  254.                 }else{
  255.                     return $this->redirectToRoute('mission_index', [], Response::HTTP_SEE_OTHER);
  256.                 }
  257.                
  258.             }
  259.            
  260.             return $this->redirectToRoute('client_index', [], Response::HTTP_SEE_OTHER);
  261.             
  262.         }
  263.         return $this->renderForm('client/handle.html.twig', [
  264.             'form' => $form,
  265.             'user' => $user,
  266.             'type_action' => $typeAction,
  267.             'isCreationOfGestionary' => $isCreationOfGestionary,
  268.         ]);
  269.     }
  270.     /**
  271.      * @param Request $request
  272.      * @param UserRepository $userRepository
  273.      * @return JsonResponse
  274.      */
  275.     #[Route('/api/clients/search'name'api_clients_search')]
  276.     public function apiSearch(Request $requestUserRepository $userRepository,CompanyRepository $companyRepository)
  277.     {
  278.         $isAdmin false;
  279.         $user $request->query->get('userId') != null $userRepository->findOneBy(['id'=>$request->query->get('userId')]) :  $this->getUser(); 
  280.       
  281.         //determine if root or client admin
  282.         if (in_array("ROLE_ADMIN",  $user->getRoles())) {
  283.            $isAdmin true;
  284.         }
  285.         $query $request->query->get('query');
  286.         $query trim($query);
  287.         if ($request->query->get('client') == 2) {
  288.            
  289.             return new JsonResponse([
  290.                 'clients' => $userRepository->apiQuerySearchProject($query,false,$isAdmin),
  291.             ]); 
  292.         }else{
  293.             $companyClient null;
  294.             if ($request->query->get('client') == 1){
  295.                 $role 'ROLE_CLIENT';
  296.                 if ($request->query->get('companyId')) {
  297.                     $companyClient $companyRepository->find($request->query->get('companyId'));
  298.                 }
  299.             }else{
  300.                 $role 'ROLE_SUBCONTRACTOR';
  301.             }
  302.         }
  303.         //dd( $userRepository->apiQuerySearch($query, $role,false,$isAdmin,$companyClient));
  304.         return new JsonResponse([
  305.             'clients' => $userRepository->apiQuerySearch($query$role,false,$isAdmin,$companyClient),
  306.         ]);
  307.     }
  308.    #[Route('/api/clients/cgv/cgu'name'api_clients_cgv_cgu'methods: ['GET'])]
  309.     public function CguClient(JobRepository $jobRepository,UtilsService $utilsServiceSerializerInterface $serializer,DynamicHostService $dynamicHostService,ParameterBagInterface $parameterBagInterface,  ContractService $contractService,Environment $twig,PdfService $pdfService): JsonResponse
  310.     {
  311.         $userData = [
  312.             'cgu'=> $contractService->getCGU(null),
  313.             'cguClient'=> $contractService->getCGU(nullnull'client'),
  314.             'cgv'=>$contractService->getCGV(null)
  315.         ];
  316.          return new JsonResponse($userData,
  317.             Response::HTTP_OK,
  318.             [],
  319.         );
  320.     }
  321.      #[Route('/api/clients/creation'name'api_clients_creation'methods: ['GET'])]
  322.     public function createClients(JobRepository $jobRepository,UtilsService $utilsServiceSerializerInterface $serializer,DynamicHostService $dynamicHostService,ParameterBagInterface $parameterBagInterface,  ContractService $contractService,Environment $twig,PdfService $pdfService,EntityManagerInterface $entityManager): JsonResponse
  323.     {
  324.         $user = new User();
  325.         $user->setUserData(null);
  326.         $user->setEmail(uniqid());
  327.         $user->setRoles(['ROLE_SUBCONTRACTOR']);
  328.         $user->setDeleted(true);
  329.         $user->setEnabled(false);
  330.         $entityManager->persist($user);
  331.         $entityManager->flush();
  332.         return new JsonResponse([
  333.             'id' => $user->getId(),
  334.         ]);
  335.     }
  336.      #[Route('/api/clients/creation/role/client'name'api_clients_creation_role_client'methods: ['GET'])]
  337.     public function createClientsWithRoles(JobRepository $jobRepository,UtilsService $utilsServiceSerializerInterface $serializer,DynamicHostService $dynamicHostService,ParameterBagInterface $parameterBagInterface,  ContractService $contractService,Environment $twig,PdfService $pdfService,EntityManagerInterface $entityManager): JsonResponse
  338.     {
  339.         $user = new User();
  340.         $user->setUserData(null);
  341.         $user->setEmail(uniqid());
  342.         $user->setDeleted(true);
  343.         $user->setRoles(['ROLE_CLIENT']);
  344.         $user->setEnabled(false);
  345.         $entityManager->persist($user);
  346.         $entityManager->flush();
  347.         return new JsonResponse([
  348.             'id' => $user->getId(),
  349.         ]);
  350.     }
  351.     #[Route('/api/clients/{id}'name'api_clients'methods: ['GET'])]
  352.     public function apiClients(User $user,JobRepository $jobRepository,UtilsService $utilsServiceSerializerInterface $serializer,DynamicHostService $dynamicHostService,ParameterBagInterface $parameterBagInterface,  ContractService $contractService,Environment $twig,PdfService $pdfService): JsonResponse
  353.     {
  354.         if ($user->isEnabled()) {
  355.             return new JsonResponse([
  356.                 'alreadyEnabled' => true,
  357.             ]);
  358.         }
  359.        
  360.         $company $dynamicHostService->getCompany($user) ;
  361.         $backUrl =  $company instanceof Company $company->getDomaineName() : $parameterBagInterface->get('back_website_url'); 
  362.         $userData = [
  363.             'lastname'=> $user->getLastname(),
  364.             'firstname'=>$user->getFirstname(),
  365.             'email'=>$user->getEmail(),
  366.             'cellphone'=>$user->getCellPhone(),
  367.             'billingMethod'=>$user->getBillingMethod(),
  368.             'gender'=>$user->getGender(),
  369.             'dailyRate'=>$user->getDailyRate(),
  370.             'userData'=>[
  371.                'stateCompany'=> $user->getUserData()?->getStateCompany(),
  372.                'status'=> $user->getUserData()?->getStatus(),
  373.                'country'=> $user->getUserData()?->getCountry(),
  374.                'siren'=> $user->getUserData()?->getSiren(),
  375.                'intracommunityTva'=> $user->getUserData()?->getIntracommunityTva(),
  376.                'address'=> $user->getUserData()?->getAddress(),
  377.                'rIB'=> $user->getUserData()?->getRIB(),
  378.                'accountOwner'=> $user->getUserData()?->getAccountOwner(),
  379.                'iBAN'=> $user->getUserData()?->getIBAN(),
  380.                'bicSwift'=> $user->getUserData()?->getBicSwift(),
  381.                'spokenLanguages'=> $user->getUserData()?->getSpokenLanguages(),
  382.                'companyName'=> $user->getUserData()?->getCompanyName(),
  383.                'tva'=> $user->getUserData()?->getTva(),
  384.             ],
  385.             'salary'=>$user->getSalary(),
  386.             'cgu'=> $contractService->getCGU($user),
  387.             'cguClient'=> $contractService->getCGU($usernull'client'),
  388.             'cgv'=>$contractService->getCGV($user),
  389.             'jobs'=> $user->getJobs()!=null array_map(function($job){
  390.                     return $job->getId();
  391.                 },($user->getJobs())->toArray()) : [],
  392.             'jobsAgency'=> $utilsService->getIds($jobRepository->findByAgency($company)),
  393.             'link'=>[
  394.                 'cguSubcontractor'=>  $company  instanceof Company ?  "$backUrl/condition-generale/{$company->getId()}-cgu-sous-traitant" $contractService->getLinkMyFlowCGUSubcontractor(), 
  395.                 'cguClient'=> $company  instanceof Company ?  "$backUrl/condition-generale/{$company->getId()}-cgu-client" $contractService->getLinkMyFlowCGUClient(), 
  396.                 'cgv'=> $company  instanceof Company ?  "$backUrl/condition-generale/{$company->getId()}-cgv" $contractService->getLinkMyFlowCGV(), 
  397.             ],
  398.             'agency'=>[
  399.                 'name'=> $company instanceof Company $company->getName() : '',
  400.                 'id'=> $company instanceof Company $company->getId() : ''
  401.             ],
  402.             'contractSubClient'=>$twig->render(
  403.                 $pdfService->getLinkTwigToGenerateContratBetweenAgenceAndSubcontractor($user),
  404.                 $pdfService->getParamsToGenerateContratBetweenAgenceAndSubcontractor($user)
  405.             ),
  406.        ];
  407.         return new JsonResponse($userData,
  408.             Response::HTTP_OK,
  409.             [],
  410.         );
  411.     }
  412.     #[Route('/api/clients/{id}'name'api_edit_client'methods: ['POST'])]
  413.     public function apiEditClient(User $userConfidentialityService $confidentialityServiceRequest $requestUserPasswordHasherInterface $passwordHasherEntityManagerInterface $entityManagerEventDispatcherInterface $dispatcher): JsonResponse
  414.     {   
  415.         
  416.         $user->setFirstname($request->request->get('firstname'));
  417.         $user->setLastname($request->request->get('lastname'));
  418.         $user->setCellPhone($request->request->get('cellPhone'));
  419.         $user->setEnabled(true);
  420.         $user->setGender($request->request->get('gender'));
  421.         $hashedPassword $passwordHasher->hashPassword($user$request->request->get('password'));
  422.         $user->setPassword($hashedPassword);
  423.        
  424.         $entityManager->persist($user);
  425.         $entityManager->flush();
  426.         $event = new ClientUpdatedEvent($userfalse$request->request->get('password'), true);
  427.         $dispatcher->dispatch($eventClientUpdatedEvent::NAME);
  428.         $confidentialityService->addSignedContractForClient($usertruefalsetrue);
  429.         return new JsonResponse(['result' => 'success']);
  430.     }
  431.     #[Route('/api/clients/external/{id}'name'api_edit_external_client'methods: ['POST'])]
  432.     public function apiEditExternalClient(User $userRequest $requestUserPasswordHasherInterface $passwordHasherEntityManagerInterface $entityManagerEventDispatcherInterface $dispatcher,ConfidentialityService $confidentialityService): JsonResponse
  433.     {
  434.         
  435.         
  436.         $user->setFirstname($request->request->get('firstname'));
  437.         $user->setLastname($request->request->get('lastname'));
  438.         $user->setEmail($request->request->get('email'));
  439.         $user->setCellPhone($request->request->get('cellPhone'));
  440.         $user->setEnabled(true);
  441.         $user->setGender($request->request->get('gender'));
  442.         $user->setDeleted(false);
  443.         $hashedPassword $passwordHasher->hashPassword($user$request->request->get('password'));
  444.         $user->setPassword($hashedPassword);
  445.         $entityManager->flush();
  446.         $event = new ClientUpdatedEvent($userfalse$request->request->get('password'), true);
  447.         $dispatcher->dispatch($eventClientUpdatedEvent::NAME);
  448.          $confidentialityService->addSignedContractForClient($user,true,false,true);
  449.         return new JsonResponse(['result' => 'success']);
  450.     }
  451.     #[Route('/api/clients/external/company/{id}'name'api_edit_external_company_client'methods: ['POST'])]
  452.     public function apiEditExternalCompanyClient(User $userRequest $request,CreditService $creditServiceUserPasswordHasherInterface $passwordHasherEntityManagerInterface $entityManagerEventDispatcherInterface $dispatcher,CompanyRepository $companyRepository,ConfidentialityService $confidentialityService): JsonResponse
  453.     {
  454.               
  455.         //infos company
  456.         $adresse =  $request->request->get('adresse');
  457.         $country =  $request->request->get('pays');
  458.         $rcs =  $request->request->get('rcs');
  459.         $state =  $request->request->get('state');
  460.         //end infos company
  461.         
  462.         $logo $request->request->get('logo');
  463.         $companyExist true;
  464.         $company $companyRepository->findOneByName($request->request->get('company_name'));
  465.         if (is_null($company)) {
  466.             $companyExist false;
  467.             $company = new Company();
  468.         }
  469.         $company->setName($request->request->get('company_name'));
  470.         $company->setCreatedAt(new \DateTime());
  471.         $company->setSiren($request->request->get('siren'));
  472.         $company->setCostOfDiscountedCredit(0);
  473.         $company->setEnabled(true);
  474.         $company->setContract(3);
  475.         $company->setCustomerDiscount(0);
  476.         
  477.         
  478.         if (!is_null($request->request->get('logo')) and !$companyExist) {
  479.             //upload image company 
  480.             $frontWebSiteUrlLogo $this->getParameter('front_website_url_upload_logo_company').$logo;
  481.             $dirLogoCompany $this->getParameter('dir_logo_company_kernel').$logo;
  482.             if($this->transfertLogo($frontWebSiteUrlLogo,$dirLogoCompany))
  483.                 $company->setLogoName($logo);
  484.         }
  485.         if ($companyExist == false) {
  486.             $entityManager->persist($company);
  487.             $entityManager->flush();
  488.             $creditHistory =  new CreditHistory();
  489.             $creditHistory->setCompany($company)
  490.                           ->setName("Facturation individuelle")
  491.                           ->setTypePack(TypePack::CASH->value)
  492.                           ->setIdentifier($creditService->getNewReference())
  493.                           ->setOrderedBy($user);
  494.             $entityManager->persist($creditHistory);
  495.             $entityManager->flush();
  496.             $this->sharedResourceCategoryService->setDefaultSharedResourceCategory($company);
  497.         }
  498.         
  499.         
  500.         
  501.         $user->setCompany($company) ;
  502.         $entityManager->persist($user);
  503.         $entityManager->flush();
  504.         $response $this->frontAPIService->pushCompanyToFront($company);
  505.         if (null !== $response && null === $company->getFrontId()) {
  506.             $company->setFrontId($response['id']);
  507.             $entityManager->persist($company);
  508.             $entityManager->flush();
  509.         }
  510.         //add data company
  511.         
  512.         if ($companyExist == false) {
  513.             
  514.             $companyData = new CompanyData();
  515.             $companyData->setCountry($country)
  516.                         ->setAddress($adresse)
  517.                         ->setRcs($rcs)
  518.                         ->setState($state);
  519.             $entityManager->persist($companyData);
  520.             $company->setCompanyData($companyData);
  521.             $entityManager->persist($company);
  522.             $entityManager->flush();
  523.             
  524.         }
  525.         //mise a jour de l'utilisateur sur wordpress
  526.         $this->frontAPIService->pushClientToFront($usernull);
  527.         //link to user
  528.         $confidentialityService->addSignedContractForClient($user,true,false,true);
  529.         return new JsonResponse(['result' => 'success']);
  530.     }
  531.     public function transfertLogo($logoDir,$dirDest){
  532.         $imageUrl $logoDir;
  533.         $ch curl_init();
  534.         curl_setopt($chCURLOPT_URL$imageUrl);
  535.         curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  536.         $response curl_exec($ch);
  537.         if (curl_errno($ch)) {
  538.             echo 'Erreur cURL : ' curl_error($ch);
  539.             return false;
  540.         } else {
  541.             $localFilePath $dirDest;
  542.             try{
  543.                 file_put_contents($localFilePath$response);
  544.             }catch(\Exception $e){
  545.                 return false;
  546.             }
  547.         }
  548.         curl_close($ch);
  549.         return true;
  550.     }
  551.     #[Route('/admin/client/{id}/{availabilty<enable|disable>}'name'client_toggle_availabilty')]
  552.     #[Route('/admin/client_gestionnaire/{id}/{availabilty<enable|disable>}'name'client_gestionnaire_toggle_availabilty')]
  553.     public function toggleAvailability(User $userEntityManagerInterface $entityManager,Request $request): Response
  554.     {
  555.         $user->setEnabled(!$user->isEnabled());
  556.         $entityManager->flush();
  557.         $this->addFlash(
  558.             type'success',
  559.             message'Le client '.$user.' a bien été '. ($user->isEnabled() ? 'activé' 'désactivé')
  560.         );
  561.         $route $request->get('_route') === 'client_toggle_availabilty' 'client_index''client_gestionnaire_index';
  562.         return $this->redirectToRoute($route);
  563.     }
  564.     
  565.     #[Route('/admin/client/{id}/invitation'name'client_send_another_invitation')]
  566.     public function sendAnotherInvitation(EventDispatcherInterface $dispatcherUser $user): Response
  567.     {
  568.         $event = new ClientUpdatedEvent($usertruenullfalsefalse);
  569.         $dispatcher->dispatch($eventClientUpdatedEvent::NAME);
  570.         $this->addFlash(
  571.             type'success',
  572.             message'L\'email d\'invitation a bien été envoyé'
  573.         );
  574.         return $this->redirectToRoute('client_index');
  575.     }
  576.     #[Route('/admin/client/{id}/supprimer'name'client_remove'methods: ['GET','POST'])]
  577.     #[Route('/admin/gestionnaires/{id}/supprimer'name'client_gestionnaire_remove'methods: ['GET','POST'])]
  578.     public function deleteClient(User $user,UserService $userServiceEntityManagerInterface $entityManager,EventDispatcherInterface $dispatcher,ParameterBagInterface $parameterBag,Request $request)
  579.     {
  580.         
  581.         $event = new ClientDeleteWpEvent($userService->delete($user), $parameterBag);
  582.         $dispatcher->dispatch($eventClientDeleteWpEvent::NAME);
  583.         $txt "client";
  584.         $route 'client_index';
  585.         if ( $request->get('_route') === 'client_gestionnaire_remove'){
  586.             $txt "gestionnaire";
  587.             $route "client_gestionnaire_index";
  588.         }
  589.         $this->addFlash(
  590.             'success',
  591.             "Le {$txt} a bien été supprimé"
  592.         );
  593.         return $this->redirect($request->headers->get('referer')) ?  $this->redirect($request->headers->get('referer')) : $this->redirectToRoute($route);
  594.     }
  595.     #[Route('/mon-profil-client'name'my_profil_client'methods: ['GET','POST'])]
  596.     public function Profil(Request $requestEntityManagerInterface $entityManagerUserPasswordHasherInterface $hasher,EventDispatcherInterface $dispatcher): Response
  597.     {
  598.         $user $this->getUser();
  599.         $form $this->createForm(ClientProfilType::class, $user,['isadmin'=>$this->isGranted(Role::ROLE_ADMIN->value)]);
  600.         $form->handleRequest($request);
  601.         if($form->isSubmitted() && $form->isValid()){
  602.             if (!empty($form->getData()->getPlainPassword())){
  603.                 $hashedPassword $hasher->hashPassword($user$form->getData()->getPlainPassword());
  604.                 $user->setPassword($hashedPassword);
  605.             }
  606.             $file $form->get('picture')->getData();
  607.             if ($file!=null) {
  608.                 $destination $this->getParameter('file_profil_directory');
  609.                 try {
  610.                     if(!empty(trim($user->getPictureName())) && !is_null($user->getPictureName())){
  611.                         unlink("$destination/{$user->getPictureName()}");
  612.                     }
  613.                 } catch (\Throwable $th) {
  614.                     
  615.                 }
  616.                 $originalFilename pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
  617.                 $originalFilename str_replace(' ','-',$originalFilename);
  618.                 //$originalFilename = preg_replace('/[^A-Za-z0-9 ]/', '', $originalFilename);
  619.                 $originalFilename $this->replaceAllSpecialCharFromString($originalFilename);
  620.                 $newFilename $originalFilename .uniqid().'.' $file->guessExtension();  
  621.                 
  622.                 $file->move(
  623.                     $destination,
  624.                     $newFilename
  625.                 );
  626.   
  627.                 $user->setPictureName($newFilename);
  628.             }
  629.             $user->setPicture(null);
  630.             $entityManager->persist($user);
  631.             $entityManager->flush();
  632.             $event = new ClientUpdatedEvent($userfalse);
  633.             $dispatcher->dispatch($eventClientUpdatedEvent::NAME);
  634.            
  635.             if($request->request->get('remove-my-account')!=null){
  636.                 return $this->redirectToRoute('my_profil_client',[
  637.                     'confirm_account_deleted'=> true,
  638.                 ]);
  639.                 
  640.             }
  641.             $this->addFlash(
  642.                 'success',
  643.                 'Votre profil a bien été modifié'
  644.             );
  645.             return $this->redirectToRoute('my_profil_client');
  646.         } elseif ($form->isSubmitted()) {
  647.             $this->addFlash(
  648.                 'error',
  649.                 'Merci de corriger les erreurs',
  650.             );
  651.         }
  652.         return $this->renderForm('client/profil.html.twig', [
  653.             'form' => $form,
  654.         ]);
  655.     }
  656.     #[Route('/admin/client/{id}/renvoie-email-inscription'name'client_resend_registration_email'methods: ['GET','POST'])]
  657.     public function resendRegistrationEmail(Request $requestUser $userEventDispatcherInterface $dispatcher)
  658.     {
  659.         $event = new ClientUpdatedEvent($usertrue);
  660.         $dispatcher->dispatch($eventClientUpdatedEvent::NAME);
  661.         $this->addFlash(
  662.             type'success',
  663.             message'L\'email d\'inscription a bien été envoyé',
  664.         );
  665.         return $this->redirect($request->headers->get('referer'));
  666.     }
  667.     
  668.     #[Route('/my-subcontractor-interlocutors/{userId}'name'my_subcontractor_interlocutors'methods: ['GET'])]
  669.     public function showInterlocutors(string $userIdUserRepository $userRepositoryCampaignRepository $campaignRepository): Response
  670.     {   
  671.         $agency $this->dynamicHostService->getCompany($this->getUser()); 
  672.         $nbYearMax 3;
  673.         $user $userRepository->find($userId);
  674.         $campaigns $campaignRepository->findAllInterlocutors($user$nbYearMax);
  675.         
  676.         $userManagerAndAdminAgency $agency != null &&  $user!= null ?  $userRepository->getManagerAndAdminAgency($agency$user) : []; 
  677.         $allParticipantsMail = [];
  678.         $allParticipants = [];
  679.         foreach ($campaigns as $campaign) {
  680.             foreach ($campaign->getMissions() as $mission) {
  681.                 foreach ($mission->getParticipants() as $participant) {
  682.                     if ($participant->getRole() == Role::ROLE_SUBCONTRACTOR) {
  683.                         if (!in_array($participant->getUser()->getEmail(), $allParticipantsMail)) {
  684.                             $allParticipantsMail[] = $participant->getUser()->getEmail();
  685.                             $allParticipants[] = $participant;
  686.                         }
  687.                     }
  688.                 }
  689.             }
  690.         }
  691.         return $this->renderForm('client/interlocutors.html.twig', [
  692.             'subcontractors'   => $allParticipants,
  693.             'user_manager_and_admin_agency' => $userManagerAndAdminAgency,
  694.             'is_agency'=> $agency == null false true
  695.         ]);
  696.     }
  697.     private function replaceAllSpecialCharFromString($values){
  698.         $string str_replace(
  699.             ['à''á''â''ã''ä''å''ç''è''é''ê''ë''ì''í''î''ï''ñ''ò''ó''ô''õ''ö''ø''ù''ú''û''ü''ý''ÿ'],
  700.             ['a''a''a''a''a''a''c''e''e''e''e''i''i''i''i''n''o''o''o''o''o''o''u''u''u''u''y''y'],
  701.             $values
  702.         );
  703.     
  704.         return preg_replace('/[^A-Za-z0-9\- ]/'''$string);
  705.     }
  706. }