src/Controller/ClientController.php line 430

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