<?php
declare(strict_types=1);
/**
* @author Mehrez Labidi
*/
namespace App\Controller;
use App\Entity\Utilisateur;
use App\Entity\UtilisateursNewsletter;
use App\Form\RegistrationFormType;
use App\Helper\TransProvider;
use App\Helper\Utils;
use App\Repository\UtilisateurRepository;
use App\Security\AppCustomAuthenticator;
use App\Security\EmailVerifier;
use App\Services\Mailer;
use App\Services\ManagerEntity\UtilisateursNewsletterManagers;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mime\Address;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
use App\Services\ManagerEntity\UtilisateursManagers;
class RegistrationController extends AbstractController {
/**
* @var TransProvider
*/
private $transProvider;
// private EmailVerifier $emailVerifier;
/**
* @var UtilisateursNewsletterManagers
*/
private UtilisateursNewsletterManagers $utilisateursNewsletterManagers;
private UtilisateursManagers $UtilisateursManagers;
/**
* @param EmailVerifier $emailVerifier
*/
public function __construct(EmailVerifier $emailVerifier, UtilisateursNewsletterManagers $utilisateursNewsletterManagers, TransProvider $transProvider, UtilisateursManagers $utilisateursManagers) {
$this->emailVerifier = $emailVerifier;
$this->utilisateursNewsletterManagers = $utilisateursNewsletterManagers;
$this->transProvider = $transProvider;
$this->UtilisateursManagers = $utilisateursManagers;
}
/**
* @Route("/creation-compte{codePays}", name="app_register")
*/
public function register(Request $request, UserPasswordEncoderInterface $userPasswordEncoderInterface, AppCustomAuthenticator $authenticator): Response {
$user = new Utilisateur();
$form = $this->createForm(RegistrationFormType::class, $user);
$form->handleRequest($request);
$formValid = false;
if ($form->isSubmitted()) {
if ($form->isValid()) {
$idTypeStructureInvestisseur = $form->get("id_type_structure_investisseur")->getData();
$idTypeStructureExpert = $form->get("id_type_structure_expert")->getData();
$idTypeStructure = $idTypeStructureInvestisseur ?? $idTypeStructureExpert;
$newsletters_internationals = $form->get("newsletters_internationals")->getData();
$newsletters_internationals = (!empty($newsletters_internationals)) ? "," . implode(",", $newsletters_internationals) : "";
$typeUtilisateur = $form->get("type_utilisateur")->getData();
// encode the plain password
$user->setPasswordEncryptedUtilisateur(
$userPasswordEncoderInterface->encodePassword(
$user,
$form->get('plainPassword')->getData()
)
);
$em = $this->getDoctrine()->getManager();
$user->id_type_structure = $idTypeStructureExpert;
$emailUtilisateur = $form->get('email_utilisateur')->getData();
$data = [
"id_metier" => UtilisateursNewsletter::getIdMetierByTypeUtilisateurIdTypeStructure($typeUtilisateur, $idTypeStructure),
"id_pays" => $form->get("id_pays_utilisateur")->getData(),
"id_region" => $form->get("id_region")->getData(),
"demarchage_partenaire" => $form->get("provenance_notoriete_fusacq")->getData(),
"newsletters_internationals" => $newsletters_internationals
];
$data = array_merge($data, (array) $form->getData());
$oldUserId = $this->getDoctrine()->getRepository(Utilisateur::class)->getIdUtilisateurProspectByMail($emailUtilisateur);
if ($oldUserId) {
$oldUser = $this->getDoctrine()->getRepository(Utilisateur::class)->find($oldUserId);
$oldUser->suivi = $oldUser->_get("suivi") . "\n" . "inscription de prospect depuis le formulaire d'inscription FUSACQ";
foreach ($oldUser->getAttribute() as $column) { // mise à jour de l'ancien utilisateur avec ses nouvelles infos //
if (($column != Utilisateur::USER_ID) && ($column != "suivi")) { // except id_utilisateur
$oldUser->_set($column, $user->_get($column)); // mise à jour de l'ancien utilisateur avec ses nouvelles infos //
}
}
$this->utilisateursNewsletterManagers->inscriptionOrUpdateNewslettersApresInscriUtilisateur($emailUtilisateur, $data);
$oldUser->setIsVerified(true);
// quelques mise à jour log de connexion old logique => fusacq choice
$oldUser->mode_utilisateur = Utilisateur::MODE_UTILISATEUR_INSCRIT;
$oldUser->date_inscription_reelle = Utils::getDateToDayFormatFUSACQ();
$oldUser->plateforme_inscription = "fusacq";
$oldUser->inscription_validee = Utilisateur::INSCRIPTION_VALIDE_OUI;
$oldUser->mode_reglement_commerce = "cb";
$oldUser->login_utilisateur = $oldUser->getId();
$em->persist($oldUser);
$em->flush();
} else {
$this->utilisateursNewsletterManagers->inscriptionOrUpdateNewslettersApresInscriUtilisateur($emailUtilisateur, $data);
//
$user->setIsVerified(true);
// quelques mise à jour log de connexion old logique => fusacq choice
$user->mode_utilisateur = Utilisateur::MODE_UTILISATEUR_INSCRIT;
$user->date_inscription_reelle = Utils::getDateToDayFormatFUSACQ();
$user->inscription_validee = Utilisateur::INSCRIPTION_VALIDE_OUI;
$user->mode_reglement_commerce = "cb";
$user->plateforme_inscription = "fusacq";
$user->suivi = "nouvelle inscription depuis le formulaire d'inscription FUSACQ";
$em->persist($user);
$em->flush();
}
$em->clear(); // Nettoyer après la transaction
$this->addFlash('success', "Vous êtes maintenant inscrit sur FUSACQ !");
$formValid = true;
} else {
$this->addFlash('error', "Certains champs sont vides ou invalides.");
}
}
return $this->render('registration/register.html.twig', [
'registrationForm' => $form->createView(),
"formValid" => $formValid
]);
}
/**
* @param $var
* @return mixed|string
*/
private function transChoice($var) {
if (is_string($var)) {
$var = $this->transProvider
->translate($var, "", "M");
}
if (is_array($var)) {
foreach ($var as $key => $item) {
unset($var[$key]);
$key = $this->transProvider
->translate($key, "", "M");
$var[$key] = $item;
}
}
return $var;
}
/**
* @Route("/verify/email", name="app_verify_email")
*/
// public function verifyUserEmail(Request $request, UtilisateurRepository $utilisateurRepository): Response {
// $id = $request->get('id');
// if (null === $id) {
// return $this->redirectToRoute('app_register');
// }
// $user = $utilisateurRepository->find($id);
// if (null === $user) {
// return $this->redirectToRoute('app_register');
// }
// // validate email confirmation link, sets User::isVerified=true and persists
// try {
// $this->emailVerifier->handleEmailConfirmation($request, $user);
// } catch (VerifyEmailExceptionInterface $exception) {
// $this->addFlash('verify_email_error', $exception->getReason());
// return $this->redirectToRoute('app_register');
// }
//// // @TODO Change the redirect on success and handle or remove the flash message in your templates
//// $this->addFlash('success', 'Your email address has been verified.');
//// return $this->redirectToRoute('app_register');
// // redirect after confirm email user
// $session = $request->getSession();
// $codePays = $session->get('codePays');
// if (!$codePays) {
// $codePays = strtolower($_COOKIE["codePays"]);
// }
// return $this->redirectToRoute('index', ['codePays' => Utils::codePaysWithoutDash($codePays)]);
// }
}