<?php
namespace App\Controller\Frontend;
use App\Entity\AttendanceTypes;
use App\Entity\Employee;
use App\Form\Frontend\AttendanceType;
use App\Form\Frontend\PwdChangeType;
use App\Service\FormService;
use App\Service\UserService;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class EmployeeFrontendController extends AbstractController
{
/**
* @var \App\Service\FormService $formService
*/
private FormService $formService;
/**
* @var ManagerRegistry
*/
private ManagerRegistry $doctrine;
/**
* @var \App\Service\UserService $userService
*/
private UserService $userService;
/**
* @param FormService $formService
* @param ManagerRegistry $doctrine
* @param UserService $userService
*/
public function __construct(FormService $formService, ManagerRegistry $doctrine, UserService $userService) {
$this->formService = $formService;
$this->doctrine = $doctrine;
$this->userService = $userService;
}
/**
* @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
*
* @Route ("employee", name="employee")
*/
public function indexAction(Request $request)
{
//$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
/** @var \App\Entity\Employee $user */
$user = $this->getUser();
if (!$user) {
return $this->redirectToRoute('employee_login');
}
$session = $request->getSession();
if($session->has("invalid_logins")){
$session->remove("invalid_logins");
};
if($session->has("invalid_accounts")){
$session->remove("invalid_accounts");
};
/** @var \App\Entity\Locations $location */
$location = $this->userService->getLocation($user);
$repository = $this->doctrine->getRepository(AttendanceTypes::class);
$legend = $repository->findAll();
$form = $this->createForm(AttendanceType::class, null);
$form->add("save", SubmitType::class, [
"label" => "Save",
"attr" => ["class" => "btn btn-primary btn-block"]
]);
return $this->render('frontend/employee/dashboard.html.twig', [
'userName' => $user->getFirstname(),
'user' => $user,
'form' => $form->createView(),
'legend' => $legend,
'locationMaxDays' => json_encode($location->getHasHomeOfficeRequest() ? $location->getHoDaysPerWeek() : 0),
'homeOfficeAvailable' => $location->getHasHomeOfficeRequest(),
]);
}
/**
* @param Request $request
* @param \Swift_Mailer $mailer
* @param UserPasswordEncoderInterface $encoder
* @return Response
* @throws \Exception
*
* @Route ("employee/confirm", name="employee_confirm")
*/
public function confirmAction(Request $request, \Swift_Mailer $mailer, UserPasswordEncoderInterface $encoder)
{
$id = $request->get("id");
$hash = $request->get("hash");
/**
* @var App\Repository\EmployeeRepository $repository
*/
$repository = $this->doctrine->getRepository(Employee::class);
$employee = null;
if(!empty($hash)) {
$employee = $repository->findOneBy(['hash' => $hash]);
}
if(!$employee instanceof Employee || $employee->getId() !== intval($id))
{
return $this->render("frontend/employee/confirm.html.twig", [
"success" => false,
"employee" => null
]);
}
$entityManager = $this->doctrine->getManager();
$random = sha1(random_bytes(10));
$passwordPlain = substr($random, 0, 12);
$password = $encoder->encodePassword($employee, $passwordPlain);
$employee->setPassword($password);
$employee->setHash(null);
$employee->setStatus(1);
$entityManager->flush();
$message = (new \Swift_Message('Your login informations'))
->setFrom('info@op-buce.com')
->setTo($employee->getEmail())
->setBody(
$this->renderView(
'email/employee/login-info.html.twig',
array('employee' => $employee, 'pwd' => $passwordPlain)
),
'text/html'
)
->addPart(
$this->renderView(
'email/employee/login-info.txt.twig',
array('employee' => $employee, 'pwd' => $passwordPlain)
),
'text/plain'
);
$mailer->send($message);
return $this->render("frontend/employee/confirm.html.twig", [
"success" => true,
"employee" => $employee
]);
}
/**
* @param Request $request
* @param AuthenticationUtils $authenticationUtils
* @return Response
*
* @Route ("employee/login", name="employee_login")
*/
public function loginAction(Request $request, AuthenticationUtils $authenticationUtils): Response
{
$session = $request->getSession();
$invalidLogins = $session->has("invalid_logins") ? $session->get("invalid_logins") : 0;
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render("frontend/employee/login.html.twig", [
'last_username' => $lastUsername,
'error' => $error,
'invalid_logins' => $invalidLogins
]);
}
/**
* @Route("employee/login/redirect", name="_login_employee_redirect")
*/
public function loginRedirectAction(){
if($this->get('security.authorization_checker')->isGranted('ROLE_EMPLOYEE') || $this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
return $this->redirectToRoute('employee');
} else {
return $this->redirectToRoute('employee_login');
}
}
/**
* @param Request $request
* @param AuthenticationUtils $authenticationUtils
*
* @Route("employee/logout", name="employee_logout")
*/
public function logoutAction(Request $request, AuthenticationUtils $authenticationUtils){
}
/**
* @return Response
*
* @Route("employee/legal-disclaimer", name="employee_legaldisclaimer")
*/
public function legalDisclaimerAction(){
$user = $this->getUser();
return $this->render("frontend/employee/legal-disclaimer.html.twig", [
'user' => $user,
'data' => !$user ? null : $user->getFirstName()
]);
}
/**
* @param Request $request
* @return JsonResponse
* @throws \Exception
*
* @Route("employee/legal-discalimer/accepted", name="employee_legaldisclaimer_accepted", methods={"POST"})
*/
public function acceptDisclaimerAction(Request $request){
$user = $this->getUser();
if($request->isXmlHttpRequest()) {
$accepted = $request->request->get('accepted');
$em = $this->doctrine->getManager();
$repo = $this->doctrine->getRepository(Employee::class);
$employee = $repo->find($user->getId());
if ($accepted == "false") {
$employee->setDisclaimerAcceptedDate(null);
$employee->setDisclaimerAccepted(false);
} else if ($accepted == "true") {
$now = new \DateTime();
$employee->setDisclaimerAcceptedDate($now);
$employee->setDisclaimerAccepted(true);
}
try {
$em->flush();
return new JsonResponse(['success' => true]);
} catch (\Exception $e) {
return new JsonResponse(['success' => false]);
}
}
return new JsonResponse(['success' => false]);
}
/**
* @param Request $request
* @param \Swift_Mailer $mailer
* @param UserPasswordEncoderInterface $encoder
* @return JsonResponse
* @throws \Exception
*
* @Route("employee/reset-pwd", name="employee_resetpwd", methods={"POST"})
*/
public function generateNewPwd(Request $request, \Swift_Mailer $mailer, UserPasswordEncoderInterface $encoder){
$username = $request->request->get('username');
$email = $request->request->get('email');
$repo = $this->doctrine->getRepository(Employee::class);
$employee = $repo->findOneBy(['username' => $username, 'email' => $email, 'status' => 1, 'hash' => null]);
if(empty($employee) || is_null($employee)){
return new JsonResponse(['success' => false, 'data' => 'User not found or not confirmed.']);
}
$entityManager = $this->doctrine->getManager();
$random = sha1(random_bytes(10));
$passwordPlain = substr($random, 0, 12);
$password = $encoder->encodePassword($employee, $passwordPlain);
$employee->setPassword($password);
$entityManager->flush();
$message = (new \Swift_Message('Reset password'))
->setFrom('info@op-buce.com')
->setTo($employee->getEmail())
->setBody(
$this->renderView(
'email/employee/reset-pwd.html.twig',
array('employee' => $employee, 'pwd' => $passwordPlain)
),
'text/html'
)
->addPart(
$this->renderView(
'email/employee/reset-pwd.txt.twig',
array('employee' => $employee, 'pwd' => $passwordPlain)
),
'text/plain'
);
$mailer->send($message);
return new JsonResponse(['success' => true]);
}
/**
* @param Request $request
* @return JsonResponse
*
* @Route("employee/get-pwd-change-form", name="employee_pwd-change-form")
*/
public function getPwdChangeForm(Request $request)
{
$user = $this->getUser();
if(!$user instanceof Employee) {
return new JsonResponse(['success' => false], 403);
}
$form = $this->createForm(PwdChangeType::class, $user, [
]);
$template = $this->renderView('frontend/employee/password-change-form.html.twig', [
'form' => $form->createView()
]);
return new JsonResponse(['success' => true, 'data' => ['template' => $template]]);
}
/**
* @param Request $request
* @param UserPasswordEncoderInterface $encoder
* @return JsonResponse
*
* @Route("employee/pwd-change", name="employee_pwd-change")
*/
public function setNewPwd(Request $request, UserPasswordEncoderInterface $encoder)
{
$user = $this->getUser();
if(!$user instanceof Employee) {
return new JsonResponse(['success' => false], 403);
}
$form = $this->createForm(PwdChangeType::class, $user);
$form->handleRequest($request);
if($form->isSubmitted()) {
if(!$form->isValid()) {
$errors = $this->formService->getErrorMessages($form);
return new JsonResponse(['success' => false, 'error' => $errors]);
}
if($encoder->isPasswordValid($user, $user->getPlainPassword())){
return new JsonResponse(['success' => false, 'error' => ['Your new password must not the same as your old password.']]);
}
$password = $encoder->encodePassword($user, $user->getPlainPassword());
$user->setPassword($password);
$date = new \DateTime('now');
$user->setPasswordChanged($date);
try {
$em = $this->doctrine->getManager();
$em->flush();
} catch (\Exception $exception) {
return new JsonResponse(['success' => false, 'error' => ['Saving faild. Please try again later']], 500);
}
return new JsonResponse(['success' => true]);
}
return new JsonResponse(['success' => false], 400);
}
}