src/Controller/AccountController.php line 318

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Utils\Utils;
  5. use App\Entity\Mobile;
  6. use Psr\Log\LoggerInterface;
  7. use App\Entity\PasswordUpdate;
  8. use App\Entity\UserInfoPlus;
  9. use App\Form\PasswordUpdateType;
  10. use Symfony\Component\Mime\Email;
  11. use App\Repository\UserRepository;
  12. use Symfony\Component\Form\FormError;
  13. use App\Repository\InvitationRepository;
  14. use App\Repository\UserInfoPlusRepository;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use Symfony\Bridge\Doctrine\Types\UuidType;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\Mailer\MailerInterface;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Symfony\Component\HttpFoundation\JsonResponse;
  22. use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
  23. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  24. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  25. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  26. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  27. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  28. class AccountController extends AbstractController
  29. {
  30.     const TYPE_ACTEURS = [
  31.         => ["name" => 'un Producteur/Acheteur'"role" => "ROLE_PRODUCTEUR"],
  32.         => ["name" => 'un Agrégateur'"role" => "ROLE_AGREGATEUR"],
  33.         => ["name" => 'une Banque'"role" => "ROLE_BANQUE"],
  34.         => ["name" => 'un Assureur'"role" => "ROLE_ASSUREUR"],
  35.         => ["name" => 'un Exportateur'"role" => "ROLE_EXPORTATEUR"],
  36.         => ["name" => 'un DPV'"role" => "ROLE_DPV"],
  37.     ];
  38.     const STATUT_JURIDIQUE = [
  39.         => 'GIE',
  40.         => 'Association',
  41.         => 'Coopérative',
  42.         => 'SARL',
  43.         => 'SA',
  44.         => 'Particulier',
  45.         // 6 => 'Autres',
  46.     ];
  47.     const ACTIVITES = [
  48.         '01' => 'Oignon',
  49.         '02' => 'Tomate',
  50.         '03' => 'Gombo',
  51.         '11' => 'Mil',
  52.         '12' => 'Mais',
  53.         '13' => 'Sasame',
  54.         '14' => 'Riz',
  55.         '20' => 'Mangue',
  56.         '21' => 'Anacarde',
  57.         '22' => 'Citron',
  58.         '23' => 'Orange',
  59.         '24' => 'Pamplemousse'
  60.     ];
  61.     const COUNTRIES = [
  62.         'AF' => ["name" => 'Afghanistan'],
  63.         'AX' => ["name" => 'Åland Islands'],
  64.         'AL' => ["name" => 'Albania'],
  65.         'DZ' => ["name" => 'Algeria'],
  66.         'AS' => ["name" => 'American Samoa'],
  67.         'AD' => ["name" => 'AndorrA'],
  68.         'AO' => ["name" => 'Angola'],
  69.         'AI' => ["name" => 'Anguilla'],
  70.         'AQ' => ["name" => 'Antarctica'],
  71.         'AG' => ["name" => 'Antigua and Barbuda'],
  72.         'AR' => ["name" => 'Argentina'],
  73.         'AM' => ["name" => 'Armenia'],
  74.         'AW' => ["name" => 'Aruba'],
  75.         'AU' => ["name" => 'Australia'],
  76.         'AT' => ["name" => 'Austria'],
  77.         'AZ' => ["name" => 'Azerbaijan'],
  78.         'BS' => ["name" => 'Bahamas'],
  79.         'BH' => ["name" => 'Bahrain'],
  80.         'BD' => ["name" => 'Bangladesh'],
  81.         'BB' => ["name" => 'Barbados'],
  82.         'BY' => ["name" => 'Belarus'],
  83.         'BE' => ["name" => 'Belgium'],
  84.         'BZ' => ["name" => 'Belize'],
  85.         'BJ' => ["name" => 'Benin'],
  86.         'BM' => ["name" => 'Bermuda'],
  87.         'BT' => ["name" => 'Bhutan'],
  88.         'BO' => ["name" => 'Bolivia'],
  89.         'BA' => ["name" => 'Bosnia and Herzegovina'],
  90.         'BW' => ["name" => 'Botswana'],
  91.         'BV' => ["name" => 'Bouvet Island'],
  92.         'BR' => ["name" => 'Brazil'],
  93.         'IO' => ["name" => 'British Indian Ocean Territory'],
  94.         'BN' => ["name" => 'Brunei Darussalam'],
  95.         'BG' => ["name" => 'Bulgaria'],
  96.         'BF' => ["name" => 'Burkina Faso'],
  97.         'BI' => ["name" => 'Burundi'],
  98.         'KH' => ["name" => 'Cambodia'],
  99.         'CM' => ["name" => 'Cameroon'],
  100.         'CA' => ["name" => 'Canada'],
  101.         'CV' => ["name" => 'Cape Verde'],
  102.         'KY' => ["name" => 'Cayman Islands'],
  103.         'CF' => ["name" => 'Central African Republic'],
  104.         'TD' => ["name" => 'Chad'],
  105.         'CL' => ["name" => 'Chile'],
  106.         'CN' => ["name" => 'China'],
  107.         'CX' => ["name" => 'Christmas Island'],
  108.         'CC' => ["name" => 'Cocos (Keeling) Islands'],
  109.         'CO' => ["name" => 'Colombia'],
  110.         'KM' => ["name" => 'Comoros'],
  111.         'CG' => ["name" => 'Congo'],
  112.         'CD' => ["name" => 'Congo, The Democratic Republic of the'],
  113.         'CK' => ["name" => 'Cook Islands'],
  114.         'CR' => ["name" => 'Costa Rica'],
  115.         'CI' => ["name" => 'Cote D\'Ivoire'],
  116.         'HR' => ["name" => 'Croatia'],
  117.         'CU' => ["name" => 'Cuba'],
  118.         'CY' => ["name" => 'Cyprus'],
  119.         'CZ' => ["name" => 'Czech Republic'],
  120.         'DK' => ["name" => 'Denmark'],
  121.         'DJ' => ["name" => 'Djibouti'],
  122.         'DM' => ["name" => 'Dominica'],
  123.         'DO' => ["name" => 'Dominican Republic'],
  124.         'EC' => ["name" => 'Ecuador'],
  125.         'EG' => ["name" => 'Egypt'],
  126.         'SV' => ["name" => 'El Salvador'],
  127.         'GQ' => ["name" => 'Equatorial Guinea'],
  128.         'ER' => ["name" => 'Eritrea'],
  129.         'EE' => ["name" => 'Estonia'],
  130.         'ET' => ["name" => 'Ethiopia'],
  131.         'FK' => ["name" => 'Falkland Islands (Malvinas)'],
  132.         'FO' => ["name" => 'Faroe Islands'],
  133.         'FJ' => ["name" => 'Fiji'],
  134.         'FI' => ["name" => 'Finland'],
  135.         'FR' => ["name" => 'France'],
  136.         'GF' => ["name" => 'French Guiana'],
  137.         'PF' => ["name" => 'French Polynesia'],
  138.         'TF' => ["name" => 'French Southern Territories'],
  139.         'GA' => ["name" => 'Gabon'],
  140.         'GM' => ["name" => 'Gambia'],
  141.         'GE' => ["name" => 'Georgia'],
  142.         'DE' => ["name" => 'Germany'],
  143.         'GH' => ["name" => 'Ghana'],
  144.         'GI' => ["name" => 'Gibraltar'],
  145.         'GR' => ["name" => 'Greece'],
  146.         'GL' => ["name" => 'Greenland'],
  147.         'GD' => ["name" => 'Grenada'],
  148.         'GP' => ["name" => 'Guadeloupe'],
  149.         'GU' => ["name" => 'Guam'],
  150.         'GT' => ["name" => 'Guatemala'],
  151.         'GG' => ["name" => 'Guernsey'],
  152.         'GN' => ["name" => 'Guinea'],
  153.         'GW' => ["name" => 'Guinea-Bissau'],
  154.         'GY' => ["name" => 'Guyana'],
  155.         'HT' => ["name" => 'Haiti'],
  156.         'HM' => ["name" => 'Heard Island and Mcdonald Islands'],
  157.         'VA' => ["name" => 'Holy See (Vatican City State)'],
  158.         'HN' => ["name" => 'Honduras'],
  159.         'HK' => ["name" => 'Hong Kong'],
  160.         'HU' => ["name" => 'Hungary'],
  161.         'IS' => ["name" => 'Iceland'],
  162.         'IN' => ["name" => 'India'],
  163.         'ID' => ["name" => 'Indonesia'],
  164.         'IR' => ["name" => 'Iran, Islamic Republic Of'],
  165.         'IQ' => ["name" => 'Iraq'],
  166.         'IE' => ["name" => 'Ireland'],
  167.         'IM' => ["name" => 'Isle of Man'],
  168.         'IL' => ["name" => 'Israel'],
  169.         'IT' => ["name" => 'Italy'],
  170.         'JM' => ["name" => 'Jamaica'],
  171.         'JP' => ["name" => 'Japan'],
  172.         'JE' => ["name" => 'Jersey'],
  173.         'JO' => ["name" => 'Jordan'],
  174.         'KZ' => ["name" => 'Kazakhstan'],
  175.         'KE' => ["name" => 'Kenya'],
  176.         'KI' => ["name" => 'Kiribati'],
  177.         'KP' => ["name" => 'Korea, Democratic People\'S Republic of'],
  178.         'KR' => ["name" => 'Korea, Republic of'],
  179.         'KW' => ["name" => 'Kuwait'],
  180.         'KG' => ["name" => 'Kyrgyzstan'],
  181.         'LA' => ["name" => 'Lao People\'S Democratic Republic'],
  182.         'LV' => ["name" => 'Latvia'],
  183.         'LB' => ["name" => 'Lebanon'],
  184.         'LS' => ["name" => 'Lesotho'],
  185.         'LR' => ["name" => 'Liberia'],
  186.         'LY' => ["name" => 'Libyan Arab Jamahiriya'],
  187.         'LI' => ["name" => 'Liechtenstein'],
  188.         'LT' => ["name" => 'Lithuania'],
  189.         'LU' => ["name" => 'Luxembourg'],
  190.         'MO' => ["name" => 'Macao'],
  191.         'MK' => ["name" => 'Macedonia, The Former Yugoslav Republic of'],
  192.         'MG' => ["name" => 'Madagascar'],
  193.         'MW' => ["name" => 'Malawi'],
  194.         'MY' => ["name" => 'Malaysia'],
  195.         'MV' => ["name" => 'Maldives'],
  196.         'ML' => ["name" => 'Mali'],
  197.         'MT' => ["name" => 'Malta'],
  198.         'MH' => ["name" => 'Marshall Islands'],
  199.         'MQ' => ["name" => 'Martinique'],
  200.         'MR' => ["name" => 'Mauritania'],
  201.         'MU' => ["name" => 'Mauritius'],
  202.         'YT' => ["name" => 'Mayotte'],
  203.         'MX' => ["name" => 'Mexico'],
  204.         'FM' => ["name" => 'Micronesia, Federated States of'],
  205.         'MD' => ["name" => 'Moldova, Republic of'],
  206.         'MC' => ["name" => 'Monaco'],
  207.         'MN' => ["name" => 'Mongolia'],
  208.         'MS' => ["name" => 'Montserrat'],
  209.         'MA' => ["name" => 'Morocco'],
  210.         'MZ' => ["name" => 'Mozambique'],
  211.         'MM' => ["name" => 'Myanmar'],
  212.         'NA' => ["name" => 'Namibia'],
  213.         'NR' => ["name" => 'Nauru'],
  214.         'NP' => ["name" => 'Nepal'],
  215.         'NL' => ["name" => 'Netherlands'],
  216.         'AN' => ["name" => 'Netherlands Antilles'],
  217.         'NC' => ["name" => 'New Caledonia'],
  218.         'NZ' => ["name" => 'New Zealand'],
  219.         'NI' => ["name" => 'Nicaragua'],
  220.         'NE' => ["name" => 'Niger'],
  221.         'NG' => ["name" => 'Nigeria'],
  222.         'NU' => ["name" => 'Niue'],
  223.         'NF' => ["name" => 'Norfolk Island'],
  224.         'MP' => ["name" => 'Northern Mariana Islands'],
  225.         'NO' => ["name" => 'Norway'],
  226.         'OM' => ["name" => 'Oman'],
  227.         'PK' => ["name" => 'Pakistan'],
  228.         'PW' => ["name" => 'Palau'],
  229.         'PS' => ["name" => 'Palestinian Territory, Occupied'],
  230.         'PA' => ["name" => 'Panama'],
  231.         'PG' => ["name" => 'Papua New Guinea'],
  232.         'PY' => ["name" => 'Paraguay'],
  233.         'PE' => ["name" => 'Peru'],
  234.         'PH' => ["name" => 'Philippines'],
  235.         'PN' => ["name" => 'Pitcairn'],
  236.         'PL' => ["name" => 'Poland'],
  237.         'PT' => ["name" => 'Portugal'],
  238.         'PR' => ["name" => 'Puerto Rico'],
  239.         'QA' => ["name" => 'Qatar'],
  240.         'RE' => ["name" => 'Reunion'],
  241.         'RO' => ["name" => 'Romania'],
  242.         'RU' => ["name" => 'Russian Federation'],
  243.         'RW' => ["name" => 'RWANDA'],
  244.         'SH' => ["name" => 'Saint Helena'],
  245.         'KN' => ["name" => 'Saint Kitts and Nevis'],
  246.         'LC' => ["name" => 'Saint Lucia'],
  247.         'PM' => ["name" => 'Saint Pierre and Miquelon'],
  248.         'VC' => ["name" => 'Saint Vincent and the Grenadines'],
  249.         'WS' => ["name" => 'Samoa'],
  250.         'SM' => ["name" => 'San Marino'],
  251.         'ST' => ["name" => 'Sao Tome and Principe'],
  252.         'SA' => ["name" => 'Saudi Arabia'],
  253.         'SN' => ["name" => 'Senegal'],
  254.         'CS' => ["name" => 'Serbia and Montenegro'],
  255.         'SC' => ["name" => 'Seychelles'],
  256.         'SL' => ["name" => 'Sierra Leone'],
  257.         'SG' => ["name" => 'Singapore'],
  258.         'SK' => ["name" => 'Slovakia'],
  259.         'SI' => ["name" => 'Slovenia'],
  260.         'SB' => ["name" => 'Solomon Islands'],
  261.         'SO' => ["name" => 'Somalia'],
  262.         'ZA' => ["name" => 'South Africa'],
  263.         'GS' => ["name" => 'South Georgia and the South Sandwich Islands'],
  264.         'ES' => ["name" => 'Spain'],
  265.         'LK' => ["name" => 'Sri Lanka'],
  266.         'SD' => ["name" => 'Sudan'],
  267.         'SR' => ["name" => 'Suriname'],
  268.         'SJ' => ["name" => 'Svalbard and Jan Mayen'],
  269.         'SZ' => ["name" => 'Swaziland'],
  270.         'SE' => ["name" => 'Sweden'],
  271.         'CH' => ["name" => 'Switzerland'],
  272.         'SY' => ["name" => 'Syrian Arab Republic'],
  273.         'TW' => ["name" => 'Taiwan, Province of China'],
  274.         'TJ' => ["name" => 'Tajikistan'],
  275.         'TZ' => ["name" => 'Tanzania, United Republic of'],
  276.         'TH' => ["name" => 'Thailand'],
  277.         'TL' => ["name" => 'Timor-Leste'],
  278.         'TG' => ["name" => 'Togo'],
  279.         'TK' => ["name" => 'Tokelau'],
  280.         'TO' => ["name" => 'Tonga'],
  281.         'TT' => ["name" => 'Trinidad and Tobago'],
  282.         'TN' => ["name" => 'Tunisia'],
  283.         'TR' => ["name" => 'Turkey'],
  284.         'TM' => ["name" => 'Turkmenistan'],
  285.         'TC' => ["name" => 'Turks and Caicos Islands'],
  286.         'TV' => ["name" => 'Tuvalu'],
  287.         'UG' => ["name" => 'Uganda'],
  288.         'UA' => ["name" => 'Ukraine'],
  289.         'AE' => ["name" => 'United Arab Emirates'],
  290.         'GB' => ["name" => 'United Kingdom'],
  291.         'US' => ["name" => 'United States'],
  292.         'UM' => ["name" => 'United States Minor Outlying Islands'],
  293.         'UY' => ["name" => 'Uruguay'],
  294.         'UZ' => ["name" => 'Uzbekistan'],
  295.         'VU' => ["name" => 'Vanuatu'],
  296.         'VE' => ["name" => 'Venezuela'],
  297.         'VN' => ["name" => 'Viet Nam'],
  298.         'VG' => ["name" => 'Virgin Islands, British'],
  299.         'VI' => ["name" => 'Virgin Islands, U.S.'],
  300.         'WF' => ["name" => 'Wallis and Futuna'],
  301.         'EH' => ["name" => 'Western Sahara'],
  302.         'YE' => ["name" => 'Yemen'],
  303.         'ZM' => ["name" => 'Zambia'],
  304.         'ZW' => ["name" => 'Zimbabwe']
  305.     ];
  306.     #[Route('/login_check'name'app_login')]
  307.     public function login(AuthenticationUtils $authenticationUtilsRequest $request): Response
  308.     {
  309.         $error $authenticationUtils->getLastAuthenticationError();
  310.         $request->getSession('session')->getFlashBag()->clear();
  311.         $flashBag =  $request->getSession('session')->getFlashBag();
  312.         if ($error) {
  313.             $flashBag->set('danger'$error->getMessageKey());
  314.         }
  315.         return $this->redirectToRoute('login_view');
  316.     }
  317.     #[Route('/login'name'login_view')]
  318.     public function loginViewlogin(AuthenticationUtils $authenticationUtilsRequest $request): Response
  319.     {
  320.         // get the login error if there is one
  321.         $error $authenticationUtils->getLastAuthenticationError();
  322.         // last username entered by the user
  323.         $lastUsername $authenticationUtils->getLastUsername();
  324.         return $this->render('account/login.html.twig', [
  325.             'last_username' => $lastUsername,
  326.             'error'         => $error,
  327.         ]);
  328.     }
  329.     #[Route('/logout'name'app_logout')]
  330.     public function logout(Request $requestResponse $responseTokenInterface $token): Response
  331.     {
  332.         $request->getSession()->invalidate();
  333.         return $this->redirectToRoute('login_view');
  334.     }
  335.     #[Route('/signup'name'app_signup')]
  336.     public function registerView(): Response
  337.     {
  338.         return $this->render('account/register.html.twig', [
  339.             'countries' => self::COUNTRIES,
  340.             'acteurs' => self::TYPE_ACTEURS,
  341.             'activites' => self::ACTIVITES,
  342.             'statutJuridiques' => self::STATUT_JURIDIQUE,
  343.         ]);
  344.     }
  345.     #[Route('/register'name'app_register'methods: ['POST'])]
  346.     public function register(
  347.         Request $request,
  348.         EntityManagerInterface $entityManager,
  349.         UserRepository $usersRepo,
  350.         UserPasswordHasherInterface $userPasswordHasher,
  351.         LoggerInterface $logger,
  352.         MailerInterface $mailer,
  353.         UserRepository $userRepository,
  354.         string $mail_sender
  355.     ): JsonResponse {
  356.         set_time_limit(0);
  357.         $newUser = new User();
  358.         // return $this->json(uniqid());
  359.         try {
  360.             $entityManager->getConnection()->beginTransaction();
  361.             // $code = strtoupper(Utils::generateUniqCod($usersRepo, 4));
  362.             $companyCode $userRepository->findLastOrganizationCode();
  363.             if ($companyCode == null) {
  364.                 $newUser->setCode('AAA');
  365.             } else {
  366.                 $code Utils::getCompanyCode($companyCode);
  367.                 $newUser->setCode($code);
  368.             }
  369.             $newUser
  370.                 ->setIsValid(0)
  371.                 ->setCreatedAt(new \DateTime())
  372.                 ->setUpdatedAt(new \DateTime())
  373.                 ->setUuid(Utils::generateCaseID())
  374.                 ->setCountry($request->get('country'))
  375.                 ->setIdentification($request->get('identification'))
  376.                 ->setLegalStatus($request->get('statut'))
  377.                 ->setDomainActivity(empty($request->get('domaines')) > ? [] : $request->get('domaines'))
  378.                 ->setFirstName($request->get('firstName'))
  379.                 ->setLastName($request->get('lastName'))
  380.                 ->setSociety($request->get('raisonsociale'))
  381.                 ->setPhone($request->get('phone'))
  382.                 ->setCaptcha(uniqid());
  383.             $randomPassword $request->get('password');
  384.             $hashPassword $userPasswordHasher->hashPassword($newUser$randomPassword);
  385.             $newUser->setEmail($request->get('email'))
  386.                 ->setPassword($hashPassword)
  387.                 ->setRoles(array(self::TYPE_ACTEURS[$request->get('identification')]['role']))
  388.                 ->setIsActive(0)
  389.                 ->setIsSendMail(0)
  390.                 // ->setCode($code)
  391.                 ->setCaptcha(sha1($companyCode));
  392.             if ($newUser->getEmail() != NULL) {
  393.                 $email_validation_regex "/^[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/";
  394.                 if (== preg_match($email_validation_regex$newUser->getEmail())) { // returns 1
  395.                     return new JsonResponse(["err" => 'Email est incorrect'], 500);
  396.                 }
  397.             }
  398.             $entityManager->persist($newUser);
  399.             $entityManager->flush();
  400.             $entityManager->getConnection()->commit();
  401.             try {
  402.                 $fullName $newUser->getSociety() . $newUser->getFirstName() . ' ' $newUser->getLastName();
  403.                 $telephone $newUser->getPhone();
  404.                 $codeCompany $newUser->getCode();
  405.                 $email = (new Email())
  406.                     // ->from('sysagri@statinfo.sn')
  407.                     ->from("$mail_sender")
  408.                     ->to('btamba@statinfo.sn')
  409.                     ->addTo('tcissokho@statinfo.sn')
  410.                     ->addTo('bounafode@gmail.com')
  411.                     ->subject('Notification compte')
  412.                     ->html("<p>Bonjour,</p> 
  413.                 <p>$fullName s'est inscrit sur la plateforme SysAgri et son code organisation est <b>$codeCompany</b></p>
  414.                 <p>Veuillez le contactez sur ce numéro <b>$telephone</b> !</p>");
  415.                 $mailer->send($email);
  416.             } catch (\Exception $th) {
  417.                 //throw $th;
  418.             }
  419.         } catch (UniqueConstraintViolationException $e) {
  420.             $entityManager->getConnection()->rollBack();
  421.             $isLoginDuplicate $usersRepo->isDuplicated($newUser->getEmail());
  422.             if ($isLoginDuplicate) {
  423.                 $mail $newUser->getEmail();
  424.                 return new JsonResponse(['err' => "cet adresse email $mail est déjà utilisé !"], 500);
  425.             }
  426.         } catch (\Exception $e) {
  427.             $entityManager->getConnection()->rollBack();
  428.             return new JsonResponse(['err' => $e->getMessage()], 500);
  429.         } finally {
  430.             $logger->info(json_encode($newUser));
  431.         }
  432.         return new JsonResponse($newUser200);
  433.     }
  434.     #[Route('/users/sendMail'name'app_acount_sendMail')]
  435.     #[IsGranted('ROLE_USER')]
  436.     public function sendMailForWebUser(
  437.         MailerInterface $mailer,
  438.         Request $request,
  439.         UserRepository $repo,
  440.         EntityManagerInterface $entityManager,
  441.         string $mail_sender
  442.     ): JsonResponse {
  443.         ini_set('memory_limit''4096M');
  444.         set_time_limit(0);
  445.         $status $request->get('status');
  446.         $code substr($request->get('code'), 23);
  447.         try {
  448.             $entityManager->getConnection()->beginTransaction();
  449.             $user $repo->findOneBy(['code' => $code]);
  450.             if ($user && !$user->isIsSendMail()) {
  451.                 // $user->setIsSendMail($status);
  452.                 $fullName $user->getSociety() . $user->getFirstName() . ' ' $user->getLastName();
  453.                 $lien $request->getSchemeAndHttpHost() . $request->getBaseUrl() . $this->generateUrl('app_opened_email', ['captcha' => $user->getCaptcha()]); //"http://41.214.64.148/pigor_denombrement/public/index.php/candidatures/pieceJointes/" . $candidat->getNumeroDossier();
  454.                 $companyCode $request->get('code');
  455.                 $email = (new Email())
  456.                     // ->from('rgph5ansd@gmail.com')
  457.                     ->from("$mail_sender")
  458.                     ->to($user->getEmail())
  459.                     ->subject('Confirmation compte')
  460.                     ->html("<p>Bonjour $fullName,</p> 
  461.                     <p>Le code de votre organisation est <b>$companyCode</b></p>
  462.                     <p>vous vous êtes inscrit sur la plateforme <b>SysAgri Système</b>, veuillez confirmer en cliquant sur le lien ci-dessous <br/>
  463.                         <a href='$lien' >$lien</a>
  464.                     </p>");
  465.                 $mailer->send($email);
  466.                 $user->setIsSendMail(true)
  467.                     ->setIsUserConfirmEmail(false);
  468.                 $entityManager->persist($user);
  469.                 $entityManager->flush();
  470.                 $entityManager->getConnection()->commit();
  471.             } else {
  472.                 return $this->json("An email is already sended");
  473.             }
  474.         } catch (\Throwable $th) {
  475.             $entityManager->getConnection()->rollBack();
  476.             return new JsonResponse($th->getMessage(), 500);
  477.         }
  478.         return new JsonResponse('Mail sended successfully !'200);
  479.     }
  480.     // Permet d'ouvrir le formulaire simplifié d'enregistrement pour un invité
  481.     #[Route('/invitation/register/{token}'name'app_account_invitation_register'options: ['expose' => true])]
  482.     public function simpleRegister($tokenInvitationRepository $repo): Response
  483.     {
  484.         $invited $repo->findOneBy(['token' => $token]);
  485.         return $this->render('account/register-invited.html.twig', ['invitation' => $invited]);
  486.     }
  487.     #[Route('/invitedregister'name'app_invitation_register'methods: ['POST'])]
  488.     public function invitationRegister(
  489.         Request $request,
  490.         EntityManagerInterface $entityManager,
  491.         UserRepository $usersRepo,
  492.         UserPasswordHasherInterface $userPasswordHasher,
  493.         LoggerInterface $logger
  494.     ): JsonResponse {
  495.         set_time_limit(0);
  496.         $newUser = new User();
  497.         try {
  498.             $organisation $usersRepo->findOneBy(["id" => $request->get("token")]);
  499.             $orgaName $organisation->getSociety() != NULL
  500.                 $organisation->getSociety()
  501.                 : $organisation->getFirstName() . " " $organisation->getLastName();
  502.             $entityManager->getConnection()->beginTransaction();
  503.             $code strtoupper(Utils::generateUniqCod($usersRepo4));
  504.             $newUser
  505.                 ->setCreatedAt(new \DateTime())
  506.                 ->setUuid(uniqid())
  507.                 ->setCountry($organisation->getCountry())
  508.                 ->setIdentification($organisation->getIdentification())
  509.                 ->setLegalStatus($organisation->getLegalStatus())
  510.                 ->setDomainActivity($organisation->getDomainActivity())
  511.                 ->setFirstName($request->get('firstName'))
  512.                 ->setLastName($request->get('lastName'))
  513.                 ->setSociety($orgaName)
  514.                 ->setPhone($request->get('phone'))
  515.                 ->setCaptcha(uniqid());
  516.             $randomPassword $request->get('password');
  517.             $hashPassword $userPasswordHasher->hashPassword($newUser$randomPassword);
  518.             $newUser->setEmail($request->get('email'))
  519.                 ->setPassword($hashPassword)
  520.                 ->setRoles($organisation->getRoles())
  521.                 ->setIsSendMail(1)
  522.                 ->setIsUserConfirmEmail(1)
  523.                 ->setIsActive(1)
  524.                 ->setIsValid(1)
  525.                 ->setCode($code)
  526.                 ->setCaptcha(Utils::customUuid(32))
  527.                 ->setParentCode($organisation->getCode())
  528.                 ->setLangue($organisation->getLangue());
  529.             if ($newUser->getEmail() != NULL) {
  530.                 $email_validation_regex "/^[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/";
  531.                 if (== preg_match($email_validation_regex$newUser->getEmail())) { // returns 1
  532.                     return new JsonResponse(["err" => 'Email est incorrect'], 500);
  533.                 }
  534.             }
  535.             $entityManager->persist($newUser);
  536.             $entityManager->flush();
  537.             $entityManager->getConnection()->commit();
  538.         } catch (UniqueConstraintViolationException $e) {
  539.             $entityManager->getConnection()->rollBack();
  540.             $isLoginDuplicate $usersRepo->isDuplicated($newUser->getEmail());
  541.             if ($isLoginDuplicate) {
  542.                 $mail $newUser->getEmail();
  543.                 return new JsonResponse(['err' => "cet adresse email $mail est déjà utilisé !"], 500);
  544.             }
  545.         } catch (\Exception $e) {
  546.             $entityManager->getConnection()->rollBack();
  547.             return new JsonResponse(['err' => $e->getMessage()], 500);
  548.         } finally {
  549.             $logger->info(json_encode($newUser));
  550.         }
  551.         $this->addFlash(
  552.             'success',
  553.             'Vous venez de créer votre compte avec succès, veuillez-vous connecter !'
  554.         );
  555.         return new JsonResponse($newUser200);
  556.     }
  557.     #[Route('/forgot-password'name'app_forgot_password')]
  558.     public function forgotPassword(
  559.         Request $request,
  560.         UserRepository $userRepository,
  561.         EntityManagerInterface $entityManager,
  562.         MailerInterface $mailer
  563.     ): Response {
  564.         $request->getSession()->invalidate();
  565.         if ($request->getMethod() == "POST") {
  566.             try {
  567.                 $entityManager->beginTransaction();
  568.                 $token Utils::customUuid(100);
  569.                 $keyRecover "S-" Utils::generateRandomPassword(6);
  570.                 $account $userRepository->findOneBy(["email" => $request->get("email")]);
  571.                 if ($account == NULL) {
  572.                     $this->addFlash(
  573.                         'danger',
  574.                         "Aucun compte n'a été enregistré sous cette adresse email"
  575.                     );
  576.                     return $this->render('account/forgot-password.html.twig');
  577.                 } else if (count($account->getUserInfoPluses()) > 0) {
  578.                     $newRecover $account->getUserInfoPluses()[0];
  579.                     $newRecover
  580.                         ->setSentAt(new \DateTime())
  581.                         ->setIsPasswordChanged(false)
  582.                         ->setKeyRecover($keyRecover)
  583.                         ->setToken($token);
  584.                     $entityManager->persist($newRecover);
  585.                     $entityManager->flush();
  586.                     $entityManager->commit();
  587.                     $this->addFlash(
  588.                         'success',
  589.                         "Un email vous a été envoyé pour réinitialiser votre mot de passe et expire dans 15 minutes."
  590.                     );
  591.                 } else {
  592.                     $newRecover = new UserInfoPlus();
  593.                     $newRecover
  594.                         ->setUtilisateur($account)
  595.                         ->setSentAt(new \DateTime())
  596.                         ->setIsPasswordChanged(false)
  597.                         ->setKeyRecover($keyRecover)
  598.                         ->setToken($token);
  599.                     $entityManager->persist($newRecover);
  600.                     $entityManager->flush();
  601.                     $entityManager->commit();
  602.                     $this->addFlash(
  603.                         'success',
  604.                         "Un email vous a été envoyé pour réinitialiser votre mot de passe."
  605.                     );
  606.                 }
  607.                 // if (count($account->getUserInfoPluses()) > 0) {
  608.                 try {
  609.                     $fullName $account->getSociety() . " " $account->getFirstName() . ' ' $account->getLastName();
  610.                     $lien $request->getSchemeAndHttpHost() . $request->getBaseUrl() . $this->generateUrl('app_forgot_password_recover', ['token' => $token]); //"http://41.214.64.148/pigor_denombrement/public/index.php/candidatures/pieceJointes/" . $candidat->getNumeroDossier();
  611.                     $email = (new Email())
  612.                         ->from('sysagri@statinfo.sn')
  613.                         ->to($account->getEmail())
  614.                         ->subject('Password recover')
  615.                         ->html("<p>Bonjour $fullName,</p> 
  616.                             <p>Votre code de réinitialisation est <b>$keyRecover</b>. Click sur le lien ci-dessous pour changer votre mot de passe.</p>
  617.                             <p><a href='$lien' >$lien</a></p>");
  618.                     $mailer->send($email);
  619.                 } catch (\Throwable $th) {
  620.                     throw $th;
  621.                 }
  622.                 // }
  623.             } catch (\Exception $th) {
  624.                 //throw $th;
  625.                 $entityManager->rollback();
  626.                 $this->addFlash(
  627.                     'danger',
  628.                     $th->getMessage()
  629.                 );
  630.             }
  631.         }
  632.         return $this->render('account/forgot-password.html.twig');
  633.     }
  634.     #[Route('/recover-password/{token}/recover'name'app_forgot_password_recover'options: ['expose' => true])]
  635.     public function forgotPasswordChanged(
  636.         $token,
  637.         Request $request,
  638.         UserInfoPlusRepository $repo,
  639.         EntityManagerInterface $entityManager,
  640.         UserPasswordHasherInterface $userPasswordHasher
  641.     ): Response {
  642.         $expiredTokenMin $this->getParameter("expiredTokenMin");
  643.         $recoverPassword $repo->findOneBy(['token' => $token]);
  644.         $isValideToken false;
  645.         if ($recoverPassword == NULL) {
  646.             $this->addFlash(
  647.                 'danger',
  648.                 "Token invalide"
  649.             );
  650.         } else {
  651.             if ($recoverPassword->isIsPasswordChanged()) {
  652.                 $this->addFlash(
  653.                     'danger',
  654.                     "Un changement de mot de passe a déjà été effectué avec ce token."
  655.                 );
  656.                 return $this->render('account/recover-password.html.twig', ['isValidToken' => $isValideToken'token' => $token]);
  657.             }
  658.             $isExipredToken Utils::isExpireDate($recoverPassword->getSentAt(), $expiredTokenMin);
  659.             if ($isExipredToken) {
  660.                 $this->addFlash(
  661.                     'danger',
  662.                     "Token expiré, Merci de réinitialiser votre compte à nouveau !"
  663.                 );
  664.             } else {
  665.                 $isValideToken true;
  666.             }
  667.         }
  668.         try {
  669.             if ($request->getMethod() == "POST" && $isValideToken) {
  670.                 $entityManager->beginTransaction();
  671.                 $findRecoverPassword $repo->findOneBy(['token' => $token"keyRecover" => $request->get("codeValidation")]);
  672.                 if ($findRecoverPassword == NULL) {
  673.                     $this->addFlash(
  674.                         'danger',
  675.                         "Code invalide, merci de renseigner le code envoyé par E-mail"
  676.                     );
  677.                 } else {
  678.                     $dt = new \DateTime();
  679.                     $myAccount $findRecoverPassword->getUtilisateur();
  680.                     $randomPassword $request->get('password');
  681.                     $hashPassword $userPasswordHasher->hashPassword($myAccount$randomPassword);
  682.                     $myAccount
  683.                         ->setPassword($hashPassword)
  684.                         ->setUpdatedAt($dt);
  685.                     $entityManager->persist($myAccount);
  686.                     $findRecoverPassword
  687.                         ->setIsPasswordChanged(true)
  688.                         ->setPasswordChangeAt($dt);
  689.                     $entityManager->persist($findRecoverPassword);
  690.                     $entityManager->flush();
  691.                     $entityManager->commit();
  692.                     $this->addFlash(
  693.                         'success',
  694.                         "Votre mot de passe a été changé avec succès !"
  695.                     );
  696.                     return $this->redirectToRoute('login_view');
  697.                 }
  698.             }
  699.         } catch (\Exception $th) {
  700.             $entityManager->rollback();
  701.             $this->addFlash(
  702.                 'danger',
  703.                 $th->getMessage()
  704.             );
  705.         }
  706.         return $this->render('account/recover-password.html.twig', ['isValidToken' => $isValideToken'token' => $token]);
  707.     }
  708. }