<?php
namespace App\Controller\CompteClient;
use App\Constants\CompteClientConstants;
use App\Constants\FicheConstant;
use App\Constants\TemplateConstants;
use App\Manager\CompteClient\CompteClientListManager;
use App\Manager\Dossier\DossierListManager;
use App\Manager\FichePersonne\FichePersonneListManager;
use App\Manager\Sendinblue\SendinblueManager;
use App\Manager\Template\TemplateListManager;
use App\Repository\CentreRepository;
use App\Repository\CompteClientRepository;
use App\Repository\FicheFonctionRepository;
use App\Repository\HoraireFicheJourRepository;
use App\Repository\HoraireFicheRepository;
use App\Services\Metier\CentreServicesParametresSM;
use App\Traitement\CompteClientTraitement;
use App\Traitement\HoraireFicheTraitement;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class GestionCompteClientController extends AbstractController
{
private CentreServicesParametresSM $csp;
public function __construct(CentreServicesParametresSM $csp)
{
$this->csp = $csp;
}
/**
* @Route("/mot-de-passe-oublier", name="compte_client_mot_de_passe_oublier")
*/
public function motDePasseOublier(Request $request, CompteClientRepository $compteRepository, CentreRepository $centreRepository ): Response
{
return $this->render('compte_client/mot_de_passe_oublier.html.twig');
}
/**
* @Route("/verification-email-mot-de-passe", name="compte_client_verification_email_mot_de_passe_oublier")
*
* @param Request $request
* @param CompteClientRepository $compteRepository
* @return JsonResponse
*/
public function checkEmailSendCodeMotDePassOublier(Request $request, ManagerRegistry $doctrine, CompteClientRepository $compteRepository, CentreRepository $centreRepository ): JsonResponse
{
$form = $request->request->all();
if ($this->isCsrfTokenValid('check-email-compte', $form['token'])){
$email = $form['email'];
$user = $compteRepository->findOneBy(['email' => $email]);
$em = $doctrine->getManager();
if(is_object($user) && $user->getEtat() != CompteClientConstants::ETAT_FERME){
$recupCode = '';
for ($i = 0; $i < 8; $i++) {
$recupCode .= mt_rand(0, 9);
}
$user->setRecupCode($recupCode)
->setRecupCodeTimer(new \DateTime());
$em->persist($user);
$em->flush();
$dossier = DossierListManager::getDossierByCompteClientDQL($em, $user->getId());
if(isset($dossier[0]) && is_object($dossier[0])) {
$centre = $centreRepository->findOneBy(['idCentre' => $dossier[0]->getIdCentre()]);
$param['data'] = array('username'=>$email, 'recup_code'=>$recupCode);
$template = TemplateListManager::getTemplateByCodeAndIdCentre($em,TemplateConstants::RECUPERATION_MOT_DE_PASSE, $centre->getIdCentre());
$param['idTemplate'] = $template->getIdSendiblue();
$cleApi = $this->csp->getBrevoApiKey();
$resSendinblue = SendinblueManager::sendinBlueEmailInCallWithParam($email, $cleApi, $param);
if($resSendinblue['statut']){
$res = array('success' => true);
} else {
$res = array('success' => false, 'msg' => $resSendinblue['erreur']);
}
}else{
$res = array("success" => false, "msg" => "Impossible de trouver le dossier du compte client. Merci de nous contacter");
}
$res = array('success' => true);
}else if(is_object($user) && $user->getEtat() == CompteClientConstants::ETAT_FERME) {
$res = array("success" => false, "msg" => "Votre compte a été fermé. Merci de nous contactez");
}else{
$res = array("success" => false, "msg" => "Votre adresse email est inconnue");
}
}else{
$res = array("success" => false, "msg" =>"Le token du formulaire est invalide");
}
return new JsonResponse($res);
}
/**
* @Route("/code-confirmation", name="compte_client_code_confirmation_mot_de_passe_oublier")
*
* @param Request $request
* @param CompteClientRepository $compteRepository
* @return JsonResponse
*/
public function codeConfirmationMotDePasseOublier(Request $request, ManagerRegistry $doctrine, CompteClientRepository $compteRepository): JsonResponse
{
$form = $request->request->all();
if ($this->isCsrfTokenValid('code-confirmation', $form['token'])){
$em = $doctrine->getManager();
$email = $form['email'];
$user = $compteRepository->findOneBy(['email' => $email]);
if(is_object($user)){
$code = $form['code-confirmation'];
$newmdp = $form['password-new'];
$validiteCode = 3600;
$codeBase = $user->getRecupCode();
$codeCreation = $user->getRecupCodeTimer();
if ($code !== $codeBase) {
$res = array('success' => false, 'msg' => 'Erreur, le code de confirmations est incorrecte');
} else {
$timer = $codeCreation->getTimestamp();
$max = $timer + $validiteCode;
$nowDate = new \DateTime();
$now = $nowDate->getTimestamp();
$seconde = $max - $now;
if ($seconde > 0) {
$dataPassword = CompteClientTraitement::generateHashPasswordAndSalt($newmdp);
$user->setPassword($dataPassword['password'])
->setSalt($dataPassword['salt']);
$em->persist($user);
$em->flush();
$res = array('success' => true);
} else {
$res = array('success' => false, 'msg' => 'Erreur, le code de récupération n\'est plus valide');
}
}
}else{
$res = array("success" => false, "msg" => "Votre adresse email est inconnue");
}
}else{
$res = array("success" => false, "msg" =>"Le token du formulaire est invalide");
}
return new JsonResponse($res);
}
/**
* @Route("/client/teams", name="connect_compte_client_teams")
*
* @param Request $request
* @return void
*/
public function teamCompteClient(Request $request, ManagerRegistry $doctrine, FicheFonctionRepository $ficheFonctionRepository, HoraireFicheRepository $horaireFicheRepository, HoraireFicheJourRepository $horaireFicheJourRepository)
{
$em = $doctrine->getManager();
$idCompteClient = $this->getUser()->getId();
$dossier = DossierListManager::getDossierByCompteClientDQL($em, $idCompteClient);
$listeTeam = [];
$teamFonctions = [];
$ficheFonctions = [];
$teamFiche = [];
$horaires =[];
if(isset($dossier[0])){
$listeTeam = CompteClientListManager::getAllCompteClientByIdDossierEtatNonFermer($em, $dossier[0]->getIdDossier());
foreach ($listeTeam as $t) {
$fiches = FichePersonneListManager::getFichePersonneByIdDossierAndIdCompteClient($em, $dossier[0]->getIdDossier(), $t->getId());
$teamFiche[$t->getId()] = $fiches;
foreach ($fiches as $fi) {
$fonctions = $ficheFonctionRepository->findBy(['fiche' => $fi]);
foreach ($fonctions as $f) {
$teamFonctions[$t->getId()][$f->getFonction()->getIdFonction()] = $f->getFonction()->getLibelle();
$ficheFonctions[$t->getId()][$fi->getIdPersonne()][] = $f->getFonction()->getLibelle();
}
$horaires[$fi->getIdPersonne()] = HoraireFicheTraitement::getHoraireFiche($horaireFicheRepository, $horaireFicheJourRepository, $fi->getIdPersonne(), FicheConstant::FICHE_PERSONNE);
}
}
}else{
throw $this->createNotFoundException();
}
return $this->render('compte_client/team.html.twig', array('liste' => $listeTeam, 'fiches' => $teamFiche, 'fonctions' => $teamFonctions, 'ficheFonctions' => $ficheFonctions, 'horaires' => $horaires));
}
/**
* @Route("/client/mon-compte", name="connect_compte_client_mon_compte")
*
* @param Request $request
* @param CompteClientRepository $compteRepository
* @return void
*/
public function monCompteClient(Request $request, CompteClientRepository $compteRepository)
{
$user = $this->getUser();
return $this->render('compte_client/mon_compte.html.twig');
}
/**
* @Route("/client/mise-a-jour/information", name="connect_compte_client_mise_a_jour_information", methods={"POST"})
*
* @param Request $request
* @param CompteClientRepository $compteRepository
* @return JsonResponse
*/
public function majInformationCompteClient(Request $request, ManagerRegistry $doctrine, CompteClientRepository $compteRepository)
{
$post = $request->request->all();
$em = $doctrine->getManager();
if($this->getUser()){
$compte = $compteRepository->find($this->getUser()->getId());
if($post['date-naissance'] !== ''){
$dateNaiss = \DateTime::createFromFormat('d/m/Y', $post['date-naissance']);
$compte->setDateNaissance($dateNaiss);
}
if($post['date-embauche'] !== ''){
$dateEmb = \DateTime::createFromFormat('d/m/Y', $post['date-embauche']);
$compte->setDateEmbauche($dateEmb);
}
$em->persist($compte);
$em->flush();
$res = array('success' => true);
}else{
$res = array('success' => false);
}
return new JsonResponse($res);
}
/**
* @Route("/client/mise-a-jour/notification", name="connect_compte_client_mise_a_jour_notification", methods={"POST"})
*
* @param Request $request
* @param CompteClientRepository $compteRepository
* @return JsonResponse
*/
public function majNotificationCompteClient(Request $request, ManagerRegistry $doctrine, CompteClientRepository $compteRepository)
{
$post = $request->request->all();
$em = $doctrine->getManager();
if($this->getUser()){
$compte = $compteRepository->find($this->getUser()->getId());
if(isset($post['notification-anniversaire'])){
$compte->setAnnivCompte(true);
}else{
$compte->setAnnivCompte(false);
}
if(isset($post['notification-collegue'])){
$compte->setAnnivCollegue(true);
}else{
$compte->setAnnivCollegue(false);
}
$em->persist($compte);
$em->flush();
$res = array('success' => true);
}else{
$res = array('success' => false);
}
return new JsonResponse($res);
}
/**
* @Route("/client/mise-a-jour/mot-de-passe", name="connect_compte_client_mise_a_jour_password", methods={"POST"})
*
* @param Request $request
* @param CompteClientRepository $compteRepository
* @return JsonResponse
*/
public function majPasswordCompteClient(Request $request, ManagerRegistry $doctrine, CompteClientRepository $compteRepository)
{
$post = $request->request->all();
$em = $doctrine->getManager();
if($this->getUser()){
$compte = $compteRepository->find($this->getUser()->getId());
$passActuel = CompteClientTraitement::generateHashPasswordBySalt($post['current_password'], $compte->getSalt());
if($passActuel == $compte->getPassword()){
if($post['new_password'] == $post['confirm_password'] && strlen($post['new_password']) > 7){
$dataPassword = CompteClientTraitement::generateHashPasswordAndSalt($post['new_password']);
$compte->setPassword($dataPassword['password'])
->setSalt($dataPassword['salt']);
$em->persist($compte);
$em->flush();
$res = array('success' => true);
}else{
$res = array('success' => false, 'msg' => "Les mots de passe ne sont pas identique ou ne respectent pas le bon format requis. Veuillez réessayer votre saisie");
}
}else{
$res = array('success' => false, 'msg' => "Le mot de passe actuel est incorrect. Veuillez réessayer ou faire mot de passe oublié");
}
}else{
$res = array('success' => false, 'msg' => "Vous devez vous connecter pour avoir le droit de faire cette action");
}
return new JsonResponse($res);
}
}