<?php
namespace App\Controller;
use App\Entity\DataView;
use App\Service\SendMail;
use DateTime;
use App\Service\ExceptionHandler;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use App\Entity\User;
use App\Form\LostPassType;
use App\Form\UserEditType;
use App\Form\UserType;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/users")
*/
class UserController extends AbstractController
{
private function getValidity()
{
/* Génération de la date de validité du token date du jour + 48 heures */
$date = date('Y-m-d H:i:s');
$validity = date("Y-m-d H:i:s", strtotime("+2 day", strtotime($date)));
return new DateTime($validity);
}
private function getToken()
{
/* Génération du token temporaire pour la finalisation de l'inscription de l'utilisteur */
$chaine = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$melange = str_shuffle($chaine);
return substr($melange, 0, 32);
}
/**
* @var ExceptionHandler
*/
private $exceptionHandler;
/**
* @return void
*/
public function __construct()
{
$this->exceptionHandler = new ExceptionHandler();
}
/**
*
* Méthode pour afficher la liste des utilisateurs
* @Route("/list", name="user_index", methods={"GET"})
* @return Response
*/
public function indexAction(Request $request)
{
$id = $this->getUser()->getUserEntity()->getId();
$active = $request->get('active', 1);
$listUsers = $this->getDoctrine()->getManager()->getRepository(User::class)->findBy([
'userEntity' => $id,
'isActive' => $active
]);
// On donne toutes les informations nécessaires à la vue
return $this->render('User/index.html.twig', array(
'listUsers' => $listUsers,
'active' => $active
));
}
/**
* Méthode pour afficher les détails d'un utilisateur
* @Route("/user/{id}", name="user_show", methods={"GET"})
* @param $id
* @return Response
*/
public function viewAction($id)
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository(User::class)->find($id);
if (null === $user) {
throw new NotFoundHttpException("L'utilisateur d'id ".$id." n'existe pas.");
}
return $this->render('User/view.html.twig', array(
'user' => $user
));
}
/**
* Méthode pour ajouter un utilisateur
* @Route("/add", name="user_add", methods={"GET","POST"})
* @param SendMail $mail
* @param Request $request
* @return RedirectResponse|Response
*/
public function addAction(SendMail $mail, Request $request)
{
$role = $this->getUser()->getRoles()[0];
$userEntity = $this->getUser()->getUserEntity();
$entity = $this->getUser()->getEntite();
$user = new User();
$form = $this->get('form.factory')->create(UserType::class, $user, ['role' => $role]);
if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
$token = $this->getToken();
$user->setToken($token);
$dateValide= $this->getValidity();
$user->setValidity($dateValide);
$user->setUserEntity($userEntity);
$user->setEntite($entity);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
//AJOUT DES VUES PAR DEFAUTS
$this->createBaseDataview($user);
//$mail = $this->get('email.user.mailer');
$mail->sendChangePassword($user);
$request->getSession()->getFlashBag()->add('success', 'Utilisateur bien enregistré.');
return $this->redirectToRoute('sudalys_users_view', array('id' => $user->getId()));
}
return $this->render('User/add.html.twig', array(
'form' => $form->createView(),
));
}
public function createBaseDataview(User $user)
{
$em = $this->getDoctrine()->getManager();
//****** MODULE VENTE *******/
// AJOUT VU ARTICLE
$dtv = new DataView();
$dtv->setOwner($user);
$dtv->setType('article');
$dtv->setDataTable('article');
$dtv->setDataClass('App\Entity\Article');
$dtv->setLabel('Articles');
$dtv->setTemplate('article');
$dtv->setModule('produit');
$em->persist($dtv);
// AJOUT VU ARTICLE
$dtv = new DataView();
$dtv->setOwner($user);
$dtv->setType('subscription_type');
$dtv->setDataTable('subscription_type');
$dtv->setDataClass('App\Entity\SubscriptionType');
$dtv->setLabel("Types d'abonnements");
$dtv->setTemplate('subscription_type');
$dtv->setModule('produit');
$em->persist($dtv);
// AJOUT VU ORGANISME CLIENT
$dtv = new DataView();
$dtv->setOwner($user);
$dtv->setType('client');
$dtv->setDataTable('organisme');
$dtv->setDataClass('App\Entity\Organisme');
$dtv->setLabel('Clients');
$dtv->setTemplate('organisme');
$dtv->setModule('organisme');
$em->persist($dtv);
// AJOUT VU DEVIS
$dtv = new DataView();
$dtv->setOwner($user);
$dtv->setType('devis');
$dtv->setDataTable('devis');
$dtv->setDataClass('App\Entity\Devis');
$dtv->setLabel('Devis');
$dtv->setTemplate('devis');
$dtv->setModule('vente');
$em->persist($dtv);
// AJOUT VU COMMANDE
$dtv = new DataView();
$dtv->setOwner($user);
$dtv->setType('commande');
$dtv->setDataTable('commande');
$dtv->setDataClass('App\Entity\Commande');
$dtv->setLabel('Commandes');
$dtv->setTemplate('commande');
$dtv->setModule('vente');
$em->persist($dtv);
// AJOUT VU FACTURE
$dtv = new DataView();
$dtv->setOwner($user);
$dtv->setType('facture');
$dtv->setDataTable('facture');
$dtv->setDataClass('App\Entity\Facture');
$dtv->setLabel('Factures');
$dtv->setTemplate('facture');
$dtv->setModule('vente');
$em->persist($dtv);
//****** MODULE ACHAT *******/
// AJOUT VU ORGANISME FOURNISSEUR
$dtv = new DataView();
$dtv->setOwner($user);
$dtv->setType('fournisseur');
$dtv->setDataTable('organisme');
$dtv->setDataClass('App\Entity\Organisme');
$dtv->setLabel('Fournisseurs');
$dtv->setTemplate('organisme');
$dtv->setModule('organisme');
$em->persist($dtv);
// AJOUT VU COMMANDE
$dtv = new DataView();
$dtv->setOwner($user);
$dtv->setType('commande_fp');
$dtv->setDataTable('commande_fournisseur');
$dtv->setDataClass('App\Entity\CommandeFournisseur');
$dtv->setLabel('Commandes fournisseurs');
$dtv->setTemplate('commande_fp');
$dtv->setModule('achat');
$em->persist($dtv);
// AJOUT VU FACTURE
$dtv = new DataView();
$dtv->setOwner($user);
$dtv->setType('facture_fp');
$dtv->setDataTable('facture_fournisseur');
$dtv->setDataClass('App\Entity\FactureFournisseur');
$dtv->setLabel('Factures fournisseurs');
$dtv->setTemplate('facture_fp');
$dtv->setModule('achat');
$em->persist($dtv);
$em->flush();
return true;
}
/**
* Méthode pour éditer un utilisateur
* @Route("/edit/{id}", name="user_edit", methods={"GET","POST"})
* @param $id
* @param Request $request
* @return RedirectResponse|Response
*/
public function editAction($id, Request $request)
{
$role = $this->getUser()->getRoles()[0];
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository(User::class)->find($id);
if (null === $user) {
throw new NotFoundHttpException("L'utilisateur d'id " . $id . " n'existe pas.");
}
$form = $this->get('form.factory')->create(UserEditType::class, $user, ['role' => $role]);
if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
$em->flush();
$request->getSession()->getFlashBag()->add('info', 'Utilisateur bien modifié.');
return $this->redirectToRoute('sudalys_users_view', array('id' => $user->getId()));
}
return $this->render('User/edit.html.twig', array(
'user' => $user,
'form' => $form->createView(),
));
}
/**
* Méthode pour supprimer un utilisateur
* @Route("/delete/{id}", name="user_edit", methods={"POST"})
* @param $id
* @param Request $request
* @return RedirectResponse|Response
*/
public function deleteAction($id, Request $request)
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository(User::class)->find($id);
if (null === $user) {
throw new NotFoundHttpException("L'utilisateur d'id " . $id . " n'existe pas.");
}
// On crée un formulaire vide, qui ne contiendra que le champ CSRF
// Cela permet de protéger la suppression d'utilisateur contre cette faille
$form = $this->get('form.factory')->create();
if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
$user->setIsActive(false);
//$em->remove($user);
$em->flush();
$request->getSession()->getFlashBag()->add('info', "L'utilisateur a bien été supprimé.");
return $this->redirectToRoute('sudalys_users_home');
}
return $this->render('User/delete.html.twig', array(
'user' => $user,
'form' => $form->createView(),
));
}
/**
* Méthode pour récupérer le mot de passe perdu d'un utilisateur
* Attention pas encore testé
* @Route("/mot-de-passe-perdu", name="user_lostpass", methods={"GET"})
* @param Request $request
* @param SendMail $mail
* @return RedirectResponse|Response
*/
public function lostPassAction(Request $request, SendMail $mail)
{
$user = new User();
$form = $this->get('form.factory')->create(LostPassType::class, $user);
// On vérifie la requête = Post, on crée le lien requête <-> formulaire et on vérifie que les valeurs entrées sont valides
if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
$donnees = $request->get('lost_pass');
$user = $this->getDoctrine()
->getManager()
->getRepository(User::class)
->findOneBy(array('email'=>$donnees['email']));
if (null === $user) {
$request->getSession()->getFlashBag()->add('info', 'L\'adresse mail n\'éxiste pas');
return $this->redirectToRoute('app_login');
} elseif ($user->getIsActive() == false) {
$request->getSession()->getFlashBag()->add('info', 'Le compte utilisateur est désactivé');
return $this->redirectToRoute('app_login');
} else {
$user->setPassword(null);
$user->setValidity($this->getValidity());
// on enregistre User dans la base de données
$em = $this->getDoctrine()->getManager();
$em->flush();
$em->flush();
$mail->sendChangePassword($user);
$request->getSession()->getFlashBag()->add('info', "Un email pour créer votre nouveau mot de passe vous a été envoyé.");
return $this->redirectToRoute('app_login');
}
}
return $this->render('User/lostPass.html.twig', array(
'user' => $user,
'form' => $form->createView()
));
}
/**
* Méthode pour envoyer un nouvel email de confirmation pour activer le compte
* @param SendMail $mail
* @param $userId
* @return RedirectResponse
*/
public function relanceMailAction(SendMail $mail, $userId)
{
$em = $this->getDoctrine()->getManager();
$user = $this->getDoctrine()->getRepository(User::class)->find($userId);
$token = $this->getToken();
$user->setToken($token);
$dateValide= $this->getValidity();
$user->setValidity($dateValide);
$em->persist($user);
try {
$em->flush();
$mail->sendNewNotification($user, $this->getParameter('adresse_web'));
$this->addFlash('success', "Un nouvel email a été envoyé à l'utilisateur pour valider son compte.");
/*if ($response['status'] === 'success') {
$this->addFlash('success', "Un nouvel email a été envoyé à l'utilisateur pour valider son compte.");
} else {
$this->addFlash('danger', "Une erreur c'est produite lors de l'envoi de l'email, vueillez réessayer.");
}*/
} catch (\Exception $e) {
/*$error = $this->exceptionHandler->getException($e);
$message = $this->exceptionHandler->exceptionHandler($error, 'utilisateur');*/
$this->addFlash('warning', $e->getMessage());
}
return $this->redirectToRoute('sudalys_users_home');
}
}