src/Controller/RegistrationController.php line 37

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\AdditionalCompanyInformation;
  4. use App\Entity\DeliveryAddress;
  5. use App\Entity\Joker;
  6. use App\Entity\User;
  7. use App\Form\RegisterEmail;
  8. use App\Form\RegisterInformations;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\RedirectResponse;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\Mailer\MailerInterface;
  16. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Symfony\Contracts\HttpClient\HttpClientInterface;
  19. use Symfony\Contracts\Translation\TranslatorInterface;
  20. use Symfony\Component\Mime\Email;
  21. class RegistrationController extends AbstractController
  22. {
  23.     private $client;
  24.     private EntityManagerInterface $manager;
  25.     public function __construct(HttpClientInterface $clientEntityManagerInterface $manager)
  26.     {
  27.         $this->client $client;
  28.         $this->manager $manager;
  29.     }
  30.     #[Route('/register'name'app_register')]
  31.     public function email(Request $requestUserPasswordHasherInterface $userPasswordHasherEntityManagerInterface $entityManager): Response
  32.     {
  33.         $form $this->createForm(RegisterEmail::class);
  34.         $form->handleRequest($request);
  35.         if ($form->isSubmitted() && $form->isValid()) {
  36.             $email $form->get('email')->getData();
  37.             
  38.             // Vérifier si l'email existe déjà
  39.             $existingUser $entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
  40.             if ($existingUser) {
  41.                 $this->addFlash('danger''Cette adresse e-mail est déjà utilisée. Veuillez utiliser une autre adresse ou vous connecter.');
  42.                 return $this->render('register/email.html.twig', [
  43.                     'form' => $form->createView(),
  44.                 ]);
  45.             }
  46.             
  47.             $request->getSession()->set('register_email'$email);
  48.             return $this->redirectToRoute('register_information_form');
  49.         }
  50.         return $this->render('register/email.html.twig', [
  51.             'form' => $form->createView(),
  52.         ]);
  53.     }
  54.     #[Route('/register/informations'name'register_information_form')]
  55.     public function informations(Request $requestMailerInterface $mailerUserPasswordHasherInterface $userPasswordHasherEntityManagerInterface $entityManager)
  56.     {
  57.         $email $request->getSession()->get('register_email');
  58.         if (!$email) {
  59.             return $this->redirectToRoute('app_register');
  60.         }
  61.         $form $this->createForm(RegisterInformations::class, ['ceo_email' => $email'accountant_email' => $email'therapist_email' => $email]);
  62.         $form->handleRequest($request);
  63.         $emails $this->getParameter('app.register.emails');
  64.         if (!is_array($emails)) {
  65.             $emails explode(','$emails);
  66.         }
  67.         if ($form->isSubmitted()) {
  68.             if ($form->isValid()) {
  69.                 $formData $form->getData();
  70.                 
  71.                 // Créer l'utilisateur
  72.                 $user = new User();
  73.                 $temporaryPassword User::generatePassword();
  74.                 $user->setEmail($email);
  75.                 $user->setGeneratePasswordRecovery($temporaryPassword);
  76.                 $user->setPassword(
  77.                     $userPasswordHasher->hashPassword(
  78.                         $user,
  79.                         $temporaryPassword
  80.                     )
  81.                 );
  82.                 
  83.                 $entityManager->persist($user);
  84.                 $entityManager->flush();
  85.                 // Créer le joker (remises)
  86.                 $joker = new Joker();
  87.                 $joker->setUser($user);
  88.                 $joker->setDateStart(new \DateTime());
  89.                 $year date('Y');
  90.                 $date = new \DateTime();
  91.                 $date->setDate($year1231);
  92.                 $joker->setDateEnd($date);
  93.                 $joker->setNumberJoker(4);
  94.                 $entityManager->persist($joker);
  95.                 // Créer les informations d'entreprise
  96.                 $information = new AdditionalCompanyInformation();
  97.                 $information->setUser($user);
  98.                 $information->setCompanyName($formData['company_name']);
  99.                 $information->setCompanyAddress($formData['company_address']);
  100.                 $information->setCompanyPostal($formData['company_postal_code']);
  101.                 $information->setTownAddressCompany($formData['company_city']);
  102.                 $information->setCompanyCountry($formData['company_country']);
  103.                 $information->setTva($formData['company_vat_number']);
  104.                 // Note: Ces champs ne semblent pas avoir de setters correspondants dans l'entité
  105.                 // $information->setCompanyPhone($formData['company_phone']);
  106.                 $information->setIbanrib($formData['company_iban']);
  107.                 $information->setLegalForm($formData['company_legal_form']);
  108.                 $information->setRcs($formData['company_number']);
  109.                 
  110.                 if (isset($formData['company_siren'])) {
  111.                     $information->setSirenNumber($formData['company_siren']);
  112.                 }
  113.                 if (isset($formData['company_siret'])) {
  114.                     $information->setSiretNumber($formData['company_siret']);
  115.                 }
  116.                 if (isset($formData['website'])) {
  117.                     $information->setCompanyWebsite($formData['website']);
  118.                 }
  119.                 if (isset($formData['shop_surface_area'])) {
  120.                     $information->setStoreSize($formData['shop_surface_area']);
  121.                 }
  122.                 if (isset($formData['shop_food_supplement_surface_area'])) {
  123.                     $information->setSalesAreaForFoodSupplements($formData['shop_food_supplement_surface_area']);
  124.                 }
  125.                 // Informations CEO
  126.                 $information->setCeoGender($formData['ceo_gender']);
  127.                 $information->setCeoFirstName($formData['ceo_firstname']);
  128.                 $information->setCeoLastName($formData['ceo_lastname']);
  129.                 $information->setCeoEmail($formData['ceo_email']);
  130.                 if (isset($formData['ceo_phone'])) {
  131.                     $information->setCeoPhone($formData['ceo_phone']);
  132.                 }
  133.                 if (isset($formData['ceo_mobile'])) {
  134.                     $information->setCeoMobilePhone($formData['ceo_mobile']);
  135.                 }
  136.                 $information->setCeoSupplementsPurchaseDecisionMaker($formData['ceo_purchase_decision_maker'] ?? false);
  137.                 // Informations Comptable
  138.                 $information->setAccountantGender($formData['accountant_gender']);
  139.                 if (isset($formData['accountant_firstname'])) {
  140.                     $information->setAccountantFirstName($formData['accountant_firstname']);
  141.                 }
  142.                 if (isset($formData['accountant_lastname'])) {
  143.                     $information->setAccountantLastName($formData['accountant_lastname']);
  144.                 }
  145.                 if (isset($formData['accountant_email'])) {
  146.                     $information->setAccountantEmail($formData['accountant_email']);
  147.                 }
  148.                 if (isset($formData['accountant_phone'])) {
  149.                     $information->setAccountantPhone($formData['accountant_phone']);
  150.                 }
  151.                 if (isset($formData['accountant_mobile'])) {
  152.                     $information->setAccountantMobilePhone($formData['accountant_mobile']);
  153.                 }
  154.                 $information->setAccountantSupplementsPurchaseDecisionMaker($formData['accountant_purchase_decision_maker'] ?? false);
  155.                 // Informations Thérapeute
  156.                 $information->setTherapistGender($formData['therapist_gender']);
  157.                 if (isset($formData['therapist_firstname'])) {
  158.                     $information->setTherapistFirstName($formData['therapist_firstname']);
  159.                 }
  160.                 if (isset($formData['therapist_lastname'])) {
  161.                     $information->setTherapistLastName($formData['therapist_lastname']);
  162.                 }
  163.                 if (isset($formData['therapist_email'])) {
  164.                     $information->setTherapistEmail($formData['therapist_email']);
  165.                 }
  166.                 if (isset($formData['therapist_phone'])) {
  167.                     $information->setTherapistPhone($formData['therapist_phone']);
  168.                 }
  169.                 if (isset($formData['therapist_mobile'])) {
  170.                     $information->setTherapistMobilePhone($formData['therapist_mobile']);
  171.                 }
  172.                 $information->setTherapistSupplementsPurchaseDecisionMaker($formData['therapist_purchase_decision_maker'] ?? false);
  173.                 $entityManager->persist($information);
  174.                 // Créer l'adresse de livraison par défaut
  175.                 $address = new DeliveryAddress();
  176.                 $address->setUser($user);
  177.                 $address->setCompanyName($formData['company_name']);
  178.                 $address->setName($formData['ceo_lastname']);
  179.                 $address->setFirstName($formData['ceo_firstname']);
  180.                 $address->setAddress($formData['company_address']);
  181.                 $address->setTown($formData['company_city']);
  182.                 $address->setPostal($formData['company_postal_code']);
  183.                 $address->setCountry($formData['company_country']);
  184.                 $entityManager->persist($address);
  185.                 // Sauvegarder tout
  186.                 $entityManager->flush();
  187.                 // Ajouter le mot de passe temporaire au contexte de l'email
  188.                 $emailContext $formData;
  189.                 $emailContext['temporary_password'] = $temporaryPassword;
  190.                 $emailContext['user_email'] = $email;
  191.                 // https://symfony.com/doc/6.4/mailer.html#html-content
  192.                 $emailNotification = (new TemplatedEmail())
  193.                     ->from('info@b2bnaturamedicatrix.com')
  194.                     ->to(...$emails)
  195.                     ->subject('B2B Naturamedicatrix - Inscription client')
  196.                     ->htmlTemplate('emails/client_register_informations.html.twig')
  197.                     ->context($emailContext);
  198.                 $mailer->send($emailNotification);
  199.                 // Supprimer l'email de la session
  200.                 $request->getSession()->remove('register_email');
  201.                 $this->addFlash('success''Votre inscription a bien été effectuée, vous recevrez sous peu un e-mail de confirmation avec vos informations de connexion.');
  202.                 return $this->redirectToRoute('app_register');
  203.             } else {
  204.                 $this->addFlash('danger''Des erreurs sont présentes dans les données renseignées, merci de les corriger avant de poursuivre.');
  205.             }
  206.         }
  207.         return $this->render('register/informations.html.twig', [
  208.             'form' => $form->createView(),
  209.         ]);
  210.     }
  211.     private function getToken(): Response
  212.     {
  213.         $url 'https://ns3190747.ip-51-89-219.eu/Login';
  214.         $response $this->client->request('POST'$url, [
  215.             'json' => [
  216.                 'userName' => 'Natura',
  217.                 'password' => 'Natura@ApiB2B!2023'
  218.             ],
  219.         ]);
  220.         $content $response->getContent();  // Obtenez le contenu de la réponse
  221.         $statusCode $response->getStatusCode();  // Obtenez le code de statut de la réponse
  222.         $tokenData json_decode($contenttrue);  // Convertissez le contenu JSON en tableau PHP
  223.         // Vous devriez maintenant avoir le token JWT dans $tokenData (ou un nom approprié selon la structure de la réponse)
  224.         // Pour cet exemple, je vais simplement renvoyer le contenu en tant que réponse.
  225.         return new Response($content);
  226.     }
  227.     #[Route('/admin/mercator/customer/creation'name'mercator_customer_creation')]
  228.     public function createCustomerWithMercator(Request $requestEntityManagerInterface $managerUserPasswordHasherInterface $userPasswordHasher): RedirectResponse
  229.     {
  230.         $cat $request->get('cat');
  231.         $jwtToken $this->getToken()->getContent();  // Remplacez par votre JWT
  232.         $response $this->client->request('GET'"https://ns3190747.ip-51-89-219.eu/customer?categorie=$cat", [
  233.             'headers' => [
  234.                 'Authorization' => 'Bearer ' $jwtToken,
  235.             ],
  236.         ]);
  237.         $content $response->getContent();  // Obtenez le contenu de la réponse
  238.         $statusCode $response->getStatusCode();  // Obtenez le code de statut de la réponse
  239.         $fetchedCustomers json_decode($contenttrue);  // `true` pour obtenir un tableau associatif
  240.         foreach ($fetchedCustomers as $customerData) {
  241.             // PRIORITÉ 1 : Matching par email
  242.             $checkCustomer null;
  243.             if (!empty($customerData['email'])) {
  244.                 $checkCustomer $manager->getRepository(User::class)
  245.                     ->findOneBy(['email' => $customerData['email']]);
  246.             }
  247.             
  248.             // PRIORITÉ 2 : Fallback sur la TVA si email ne matche pas
  249.             if (!$checkCustomer && !empty($customerData['numTVA'])) {
  250.                 $additionalInfo $manager->getRepository(AdditionalCompanyInformation::class)
  251.                     ->findOneBy(['tva' => $customerData['numTVA']]);
  252.                 if ($additionalInfo) {
  253.                     $checkCustomer $additionalInfo->getUser();
  254.                 }
  255.             }
  256.             if (!$checkCustomer && $customerData['email'] != null) {
  257.                 $user = new User();
  258.                 $pass User::generatePassword();
  259.                 $user->setEmail($customerData['email']);
  260.                 $user->setGeneratePasswordRecovery($pass);
  261.                 $user->setPassword(
  262.                     $userPasswordHasher->hashPassword(
  263.                         $user,
  264.                         $pass
  265.                     )
  266.                 );
  267.                 $manager->persist($user);
  268.                 $manager->flush();
  269.                 $joker = new Joker();
  270.                 $joker->setUser($user);
  271.                 $joker->setDateStart(new \DateTime());
  272.                 $year date('Y'); // Récupérer l'année actuelle
  273.                 $date = new \DateTime();
  274.                 $date->setDate($year1231); // Définir la date au 31 décembre de l'année actuelle
  275.                 $joker->setDateEnd($date);
  276.                 $joker->setNumberJoker(4);
  277.                 $manager->persist($joker);
  278.                 $information = new AdditionalCompanyInformation();
  279.                 $information->setUser($user);
  280.                 $information->setTva($customerData['numTVA']);
  281.                 $country '';
  282.                 switch ($customerData['pays']) {
  283.                     case 'BE':
  284.                         $country 'Belgique';
  285.                         break;
  286.                     case 'FR':
  287.                         $country 'France';
  288.                         break;
  289.                     case 'LU':
  290.                         $country 'Luxembourg';
  291.                         break;
  292.                 }
  293.                 $information->setCompanyCountry($country);
  294.                 $information->setMercatorBE($customerData['mercatorBE']);
  295.                 $information->setMercatorLU($customerData['mercatorLU']);
  296.                 $information->setCompanyName($customerData['nomSociete']);
  297.                 $information->setIdClientMercator($customerData['id']);
  298.                 $information->setCompanyAddress($customerData['adresse']);
  299.                 $information->setTownAddressCompany($customerData['ville']);
  300.                 $information->setCompanyPostal($customerData['codePostal']);
  301.                 $information->setCustomerCategoryMercator($customerData['categorie']);
  302.                 $information->setCompanyTypePro('Magasin Bio');
  303.                 $address = new DeliveryAddress();
  304.                 $address->setUser($user);
  305.                 $address->setCompanyName($customerData['nomSociete']);
  306.                 $address->setName("");
  307.                 $address->setAddress($customerData['adresse']);
  308.                 $address->setTown($customerData['ville']);
  309.                 $address->setPostal($customerData['codePostal']);
  310.                 $address->setFirstName("");
  311.                 $address->setCountry('France');
  312.                 $manager->persist($address);
  313.                 $manager->flush();
  314.                 $manager->persist($information);
  315.                 $manager->flush();
  316.             } else {
  317.                 $information $manager->getRepository(AdditionalCompanyInformation::class)->findOneBy(array('user' => $checkCustomer));
  318.                 if ($information != null) {
  319.                     $information->setTva($customerData['numTVA']);
  320.                     $country '';
  321.                     switch ($customerData['pays']) {
  322.                         case 'BE':
  323.                             $country 'Belgique';
  324.                             break;
  325.                         case 'FR':
  326.                             $country 'France';
  327.                             break;
  328.                         case 'LU':
  329.                             $country 'Luxembourg';
  330.                             break;
  331.                     }
  332.                     $information->setCompanyCountry($country);
  333.                     $information->setMercatorBE($customerData['mercatorBE']);
  334.                     $information->setMercatorLU($customerData['mercatorLU']);
  335.                     $information->setCompanyName($customerData['nomSociete']);
  336.                     $information->setIdClientMercator($customerData['id']);
  337.                     $information->setCompanyAddress($customerData['adresse']);
  338.                     $information->setTownAddressCompany($customerData['ville']);
  339.                     $information->setCompanyPostal($customerData['codePostal']);
  340.                     $information->setCustomerCategoryMercator($customerData['categorie']);
  341.                     $information->setCompanyTypePro('Magasin Bio');
  342.                     $checkDelivery $manager->getRepository(DeliveryAddress::class)->findOneBy(array('user' => $checkCustomer'companyName' => $customerData['nomSociete']));
  343.                     if (!$checkDelivery) {
  344.                         $address = new DeliveryAddress();
  345.                         $address->setUser($checkCustomer);
  346.                         $address->setName("");
  347.                         $address->setFirstName("");
  348.                         $address->setCompanyName($customerData['nomSociete']);
  349.                         $address->setAddress($customerData['adresse']);
  350.                         $address->setTown($customerData['ville']);
  351.                         $address->setPostal($customerData['codePostal']);
  352.                         $address->setCountry($country);
  353.                         $manager->persist($address);
  354.                         $manager->flush();
  355.                     } else {
  356.                         $address $checkDelivery;
  357.                         $address->setName("");
  358.                         $address->setFirstName("");
  359.                         $address->setAddress($customerData['adresse']);
  360.                         $address->setCompanyName($customerData['nomSociete']);
  361.                         $address->setTown($customerData['ville']);
  362.                         $address->setPostal($customerData['codePostal']);
  363.                         $address->setCountry($country);
  364.                     }
  365.                     $manager->flush();
  366.                 }
  367.             }
  368.         }
  369.         $this->addFlash('success'"La création/mise à jour des clients de la catégorie $cat est un succès!");
  370.         return $this->redirectToRoute('accueil');
  371.     }
  372. }