248 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Controller;
 | |
| 
 | |
| use App\Entity\Supervision;
 | |
| use App\Entity\User;
 | |
| use App\Form\EditUserFormType;
 | |
| use App\Form\SupervisorFormType;
 | |
| use App\Form\UserFormType;
 | |
| use App\Libs\NavList;
 | |
| use App\Repository\UserRepository;
 | |
| use Doctrine\ORM\EntityManagerInterface;
 | |
| use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 | |
| use Symfony\Component\HttpFoundation\Request;
 | |
| use Symfony\Component\HttpFoundation\Response;
 | |
| use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
 | |
| use Symfony\Component\Routing\Annotation\Route;
 | |
| use Symfony\Component\Security\Http\Attribute\CurrentUser;
 | |
| use Symfony\Component\Security\Http\Attribute\IsGranted;
 | |
| 
 | |
| #[IsGranted('ROLE_ADMIN')]
 | |
| class AdminController extends AbstractController
 | |
| {
 | |
|     public function __construct(
 | |
|         private readonly EntityManagerInterface $entityManager,
 | |
|         private readonly UserPasswordHasherInterface $userPasswordHasher,
 | |
|         private array $navLinks = []
 | |
|     ) {
 | |
|         $this->navLinks = NavList::LIST;
 | |
|     }
 | |
| 
 | |
|     #[Route('/admin-dashboard', name: 'app_admin_dashboard')]
 | |
|     public function adminDashboard(#[CurrentUser()] User $user): Response
 | |
|     {
 | |
|         $this->denyAccessUnlessGranted('ROLE_ADMIN');
 | |
|         $this->navLinks['admin_dashboard'] = 'nav-link text-white active bg-gradient-dark';
 | |
| 
 | |
|         return $this->render(
 | |
|             'internal/admin/admin-dashboard.html.twig',
 | |
|             array_merge(
 | |
|                 $this->navLinks,
 | |
|                 [
 | |
|                     'breadcrumbs' => [
 | |
|                         'Admin Dashboard'
 | |
|                     ],
 | |
|                     'notifications' => $user->retrieveUnreadNotifications(),
 | |
|                 ]
 | |
|             )
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     #[Route('/list-users', name: 'app_list_users')]
 | |
|     public function listUsers(#[CurrentUser()] User $user): Response
 | |
|     {
 | |
|         $this->denyAccessUnlessGranted('ROLE_ADMIN');
 | |
| 
 | |
|         /** @var UserRepository $repo */
 | |
|         $repo = $this->entityManager->getRepository(User::class);
 | |
|         $users = $repo->getCompanyUsers($user->getCompany());
 | |
| 
 | |
|         /** @var SupervisionRepository $supRepo */
 | |
|         $supRepo = $this->entityManager->getRepository(Supervision::class);
 | |
|         foreach ($users as $idx => $user) {
 | |
|             $supervisor = $supRepo->getSupervisorByWorker($user);
 | |
|             $users[$idx]->setSupervisor($supervisor);
 | |
|         }
 | |
| 
 | |
|         $this->navLinks['user_list'] = 'nav-link text-white active bg-gradient-dark';
 | |
| 
 | |
|         return $this->render(
 | |
|             'internal/admin/users/list-users.html.twig',
 | |
|             array_merge(
 | |
|                 $this->navLinks,
 | |
|                 [
 | |
|                     'breadcrumbs' => [
 | |
|                         'User List'
 | |
|                     ],
 | |
|                     'users' => $users,
 | |
|                     'notifications' => $user->retrieveUnreadNotifications(),
 | |
|                 ]
 | |
|             )
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     #[Route('/add-user', name: 'app_add_user')]
 | |
|     public function addUser(Request $request, #[CurrentUser()] User $admin): Response
 | |
|     {
 | |
|         $this->denyAccessUnlessGranted('ROLE_ADMIN');
 | |
| 
 | |
|         $user = new User();
 | |
|         $form = $this->createForm(UserFormType::class, $user);
 | |
| 
 | |
|         $form->handleRequest($request);
 | |
| 
 | |
|         if ($form->isSubmitted() && $form->isValid()) {
 | |
|             $plainPassword = $form->get('password')->getData();
 | |
|             $roles = ['ROLE_USER'];
 | |
| 
 | |
|             if ($form->get('caseWorker')->getData()) {
 | |
|                 $roles[] = 'ROLE_CASE_WORKER';
 | |
|             }
 | |
| 
 | |
|             if ($form->get('caseManager')->getData()) {
 | |
|                 $roles[] = 'ROLE_CASE_MANAGER';
 | |
|             }
 | |
| 
 | |
|             if ($form->get('therapist')->getData()) {
 | |
|                 $roles[] = 'ROLE_THERAPIST';
 | |
|             }
 | |
| 
 | |
|             if ($form->get('su')->getData()) {
 | |
|                 $roles[] = 'ROLE_ADMIN';
 | |
|             }
 | |
| 
 | |
|             $user->setUsername($form->get('username')->getData())
 | |
|                  ->setPassword(
 | |
|                      $this->userPasswordHasher->hashPassword(
 | |
|                          $user,
 | |
|                          $plainPassword
 | |
|                      )
 | |
|                  )
 | |
|                  ->setName($form->get('name')->getData())
 | |
|                  ->setEmail($form->get('email')->getData())
 | |
|                  ->setRoles($roles)
 | |
|                  ->setRateType($form->get('rateType')->getData())
 | |
|                  ->setRate($form->get('rate')->getData())
 | |
|                  ->setLevel($form->get('level')->getData())
 | |
|                  ->setCompany($admin->getCompany());
 | |
| 
 | |
|             $this->entityManager->persist($user);
 | |
|             $this->entityManager->flush();
 | |
| 
 | |
|             return $this->redirectToRoute('app_list_users');
 | |
|         }
 | |
| 
 | |
|         $this->navLinks['user_list'] = 'nav-link text-white active bg-gradient-dark';
 | |
| 
 | |
|         return $this->render(
 | |
|             'internal/admin/users/add-user.html.twig',
 | |
|             array_merge(
 | |
|                 $this->navLinks,
 | |
|                 [
 | |
|                     'breadcrumbs' => [
 | |
|                         'Add User'
 | |
|                     ],
 | |
|                     'form' => $form,
 | |
|                     'notifications' => $admin->retrieveUnreadNotifications(),
 | |
|                 ]
 | |
|             )
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     #[Route('/edit-user/{id}', name: 'app_edit_user')]
 | |
|     public function editUser(string $id, Request $request, #[CurrentUser()] User $admin): Response
 | |
|     {
 | |
|         /** @var UserRepository $userRepo */
 | |
|         $userRepo = $this->entityManager->getRepository(User::class);
 | |
| 
 | |
|         /** @var User $user */
 | |
|         $user = $userRepo->find($id);
 | |
| 
 | |
|         $form = $this->createForm(EditUserFormType::class, $user);
 | |
|         $form->handleRequest($request);
 | |
| 
 | |
|         $this->navLinks['user_list'] = 'nav-link text-white active bg-gradient-dark';
 | |
| 
 | |
|         if ($form->isSubmitted() && $form->isValid()) {
 | |
|             $user->setName($form->get('name')->getData())
 | |
|                  ->setEmail($form->get('email')->getData())
 | |
|                  ->setCaseWorker($form->get('caseWorker')->getData())
 | |
|                  ->setCaseManager($form->get('caseManager')->getData())
 | |
|                  ->setTherapist($form->get('therapist')->getData())
 | |
|                  ->setSu($form->get('su')->getData())
 | |
|                  ->setRateType($form->get('rateType')->getData())
 | |
|                  ->setRate($form->get('rate')->getData())
 | |
|                  ->setLevel($form->get('level')->getData());
 | |
| 
 | |
|             $this->entityManager->persist($user);
 | |
|             $this->entityManager->flush();
 | |
| 
 | |
|             return $this->redirectToRoute('app_list_users');
 | |
|         }
 | |
| 
 | |
|         return $this->render(
 | |
|             'internal/admin/users/edit-user.html.twig',
 | |
|             array_merge(
 | |
|                 $this->navLinks,
 | |
|                 [
 | |
|                     'breadcrumbs' => [
 | |
|                         'Edit User'
 | |
|                     ],
 | |
|                     'data' => $user,
 | |
|                     'form' => $form,
 | |
|                     'notifications' => $admin->retrieveUnreadNotifications(),
 | |
|                 ]
 | |
|             )
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     #[Route('/assign-supervisor/{id}', name: 'app_assign_supervisor')]
 | |
|     public function assignSupervisor(string $id, Request $request, #[CurrentUser()] User $admin): Response
 | |
|     {
 | |
|         /** @var UserRepository $userRepo */
 | |
|         $userRepo = $this->entityManager->getRepository(User::class);
 | |
| 
 | |
|         /** @var User $user */
 | |
|         $user = $userRepo->find($id);
 | |
|         $prevSup = $this->entityManager->getRepository(Supervision::class)->findBy(['user' => $user]);
 | |
| 
 | |
|         $form = $this->createForm(SupervisorFormType::class);
 | |
|         $form->handleRequest($request);
 | |
| 
 | |
|         if ($form->isSubmitted() && $form->isValid()) {
 | |
|             $supervisor = $form->get('supervisor')->getData();
 | |
| 
 | |
|             if (count($prevSup) > 0) {
 | |
|                 $this->entityManager->remove($prevSup[0]);
 | |
|                 $this->entityManager->flush();
 | |
|             }
 | |
| 
 | |
|             $sup = new Supervision();
 | |
|             $sup->setSupervisor($supervisor);
 | |
|             $sup->setWorker($user);
 | |
| 
 | |
|             $this->entityManager->persist($sup);
 | |
|             $this->entityManager->flush();
 | |
| 
 | |
|             return $this->redirectToRoute('app_list_users');
 | |
|         }
 | |
| 
 | |
|         return $this->render(
 | |
|             'internal/admin/assign-supervisor.html.twig',
 | |
|             array_merge(
 | |
|                 $this->navLinks,
 | |
|                 [
 | |
|                     'breadcrumbs' => [
 | |
|                         'Assign Supervisor'
 | |
|                     ],
 | |
|                     'data' => $user,
 | |
|                     'form' => $form,
 | |
|                     'supervisors' => $userRepo->getCaseManagers($admin->getCompany()),
 | |
|                     'notifications' => $admin->retrieveUnreadNotifications(),
 | |
|                 ]
 | |
|             )
 | |
|         );
 | |
|     }
 | |
| }
 |