<?php
namespace App\Controller\manager;
use App\Client\StripeClient;
use App\Entity\Account;
use App\Entity\Partner;
use App\Entity\PartnerPage;
use App\Form\PractitionerType;
use App\Security\PasswordEncoder;
use App\Service\MailjetEmailService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Http\SecurityEvents;
/**
* Class Defaultcontroller
* @package App\Controller\manager
*
* @Route("/manager", name="manager_")
*/
class DefaultController extends AbstractController
{
/**
* @Route(
* path="/",
* name="home"
* )
*
* @return Response
*/
public function homeAction(Request $request, PasswordEncoder $passwordEncoder, EntityManagerInterface $em, SessionInterface $session, TokenStorageInterface $tokenStorage, EventDispatcherInterface $eventDispatcher)
{
return $this->redirectToRoute("manager_app_homepage");
}
/**
* @Route(
* path="/login",
* name="login"
* )
*
* @return Response
*/
public function loginAction(Request $request, PasswordEncoder $passwordEncoder, EntityManagerInterface $em, SessionInterface $session, TokenStorageInterface $tokenStorage, EventDispatcherInterface $eventDispatcher)
{
$form = $this->createFormBuilder()
->add("username", EmailType::class, [
"attr" => [
"placeholder" => "Adresse mail"
],
"label" => "Adresse mail",
])
->add("password", PasswordType::class, [
"attr" => [
"placeholder" => "Mot de passe"
],
"label" => "Mot de passe",
])->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$username = $form['username']->getData();
$password = $form['password']->getData();
$account = $em->getRepository(Account::class)->findOneBy(['email' => $username]);
if ($account) {
$isValid = $passwordEncoder->isPasswordValid($account->getPassword(), $password, $account->getSalt());
if ($isValid) {
if ($account->getEnabled()) {
$firewall = 'manager';
$token = new UsernamePasswordToken($account, $firewall, $account->getRoles());
$tokenStorage->setToken($token);
$session->set('_security_' . $firewall, serialize($token));
$event = new InteractiveLoginEvent($request, $token);
$eventDispatcher->dispatch($event, SecurityEvents::INTERACTIVE_LOGIN);
$account->setLastLogin(new \DateTime('now'));
$em->flush();
return $this->redirectToRoute('manager_app_homepage');
} else {
$session->getFlashBag()->add("danger", "Compte inactif");
}
} else {
$session->getFlashBag()->add("danger", "Identifiant ou mot de passe incorrect");
}
} else {
$session->getFlashBag()->add("danger", "Identifiant ou mot de passe incorrect");
}
}
return $this->render('manager/login.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route(
* path="/logout",
* name="logout"
* )
*/
public function logoutAction(TokenStorageInterface $tokenStorage, SessionInterface $session)
{
$tokenStorage->setToken(null);
$session->invalidate();
return $this->redirectToRoute("manager_login");
}
/**
* @Route(
* path="/register",
* name="register"
* )
*
* @return Response
*/
public function registerAction(Request $request, PasswordEncoder $passwordEncoder, EntityManagerInterface $em, SessionInterface $session, StripeClient $stripeClient, MailjetEmailService $mailjetEmailService)
{
$partner = new Partner();
$partner->setIspractitioner(true);
$form = $this->createForm(PractitionerType::class, $partner);
$form
->add('email', EmailType::class, [
"label" => "Email d'identification",
"attr" => [
"placeholder" => "Email d'identification",
],
"required" => true,
"mapped" => false,
])
->add('parrainage', TextType::class, [
"label" => "Code de parrainage",
"attr" => [
"placeholder" => "Code de parrainage",
],
"required" => false,
"mapped" => false,
])
->add('password', PasswordType::class, [
"label" => "Mot de passe",
"required" => true,
"mapped" => false,
])
->add('password2', PasswordType::class, [
"label" => "Confirmation du mot de passe",
"required" => true,
"mapped" => false,
])
->add('cgv', CheckboxType::class, [
"label" => "",
"required" => true,
"mapped" => false,
])
->add('charte', CheckboxType::class, [
"label" => "",
"required" => true,
"mapped" => false,
])
;
$form->handleRequest($request);
$clear = false;
if ($form->isSubmitted() && !$form->isValid()) {
$session->getFlashBag()->add('danger', 'Le formulaire n\'est pas rempli correctement. Veuillez vérifier les champs.');
}
if ($form->isSubmitted() && $form->isValid()) {
if ($form->get('password')->getData() == $form->get('password2')->getData()) {
$account = $em->getRepository(Account::class)->findOneBy(['email' => $form->get('email')->getData()]);
if (!$account) {
$em->persist($partner);
$em->flush();
$account = new Account();
$account->setEmail($form->get('email')->getData());
$account->setRegistrationDate(new \DateTime('now'));
$account->setEnabled(true);
$account->setRoles(["ROLE_PARTNER"]);
$account->setPartner($partner);
$salt = md5(uniqid());
$account->setSalt($salt);
$enc_pwd = $passwordEncoder->encodePassword($form->get('password')->getData(), $salt);
$account->setPassword($enc_pwd);
$em->persist($account);
$em->flush();
// Création de la fiche
$partnerPage = new PartnerPage();
$em->persist($partnerPage);
$em->flush();
$partner->setPartnerPage($partnerPage);
$partner->setPartnershipCode($form->get('parrainage')->getData());
$em->flush();
$stripeCustomer = $stripeClient->createCustomer($account, $account->getEmail(), $partner->getFirstName(), $partner->getLastName());
if ($stripeCustomer && $stripeCustomer->id) {
$account->setStripeCustomerId($stripeCustomer->id);
$em->flush();
}
// Notification utilisateur
$mailjetEmailService->send(
"Création de votre compte ZenDez-Vous",
$account->getEmail(),
4686131,
[
"title" => "Bienvenue sur ZenDez-Vous !",
"content" => "Bonjour " . $partner->getFirstName() . " " . $partner->getLastName() . ",<br/><br/>Bienvenue chez ZenDez-Vous ! Votre inscription a bien été enregistrée et vous pouvez dès à présent accéder à votre espace professionnel ici : <a href='https://www.zendez-vous.fr/manager/login' target='_blank'>Mon intranet</a>.<br/><br/>La mise en ligne de votre profil sera effective après vérification de la validité de vos diplômes/certifications et de votre RC pro par l’équipe ZenDez-Vous. N'oubliez pas de nous communiquer ces éléments à <a href='mailto: inscription-praticien@zendez-vous.fr'>inscription-praticien@zendez-vous.fr</a> si ce n'est pas encore fait.<br/><br/>En cas de question, n’hésitez pas à nous contacter sur <a href='mailto: contact@zendez-vous.fr'>contact@zendez-vous.fr</a>.<br/><br/>Merci pour votre confiance !",
"email" => $account->getEmail(),
]);
// Notification admin
$mailjetEmailService->send(
"ZenDez-Vous: Nouveau praticien ".$partner->getFirstName(). " " . $partner->getLastName(),
"inscription-praticien@zendez-vous.fr",
4686131,
[
"title" => "Un nouveau praticien sur ZenDez-Vous",
"content" => "Bonjour, <br/><br/>Le praticien ".$partner->getFirstName(). " " . $partner->getLastName() ." s'est inscrit sur ZenDez-Vous.<br/>Il devrait vous envoyer ses diplômes/certifications et sa RC pro pour vérification et s'abonner prochainement.".($form->get("parrainage")->getData() ? "<br/><br/><b>Code de parrainage : </b>".$form->get("parrainage")->getData() : ""),
"email" => "inscription-praticien@zendez-vous.fr",
]);
$clear = true;
$session->getFlashBag()->add('success', 'Super ! Votre compte praticien a bien été créé. Vous avez reçu un email avec les dernières instructions.');
} else {
$session->getFlashBag()->add('danger', 'Un compte existe déjà avec cette adresse e-mail. Veuillez en choisir une autre.');
}
} else {
$session->getFlashBag()->add('danger', 'Les mots de passe ne correspondent pas.');
}
}
return $this->render('manager/register.html.twig', [
"form" => $form->createView(),
"clear" => $clear,
]);
}
/**
* @Route(
* path="/register-admin",
* name="register_admin"
* )
*/
public function registerAdminAction(EntityManagerInterface $em, PasswordEncoder $passwordEncoder)
{
/*
$account = new Account();
$account->setEmail("webmaster@slapp.me");
$account->setRegistrationDate(new \DateTime('now'));
$salt = md5(uniqid());
$account->setSalt($salt);
$enc_pwd = $passwordEncoder->encodePassword("", $salt);
$account->setPassword($enc_pwd);
$em->persist($account);
$em->flush();
*/
return new JsonResponse([
'success' => true,
]);
}
/**
* @Route(
* path="/test-sms",
* name="test-sms"
* )
*/
public function testSmsAdminAction(EntityManagerInterface $em, PasswordEncoder $passwordEncoder)
{
$fields = array(
'apiKey' => "00e22d45de38c8e5252f8d8266c2446f95865ccf",
'phoneNumbers' => "0604176553",
'message' => 'Vérification du fonctionnement du service SMS',
'sender' => 'ZENDEZ-VOUS',
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://api.smspartner.fr/v1/send');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($curl);
curl_close($curl);
return new JsonResponse([
'success' => true,
'message' => $result,
]);
}
}