<?php
namespace App\Controller;
use App\Entity\User;
use App\Entity\Adresse;
use App\Form\MedecinType;
use App\Form\GrossisteType;
use App\Form\PharmacieType;
use GeoIp2\Database\Reader;
use App\Services\CountryCode;
use App\Form\PrescripteurType;
use App\Entity\UserTypepaiement;
use App\Services\MailerServices;
use App\Services\IctocoinService;
use App\Repository\PaysRepository;
use App\Repository\UserRepository;
use App\Services\OrangeSmsService;
use App\Repository\VilleRepository;
use App\Repository\AdresseRepository;
use App\Repository\QuartierRepository;
use App\Form\FinalisationIscriptionType;
use Doctrine\ORM\EntityManagerInterface;
use App\Form\Handler\RegisterFormHandler;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Security\Core\Security;
use GeoIp2\Exception\AddressNotFoundException;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Form\Handler\FinalisationInscriptionFormHandler;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class RegisterController extends AbstractController
{
private $em;
private $mailerint;
private $villeRepo;
private $quartierRepo;
private $paysRepo;
private $tanslator;
private $appKernel;
private $primeDeBienvenu = 1000;
public function __construct(
EntityManagerInterface $em,
MailerInterface $mailerint,
PaysRepository $paysRepo,
VilleRepository $villeRepo,
QuartierRepository $quartierRepo,
TranslatorInterface $tanslator,
KernelInterface $appKernel
) {
$this->em = $em;
$this->mailerint = $mailerint;
$this->villeRepo = $villeRepo;
$this->quartierRepo = $quartierRepo;
$this->paysRepo = $paysRepo;
$this->tanslator = $tanslator;
$this->appKernel = $appKernel;
}
/**
* @Route("/register/grossiste", name="register_grossiste")
*/
public function registerGrossiste(Request $request, UserPasswordHasherInterface $encoders, MailerServices $ms, OrangeSmsService $OrangeSmsService,RequestStack $requestStack): Response
{
$user = new User();
$form = $this->createForm(GrossisteType::class, $user);
$formHandler = new RegisterFormHandler($form, $request, $this->em, $encoders, $requestStack);
$user->setRoles(['ROLE_GROSSISTE'])->setGrossiste($user);
$user = $formHandler->process();
if (!is_null($user)) {
$ms->sendEmail($this->mailerint, 'pharmadexi@gmail.com', $user->getEmail(), $user->getDesignation(), 'Confirmation Inscription PHARMADEXI', 'emails/confirm_grssiste_register.html.twig');
$ms->sendEmailAdmin($this->mailerint, 'pharmadexi@gmail.com', 'eruditsophrmad@gmail.com', $user->getDesignation(), $user->getId(), "Compte client Pharmadexi en attente d'activation", 'emails/activation_compte_client.html.twig');
//$this->addFlash('success', $this->tanslator->trans('Votre compte a été bien créé.'));
$code = rand(1231, 7879);
$message = $this->tanslator->trans('PHARMADEXI-Code confirmation: ' . $code);
if ($OrangeSmsService->envoyeSMSOrange($user->getPhone(), $message) == 'OK') {
$user->setVerified(0)->setVerificationCode($code);
} else {
$user->setVerified(2)->setVerificationCode($code);
}
$this->em->flush();
return $this->redirectToRoute('register_verify');
}
return $this->render('register/register_grossiste.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/register/prescripteur", name="register_prescripteur")
*/
public function registerPrescripteur(Request $request, UserPasswordHasherInterface $encoders, MailerServices $ms, CountryCode $cd, OrangeSmsService $OrangeSmsService, RequestStack $requestStack): Response
{
$user = new User();
$form = $this->createForm(PrescripteurType::class, $user);
$formHandler = new RegisterFormHandler($form, $request, $this->em, $encoders,$requestStack);
$user->setRoles(['ROLE_PRESCRIPTEUR']);
$user = $formHandler->process();
if (!is_null($user)) {
$ms->sendEmail($this->mailerint, 'pharmadexi@gmail.com', $user->getEmail(), $user->getDesignation(), 'Confirmation Inscription PHARMADEXI', 'emails/confirm_pharmacie_register.html.twig');
$ms->sendEmailAdmin($this->mailerint, 'pharmadexi@gmail.com', 'eruditsophrmad@gmail.com', $user->getDesignation(), $user->getId(), "Compte client Pharmadexi en attente d'activation", 'emails/activation_compte_client.html.twig');
//$this->addFlash('success', $this->tanslator->trans('Votre compte a été bien créé.'));
$code = rand(1231, 7879);
$message = $this->tanslator->trans('PHARMADEXI-Code cofirmation: ' . $code);
// if ($OrangeSmsService->envoyeSMSOrange($user->getPhone(), $message) == 'OK') {
// $user->setVerified(0)->setVerificationCode($code);
// } else {
// $user->setVerified(2)->setVerificationCode($code);
// }
$this->em->flush();
return $this->redirectToRoute('register_verify');
}
return $this->render('register/register_prescripteur.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/register/pharmacie", name="register_pharmacie")
*/
public function registerPharmacie(RequestStack $requestStack, AdresseRepository $adresseRepo, IctocoinService $ictocoinService, Request $request, UserPasswordHasherInterface $encoders, MailerServices $ms, OrangeSmsService $OrangeSmsService, QuartierRepository $quartierRepo): Response
{
$user = new User();
$form = $this->createForm(PharmacieType::class, $user);
$formHandler = new RegisterFormHandler($form, $request, $this->em, $encoders, $requestStack);
$user->setRoles(['ROLE_PHARMACIE']);
$user = $formHandler->process($requestStack);
if ($user) {
// Gestion des paiements
foreach ($form->get('typepaiements')->getData() as $typepaiement) {
$userTypePaiement = new UserTypepaiement();
$userTypePaiement->setTypepaiements($typepaiement)
->setUsers($user)
->setIsValid(false);
$this->em->persist($userTypePaiement);
}
// Code de vérification
$code = rand(1231, 7879);
$message = $this->tanslator->trans('PHARMADEXI-Code confirmation: ' . $code);
// if ($OrangeSmsService->envoyeSMSOrange($user->getPhone(), $message) == 'OK') {
// $user->setVerified(0)->setVerificationCode($code);
// } else {
// $user->setVerified(2)->setVerificationCode($code);
// }
$this->em->flush();
// Prime de bienvenue
//$raison = "Prime de bienvenue";
//$ictocoinService->crediter($user->getIctusPharmacie(), $this->primeDeBienvenu, $raison);
// Envoi des emails
/* $ms->sendEmailAdmin($this->mailerint, 'pharmadexi@gmail.com', 'erudit.andrianomentsoa@sopharmad.mg', $user->getDesignation(), $user->getId(), "Compte client Pharmadexi en attente d'activation", 'emails/activation_compte_client.html.twig');
$sendMail = $ms->sendEmail($this->mailerint, 'pharmadexi@gmail.com', $user->getEmail(), $user->getDesignation(), 'Confirmation Inscription PHARMADEXI', 'emails/confirm_pharmacie_register.html.twig'); */
/* if ($sendMail === false) {
$this->addFlash('success', $this->tanslator->trans('Votre compte a été bien créé, avec email à vérifier.'));
} */
return $this->redirectToRoute('register_verify');
}
return $this->render('register/register_pharmacie.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/testmessage", name="message_pharmacie")
*/
public function testMessage(OrangeSmsService $OrangeSmsService)
{
$OrangeSmsService->sendMessage();
//dd('ok');
}
/**
* @Route("/inscription/verification-code", name="register_verify")
*/
public function verifyCode(Request $request, UserRepository $user_repo)
{
$defaultData = ['message' => 'Code'];
$form = $this->createFormBuilder($defaultData)
->add('confirm_code', TextType::class, [
'label' => false,
'attr' => [
'class' => 'form-control code-verify input-code',
'placeholder' => '######'
]
])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// data is an array with "name", "email", and "message" keys
$data = $form->getData();
$user = $user_repo->findOneByVerificationCode($data['confirm_code']);
if ($user) {
$user->setVerified(1)->setVerificationCode($data['confirm_code'] . uniqid());
$this->em->flush();
$this->addFlash('success', $this->tanslator->trans('Votre compte a été bien créé.'));
return $this->redirectToRoute('login');
} else {
$this->addFlash('danger', $this->tanslator->trans('Code invalide.'));
}
}
return $this->render('register/verification_code.html.twig', [
'form' => $form->createView()
]);
}
/**
* Undocumented function
* @Route("/inscription/verification-plustard", name="plustard_verification")
*
* @return void
*/
public function plutardVerification()
{
$this->addFlash('success', $this->tanslator->trans('Votre compte a été bien créé.'));
return $this->redirectToRoute('login');
}
/**
* @Route("/login", name="login")
*/
public function login(AuthenticationUtils $utils, Security $security): Response
{
$error = $utils->getLastAuthenticationError();
$username = $utils->getLastUsername();
//dd($this->getUser()->getRoles()[0]);
if ($security->getUser()) {
switch ($this->getUser()->getRoles()[0]) {
case 'ROLE_ADMIN':
return $this->redirectToRoute('admin_category_index');
break;
case 'ROLE_PRESCRIPTEUR':
return $this->redirectToRoute('prescripteur_index');
break;
case 'ROLE_PHARMACIE':
return $this->redirectToRoute('pharmacie_index');
break;
case 'ROLE_GROSSISTE':
return $this->redirectToRoute('grossiste_catalogue');
break;
default:
return $this->redirectToRoute('home');
break;
}
return $this->redirectToRoute('login');
}
return $this->render('register/login.html.twig', [
'hasError' => $error !== null,
'username' => $username
]);
}
/**
* @Route("/logout", name="logout")
*/
public function logout() {}
public function redirectAfterlogin()
{
return '';
}
/**
*
* @param Request $request
* @return JsonResponse
* @Route("/listville", name="listeville")
*/
public function listVilleParPays(Request $request)
{
$villes = $this->villeRepo->createQueryBuilder("v")
->where("v.pays = :pays")
->setParameter("pays", $request->query->get("payslocalisation"))
->orderBy('v.name', 'DESC')
->getQuery()
->getResult();
$responseArray = array();
foreach ($villes as $ville) {
$responseArray[] = array(
"id" => $ville->getId(),
"name" => $ville->getName()
);
}
return new JsonResponse($responseArray);
// e.g
// [{"id":"3","name":"Treasure Island"},{"id":"4","name":"Presidio of San Francisco"}]
}
/**
*
* @param Request $request
* @return JsonResponse
* @Route("/listQuartier", name="listequartier")
*/
public function listQuartierParVille(Request $request)
{
$quartiers = $this->quartierRepo->createQueryBuilder("q")
->where("q.ville = :ville")
->setParameter("ville", $request->query->get("ville"))
->orderBy('q.name', 'ASC')
->getQuery()
->getResult();
$responseArray = array();
foreach ($quartiers as $quartier) {
$responseArray[] = array(
"id" => $quartier->getId(),
"name" => $quartier->getName()
);
}
return new JsonResponse($responseArray);
// e.g
// [{"id":"3","name":"Treasure Island"},{"id":"4","name":"Presidio of San Francisco"}]
}
/**
*
* @param Request $request
* @Route("/finalisation-incription/{id}", name="finalisation_incription")
*/
public function finalisationInscriptionPharmacie(User $user, Request $request, UserPasswordHasherInterface $encoders)
{
$form = $this->createForm(FinalisationIscriptionType::class, $user);
$formHandler = new FinalisationInscriptionFormHandler($form, $request, $this->em, $encoders);
$user = $formHandler->process();
if (!is_null($user)) {
$this->addFlash('success', 'Votre compte est crée');
$this->redirectToRoute('login');
}
return $this->render('register/finalisation_incription.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route("/update-session-localisation", name="update_session_localisation")
*/
public function updateSessionLocalisation(RequestStack $requestStack, Request $request)
{
$session = $requestStack->getSession();
$latitude = $request->request->get('latitude');
$longitude = $request->request->get('longitude');
$session->set('localisation_session', ['latitude' => $latitude, 'longitude' => $longitude]);
return new JsonResponse(['success' => true]);
}
}