<?php
namespace App\Controller\Configuration;
use App\Entity\Organization\Entity;
use App\Entity\Processus;
use App\Entity\User;
use App\Enum\ModuleEnum;
use App\Enum\RoleEnum;
use App\Form\UserType;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\ProcessusRepository;
use App\Entity\Configuration\CompanyEntity;
/**
* @Route("/configuration/user")
*/
class UserController extends AbstractController
{
private UserRepository $userRepository;
private EntityManagerInterface $entityManager;
public function __construct(UserRepository $userRepository, EntityManagerInterface $entityManager)
{
$this->userRepository = $userRepository;
$this->entityManager = $entityManager;
}
/**
* @Route("/", name="app_configuration_user")
*/
public function index(ProcessusRepository $processusRepository): Response
{
$processus_list = $processusRepository->findAll();
$left_menu="user";
return $this->render('configuration/user/index.html.twig', [
'left_menu'=>$left_menu,
'processus_list'=>$processus_list,
'modules_list'=>ModuleEnum::getAvailableModules(),
'modules_labels'=>ModuleEnum::getModuleLabels()
]);
}
/**
* @Route("/list", name="app_configuration_user_list")
*/
public function list(Request $request): JsonResponse
{
$data = ['data'=>[]];
$users = $this->userRepository->findBy([],['id'=>'desc']);
foreach($users as $user)
{
try {
$urlDelete= "/configuration/user/delete/".$user->getId();
$delete_btn= "<a class='ut-action-btn ut-action-delete' onclick='open_delete_dialog_without_from(\"".$urlDelete."\",\"".$user->getFullName()."\" )' title='Supprimer'><i class='fa fa-trash-o'></i></a>";
$entities = '';
foreach ($user->getEntities() as $entity) {
$entities .= '<span class="ut-badge ut-badge-entity">' . htmlspecialchars($entity->getNom()) . '</span> ';
}
// Avatar + nom
$photo = $user->getPhoto();
$avatarUrl = $photo ? '/uploads/user/photos/' . $photo : '/img/avatars/male.png';
$userCell = '<div class="ut-user-cell">'
. '<img src="' . $avatarUrl . '" class="ut-user-avatar" alt="" />'
. '<div class="ut-user-info">'
. '<div class="ut-user-name">' . htmlspecialchars($user->getFullName()) . '</div>'
. '<div class="ut-user-email">' . htmlspecialchars($user->getEmail() ?: '') . '</div>'
. '</div></div>';
// Status badge
$statusHtml = '<span class="ut-badge ut-badge-active"><i class="fa fa-check-circle"></i> Active</span>';
$data['data'][] = [
'update_link' => '<a href="/configuration/user/modal?id=' . $user->getId() . '" data-toggle="modal" data-target="#myModal" class="ut-action-btn ut-action-edit" title="Modifier"><i class="fa fa-pencil"></i></a>',
'delete_link' => $delete_btn,
'entities' => $entities,
'role' => $user->getRolesLabelHtml(),
'gender' => $user->getGender(),
'modules' => $user->getModulesHtml(),
'processuses' => $user->getProcessusesHtml(),
'user_fullname' => $userCell,
'last_connexion' => '01/07/2022 09:00',
'status' => $statusHtml,
'fonction' => $user->getFonction(),
'email' => $user->getEmail() ?: '',
'mobile' => $user->getMobile() ?: '',
'tel' => $user->getTel() ?: ''
];
} catch (\Doctrine\ORM\EntityNotFoundException $e) {
$urlDelete= "/configuration/user/delete/".$user->getId();
$delete_btn= "<a class='ut-action-btn ut-action-delete' onclick='open_delete_dialog_without_from(\"".$urlDelete."\",\"".$user->getFullName()."\" )' title='Supprimer'><i class='fa fa-trash-o'></i></a>";
$userCell = '<div class="ut-user-cell">'
. '<img src="/img/avatars/male.png" class="ut-user-avatar" alt="" />'
. '<div class="ut-user-info">'
. '<div class="ut-user-name">' . htmlspecialchars($user->getFullName()) . '</div>'
. '<div class="ut-user-email">' . htmlspecialchars($user->getEmail() ?: '') . '</div>'
. '</div></div>';
$statusHtml = '<span class="ut-badge ut-badge-active"><i class="fa fa-check-circle"></i> Active</span>';
$data['data'][]=[
'update_link'=>'<a href="/configuration/user/modal?id='.$user->getId().'" data-toggle="modal" data-target="#myModal" class="ut-action-btn ut-action-edit" title="Modifier"><i class="fa fa-pencil"></i></a>',
'delete_link'=>$delete_btn,
'entities'=>'<span class="ut-badge ut-badge-entity">Non assigné</span>',
'role'=>$user->getRolesLabelHtml(),
'gender'=>$user->getGender(),
'modules'=>$user->getModulesHtml(),
'processuses'=>$user->getProcessusesHtml(),
'user_fullname'=>$userCell,
'last_connexion'=>'01/07/2022 09:00',
'status'=>$statusHtml,
'fonction'=>$user->getFonction(),
'email'=>$user->getEmail()?$user->getEmail():'',
'mobile'=>$user->getMobile()? $user->getMobile() : '',
'tel'=>$user->getTel() ? $user->getTel() : ''
];
}
}
return new JsonResponse($data,200);
}
/**
* @Route("/modal", name="app_configuration_user_modal")
*/
public function modal(Request $request):Response
{
$entites = $this->entityManager->getRepository(CompanyEntity::class)->findAll();
$processuses = $this->entityManager->getRepository(Processus::class)->findAll();
$modules=ModuleEnum::getAvailableModules();
$id= $request->query->get('id','');
$user = $id? $this->userRepository->find($id): new User();
$form = $this->createForm(UserType::class, $user);
return $this->render('configuration/user/modal.html.twig',[
'form'=>$form->createView(),
'id'=>$id,
'user'=>$user,
'entites'=>$entites,
'processuses'=>$processuses,
'modules'=>$modules
]);
}
/**
* @Route("/save", name="app_configuration_user_save", methods={"POST"})
*/
public function save(Request $request, UserPasswordHasherInterface $passwordHasher): JsonResponse
{
$id= $request->request->get('id','');
$lastname= $request->request->get('lastname','');
$firstname= $request->request->get('firstname','');
$fonction= $request->request->get('fonction','');
$gender= $request->request->get('gender','');
$photo = $request->files->get('photo');
$email= $request->request->get('email','');
$mobile= $request->request->get('mobile','');
$tel= $request->request->get('tel','');
$password= $request->request->get('password','');
$roles= $request->request->get('roles')?? [];
$roles_array = explode(',',$roles);
$processuses= $request->request->get('processus')?? [];
$processuses_array = explode(',',$processuses);
$modules= $request->request->get('modules')?? [];
$modules_array = explode(',',$modules);
$entities= $request->request->get('entities')?? [];
$entities_array = explode(',',$entities);
// Si aucun module n'est sélectionné, on ajoute les modules par défaut
if (empty($modules_array) || (count($modules_array) === 1 && empty($modules_array[0]))) {
$modules_array = ModuleEnum::getAvailableModules();
}
$user = new User();
if($id) {
$user = $this->userRepository->find($id);
}
$user->setLastname($lastname);
$user->setFirstname($firstname);
$user->setFonction($fonction);
$user->setGender($gender);
$user->setEmail($email);
$user->setMobile($mobile);
$user->setTel($tel);
$user->setRoles($roles_array);
$user->setModules($modules_array);
// Récupérer et définir l'entité
// $entity_id = $request->request->get('entiteAttache', null);
// Si entity_id est null ou vide, on retire l'entité
// if (empty($entity_id)) {
// $user->setEntiteAttache(null);
// } else {
// $entity = $this->entityManager->getRepository(CompanyEntity::class)->find($entity_id);
// if ($entity) {
// $user->setEntiteAttache($entity);
// } else {
// $user->setEntiteAttache(null);
// }
// }
// Gérer les processus
if(count($processuses_array) > 0) {
// Supprimer d'abord tous les processus existants
foreach($user->getProcessuses() as $processus) {
$user->removeProcessus($processus);
}
// Ajouter les nouveaux processus
foreach($processuses_array as $processus_id) {
if (!empty($processus_id)) {
$processus = $this->entityManager->getRepository(Processus::class)->find($processus_id);
if ($processus) {
$user->addProcessus($processus);
}
}
}
}
// Gérer les entités
if(count($entities_array) > 0) {
// Supprimer d'abord toutes les entités existantes
foreach($user->getEntities() as $entity) {
$user->removeEntity($entity);
}
// Ajouter les nouvelles entités
foreach($entities_array as $entity_id) {
if (!empty($entity_id)) {
$entity = $this->entityManager->getRepository(CompanyEntity::class)->find($entity_id);
if ($entity) {
$user->addEntity($entity);
}
}
}
}
// Ne mettre à jour le mot de passe que s'il est fourni
if (!empty($password)) {
$hashedPassword = $passwordHasher->hashPassword(
$user,
$password
);
$user->setPassword($hashedPassword);
}
if ($photo) {
$generatedfileName = md5(uniqid()).'.'.$photo->guessExtension();
$uploadDir = $this->getParameter('kernel.project_dir').'/public/uploads/user/photos';
if (!file_exists($uploadDir) && !is_dir($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
try {
$photo->move(
$uploadDir,
$generatedfileName
);
$user->setPhoto($generatedfileName);
} catch (FileException $e) {
}
}
$this->entityManager->persist($user);
$this->entityManager->flush();
$response = array('id' => $user->getId());
return new JsonResponse($response,200);
}
/**
* @Route("/delete/{id}", name="app_configuration_user_delete", methods={"GET"})
*/
public function delete(User $user, Request $request): Response
{
$this->entityManager->remove($user);
$this->entityManager->flush();
$referer = $request->headers->get('referer');
return $this->redirect($referer);
//return $this->redirectToRoute('surveillanceGlobal');
}
}