<?php
namespace App\Controller\Admin;
use App\Entity\Training\Groupe;
use App\Entity\User;
use App\Form\Admin\UserType;
use App\Form\Admin\ProfileType;
use App\Repository\Formation\ApaymentRepository;
use App\Repository\Formation\ClasseRepository;
use App\Repository\Formation\TrashapaymentRepository;
use App\Repository\Training\FpaymentRepository;
use App\Repository\Training\GroupeRepository;
use App\Repository\Training\TrashfpaymentRepository;
use App\Repository\Tutoring\CourseRepository;
use App\Repository\Tutoring\SpaymentRepository;
use App\Repository\Tutoring\TrashspaymentRepository;
use App\Repository\UserRepository;
use App\Service\PrintLogService;
use App\Service\SchoolyearService;
use App\Service\Securizer;
use Ensepar\Html2pdfBundle\Factory\Html2pdfFactory;
use Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use DateTime;
#[Route('admin/user')]
class UserController extends AbstractController
{
public function __construct(private readonly UserRepository $userRepository)
{
}
#[Route('/{role}/{stat}', name: 'hs_training_center_user_index', requirements: ['role' => 'trainees|formers|administrators|all'], options: ['expose' => true], defaults: ['role' => 'all', 'stat' => true], methods: ['GET'])]
public function index($role, $stat, UserRepository $userRepository, Securizer $securizer, SchoolyearService $schoolyear): Response
{
//$users=$userRepository->findAll();
$items=[];
switch ($role) {
case 'trainees':
// foreach ($users as $user) {
// if ($user->hasRole('ROLE_TRAINEE')) $items[] = $user;
// }
$items=$this->userRepository->findHaveRoles(['ROLE_TRAINEE']);
break;
case 'formers':
// foreach ($users as $user) {
// if ($user->hasRole('ROLE_TEACHER_TRAINING')) $items[] = $user;
// }
$items=$this->userRepository->findHaveRoles(['ROLE_TEACHER_TRAINING']);
break;
case 'administrators':
$users=$userRepository->findAll();
foreach ($users as $user) {
if($this->getUser()->hasParentRole($user)){
if($stat!=null) {
if ($securizer->isGranted($user, 'ROLE_ADMIN') && $user->isPublished()==$stat) $items[] = $user;
}
else {
if ($securizer->isGranted($user, 'ROLE_ADMIN')) $items[] = $user;
}
}
}
break;
default:
$users=$userRepository->findAll();
foreach ($users as $user) {
if (!$securizer->isGranted($user, 'ROLE_ADMIN')) $items[] = $user;
}
break;
}
return $this->render('Admin/user/index.html.twig', [
'users' => $items,
'role' => $role,
'genre'=> $role,
'stat' => $stat,
'sy' => $schoolyear->getSelected(),
]);
}
#[Route('/new/{role}', name: 'hs_training_center_user_new', options: ['expose' => true], defaults: ['role' => 'all'], methods: ['GET', 'POST'])]
public function new($role, Request $request, UserRepository $userRepository, UserPasswordHasherInterface $passwordEncoder): Response
{
$user = new User();
$form = $this->createForm(UserType::class, $user, ['operation'=>'new']);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
try {
if ($userRepository->findOneBy(['email' => $user->getEmail()])) {
$this->addFlash('danger', 'Le matricule ou l\'adresse email qui vous avez renseigné existe déjà.');
}
else{
$user->setPassword(
$passwordEncoder->hashPassword(
$user,
$form->get('plainPassword')->getData()
)
);
$roles=$form->get('roles')->getData();
if(is_array($roles)) $user->setRoles($roles);
else $user->addRole($roles);
$userRepository->save($user, true);
$gotonext='edit';
if($form->get('SaveList')->isClicked()) $gotonext='index';
if($form->get('SaveNew')->isClicked()) $gotonext='new';
return $this->gotonext($gotonext, $role,'success','Opération exécutée avec success.',$user);
}
} catch (Exception $e) {
$this->addFlash('danger', $e->getMessage());
}
}
return $this->renderForm('Admin/user/form.html.twig', [
'item' => $user,
'form' => $form,
'role' => $role,
'type'=>'new'
]);
}
#[Route('/show/{id}', name: 'hs_training_center_user_show', options: ['expose' => true], methods: ['GET'])]
public function show(User $user, SchoolyearService $schoolyearService): Response
{
return $this->render('Admin/user/show.html.twig', [
'item' => $user,
'role' => $user->getTypeUser(),
'schoolyear' => $schoolyearService->getSelected(),
]);
}
#[Route('/{id}/edit/{role}', name: 'hs_training_center_user_edit', options: ['expose' => true], defaults: ['role' => 'all'], methods: ['GET', 'POST'])]
public function edit($role, Request $request, User $user, UserRepository $userRepository): Response
{
$form = $this->createForm(UserType::class, $user, ['operation'=>'edit']);
$form->handleRequest($request);
if($role=='all' || $role=='') $role=$user->getTypeUser();
if ($form->isSubmitted() && $form->isValid()) {
$roles=$form->get('roles')->getData();
if(is_array($roles)) $user->setRoles($roles);
else $user->addRole($roles);
$userRepository->save($user, true);
$gotonext='edit';
if($form->get('SaveList')->isClicked()) $gotonext='index';
if($form->get('SaveNew')->isClicked()) $gotonext='new';
return $this->gotonext($gotonext, $role,'success','Opération exécutée avec success.',$user);
}
return $this->renderForm('Admin/user/form.html.twig', [
'item' => $user,
'form' => $form,
'role' => $role,
'type'=>'edit'
]);
}
#[Route('/remove/{id}', name: 'hs_training_center_user_remove', options: ['expose' => true])]
public function delete(Request $request, User $user, UserRepository $userRepository): Response
{
$role=$user->getTypeUser();
//if ($this->isCsrfTokenValid('delete'.$user->getId(), $request->request->get('_token'))) {
$userRepository->remove($user, true);
// }
return $this->redirectToRoute('hs_training_center_user_index', ['role' => $role], Response::HTTP_SEE_OTHER);
}
// #[Route('/payment_state/{user}/{start}/{end}', name: 'hs_training_center_user_payment_state', options: ['expose' => true], defaults: ['user' => 'me'], methods: ['POST'])]
#[Route(path: '/statut/{id}', name: 'hs_training_center_user_statut', options: ['expose' => true])]
public function statutAction($id)
{
$user=$this->userRepository->find($id);
if (empty($user)) {
$this->addFlash('warning','User introuvable !!!! ');
return $this->redirectToRoute('hs_training_center_user_index');
}
if($user->isPublished()) {
$user->setPublished(false);
} else {
$user->setPublished(true);
}
$button=$user->getButtonEnable();
$this->userRepository->save($user, true);
return new Response($button);
}
#[Route(path: '/payment_state/{user}/{service}/{start}/{end}', name: 'hs_training_center_user_payment_state', options: ['expose' => true], defaults: ['user' => 'me', 'service' => "all"])]
public function paymentStateAction($user, $service, $start, $end,
UserRepository $userRepository,
FpaymentRepository $repF,
SpaymentRepository $repS,
ApaymentRepository $repA,
TrashfpaymentRepository $repTF,
TrashspaymentRepository $repTS,
TrashapaymentRepository $repTA,
Html2pdfFactory $html2pdfFactory){
$datestart=DateTime::createFromFormat('d-m-Y H:i', $start." 00:00");
$dateend=DateTime::createFromFormat('d-m-Y H:i', $end." 23:59");
if($user=="me"){
$user=$this->getUser();
if($this->isGranted('ROLE_RESPONSABLE')) $user=null;
}
else{
$user=$userRepository->find($user);
if(!($user instanceof User)){$user=$this->getUser();}
}
$itemsA=$repA->findByInitier($user, $datestart, $dateend);
$itemsS=$repS->findByInitier($user, $datestart, $dateend);
$itemsF=$repF->findByInitier($user, $datestart, $dateend);
$itemsTA=$repTA->findByInitier($user, $datestart, $dateend);
$itemsTS=$repTS->findByInitier($user, $datestart, $dateend);
$itemsTF=$repTF->findByInitier($user, $datestart, $dateend);
$html = $this->renderView('Admin/user/payment_state.html.twig', ['user'=>$user,'itemsTA'=>$itemsTA,'itemsTS'=>$itemsTS,'itemsTF'=>$itemsTF,'itemsA'=>$itemsA,'itemsS'=>$itemsS,'itemsF'=>$itemsF,'end'=>$dateend,'start'=>$datestart, 'service'=>$service]);
$html2pdf = $html2pdfFactory->create();
$html2pdf->pdf->SetDisplayMode('real');
$html2pdf->pdf->SetTitle('payment_state_'.$start.'_'.$end);
$html2pdf->writeHTML($html);
return new Response($html2pdf->Output('payment_state_'.$start.'_'.$end.'.pdf'), 200, ['Content-Type' => 'application/pdf']);
}
#[Route('/change-password/{id}', name: 'hs_training_center_user_change_password', options: ['expose' => true])]
public function changePassword(User $user, Request $request, UserRepository $userRepository, UserPasswordHasherInterface $passwordEncoder): Response
{
$cuurentUser = $this->getUser();
$url = $request->headers->get('referer');
if (!$user || !$cuurentUser || $cuurentUser->getId() === $user->getId()) {
$this->addFlash('warning', 'Vous ne pouvez pas changer votre mot de passe ici !');
return new RedirectResponse($url);
}
$role=$user->getTypeUser();
if ($request->isMethod('POST')) {
//$currentPassword = $request->request->get('current_password');
$newPassword = $request->request->get('new_password');
$encodedPassword = $passwordEncoder->hashPassword($user, $newPassword);
$user->setPassword($encodedPassword);
$userRepository->save($user, true);
// Redirection vers une page ou un message de succès
$this->addFlash('success', 'Votre mot de passe a bien été mis à jour.');
return $this->redirectToRoute('hs_training_center_user_index', ['role'=>$role]);
}
return $this->render('Admin/user/change_password.html.twig', ['user' => $user]);
}
#[Route('/my-profile', name: 'hs_training_center_user_profile', options: ['expose' => true], methods: ['GET'])]
public function profile(SchoolyearService $schoolyearService): Response
{
$user = $this->getUser();
$form = $this->createForm(ProfileType::class, $user);
return $this->render('Admin/user/profile.html.twig', [
'item' => $user,
'role' => $user->getTypeUser(),
'schoolyear' => $schoolyearService->getSelected(),
'form' => $form->createView(),
]);
}
#[Route('/list-users/responsables/{id}', name: 'hs_training_center_user_list_responsables', options: ['expose' => true], methods: ['GET'])]
public function getListResponsables(User $origine, UserRepository $userRepository, Securizer $securizer)
{
$users=$userRepository->findAll();
$respTraining=[];
$respTutoring=[];
$respFormation=[];
foreach ($users as $user) {
if ($securizer->isGranted($user, 'ROLE_SECRETARY_TRAINING') && !$securizer->isGranted($user, 'ROLE_SUPER_ADMIN') && $user->isPublished() && $user!==$origine) $respTraining[] = $user;
if ($securizer->isGranted($user, 'ROLE_SECRETARY_TUTORING') && !$securizer->isGranted($user, 'ROLE_SUPER_ADMIN') && $user->isPublished() && $user!==$origine) $respTutoring[] = $user;
if ($securizer->isGranted($user, 'ROLE_SECRETARY_ACTIVITY') && !$securizer->isGranted($user, 'ROLE_SUPER_ADMIN') && $user->isPublished() && $user!==$origine) $respFormation[] = $user;
}
return $this->render('Admin/user/list_responsables.html.twig', [
'respTraining' => $respTraining,
'respTutoring' => $respTutoring,
'respFormation' => $respFormation,
'origine' => $origine
]);
}
#[Route('/reassignment_responsable/{id}', name: 'hs_training_center_user_reassignment_responsable', options: ['expose' => true], methods: ['POST'])]
public function reassignmentResponsable(User $origine, UserRepository $userRepository, GroupeRepository $groupeRepository, CourseRepository $courseRepository, ClasseRepository $classeRepository, Request $request)
{
$respTutoringId = $request->request->get('resp_tutoring_id');
$respTrainingId = $request->request->get('resp_training_id');
$respActivityId = $request->request->get('resp_activity_id');
try {
if(!$origine->getGroupes()->isEmpty()){
$respTraining=$userRepository->find($respTrainingId);
if(!$respTraining instanceof User) return new JsonResponse(['status' => 0, 'message' => "Responsable introuvable !!!"]);
foreach ($origine->getGroupes() as $groupe) {
$groupe->setResponsable($respTraining);
$groupeRepository->save($groupe, true);
}
}
if(!$origine->getCourses()->isEmpty()){
$respTutoring=$userRepository->find($respTutoringId);
if(!$respTutoring instanceof User) return new JsonResponse(['status' => 0, 'message' => "Responsable introuvable !!!"]);
foreach ($origine->getCourses() as $course){
$course->setResponsable($respTutoring);
$courseRepository->save($course, true);
}
}
if(!$origine->getClasses()->isEmpty()){
$respActivity=$userRepository->find($respActivityId);
if(!$respActivity instanceof User) return new JsonResponse(['status' => 0, 'message' => "Responsable introuvable !!!"]);
foreach ($origine->getClasses() as $classe){
$classe->setResponsable($respActivity);
$classeRepository->save($classe, true);
}
}
}catch (Exception $e) {
return new JsonResponse(['status' => 0, 'message' => "Impossible de changer le responsable !!!"]);
}
$origine->setPublished(false);
$userRepository->save($origine, true);
return new JsonResponse(['status' => 1, 'message' => $origine->getButtonEnable()]);
}
#[Route('/update-profile', name: 'hs_training_center_user_update_profile', options: ['expose' => true], methods: ['POST'])]
public function updateProfile(Request $request, UserRepository $userRepository): Response
{
$user = $this->getUser();
$profile = $request->request->get('profile');
$firstName = $profile['firstName'] ?? null;
$lastName = $profile['lastName'] ?? null;
$phone = $profile['phone'] ?? null;
$skin = $profile['skin'] ?? null;
if (!$user) {
return new JsonResponse(['status' => 0, 'message' => 'Utilisateur invalide.']);
}
if ($skin) $user->setSkin($skin);
if ($firstName !== null) $user->setFirstName($firstName);
if ($lastName !== null) $user->setLastName($lastName);
if ($phone !== null) $user->setPhone($phone);
$userRepository->save($user, true);
return new JsonResponse(['status' => 1, 'message' => 'Profil mis à jour avec succès.']);
}
#[Route('/update-skin', name: 'hs_training_center_user_update_skin', options: ['expose' => true], methods: ['POST'])]
public function updateSkin(Request $request, UserRepository $userRepository): JsonResponse
{
$skin = $request->request->get('skin');
if (!$skin) {
return new JsonResponse(['status' => 0, 'message' => 'Aucun skin fourni.'], 400);
}
$user = $this->getUser();
$user->setSkin($skin);
$userRepository->save($user, true);
return new JsonResponse(['status' => 1, 'message' => 'Skin mis à jour avec succès.']);
}
public function gotonext($action, $role, $label, $message, User $user){
$this->addFlash($label,$message);
$route='hs_training_center_user_'.$action;
if($action=='edit')
return $this->redirectToRoute($route, ['id'=>$user->getId(), 'role'=>$role]);
else
return $this->redirectToRoute($route, ['role'=>$role]);
}
}