src/Controller/Front/FrontCustomerAccountController.php line 612

Open in your IDE?
  1. <?php
  2. namespace Acme\SudcmsBundle\Controller\Front;
  3. use Acme\SudcmsBundle\Entity\AuthUser;
  4. use Acme\SudcmsBundle\Entity\EcoCustomers;
  5. use Acme\SudcmsBundle\Entity\EcoCustomersAddresses;
  6. use Acme\SudcmsBundle\Entity\Newsletter;
  7. use Acme\SudcmsBundle\Entity\Tchat;
  8. use Acme\SudcmsBundle\Entity\TchatMessages;
  9. use Acme\SudcmsBundle\Entity\TchatProducts;
  10. use Acme\SudcmsBundle\Form\Ecommerce\CustomerFrontType;
  11. use Acme\SudcmsBundle\Form\Ecommerce\CustomerResetPasswordType;
  12. use Acme\SudcmsBundle\Repository\AuthUserRepository;
  13. use Acme\SudcmsBundle\Repository\EcoCustomersAddressesRepository;
  14. use Acme\SudcmsBundle\Repository\EcoCustomersRepository;
  15. use Acme\SudcmsBundle\Repository\EcoInvoicesRepository;
  16. use Acme\SudcmsBundle\Repository\EcoOrdersRepository;
  17. use Acme\SudcmsBundle\Repository\EcoPlanningRepository;
  18. use Acme\SudcmsBundle\Repository\EcoProductsReferencesRepository;
  19. use Acme\SudcmsBundle\Repository\EcoShippingfeesCountryRepository;
  20. use Acme\SudcmsBundle\Repository\EcoShippingOrdersRepository;
  21. use Acme\SudcmsBundle\Repository\SiteRepository;
  22. use Acme\SudcmsBundle\Repository\TchatMessagesRepository;
  23. use Acme\SudcmsBundle\Repository\TchatProductsRepository;
  24. use Acme\SudcmsBundle\Repository\TchatRepository;
  25. use Acme\SudcmsBundle\Service\ApiService;
  26. use Acme\SudcmsBundle\Service\Ecommerce\LoyaltySystemService;
  27. use Acme\SudcmsBundle\Service\FileService;
  28. use Acme\SudcmsBundle\Service\MailerService;
  29. use Acme\SudcmsBundle\Service\OtideaUtils;
  30. use Doctrine\ORM\EntityManagerInterface;
  31. use Exception;
  32. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  33. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  34. use Symfony\Component\HttpFoundation\JsonResponse;
  35. use Symfony\Component\HttpFoundation\Request;
  36. use Symfony\Component\HttpFoundation\RequestStack;
  37. use Symfony\Component\HttpFoundation\Response;
  38. use Symfony\Component\HttpKernel\KernelInterface;
  39. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  40. use Symfony\Component\Routing\Annotation\Route;
  41. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  42. use Throwable;
  43. use const SITE_NAME;
  44. class FrontCustomerAccountController extends AbstractController
  45. {
  46.     private $session;
  47.     private $otideaUtils;
  48.     private $mailerService;
  49.     private $autorizedFiles = ['jpg''jpeg''png''pdf''doc''docx''xls''xlsx''ppt''pptx'];
  50.     private $fileService;
  51.     private $isEcommerce;
  52.     private $currentUserConnected;
  53.     private ApiService $apiService;
  54.     public function __construct(RequestStack   $requestStackEntityManagerInterface $entityManager,
  55.                                 OtideaUtils    $otideaUtilsMailerService $mailerServiceFileService $fileService,
  56.                                 SiteRepository $siteRepositoryApiService $apiService)
  57.     {
  58.         $this->session $requestStack->getCurrentRequest()->getSession();
  59.         $this->apiService $apiService;
  60.         $this->entityManager $entityManager;
  61.         $this->otideaUtils $otideaUtils;
  62.         $this->mailerService $mailerService;
  63.         $this->fileService $fileService;
  64.         $this->isEcommerce $siteRepository->find($this->session->get('admin_site_uid'))->getIsEcommerce();
  65.         $this->currentUserConnected $otideaUtils->getUserConnected();
  66.         if (!IS_ECOMMERCE) {
  67.             header('Location: ' WEBSITEROOT);
  68.             exit;
  69.         }
  70.         if (!$this->apiService->testConnexion()) {
  71.             $this->addFlash('danger''Une erreur est survenue, veuillez réessayer ultérieurement.');
  72.             return $this->redirectToRoute('front_home');
  73.         }
  74.     }
  75.     /**
  76.      * Envoi un mail avec un nouveau mot de passe
  77.      * @param int $authUser_id
  78.      */
  79.     private function sendNotificationNewPassword($authUser_id)
  80.     {
  81.         $this->mailerService->fromName SITE_NAME;
  82.         $this->mailerService->subject SITE_NAME " - Mot de passe oublié";
  83.         $authUser $this->entityManager->getRepository(AuthUser::class)->find($authUser_id);
  84.         //Enregistrement du nouveau mot de passe
  85.         $newPassword uniqid();
  86.         $password_hash password_hash($newPasswordPASSWORD_DEFAULT);
  87.         $authUser->setPassword($password_hash);
  88.         $this->entityManager->persist($authUser);
  89.         $this->entityManager->flush();
  90.         $customer $this->entityManager->getRepository(EcoCustomers::class)->findOneBy(['authUserId' => $authUser_id]);
  91.         $allRecipients[] = [
  92.             "nom" => $customer->getCustLastname(),
  93.             "prenom" => $customer->getCustFirstname(),
  94.             "email" => $customer->getAuthUserId()->getEmail(),
  95.             "type" => 'to'
  96.         ];
  97.         $htmlContent $this->renderView('layouts/layouts_emails/notification_new_password.html.twig', [
  98.             'password' => $newPassword,
  99.         ]);
  100.         $this->mailerService->sendMail($allRecipients$htmlContent);
  101.     }
  102.     #[Route(path'/inscription'name'front_customer_registration')]
  103.     public function inscription(Request                     $request,
  104.                                 AuthUserRepository          $repoAuthUser,
  105.                                 EcoCustomersRepository      $ecoCustomersRepository,
  106.                                 UserPasswordHasherInterface $passwordHasher,
  107.                                 ApiService                  $api): Response
  108.     {
  109.         // Clé Recaptcha : https://console.cloud.google.com/security/recaptcha/6Ld-J9ErAAAAAES2ZAZ2nCivPKbgJ2yrajLapATI/overview?project=otidea-213214&authuser=0
  110.         //Verification Recaptcha
  111.         $recaptcha_url 'https://www.google.com/recaptcha/api/siteverify';
  112.         // $recaptcha_secret = '6LeUsH4qAAAAALwxb5TVaVMfNayttwpWF-dMjQUY';
  113.         $recaptcha_secret '6Ld-J9ErAAAAAJ0TtuhxsMtTU7kayhwnUR1IofB_';
  114.         $recaptcha_response $_POST['g-recaptcha-response'];
  115.         // Make and decode POST request:
  116.         $recaptcha file_get_contents($recaptcha_url '?secret=' $recaptcha_secret '&response=' $recaptcha_response);
  117.         $recaptcha json_decode($recaptcha);
  118.         if ($recaptcha->score >= 0.5) {
  119.             // Récupération du formulaire d'inscription
  120.             $newCustomer $request->request->get('customer_front');
  121.             // Vérification si l'utilisateur existe déjà en BDD
  122.             if ($repoAuthUser->findOneBy(['email' => $newCustomer['AdrCourriel']])) {
  123.                 $this->addFlash('danger''Cet utilisateur existe déjà');
  124.                 return $this->redirectToRoute('front_app_login');
  125.             }
  126.             // Création du ECO_CUSTOMER et du AUTH_USER en BDD
  127.             $addCustomer = new EcoCustomers();
  128.             $addAuthUser = new AuthUser();
  129.             $addCustomer->setCustCreationDate(new \DateTime());
  130.             $addCustomer->setAuthUserId($addAuthUser);
  131.             $addCustomer->setOdysseeReference(0);
  132.             $addAuthUser->setCreationDatetime(new \DateTime());
  133.             $addAuthUser->setRoles(["ROLE_USER""ROLE_CUSTOMER"]);
  134.             $addAuthUser->setEmail($newCustomer['AdrCourriel']);
  135.             if ($newCustomer['password']['first'] != null) {
  136.                 $hashedPassword $passwordHasher->hashPassword(
  137.                     $addAuthUser,
  138.                     $newCustomer['password']['first']
  139.                 );
  140.                 $addAuthUser->setPassword($hashedPassword);
  141.             } else {
  142.                 $this->addFlash('danger''Un mot de passe conforme est requis');
  143.                 return $this->redirectToRoute('front_app_login');
  144.             }
  145.             if (!filter_var($newCustomer['AdrCourriel'], FILTER_VALIDATE_EMAIL) && strlen($newCustomer['AdrCourriel']) < 6) {
  146.                 $this->addFlash('danger''Veuillez entrer une adresse email valide.');
  147.                 return $this->redirectToRoute('front_app_login');
  148.             }
  149.             try {
  150.                 $this->entityManager->persist($addCustomer);
  151.                 $this->entityManager->persist($addAuthUser);
  152.                 $this->entityManager->flush();
  153.             } catch (Exception $ex) {
  154.                 $this->addFlash('danger'"Une erreur s'est produite lors de l'enregistrement du compte");
  155.                 return $this->redirectToRoute('front_customer_registration');
  156.             }
  157.             $result $this->editCustomer($newCustomer$addCustomer$addAuthUser$api);
  158.             if ($result == 'ok') {
  159.                 $this->addFlash('success''Votre compte a bien été créé');
  160.                 $this->authenticateUser($addAuthUser);
  161.                 if ($request->getSession()->get('_security.main.target_path')) {
  162.                     return $this->redirect($request->getSession()->get('_security.main.target_path'));
  163.                 }
  164.             } else {
  165.                 $this->addFlash('danger'$result);
  166.             }
  167.         } else {
  168.             $this->addFlash('danger''Vous êtes un robots');
  169.             return $this->redirectToRoute('front_app_login');
  170.         }
  171.         return $this->redirectToRoute('front_app_login');
  172.     }
  173.     //Fonction de connexion automatique après inscription
  174.     private function authenticateUser(AuthUser $user)
  175.     {
  176.         $providerKey 'main'// your firewall name
  177.         $token = new UsernamePasswordToken($usernull$providerKey$user->getRoles());
  178.         $this->container->get('security.token_storage')->setToken($token);
  179.     }
  180.     //Fonction d'édition des utilisateurs
  181.     private function editCustomer($newCustomer$addCustomer$addAuthUser$api): string
  182.     {
  183.         if (is_object($newCustomer)) {
  184.             $newCustomer = (array)$newCustomer;
  185.         }
  186.         // On définie les valeurs par défaut si elles ne sont pas définies
  187.         $newCustomer['IdOdysseeClient'] = $newCustomer['IdOdysseeClient'] ?? 0;
  188.         $newCustomer['IdExterneClient'] = $newCustomer['IdExterneClient'] ?? 0;
  189.         // On recherche dans ODYSSEE si un client existe déjà avec cet email
  190.         $searchCustomer $api->rechercherClient(idOdyssee$newCustomer['IdOdysseeClient'],
  191.             adrCourriel$newCustomer['AdrCourriel']);
  192.         // On transforme la date d'anniversaire
  193.         $birthday = new \DateTime($newCustomer->{'DateNaissance'} ?? $newCustomer['DateNaissance']);
  194.         // On modifie l'ID ODYSSEE si l'utilisateur existe déjà
  195.         $idOdyssee = (!isset($searchCustomer->{'status'}) && !empty($searchCustomer)) ? $searchCustomer[0]->{'IdOdysseeClient'} : $newCustomer['IdOdysseeClient'];
  196.         $addInOdyssee null;
  197.         $found false;
  198.         if (!isset($searchCustomer->{'status'}) && !empty($searchCustomer)) {
  199.             foreach ($searchCustomer as $customer) {
  200.                 if ($newCustomer['Nom'] == $customer->{'Nom'} && $newCustomer['Prenom'] == $customer->{'Prenom'}) {
  201.                     $addInOdyssee $api->editFicheOdyssee(
  202.                         $idOdyssee,
  203.                         "" $addCustomer->getId(),
  204.                         $newCustomer['Civilite'],
  205.                         $newCustomer['Nom'],
  206.                         $newCustomer['Prenom'],
  207.                         $birthday->format('Y-m-d\T00:00:00'),
  208.                         $newCustomer['Sexe'],
  209.                         $newCustomer['Adresse1'],
  210.                         $newCustomer['Adresse2'],
  211.                         $newCustomer['Adresse3'],
  212.                         $newCustomer['CodePostal'],
  213.                         $newCustomer['Ville'],
  214.                         $newCustomer['Pays'],
  215.                         $newCustomer['TelFixe'],
  216.                         $newCustomer['TelMobile'],
  217.                         $newCustomer['AdrCourriel'],
  218.                         isset($newCustomer['RefusComCom']) ? (int)$newCustomer['RefusComCom'] : 0,
  219.                         "update"
  220.                     );
  221.                     $found true;
  222.                     break;
  223.                 }
  224.             }
  225.         }
  226.         if (!$found) {
  227.             $addInOdyssee $api->editFicheOdyssee(
  228.                 $idOdyssee,
  229.                 "" $addCustomer->getId(),
  230.                 $newCustomer['Civilite'],
  231.                 $newCustomer['Nom'],
  232.                 $newCustomer['Prenom'],
  233.                 $birthday->format('Y-m-d\T00:00:00'),
  234.                 $newCustomer['Sexe'],
  235.                 $newCustomer['Adresse1'],
  236.                 $newCustomer['Adresse2'],
  237.                 $newCustomer['Adresse3'],
  238.                 $newCustomer['CodePostal'],
  239.                 $newCustomer['Ville'],
  240.                 $newCustomer['Pays'],
  241.                 $newCustomer['TelFixe'],
  242.                 $newCustomer['TelMobile'],
  243.                 $newCustomer['AdrCourriel'],
  244.                 isset($newCustomer['RefusComCom']) ? (int)$newCustomer['RefusComCom'] : 0
  245.             );
  246.         }
  247.         // On met a jour en BDD
  248.         $addCustomer->setOdysseeReference((!isset($searchCustomer->{'status'}) && !empty($searchCustomer)) ? $searchCustomer[0]->{'IdOdysseeClient'} : (int)$addInOdyssee[0]->{'IdOdysseeClient'});
  249.         $this->entityManager->persist($addCustomer);
  250.         $this->entityManager->flush();
  251.         // Si on trouve plusieurs compte associés à l'email, on les créer
  252.         if (!isset($searchCustomer->{'status'}) && !empty($searchCustomer)) {
  253.             foreach ($searchCustomer as $cust) {
  254.                 if (!$this->entityManager->getRepository(EcoCustomers::class)->findOneBy(['odyssee_reference' => $cust->{'IdOdysseeClient'}])) {
  255.                     $addOtherCustomer = new EcoCustomers();
  256.                     $addOtherCustomer->setAuthUserId($addAuthUser);
  257.                     $addOtherCustomer->setOdysseeReference($cust->{'IdOdysseeClient'});
  258.                     $addOtherCustomer->setCustCreationDate(new \DateTime());
  259.                     $this->entityManager->persist($addOtherCustomer);
  260.                     $this->entityManager->flush();
  261.                 }
  262.             }
  263.         }
  264.         return 'ok';
  265.     }
  266.     /*
  267.      * Permet la création et la modification d'un compte client
  268.      * ainsi que la création de l'utilisateur
  269.      * @param $params array
  270.      * @return null
  271.      */
  272.     private function setCustomerAccount($params = [])
  273.     {
  274.         $form = isset($params['form']) ? $params['form'] : null;
  275.         $customer = isset($params['customer']) ? $params['customer'] : null;
  276.         $repoAuthUser = isset($params['repoAuthUser']) ? $params['repoAuthUser'] : null;
  277.         $repoNews = isset($params['repoNews']) ? $params['repoNews'] : null;
  278.         $passwordHasher = isset($params['passwordHasher']) ? $params['passwordHasher'] : null;
  279.         $repoEcoCustomerAddresses = isset($params['repoAddress']) ? $params['repoAddress'] : null;
  280.         if ($repoAuthUser !== null && $repoNews !== null && $passwordHasher !== null) {
  281.             // vérification de la validité de l'adresse email
  282.             if (!$this->validateEmails($form->get('email')->getData())) {
  283.                 $this->session->set('displayPopup''email-not-good');
  284.                 return $this->redirectToRoute('front_customer_registration');
  285.             }
  286.             // vérification que le compte client n'existe pas déjà
  287.             $emailSearch $repoAuthUser->findOneBy(['email' => $form->get('email')->getData()]);
  288.             if ($emailSearch !== null && $customer->getId() == 0) {
  289.                 $this->session->set('displayPopup''email-exist');
  290.                 return $this->redirectToRoute('front_customer_registration');
  291.             }
  292.             $newCustomer $customer->getAuthUserId() == null;
  293.             $user $this->setUserAccount(!$newCustomer $customer->getAuthUserId()->getId() : null$passwordHasher,
  294.                 $form$repoAuthUser);
  295.             // @TODO connexion de l'utilisateur après sa création de compte
  296.             //                    $userAuthenticator->authenticateUser($user);
  297.             if ($customer->getId() == 0) {
  298.                 // liaison entre le compte utilisateur et le client
  299.                 $customer->setAuthUserId($user);
  300.                 $customer->setCustCreationDate(new \DateTime());
  301.                 // reference par defaut qui sera maj après l'enregistrement
  302.                 $customer->setCustReference("CLI");
  303.                 // pour la création d'un compte entreprise est confirmée par défaut
  304.                 $customer->setcustAccountStatus('confirmed');
  305.                 $customer->setCustAccountType('company');
  306.                 // FRANCE par défaut
  307.                 $customer->setCustCountryId(1);
  308.             }
  309.             // enregistrement du client
  310.             try {
  311.                 $this->entityManager->persist($customer);
  312.                 $this->entityManager->flush();
  313.             } catch (Exception $ex) {
  314.                 $this->addFlash('danger'"Une erreur s'est produite lors de l'enregistrement du compte");
  315.             }
  316.             // nouveau client,  definition du numéro client + maj
  317.             if ($newCustomer) {
  318.                 $ref $customer->getId() + 1000;
  319.                 $customer->setCustReference("CLI" $ref);
  320.                 try {
  321.                     $this->entityManager->persist($customer);
  322.                     $this->entityManager->flush();
  323.                 } catch (Exception $ex) {
  324.                     $this->addFlash('danger'"Une erreur s'est produite lors de la définition du numéro client");
  325.                 }
  326.             }
  327.             // enregistrement de l'adresse de livraison
  328.             if ($customer->getCustAccountType() == 'company') {
  329.                 $address null;
  330.                 $addresses $customer->getAddressesId();
  331.                 if (sizeof($addresses->getValues()) > 0) {
  332.                     foreach ($addresses as $add) {
  333.                         $address $add;
  334.                         break;
  335.                     }
  336.                 }
  337.                 $this->setDeliveryAddress($customer$form$address);
  338.             }
  339.             // connexion auto du client après la creation du compte
  340.             //                $this->setCustomerConnection($customer->getId());
  341.             // inscription à la newsletter
  342.             $mailResult $repoNews->findOneBy(['nlEmail' => $form->get('email')->getData()]);
  343.             if ($form->get('accept_newsletter')->getData() && $mailResult == NULL) {
  344.                 $this->subscriptionNewsletter($form->get('email')->getData());
  345.             }
  346.             // envoi du mail de confirmation de création de compte
  347.             if ($newCustomer) {
  348.                 $this->sendConfirmationNewAccount($form->get('email')->getData(), $form->getData());
  349.             }
  350.             $this->addFlash('success'"enregistré avec succès");
  351.             if ($this->session->has('returnToBasket')) {
  352.                 $this->session->remove('returnToBasket');
  353.                 return $this->redirectToRoute('front_basket_index');
  354.             }
  355.             return $this->redirectToRoute('front_customer_account');
  356.         }
  357.     }
  358.     /*
  359.      * Permet d'ajouter un nouveau compte client
  360.      * avec le role de client
  361.      * @return bool
  362.      */
  363.     private function setUserAccount($authUserId 0$passwordHasher null$form null$repoAuthUser null)
  364.     {
  365.         if ($form->get('email')->getData() !== null) {
  366.             if ($authUserId 0) {
  367.                 $user $repoAuthUser->find($authUserId);
  368.             } else {
  369.                 $user = new AuthUser();
  370.             }
  371.             $user->setEmail($form->get('email')->getData());
  372.             // modification du mot de passe
  373.             if ($form->has('password') && $form->get('password')->getData() !== null && trim($form->get('password')->getData()) != "") {
  374.                 // hash the password (based on the security.yaml config for the $user class)
  375.                 $hashedPassword $passwordHasher->hashPassword(
  376.                     $user,
  377.                     $form->get('password')->getData()
  378.                 );
  379.                 $user->setPassword($hashedPassword);
  380.             }
  381.             if ($user->getId() == 0) {
  382.                 $user->setRoles(array_merge($user->getRoles(), ['ROLE_CUSTOMER']));
  383.                 $user->setCreationDatetime(new \DateTime());
  384.             }
  385.             $this->entityManager->persist($user);
  386.             $this->entityManager->flush();
  387.             return $user;
  388.         }
  389.         return false;
  390.     }
  391.     /*
  392.      * Permet d'ajouter une adresse de livraison pour un client
  393.      * @param $customerId int identifiant du client dans eco_customer
  394.      * @param $form array les données du formulaire de compte
  395.      * @return void
  396.      */
  397.     private function setDeliveryAddress($customer null$form null$address null)
  398.     {
  399.         if ($customer !== null && $form != null) {
  400.             if ($address !== null) {
  401.                 $deliveryAddress $address;
  402.             } else {
  403.                 $deliveryAddress = new EcoCustomersAddresses();
  404.             }
  405.             $deliveryAddress->setCountryId(1); // PAR DEFAUT : FRANCE
  406.             $deliveryAddress->setCustomersId($customer);
  407.             $deliveryAddress->setAddressFirstname($form->get('cust_firstname')->getData());
  408.             $deliveryAddress->setAddressLastname($form->get('cust_lastname')->getData());
  409.             $deliveryAddress->setAddressCivility($form->get('cust_civility')->getData());
  410.             // address est null = nouveau compte
  411.             // address n'est pas null = compte existant maj des données
  412.             // nouveau compte : on verifie que le choix d'adresse identique entre facturation et livraison
  413.             if ($address !== null || ($form->has('same_billing_delivery') && !$form->get('same_billing_delivery')->getData())) {
  414.                 $deliveryAddress->setAddressPostal($form->get('address')->getData()->getAddressPostal());
  415.                 $deliveryAddress->setAddressAdditional($form->get('address')->getData()->getAddressAdditional());
  416.                 $deliveryAddress->setAddressDoor($form->get('address')->getData()->getAddressDoor());
  417.                 $deliveryAddress->setAddressBuilding($form->get('address')->getData()->getAddressBuilding());
  418.                 $deliveryAddress->setAddressFloor($form->get('address')->getData()->getAddressFloor());
  419.                 $deliveryAddress->setAddressPostalCode($form->get('address')->getData()->getAddressPostalCode());
  420.                 $deliveryAddress->setAddressCity($form->get('address')->getData()->getAddressCity());
  421.                 $deliveryAddress->setAddressSociety($form->get('address')->getData()->getAddressSociety());
  422.             } // adresse identique entre facturation et livraison
  423.             else {
  424.                 $deliveryAddress->setAddressPostal($form->get('cust_address')->getData());
  425.                 $deliveryAddress->setAddressAdditional($form->get('cust_additional_address')->getData());
  426.                 $deliveryAddress->setAddressDoor($form->get('cust_door')->getData());
  427.                 $deliveryAddress->setAddressBuilding($form->get('cust_building')->getData());
  428.                 $deliveryAddress->setAddressFloor($form->get('cust_floor')->getData());
  429.                 $deliveryAddress->setAddressPostalCode($form->get('cust_postal_code')->getData());
  430.                 $deliveryAddress->setAddressCity($form->get('cust_city')->getData());
  431.                 $deliveryAddress->setAddressSociety($form->get('cust_society')->getData());
  432.             }
  433.             try {
  434.                 $this->entityManager->persist($deliveryAddress);
  435.                 $this->entityManager->flush();
  436.             } catch (Exception $ex) {
  437.                 $this->addFlash('danger',
  438.                     "Une erreur s'est produite lors de l'enregistrement de l'adresse de livraison");
  439.             }
  440.         }
  441.     }
  442.     /*
  443.      * Permet d'envoyer le mail de confirmation
  444.      * de création de compte
  445.      * @param $email string l'email destinataire
  446.      * @param $formData array les données du form de création de compte
  447.      * @return void
  448.      */
  449.     private function sendConfirmationNewAccount($email null$formData null)
  450.     {
  451.         if (isset($email) && isset($formData)) {
  452.             $this->mailerService->subject "Demande d'adhésion sur " SITE_NAME;
  453.             $htmlContent $this->renderView('layouts/layouts_emails/notification_request_company.html.twig', [
  454.                 'formData' => $formData,
  455.                 'email' => $email,
  456.             ]);
  457.             $this->mailerService->sendMail([], $htmlContentNULL'request-company');
  458.         }
  459.     }
  460.     /*
  461.      * Permet d'inscrire un nouveau mail à la newsletter
  462.      * @param $email string l'email à inscrire
  463.      * @return void
  464.      */
  465.     private function subscriptionNewsletter($email "")
  466.     {
  467.         if ($email != "") {
  468.             $mail = new Newsletter();
  469.             $mail->setNlCreationDatetime(new \DateTime());
  470.             $mail->setNlEmail($email);
  471.             $mail->setNlRgpdChecked(true);
  472.             $this->entityManager->persist($mail);
  473.             $this->entityManager->flush();
  474.             try {
  475.                 $this->entityManager->persist($mail);
  476.                 $this->entityManager->flush();
  477.             } catch (Exception $ex) {
  478.                 $this->addFlash('danger',
  479.                     "Une erreur s'est produite lors de l'enregistrement de l'inscription à la newsletter");
  480.             }
  481.         }
  482.     }
  483.     /**
  484.      * Permet de redéfinir le mot de passe depuis le compte client
  485.      */
  486.     #[Route(path'/compte-client/modifier-mot-de-passe'name'front_customer_edit_password')]
  487.     public function setUserPassword(Request            $requestUserPasswordHasherInterface $passwordHasher,
  488.                                     AuthUserRepository $repoAuthUser)
  489.     {
  490.         $form $this->createForm(CustomerResetPasswordType::class);
  491.         $form->handleRequest($request);
  492.         if ($form->isSubmitted() && $form->isValid()) {
  493.             $user $repoAuthUser->find($this->getUser()->getId());
  494.             // vérification du mot de passe actuel rentré avec celui dans la bdd
  495.             if (!$passwordHasher->isPasswordValid($user$form->get('actualPassword')->getData())) {
  496.                 $this->addFlash('danger''Le mot de passe ne correspond pas à votre mot de passe actuel.');
  497.                 return $this->redirectToRoute('front_customer_account');
  498.             }
  499.             $hashedPassword $passwordHasher->hashPassword(
  500.                 $user,
  501.                 $form->get('password')->getData()
  502.             );
  503.             $user->setPassword($hashedPassword);
  504.             $this->entityManager->persist($user);
  505.             $this->entityManager->flush();
  506.             $this->addFlash('success''Votre mot de passe a été changé. Veuillez vous reconnecter.');
  507.             return $this->redirectToRoute('front_app_logout');
  508.         }
  509.         return $this->redirectToRoute('front_customer_account');
  510.     }
  511.     /**
  512.      * @throws Throwable
  513.      */
  514.     #[Route(path'/compte-client/mes-coordonnees/{refOdyssee}'name'front_customer_account')]
  515.     public function account(Request                     $request,
  516.                             EcoCustomersRepository      $ecoCustomersRepository,
  517.                             UserPasswordHasherInterface $passwordHasher,
  518.                             ApiService                  $api,
  519.                                                         $refOdyssee null): Response
  520.     {
  521.         if ($this->currentUserConnected) {
  522.             $this->redirectToRoute('front_home');
  523.         }
  524.         $ecoCustomer $refOdyssee $ecoCustomersRepository->findOneBy(['odyssee_reference' => $refOdyssee]) : $this->currentUserConnected;
  525.         $form $this->createForm(CustomerFrontType::class, $ecoCustomer, [
  526.             'odysseeClient' => $api->rechParIdOdyssee($refOdyssee ?: $ecoCustomer->getOdysseeReference())[0],
  527.             'type' => $refOdyssee 'refOdyssee' 'account'
  528.         ]);
  529.         $form->handleRequest($request);
  530.         if ($refOdyssee && !$ecoCustomersRepository->findOneBy(['odyssee_reference' => $refOdyssee])) {
  531.             $addCustomer = new EcoCustomers();
  532.             $addCustomer->setCustCreationDate(new \DateTime());
  533.             $addCustomer->setAuthUserId($this->currentUserConnected->getAuthUserId());
  534.             $addCustomer->setOdysseeReference(0);
  535.             $this->entityManager->persist($addCustomer);
  536.             $this->entityManager->flush();
  537.             $newCustomer $form->getConfig()->getOptions()['odysseeClient'];
  538.             $this->editCustomer($newCustomer$addCustomer$this->currentUserConnected->getAuthUserId(), $api);
  539.             return $this->redirectToRoute('front_customer_account',
  540.                 ['refOdyssee' => $form->getConfig()->getOptions()['odysseeClient']->{'IdOdysseeClient'}]);
  541.         }
  542.         if ($form->isSubmitted() && $form->isValid()) {
  543.             try {
  544.                 $customer $request->request->get('customer_front');
  545.                 if (!$refOdyssee) {
  546.                     $this->currentUserConnected->getAuthUserId()->setEmail($customer['AdrCourriel']);
  547.                     if ($customer['password']['first'] != null) {
  548.                         $hashedPassword $passwordHasher->hashPassword(
  549.                             $this->currentUserConnected->getAuthUserId(),
  550.                             $customer['password']['first']
  551.                         );
  552.                         $this->currentUserConnected->getAuthUserId()->setPassword($hashedPassword);
  553.                     }
  554.                     $this->entityManager->persist($this->currentUserConnected->getAuthUserId());
  555.                     $this->entityManager->flush();
  556.                     foreach ($this->currentUserConnected->getAuthUserId()->getCustomer() as $cust) {
  557.                         $customerPush $api->rechercherClient(idOdyssee: (int)$cust->getOdysseeReference());
  558.                         $this->editCustomer($customerPush[0], $cust,
  559.                             $this->currentUserConnected->getAuthUserId(),
  560.                             $api);
  561.                     }
  562.                 } else {
  563.                     $cust $ecoCustomersRepository->findOneBy(['odyssee_reference' => $refOdyssee]);
  564.                     $customer['IdOdysseeClient'] = $refOdyssee;
  565.                     $customer['IdExterneClient'] = $cust->getId();
  566.                     $customer['AdrCourriel'] = $this->currentUserConnected->getAuthUserId()->getEmail();
  567.                     $this->editCustomer($customer$cust,
  568.                         $this->currentUserConnected->getAuthUserId(),
  569.                         $api);
  570.                 }
  571.                 $this->addFlash('success'"enregistré avec succès");
  572.             } catch (Exception $ex) {
  573.                 $this->addFlash('danger'"Une erreur s'est produite lors de l'enregistrement ");
  574.             }
  575.             if ($request->query->get("from") !== null && $request->query->get("from") == "delivery") {
  576.                 return $this->redirectToRoute('front_basket_delivery');
  577.             } else {
  578.                 return $this->redirectToRoute('front_customer_account', ['refOdyssee' => $refOdyssee]);
  579.             }
  580.         }
  581.         $allOdysseeCustomers = [];
  582.         foreach ($this->currentUserConnected->getAuthUserId()->getCustomer() as $cust) {
  583.             $allOdysseeCustomers[] = $api->rechParIdOdyssee($cust->getOdysseeReference());
  584.         }
  585.         $allOdysseeCustomers $api->rechercherClient(adrCourriel$this->currentUserConnected->getAuthUserId()->getEmail());
  586.         $template $refOdyssee 'ref_odyssee' 'account';
  587.         $pageAccount 'coordonnees';
  588.         $selectedMenu $refOdyssee ?: 'email';
  589.         return $this->render('@main-app/front/front_customer_account/' $template '.html.twig', [
  590.             'form' => $form->createView(),
  591.             'pageAccount' => $pageAccount,
  592.             'selectedMenu' => $selectedMenu,
  593.             'customer' => $refOdyssee $ecoCustomersRepository->findOneBy(['odyssee_reference' => $refOdyssee]) : $this->currentUserConnected,
  594.             'user' => $this->currentUserConnected->getAuthUserId(),
  595.             'allOdysseeCustomers' => $allOdysseeCustomers
  596.         ]);
  597.     }
  598.     #[Route(path'/compte-client/save-delivery'name'front_customer_save_delivery_address')]
  599.     public function saveDeliveryAddress(Request $requestEcoCustomersAddressesRepository $repoCustomersAddresses)
  600.     {
  601.         if ($request->isMethod('POST')) {
  602.             $deliveryAddress $repoCustomersAddresses->find($request->get('delivery_id'));
  603.             if ($request->get('delivery_id') == 0) {
  604.                 $deliveryAddress = new EcoCustomersAddresses;
  605.                 $deliveryAddress->setCustomerId($this->currentUserConnected->getId());
  606.             }
  607.             //Enregistrement de l'adresse de livraison
  608.             $deliveryAddress->setCountryId($request->get('country_id'));
  609.             $deliveryAddress->setAddressCivility($request->get('address_civility'));
  610.             $deliveryAddress->setAddressFirstname($request->get('address_firstname'));
  611.             $deliveryAddress->setAddressLastname($request->get('address_lastname'));
  612.             $deliveryAddress->setAddressSociety($request->get('address_society'));
  613.             $deliveryAddress->setAddressPostalCode($request->get('address_postal_code'));
  614.             $deliveryAddress->setAddressCity($request->get('address_city'));
  615.             $deliveryAddress->setAddressPhone($request->get('address_phone'));
  616.             $deliveryAddress->setAddressEntitled($request->get('address_entitled'));
  617.             $this->entityManager->persist($deliveryAddress);
  618.             $this->entityManager->flush();
  619.             $this->addFlash('success'"enregistré avec succès");
  620.             if ($request->query->get("from") !== null && $request->query->get("from") == "delivery") {
  621.                 return $this->redirectToRoute('front_basket_delivery');
  622.             } else {
  623.                 return $this->redirectToRoute('front_customer_account');
  624.             }
  625.         }
  626.     }
  627.     /**
  628.      * @throws Throwable
  629.      */
  630.     #[Route(path'/compte-client/mes-commandes'name'front_customer_orders')]
  631.     public function orders(Request                     $request,
  632.                            EcoOrdersRepository         $repoOrders,
  633.                            EcoShippingOrdersRepository $repoShippingOrders,
  634.                            LoyaltySystemService        $loyaltySystem,
  635.                            ApiService                  $api): Response
  636.     {
  637.         $customers $this->currentUserConnected->getAuthUserId()->getCustomer();
  638.         $allAvailablesResaCures = [];
  639.         // On parcourt tous les clients attachés à ce compte
  640.         $orders = [];
  641.         foreach ($customers as $customer) {
  642.             // Récupération des commandes du client
  643.             $order $api->rechercherResaCure(idOdysseeClient: (int)$customer->getOdysseeReference());
  644.             if (!isset($order->status)) {
  645.                 $orders[$customer->getOdysseeReference()] = $order;
  646.             }
  647.             // On parcours les cures, on ne garde que celles dont la date de début est supérieure à la date du jour
  648.             foreach ($orders as $patient) {
  649.                 foreach ($patient as $cure) {
  650.                     $dateDebut = new \DateTime($cure->{'Date_Debut_Resa'});
  651.                     $dateFin = new \DateTime($cure->{'Date_Fin_Resa'});
  652.                     $dateJour = new \DateTime();
  653.                     if ($dateDebut $dateJour || $dateFin $dateJour) {
  654.                         $allAvailablesResaCures[] = $cure;
  655.                     }
  656.                 }
  657.             }
  658.         }
  659.         $allOdysseeCustomers $api->rechercherClient(adrCourriel$this->currentUserConnected->getAuthUserId()->getEmail());
  660.         //TODO : si le site est un SPA, récupérer les résa et ventes SPA (non disponible dans l'API à ce jour)
  661.         if (ODYSSEE_TYPE == 'SPA') {
  662.             $allAvailablesResaCures = [];
  663.         }
  664.         return $this->render('@main-app/front/front_customer_account/orders.html.twig', [
  665.             'orders' => $allAvailablesResaCures,
  666.             'indicationsPrincipales' => $api->listerItp(),
  667.             'indicationsSecondaires' => $api->listerIts(),
  668.             'pageAccount' => 'commandes',
  669.             'allOdysseeCustomers' => $allOdysseeCustomers
  670.         ]);
  671.     }
  672.     /**
  673.      * @throws Throwable
  674.      */
  675.     #[Route(path'/compte-client/ma-cure/{cure_id}'name'front_customer_order_cure')]
  676.     public function orderCure(Request                     $requestEcoOrdersRepository $repoOrders,
  677.                               EcoShippingOrdersRepository $repoShippingOrders,
  678.                               LoyaltySystemService        $loyaltySystem,
  679.                               ApiService                  $api$cure_id 0): Response
  680.     {
  681.         $customers $this->currentUserConnected->getAuthUserId()->getCustomer();
  682.         if ($cure_id == 0) {
  683.             return $this->redirectToRoute('front_customer_orders');
  684.         }
  685.         // Récupération des commandes du client
  686.         $order $api->rechercherResaCure(idOdysseeResa: (int)$cure_id);
  687.         if (!$order) {
  688.             return $this->redirectToRoute('front_customer_orders');
  689.         }
  690.         $medecinsPresc = [];
  691.         // Récupération du médecin prescripteur
  692.         if ($api->rechercherMedPrParCode($order[0]->{'Medecin_Prescripteur'})) {
  693.             $medecinsPresc $api->rechercherMedPrParCode($order[0]->{'Medecin_Prescripteur'});
  694.         }
  695.         $curiste $api->rechParIdOdyssee($order[0]->{'IdOdysseeClient'});
  696.         // Si il y a plusieurs curistes, on récupère le premier
  697.         if (is_array($curiste)) {
  698.             $curiste $curiste[0];
  699.         }
  700.         return $this->render('@main-app/front/front_customer_account/order_cure.html.twig', [
  701.             'order' => $order[0],
  702.             'curiste' => $curiste,
  703.             'indicationsPrincipales' => $api->listerItp(),
  704.             'indicationsSecondaires' => $api->listerIts(),
  705.             'medecinsTherm' => $api->listerMedTh(),
  706.             'medecinsPresc' => $medecinsPresc,
  707.             'plagesHoraires' => $api->listerPlageHoraire(),
  708.             'etablissements' => $api->listerEtabResaCure(),
  709.             'pointsDeVente' => $api->listerPvResaCure(),
  710.             'pageAccount' => 'ma-cure'
  711.         ]);
  712.     }
  713.     #[Route(path'/compte-client/ma-commande/{order_id}'name'front_customer_order_detail'defaults: ['order_id' => ''])]
  714.     public function order_detail(Request                         $requestEcoOrdersRepository $repoOrders,
  715.                                  EcoShippingOrdersRepository     $repoShippingOrders,
  716.                                  EcoProductsReferencesRepository $repoRef$order_id,
  717.                                  EcoInvoicesRepository           $repoInvoices): Response
  718.     {
  719.         //Vérification que l'utilisateur est bien connecté
  720.         if (!$this->currentUserConnected || $this->currentUserConnected == null) {
  721.             return $this->redirectToRoute('front_customer_registration');
  722.         }
  723.         $order $repoOrders->find($order_id);
  724.         //Vérification que la commande est bien la sienne
  725.         if ($order == null || $order->getCustomerId() != $this->currentUserConnected->getId()) {
  726.             return $this->redirectToRoute('front_customer_orders');
  727.         }
  728.         return $this->render('@main-app/front/front_customer_account/order_detail.html.twig', [
  729.             'order' => $order,
  730.             'shipment' => $repoShippingOrders->findByShipmentOrders($this->currentUserConnected->getId()),
  731.             'references' => $repoRef->findByProductReferencesOrder($order_id$isCanceled 0),
  732.             'referencesCanceled' => $repoRef->findByProductReferencesOrder($order_id$isCanceled 1),
  733.             'invoices' => $repoInvoices->findByInvoices($this->currentUserConnected->getId(), 'invoice',
  734.                 $order_id),
  735.             'credit_note' => $repoInvoices->findByInvoices($this->currentUserConnected->getId(), 'credit_note',
  736.                 $order_id),
  737.             'pageAccount' => 'commande'
  738.         ]);
  739.     }
  740.     #[Route(path'/compte-client/telecharger/{invoice_id}'name'front_customer_invoices_download'defaults: ['invoice_id' => 0])]
  741.     public function download(Request             $requestEcoInvoicesRepository $repoInvoices,
  742.                              EcoOrdersRepository $repoOrdersKernelInterface $appKernel$invoice_id 0)
  743.     {
  744.         if (!$this->currentUserConnected || $this->currentUserConnected == null) {
  745.             return $this->redirectToRoute('front_customer_registration');
  746.         }
  747.         //Vérification que la facture est bien la sienne
  748.         $invoice $repoInvoices->find($invoice_id);
  749.         if ($invoice !== null) {
  750.             $order $repoOrders->find($invoice->getOrderId());
  751.             if ($order->getCustomerId() != $this->currentUserConnected->getId()) {
  752.                 return $this->redirectToRoute('front_customer_invoices');
  753.             }
  754.         } else {
  755.             return $this->redirectToRoute('front_customer_invoices');
  756.         }
  757.         //Téléchargement du fichier
  758.         $fileName $invoice->getInvoiceFilename() != null $invoice->getInvoiceFilename() : 'walouuu.pdf';
  759.         $file $appKernel->getProjectDir() . '/public/medias_front/orders/' $fileName;
  760.         if (file_exists($file)) {
  761.             return new BinaryFileResponse($file);
  762.         } else {
  763.             return $this->redirectToRoute('front_customer_invoices');
  764.         }
  765.     }
  766.     #[Route(path'/compte-client/mes-messages'name'front_customer_tchat')]
  767.     public function tchat(Request         $requestEcoCustomersRepository $repoCustomers,
  768.                           TchatRepository $repoTchat): Response
  769.     {
  770.         if (!$this->currentUserConnected || $this->currentUserConnected == null) {
  771.             return $this->redirectToRoute('front_customer_registration');
  772.         }
  773.         return $this->render('@main-app/front/front_customer_account/tchat.html.twig', [
  774.             'pageAccount' => 'messages',
  775.             'discussions' => $repoTchat->findByCustomerDiscussion($this->currentUserConnected->getId()),
  776.             'unreadMessages' => $repoTchat->controlIfDiscussionUnread($this->currentUserConnected->getId()),
  777.         ]);
  778.     }
  779.     #[Route(path'/compte-client/nouveau-ticket'name'front_tchat_ticket')]
  780.     public function tchat_ticket(Request         $requestEcoCustomersRepository $repoCustomers,
  781.                                  TchatRepository $repoTchatEcoOrdersRepository $repoOrders): Response
  782.     {
  783.         if (!$this->currentUserConnected || $this->currentUserConnected == null) {
  784.             return $this->redirectToRoute('front_customer_registration');
  785.         }
  786.         return $this->render('@main-app/front/front_customer_account/tchat_ticket.html.twig', [
  787.             'pageAccount' => 'messages',
  788.             'customer_id' => $this->currentUserConnected->getId(),
  789.             'orders' => $repoOrders->findBy(['order_status' => array('valid''partial-shipment''shipment'),
  790.                 'customer_id' => $this->currentUserConnected->getId()],
  791.                 ['order_date' => 'DESC'])
  792.         ]);
  793.     }
  794.     /**
  795.      * @param Request $request
  796.      */
  797.     #[Route(path'/compte-client/axDisplayProductOrder'name'front_tchat_axDisplayProductOrder'options: ['expose' => true])]
  798.     public function axDisplayProductOrder(Request $requestEcoProductsReferencesRepository $repoProdRef)
  799.     {
  800.         if ($request->isXmlHttpRequest()) {
  801.             $renderList $this->renderView('admin/admin_tchat/tpl_display_products.html.twig', [
  802.                 'references' => $repoProdRef->findByProductReferencesByOrder($request->get('order_id')),
  803.             ]);
  804.             $script '';
  805.             $script .= " $('#products-list').html('" str_replace(array("\n""\r"), '',
  806.                     html_entity_decode(addslashes($renderList),
  807.                         ENT_QUOTES)) . "'); ";
  808.             return new JsonResponse([
  809.                 'status' => true,
  810.                 'script' => $script,
  811.             ]);
  812.         }
  813.         return new JsonResponse([
  814.             'status' => false,
  815.         ]);
  816.     }
  817.     #[Route(path'/compte-client/open-ticket'name'front_tchat_open_conversation')]
  818.     public function openTicket(Request $request)
  819.     {
  820.         if ($request->get('customer_id') > 0) {
  821.             //Ouverture d'une conversation
  822.             $tchat = new Tchat();
  823.             $tchat->setUserId(0);
  824.             $tchat->setCustomerId($request->get('customer_id'));
  825.             $tchat->setTchatObject($request->get('tchat_object'));
  826.             $tchat->setTchatDatetime(new \DateTime());
  827.             $tchat->setTchatStatus('open');
  828.             $this->entityManager->persist($tchat);
  829.             $this->entityManager->flush();
  830.             //Ajout du message
  831.             $mess = new TchatMessages;
  832.             $mess->setTchatId($tchat->getId());
  833.             $mess->setUserId(0);
  834.             $mess->setMessDatetime(new \DateTime());
  835.             $mess->setMessage($request->get('message'));
  836.             $mess->setMessRead(false);
  837.             //Ajout d'une pièce jointe
  838.             if ($request->files->get("mess_file")) {
  839.                 $fileName $this->fileService->startUpload([
  840.                     "fileData" => $request->files->get("mess_file"),
  841.                     "oldFileName" => NULL,
  842.                     "fileDestination" => $this->getParameter("upload_tchat_" CURRENT_SITE_ID),
  843.                     "autorizedExtensions" => $this->autorizedFiles,
  844.                     "createWebp" => false
  845.                 ]);
  846.                 $mess->setMessFile($fileName);
  847.             }
  848.             $this->entityManager->persist($mess);
  849.             $this->entityManager->flush();
  850.             //Liaison produits
  851.             if ($request->get('references')) {
  852.                 foreach ($request->get('references') as $op_id) {
  853.                     $prodLink = new TchatProducts();
  854.                     $prodLink->setTchatId($tchat->getId());
  855.                     $prodLink->setOrderpId($op_id);
  856.                     $this->entityManager->persist($prodLink);
  857.                 }
  858.                 $this->entityManager->flush();
  859.             }
  860.             $this->session->set('displayPopup''open-ticket');
  861.             return $this->redirectToRoute('front_tchat_discussion', ['tchat_id' => $tchat->getId()]);
  862.         }
  863.         return $this->redirectToRoute('front_tchat_ticket');
  864.     }
  865.     #[Route(path'/compte-client/discussion/{tchat_id}'name'front_tchat_discussion'defaults: ['tchat_id' => ''])]
  866.     public function discussion(Request                 $requestTchatRepository $repoTchat,
  867.                                TchatMessagesRepository $repoTchatMessEcoCustomersRepository $repoCustomer,
  868.                                AuthUserRepository      $repoUsersTchatProductsRepository $repoTchatProds,
  869.                                                        $tchat_id): Response
  870.     {
  871.         //Affichage popup
  872.         $this->displayPopup();
  873.         if ($tchat_id 0) {
  874.             $tchat $repoTchat->find($tchat_id);
  875.             //Access control
  876.             if ($this->currentUserConnected == null || $this->currentUserConnected == false || $tchat->getCustomerId() != $this->currentUserConnected->getId()) {
  877.                 return $this->redirectToRoute('front_customer_registration');
  878.             }
  879.         } else {
  880.             return $this->redirectToRoute('front_customer_registration');
  881.         }
  882.         //Marquer les messages non lus
  883.         $messages $repoTchatMess->getAdminMessages();
  884.         if (is_array($messages)) {
  885.             foreach ($messages as $mess) {
  886.                 if ($mess->getTchatId() == $tchat_id) {
  887.                     $mess->setMessRead(true);
  888.                     $this->entityManager->persist($mess);
  889.                     $this->entityManager->flush();
  890.                 }
  891.             }
  892.         }
  893.         return $this->render('@main-app/front/front_customer_account/tchat_discussion.html.twig', [
  894.             'pageAccount' => 'messages',
  895.             'discussion' => $discussion $repoTchat->find($tchat_id),
  896.             'customer' => $repoCustomer->find($discussion->getCustomerId()),
  897.             'messages' => $repoTchatMess->findBy(['tchat_id' => $tchat_id], ['mess_datetime' => 'DESC']),
  898.             'users' => $repoUsers->findAll(),
  899.             'products' => $repoTchatProds->findByTchatProducts($tchat_id),
  900.             "autorizedExtensions" => $this->autorizedFiles,
  901.         ]);
  902.     }
  903.     #[Route(path'/compte-client/repondre'name'front_tchat_response')]
  904.     public function response(Request $request): Response
  905.     {
  906.         if ($request->isMethod('POST')) {
  907.             //Ajout du message
  908.             $mess = new TchatMessages;
  909.             $mess->setTchatId($request->get('tchat_id'));
  910.             $mess->setUserId(0);
  911.             $mess->setMessDatetime(new \DateTime());
  912.             $mess->setMessage($request->get('message'));
  913.             $mess->setMessFile(NULL);
  914.             $mess->setMessRead(false);
  915.             //Ajout d'une pièce jointe
  916.             if ($request->files->get("mess_file")) {
  917.                 $fileName $this->fileService->startUpload(
  918.                     [
  919.                         "fileData" => $request->files->get("mess_file"),
  920.                         "oldFileName" => NULL,
  921.                         "fileDestination" => $this->getParameter("upload_tchat_" CURRENT_SITE_ID),
  922.                         "autorizedExtensions" => $this->autorizedFiles,
  923.                         "createWebp" => false
  924.                     ]
  925.                 );
  926.                 $mess->setMessFile($fileName);
  927.             }
  928.             $this->entityManager->persist($mess);
  929.             $this->entityManager->flush();
  930.             $this->session->set('displayPopup''send-message');
  931.             //Envoyer un mail de notification à l'administrateur
  932.             $this->newAdminMessageNotification($request->get('tchat_id'), $request->get('message'));
  933.             return $this->redirectToRoute('front_tchat_discussion', ['tchat_id' => $request->get('tchat_id')]);
  934.         }
  935.         return $this->redirectToRoute('front_tchat');
  936.     }
  937.     /**
  938.      * Notification à l'administrateur d'un nouveau message
  939.      * @param int $tchat_id
  940.      */
  941.     private function newAdminMessageNotification($tchat_id$message)
  942.     {
  943.         $tchat $this->entityManager->getRepository(Tchat::class)->find($tchat_id);
  944.         $customer $this->entityManager->getRepository(EcoCustomers::class)->find($tchat->getCustomerId());
  945.         $this->mailerService->fromEmail $customer->getAuthUserId()->getEmail();
  946.         $this->mailerService->fromName $customer->getCustLastName() . ' ' $customer->getCustFirstName();
  947.         $this->mailerService->subject SITE_NAME " - Nouveau message dans votre outil de messagerie";
  948.         $allRecipients = array();
  949.         //        $allRecipients[] = [
  950.         //            "nom" => SITE_NAME,
  951.         //            "prenom" => '',
  952.         //            "email" => 'stephen@otidea.com',
  953.         //            "type" => 'to'
  954.         //        ];
  955.         $htmlContent $this->renderView('layouts/layouts_emails/notification_tchat_admin.html.twig', [
  956.             'tchat' => $tchat,
  957.             'customer' => $customer,
  958.             'message' => $message,
  959.         ]);
  960.         $this->mailerService->sendMail($allRecipients$htmlContentNULL'admin-notification');
  961.     }
  962.     #[Route(path'/compte-client/download_attachment/{tchat_id}/{mess_id}'name'front_tchat_download_attachment'defaults: ['tchat_id' => '',
  963.         'mess_id' => ''])]
  964.     public function download_attachment(Request                 $requestTchatRepository $repoTchat,
  965.                                         TchatMessagesRepository $repoMessKernelInterface $appKernel$tchat_id,
  966.                                                                 $mess_id): Response
  967.     {
  968.         //Access control
  969.         $tchat $repoTchat->find($tchat_id);
  970.         if ($tchat->getCustomerId() != $this->currentUserConnected->getId()) {
  971.             return $this->redirectToRoute('front_customer_registration');
  972.         }
  973.         $message $repoMess->find($mess_id);
  974.         //Téléchargement du fichier
  975.         $fileName $message->getMessFile() != null $message->getMessFile() : 'nada.pdf';
  976.         $file $appKernel->getProjectDir() . '/public/medias_front/tchat/' $fileName;
  977.         if (file_exists($file)) {
  978.             return new BinaryFileResponse($file);
  979.         } else {
  980.             return $this->redirectToRoute('front_tchat_discussion', ['tchat_id' => $tchat_id]);
  981.         }
  982.     }
  983.     private function displayPopup()
  984.     {
  985.         if ($this->session->has('displayPopup')) {
  986.             //Erreur de connexion
  987.             if ($this->session->get('displayPopup') == 'connection-error') {
  988.                 $this->otideaUtils->createPopup(["title" => 'Attention',
  989.                         "message" => 'Votre identifiant ou votre mot de passe est incorrect',
  990.                         "btn2" => null]
  991.                 );
  992.             }
  993.             //L'adresse mail existe déjà
  994.             if ($this->session->get('displayPopup') == 'email-exist') {
  995.                 $this->otideaUtils->createPopup(["title" => 'Attention',
  996.                         "message" => "L'adresse e-mail que vous voulez utiliser existe déjà. Veuillez utiliser 'Mot de passe oublié' pour récupérer votre mot de passe si vous l'avez perdu",
  997.                         "btn2" => null]
  998.                 );
  999.             }
  1000.             //L'adresse mail n'est pas au bon format
  1001.             if ($this->session->get('displayPopup') == 'email-not-good') {
  1002.                 $this->otideaUtils->createPopup(["title" => 'Attention',
  1003.                         "message" => "L'adresse e-mail que vous voulez utiliser ne semble pas conforme, merci de vérifier votre saisie ou d'utiliser une autre adresse.",
  1004.                         "btn2" => null]
  1005.                 );
  1006.             }
  1007.             //Envoi d'un message
  1008.             if ($this->session->get('displayPopup') == 'send-message') {
  1009.                 $this->otideaUtils->createPopup(["title" => 'Information',
  1010.                         "message" => 'Message envoyé avec succès',
  1011.                         "btn2" => null]
  1012.                 );
  1013.             }
  1014.             //Ouverture d'un nouveau ticket
  1015.             if ($this->session->get('displayPopup') == 'open-ticket') {
  1016.                 $this->otideaUtils->createPopup(["title" => 'Information',
  1017.                         "message" => 'Ticket ouvert avec succès',
  1018.                         "btn2" => null]
  1019.                 );
  1020.             }
  1021.             $this->session->set('displayPopup'NULL);
  1022.         }
  1023.     }
  1024.     /**
  1025.      * Validates a single email address (or an array of email addresses)
  1026.      *
  1027.      * @param array|string $emails
  1028.      *
  1029.      * @return bool
  1030.      */
  1031.     public function validateEmails($emails): bool
  1032.     {
  1033.         $emails filter_var($emailsFILTER_SANITIZE_EMAIL);
  1034.         if (filter_var($emailsFILTER_VALIDATE_EMAIL)) {
  1035.             return true;
  1036.         } else {
  1037.             return false;
  1038.         }
  1039.     }
  1040.     #[Route(path'/compte-client/planning'name'front_customer_planning')]
  1041.     public function planning(Request $requestEcoPlanningRepository $planningRepository): Response
  1042.     {
  1043.         if ($this->currentUserConnected->getCustAccountType() == 'company') {
  1044.             $plannings $planningRepository->findBy(['societyId' => $this->currentUserConnected->getId()],
  1045.                 ['deliveryStartDate' => 'ASC']);
  1046.         } else if ($this->currentUserConnected->getCustAccountType() == 'employee') {
  1047.             $plannings $planningRepository->findBy(['societyId' => $this->currentUserConnected->getCompany()->getId()],
  1048.                 ['deliveryStartDate' => 'ASC']);
  1049.         }
  1050.         return $this->render('@main-app/front/front_customer_account/planning.html.twig', [
  1051.             'pageAccount' => 'planning',
  1052.             'plannings' => $plannings,
  1053.         ]);
  1054.     }
  1055.     #[Route(path'/compte-client/salaries'name'front_customer_employee')]
  1056.     public function employee(Request $requestEcoCustomersRepository $customersRepository): Response
  1057.     {
  1058.         $employees $customersRepository->findBy(['cust_society' => $this->currentUserConnected->getCustSociety()]);
  1059.         return $this->render('@main-app/front/front_customer_account/employee.html.twig', [
  1060.             'pageAccount' => 'employee',
  1061.             'employees' => $employees,
  1062.             'currentUser' => $this->currentUserConnected
  1063.         ]);
  1064.     }
  1065.     #[Route(path'/inscription-salarie/{companyId}/{campanyCode}'name'front_customer_registration_employee'defaults: ['companyId' => '',
  1066.         'campanyCode' => ''])]
  1067.     public function inscriptionEmployee($companyId$campanyCodeRequest $request,
  1068.                                         UserPasswordHasherInterface $passwordHasher,
  1069.                                         EcoShippingfeesCountryRepository $repoCountry,
  1070.                                         EcoCustomersRepository $customersRepository): Response
  1071.     {
  1072.         if ($this->getUser()) {
  1073.             return $this->redirectToRoute('front_customer_account');
  1074.         }
  1075.         $company $customersRepository->findOneBy(['id' => $companyId'custSocietyCode' => $campanyCode]);
  1076.         if ($company == null) {
  1077.             return $this->redirectToRoute('front_home');
  1078.         }
  1079.         $authUser = new AuthUser();
  1080.         $customer = new EcoCustomers();
  1081.         $form $this->createForm(CustomerFrontType::class, $customer, [
  1082.             'authUser' => $customer->getAuthUserId(),
  1083.             'countryList' => $repoCountry->findBygCountriesOrderByFrance(),
  1084.             'userType' => 'employee',
  1085.             'newsletter' => true,
  1086.             'formType' => "newAccount",
  1087.         ]);
  1088.         $form->handleRequest($request);
  1089.         if ($form->isSubmitted() && $form->isValid()) {
  1090.             $existUser $this->entityManager->getRepository(AuthUser::class)->findBy(['email' => $form->get('email')->getData()]);
  1091.             if ($existUser != null) {
  1092.                 $this->addFlash('danger'"Une erreur s'est produite lors de l'enregistrement");
  1093.                 return $this->redirectToRoute('front_customer_registration_employee',
  1094.                     ['companyId' => $companyId'campanyCode' => $campanyCode]);
  1095.             }
  1096.             $customer->setCustCreationDate(new \DateTime());
  1097.             $customer->setCustReference(uniqid());
  1098.             //Enregistrement du mot de passe
  1099.             if ($form->has('password') && $form->get('password')->getData() != "" && $form->get('password')->getData() != null) {
  1100.                 $user $this->setEmployeeAccount($authUser->getId(), $passwordHasher$form);
  1101.                 $customer->setAuthUserId($user);
  1102.                 // Le mot de passe n'a pas été modifié
  1103.             }
  1104.             // Compte salarié
  1105.             $customer->setCustAccountType('employee');
  1106.             // Compte confirmé
  1107.             $customer->setcustAccountStatus('confirmed');
  1108.             // FRANCE par défaut
  1109.             $customer->setCustCountryId(1);
  1110.             // reference client par défaut
  1111.             $customer->setCustReference("CLI");
  1112.             // liaison avec l'entreprise
  1113.             $customer->setCompany($company);
  1114.             $customer->setCustSociety($company->getCustSociety());
  1115.             try {
  1116.                 $this->entityManager->persist($customer);
  1117.                 $this->entityManager->flush();
  1118.                 $this->addFlash('success'"enregistré avec succès");
  1119.             } catch (Exception $ex) {
  1120.                 $this->addFlash('danger'"Cet utilisateur existe déjà");
  1121.             }
  1122.             try {
  1123.                 $ref $customer->getId() + 1000;
  1124.                 $customer->setCustReference("CLI" $ref);
  1125.                 $this->entityManager->persist($customer);
  1126.                 $this->entityManager->flush();
  1127.             } catch (Exception $ex) {
  1128.                 $this->addFlash('danger'"Une erreur s'est produite lors de la modification de la référence client");
  1129.             }
  1130.             return $this->redirectToRoute('front_customer_account', array('id' => $customer->getId()));
  1131.         }
  1132.         return $this->render('@main-app/security_front/registration_employee.html.twig', [
  1133.             'form' => $form->createView(),
  1134.             'company' => $company,
  1135.         ]);
  1136.     }
  1137.     /*
  1138.      * Permet d'ajouter un nouveau compte client
  1139.      * avec le role de client
  1140.      * @return bool
  1141.      */
  1142.     private function setEmployeeAccount($authUserId 0$passwordHasher null$form null$repoAuthUser null)
  1143.     {
  1144.         if ($form->get('email')->getData() !== null && $form->get('password')->getData() !== null) {
  1145.             if ($authUserId 0) {
  1146.                 $user $repoAuthUser->find($authUserId);
  1147.             } else {
  1148.                 $user = new AuthUser();
  1149.             }
  1150.             $user->setEmail($form->get('email')->getData());
  1151.             // modification du mot de passe
  1152.             if ($form->get('password')->getData() !== null && trim($form->get('password')->getData()) != "") {
  1153.                 // hash the password (based on the security.yaml config for the $user class)
  1154.                 $hashedPassword $passwordHasher->hashPassword(
  1155.                     $user,
  1156.                     $form->get('password')->getData()
  1157.                 );
  1158.                 $user->setPassword($hashedPassword);
  1159.             }
  1160.             if ($user->getId() == 0) {
  1161.                 $user->setRoles(array_merge($user->getRoles(), ['ROLE_CUSTOMER']));
  1162.                 $user->setCreationDatetime(new \DateTime());
  1163.             }
  1164.             $this->entityManager->persist($user);
  1165.             $this->entityManager->flush();
  1166.             return $user;
  1167.         }
  1168.         return false;
  1169.     }
  1170. }