src/Controller/ClientController.php line 452

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