<?php
namespace App\Controller;
use App\Entity\Dashboard;
use App\Entity\Mailling;
use App\Entity\User;
use App\Form\DashboardType;
use App\Form\UserType;
use App\Notification\MaillingNotification;
use App\Repository\NoteRepository;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
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\Routing\Annotation\Route;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/**
* @Route("/user")
*/
class UserController extends AbstractController
{
public $passwordHasher;
public $maillingNotification;
public function __construct(UserPasswordHasherInterface $passwordHasher, MaillingNotification $maillingNotification)
{
$this->passwordHasher = $passwordHasher;
$this->maillingNotification = $maillingNotification;
}
/**
*@Route("/", name="user.index")
*/
public function index(UserRepository $userRepository)
{
if (!in_array('ROLE_MASTER', $this->getUser()->getRoles())) {
return $this->redirectToRoute('dashboard.index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('user/index.html.twig', [
'users' => $userRepository->findAll()
]);
}
/**
*@Route("/add", name="user.add")
*/
public function add(Request $request, EntityManagerInterface $entityManager, UserRepository $userRepository)
{
if (!in_array('ROLE_MASTER', $this->getUser()->getRoles())) {
return $this->redirectToRoute('dashboard.index', [], Response::HTTP_SEE_OTHER);
}
$user = new User();
$form = $this->createForm(UserType::class, $user);
$requestData = $request->request->get('user');
if ($requestData != null) {
switch ($requestData['account_type']) {
case 0:
$user->setParentId(0);
$user->setRoles(['ROLE_USER', 'ROLE_SUPER_ADMIN']);
$user->setApiKey(base_convert(hash('sha256', time() . mt_rand()), 16, 36));
break;
case 1:
$user->setParentId($requestData['parent']);
$user->setRoles(['ROLE_USER']);
$user->setApiKey($userRepository->find($requestData['parent'])->getApiKey());
break;
case 2:
$user->setParentId($requestData['parent']);
$user->setRoles(['ROLE_USER', 'ROLE_MANDATAIRE']);
$user->setApiKey(base_convert(hash('sha256', time() . mt_rand()), 16, 36));
break;
}
$user->setPlainPassword($this->setPassword())
->setPassword($this->passwordHasher->hashPassword($user, $user->getPlainPassword()));
$password = $user->getPlainPassword();
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->persist($user);
$entityManager->flush();
if ($user->getParentId() == 0) {
$user->setParentId($user->getId());
$entityManager->flush($user);
}
$mailling = new Mailling();
$mailling->setSubject('Votre compte Integraal');
$mailling->setMessage('
<h3>Bienvenue sur Integraal</h3>
<p>Voici vos identifiants pour vous connecter à la plateforme : </p>
<p>
Adresse email : ' . $user->getEmail() . '<br>
Mot de passe : ' . $password . '<br>
' . $this->generateUrl('app.login', [], UrlGeneratorInterface::ABSOLUTE_URL) . '
</p>');
$mailling->setEmailFrom('no-reply@integraal.io');
$mailling->setEmailTo($user->getEmail());
$this->maillingNotification->notify($mailling);
return $this->redirectToRoute('user.index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('user/add.html.twig', [
'form' => $form->createView()
]);
}
/**
*@Route("/{id}/edit", name="user.edit", methods={"GET", "POST"})
*/
public function edit(User $user, Request $request, EntityManagerInterface $entityManager)
{
if (!in_array('ROLE_MASTER', $this->getUser()->getRoles())) {
return $this->redirectToRoute('dashboard.index', [], Response::HTTP_SEE_OTHER);
}
$sendNewId = false;
if ($request->request->get('user') != null && $user->getEmail() != $request->request->get('user')['email']) {
$sendNewId = true;
}
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->flush($user);
if ($sendNewId) $this->sendNewIdentifiant($user, '<i>Le mot de passe que vous avez défini.</i>');
return $this->redirectToRoute('user.index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('user/add.html.twig', [
'form' => $form->createView(),
'button_label' => 'Editer l\'utilisateur',
'edit' => true
]);
}
/**
*@Route("/{id}/resetpwd", name="user.resetPassword")
*/
public function resetPassword(User $user, Request $request, EntityManagerInterface $entityManager)
{
if ($this->isCsrfTokenValid('reset-password' . $user->getId(), $request->get('_token'))) {
$user->setPlainPassword($this->setPassword())
->setPassword($this->passwordHasher->hashPassword($user, $user->getPlainPassword()));
$password = $user->getPlainPassword();
$entityManager->flush($user);
$this->sendNewIdentifiant($user, $password);
}
return $this->redirectToRoute('user.index', [], Response::HTTP_SEE_OTHER);
}
/**
*@Route("/forgotPassword", name="user.forgotPassword", methods={"GET", "POST"})
*/
public function forgotPassword(Request $request, EntityManagerInterface $entityManager, UserRepository $userRepository)
{
if ($request->request->get('email')) {
if ($this->isCsrfTokenValid('reset-pwd', $request->get('_token'))) {
$users = $userRepository->findBy(['email' => $request->request->get('email')]);
if ($users) {
$user = $users[0];
$user->setPlainPassword($this->setPassword())
->setPassword($this->passwordHasher->hashPassword($user, $user->getPlainPassword()));
$password = $user->getPlainPassword();
$entityManager->flush($user);
$this->sendNewIdentifiant($user, $password);
return $this->render('user/forgot_finish.html.twig');
}
}
}
// if($request->request)
return $this->render('user/forgot.html.twig');
}
private function sendNewIdentifiant(User $user, string $password)
{
$mailling = new Mailling();
$mailling->setSubject('Vos identifiants Integraal');
$mailling->setMessage('
<h3>Vos identifiant sur Integraal ont changé</h3>
<p>Voici vos nouveaux identifiant pour vous connecter à la plateforme :</p>
<p>
Adresse email : ' . $user->getEmail() . '<br>
Mot de passe : ' . $password . ' <br>
' . $this->generateUrl('app.login', [], UrlGeneratorInterface::ABSOLUTE_URL) . '
</p>');
$mailling->setEmailFrom('no-reply@integraal.io');
$mailling->setEmailTo($user->getEmail());
$this->maillingNotification->notify($mailling);
}
private function setPassword()
{
$comb = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
$pass = array();
$combLen = strlen($comb) - 1;
for ($i = 0; $i < 8; $i++) {
$n = rand(0, $combLen);
$pass[] = $comb[$n];
}
return implode($pass);
}
/**
*@Route("/password", name="user.password")
*/
public function editPassword(Request $request, EntityManagerInterface $entityManager)
{
$user = $this->getUser();
$form = $this->createFormBuilder($user)
->add('new_password', PasswordType::class, ['mapped' => false, 'label' => 'Nouveau mot de passe'])
->getForm();
// $form = $this->createForm(UserType::class, $user);
$requestData = $request->request->get('form');
if ($requestData != null) {
$password = $requestData['new_password'];
$uppercase = preg_match('@[A-Z]@', $password);
$lowercase = preg_match('@[a-z]@', $password);
$number = preg_match('@[0-9]@', $password);
$specialChars = preg_match('@[^a-z^0-9^A-Z]@', $password);
if (!$uppercase || !$lowercase || !$number || !$specialChars || strlen($password) < 8) {
$error = ['<div class="col-12 alert alert-warning">Le mot de passe doit comporter au moins 8 caractères et doit inclure au moins une lettre minuscule, une lettre majuscule, un chiffre et un caractère spécial</div>'];
} else {
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setPlainPassword($requestData['new_password'])
->setPassword($this->passwordHasher->hashPassword($user, $user->getPlainPassword()));
$password = $user->getPlainPassword();
$entityManager->flush($user);
$this->sendNewIdentifiant($user, $password);
$this->addFlash(
'notice',
'Les changements ont été sauvegardé.'
);
return $this->redirectToRoute('user.password', [], Response::HTTP_SEE_OTHER);
}
}
}
return $this->render('user/edit_password.html.twig', [
'form' => $form->createView(),
'current_sub_page' => 'edit_password',
'error' => $error ?? ''
]);
}
/**
*@Route("/objectif", name="user.objectif")
*/
public function objectif(Request $request, EntityManagerInterface $entityManager)
{
$user = $this->getUser();
$dashboardInfo = new Dashboard($user->getDashboardInfo());
$form = $this->createForm(DashboardType::class, $dashboardInfo);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setDashboardInfo($dashboardInfo->setJson());
$entityManager->flush($user);
$this->addFlash(
'notice',
'Les changements ont été sauvegardé.'
);
return $this->redirectToRoute('user.objectif', [], Response::HTTP_SEE_OTHER);
}
return $this->render('user/objectif.html.twig', [
'form' => $form->createView(),
'current_sub_page' => 'objectif'
]);
}
/**
*@Route("/settings", name="user.settings")
*/
public function settingsAccount(Request $request, EntityManagerInterface $entityManager)
{
$user = $this->getUser();
$form = $this->createFormBuilder($user)
->add('email', EmailType::class, ['label' => 'Email'])
->add('first_name', TextType::class, ['label' => 'Prénom'])
->add('name', TextType::class, ['label' => 'Nom'])
->add('street', TextType::class, ['label' => 'Adresse'])
->add('street_number', IntegerType::class, ['label' => 'N°'])
->add('zipcode', TextType::class, ['label' => 'Code postal'])
->add('city', TextType::class, ['label' => 'Ville'])
->add('phone', TextType::class, ['label' => 'Téléphone'])
->getForm();
// $form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->flush($user);
$this->addFlash(
'notice',
'Les changements ont été sauvegardé.'
);
return $this->redirectToRoute('user.settings', [], Response::HTTP_SEE_OTHER);
}
return $this->render('user/settings.html.twig', [
'form' => $form->createView(),
'current_sub_page' => 'account_settings'
]);
}
/**
* @Route("/change-user", name="user.changeUser", methods={"POST"})
*/
public function changeUser(Request $request, UserRepository $userRepository): Response
{
if ($request->isXmlHttpRequest()) {
if ($request->request->get('PossessUser') == 'all') {
$request->getSession()->set('userPossess', 'all');
} else {
$request->getSession()->set('userPossess', $userRepository->find($request->request->get('PossessUser')));
}
return new JsonResponse([
'redirect' => $request->headers->get('referer')
]);
}
}
/**
* @Route("/delete/{id}", name="user.delete", methods={"POST"})
*/
public function delete(Request $request, User $user, EntityManagerInterface $entityManager, UserRepository $userRepository, NoteRepository $noteRepository): Response
{
$remove_id = $user->getId();
if ($this->isCsrfTokenValid('delete' . $remove_id, $request->request->get('_token'))) {
$parent = $userRepository->findBy(['id' => $user->getParentId()])[0];
$notes = $noteRepository->findBy(['user' => $user->getId()]);
if ($parent == $user) {
$users = $userRepository->getAllAgent($parent->getId());
foreach ($users as $userRelation) {
if ($userRelation != $parent) {
$this->removeUserRelation($userRelation, $entityManager, $userRepository, $noteRepository);
$entityManager->remove($userRelation);
}
}
foreach ($user->getTasksActor() as $item) {
$entityManager->remove($item);
$entityManager->flush();
}
foreach ($user->getTasks() as $item) {
$entityManager->remove($item);
$entityManager->flush();
}
foreach ($user->getMaillings() as $item) {
$entityManager->remove($item);
$entityManager->flush();
}
foreach ($user->getMarkers() as $item) {
$entityManager->remove($item);
$entityManager->flush();
}
foreach ($user->getNotifications() as $item) {
$entityManager->remove($item);
$entityManager->flush();
}
foreach ($notes as $item) {
$entityManager->remove($item);
$entityManager->flush();
}
foreach ($user->getLeadsByPossessor() as $item) {
$entityManager->remove($item);
$entityManager->flush();
}
} else {
$this->removeUserRelation($user, $entityManager, $userRepository, $noteRepository);
}
$entityManager->remove($user);
$entityManager->flush();
if ($request->isXmlHttpRequest()) {
return new JsonResponse([
'remove' => 'true'
]);
}
}
return $this->redirectToRoute('user.index', [], Response::HTTP_SEE_OTHER);
}
private function removeUserRelation(User $user, EntityManagerInterface $entityManager, UserRepository $userRepository, NoteRepository $noteRepository)
{
$parent = $userRepository->findBy(['id' => $user->getParentId()])[0];
$notes = $noteRepository->findBy(['user' => $user->getId()]);
foreach ($user->getTasksActor() as $item) {
$item->setUser($parent);
$item->setUserAction($parent);
$entityManager->flush();
}
foreach ($user->getTasks() as $item) {
$item->setUser($parent);
$item->setUserAction($parent);
$entityManager->flush();
}
foreach ($user->getMaillings() as $item) {
$item->setUser($parent);
$entityManager->flush();
}
foreach ($user->getMarkers() as $item) {
$item->setUser($parent);
$entityManager->flush();
}
foreach ($user->getNotifications() as $item) {
$item->setUser($parent);
$item->setIsSeen(0);
$entityManager->flush();
}
foreach ($notes as $item) {
$item->setUser($parent);
$entityManager->flush();
}
foreach ($user->getLeads() as $item) {
$item->setUser($parent);
$entityManager->flush();
}
}
}