<?php
namespace App\Controller;
use App\App;
use App\Entity\AgencyDocument;
use App\Entity\ApplicationInfo;
use App\Entity\Agency;
use App\Entity\Badge;
use App\Entity\RentalRecord;
use App\Entity\RentalRecordFile;
use App\Entity\UserApplication;
use App\Entity\User;
use App\Entity\DiscountCoupon;
use App\Form\AgencyDocumentForm;
use App\Form\AgencyType;
use App\Form\ApplicationEditForm;
use App\Form\ApplicationForm;
use App\Form\ApplicationProfilForm;
use App\Form\UserApplicationForm;
use App\Form\GuarantorApplicationForm;
use App\Form\UserDocumentApplicationForm;
use App\Form\BadgeForm;
use App\Form\PasswordChangeForm;
use App\Form\PasswordResetForm;
use App\Form\UserProfileForm;
use App\Form\UserRegistrationForm;
use App\Security\LoginFormAuthenticator;
use App\Service\FileUploader;
use App\Service\DfcService;
use App\Service\MailSender;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class UserController extends AbstractController
{
private $authenticationUtils;
/**
* @var MailSender
*/
private $mailSender;
public function __construct(MailSender $mailSender,AuthenticationUtils $authenticationUtils)
{
$this->mailSender = $mailSender;
$this->authenticationUtils = $authenticationUtils;
}
/**
* @Route("/register", name="user_register")
*/
public function registerAction(Request $request)
{
if ($this->getUser() instanceof User) {
return $this->redirectToRoute('homepage');
}
$em = $this->getDoctrine()->getManager();
$user = new User();
$form = $this->createForm(UserRegistrationForm::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$account = $form->getData();
$account->setRoles(['ROLE_USER']);
$is_pro = $request->request->get('is_pro');
if(isset($is_pro) && $request->request->get('is_pro') == 'on'){
$account->setRoles(['ROLE_PRO']);
}
$account->setCreatedAt(new \DateTime());
$account->setUsername('');
$ip = $request->getClientIp();
$account->setIpAddress($ip);
$token = rtrim(strtr(base64_encode(random_bytes(32)), '+/', '-_'), '=');
$account->setValidationToken($token);
$account->setStatus(User::STATUS_INACTIVE);
$em->persist($account);
$em->flush();
$this->mailSender->sendActivationCode($account);
$this->addFlash('report', "Vous allez recevoir un e-mail de confirmation à l'adresse que vous avez saisie!");
return $this->redirectToRoute('homepage');
}
return $this->render('user/register.html.twig', [
'form' => $form->createView(),
'_target_path' => $request->get('_target_path')
]);
}
/**
* Complete profil
* @return Response
* @Route("/complete/profil", name="complete_profil")
*/
public function completeProfilAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
if (in_array('ROLE_PRO', $user->getRoles()) && $user->getAgency() != null) {
return $this->redirectToRoute('homepage');
}
$agencyForm = $this->createForm(AgencyType::class, $user->getAgency());
$agencyForm->handleRequest($request);
if ($agencyForm->isSubmitted() && $agencyForm->isValid()) {
if (in_array('ROLE_PRO',$user->getRoles()) ) {
$agencyData = $request->get('agency');
$agency = $user->getAgency() == null ? new Agency() : $user->getAgency();
$agency->setName($agencyData['name']);
$agency->setAddress($agencyData['address']);
$agency->setSiren($agencyData['siren']);
$agency->setWebsite($agencyData['website']);
$agency->setPhone($agencyData['phone']);
$agency->setCertified(false);
$agency->setStatus(1);
if($agency->getId()==null){
$em->persist($agency);
}
$em->flush();
$user->setFirstname($agencyData['firstname']);
$user->setLastname($agencyData['lastname']);
$this->createUsername($user);
$user->setAgency($agency);
$em->flush();
$message = '<p>Félicitation! Votre compte est activé!</p>';
$this->addFlash('success', $message);
}else{
$message = '<p>Vous n’êtes pas inscrite en tant qu’agence!</p>';
$this->addFlash('error', $message);
}
return $this->redirectToRoute('homepage');
}
return $this->render('user/complete_profil.html.twig',[
'form' => $agencyForm->createView()
]);
}
/**
* Get profile
* @param Get dfc profile
* @param Request $request
* @return Response
* @Route("/get_dfc_profile", name="get_dfc_profile")
*/
public function getDFCProfile(Request $request,DfcService $dfc)
{
if ($request->isMethod(Request::METHOD_GET)) {
$tenantId = $request->get('tenant_id');
if(isset($tenantId)){
try{
$em = $this->getDoctrine()->getManager();
$application = $em->getRepository('App\Entity\ApplicationInfo')->findOneBy(['tenantId' => $tenantId]);
if($application!=null){
return new JsonResponse(['error' => false,"response" => $dfc->getProfile($application,$em)]);
}
}
catch (\Exception $ex){
return new JsonResponse(['error' => true,'message'=>$ex->getMessage()]);
}
}
}
return new JsonResponse(['error' => true,'message'=>"Requête invalide!"]);
}
/**
* Publish new review
* @return Response
* @Route("/search_action", name="search_action")
*/
public function searchAction()
{
return $this->render('user/search_form.html.twig',[]);
}
/**
* @Route("/activate-account/{token}", name="activate_account")
*/
public function activateAccountAction($token,Request $request)
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('App\Entity\User')
->findOneBy(['validationToken' => $token]);
if ($user === null) {
throw new NotFoundHttpException('Le lien que vous avez suivi n\'existe pas ou a expiré');
}
if (in_array('ROLE_PRO',$user->getRoles()) ) {
$user->setStatus(User::STATUS_ACTIVE);
}
$user->setValidationToken(null);
$em->flush();
$this->mailSender->sendWelcomeUser($user);
$message = '<p class="text-center">Bienvenue sur Emotiqhome</p><br>';
$message = $message . "Votre compte est activé !"."<br>";
$message = $message . "Pour pouvoir accéder à toutes les fonctionnalités compléter votre profil en moins d'une minute !"."<br>";
$this->addFlash('report', $message);
$reviews = $em->getRepository('App\Entity\Review')->findAll(['user' => $user]);
foreach ($reviews as $review) {
$review->setStatus(1);
}
$em->flush();
return $this->get('security.authentication.guard_handler')
->authenticateUserAndHandleSuccess(
$user,
$request,
$this->get(LoginFormAuthenticator::class),
'main'
);
}
/**
* @Route("/nonactivate-account", name="nonactivate_account")
*/
public function nonActivateAccountAction()
{
$message = '<h1 class="text-center"><b>Finalisez votre inscription</b>'."</h1><br>";
$message = $message . "Pour finaliser votre inscription, rendez-vous dans votre boîte e-mail pour activer votre compte.!"."<br>";
$this->addFlash('report', $message);
return $this->redirectToRoute('security_logout');
}
/**
* @Route("/account/valid", name="valid_account")
*/
public function validateAccountAction()
{
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
if (in_array('ROLE_PRO',$user->getRoles()) ) {
if ($user->getAgency() == null) {
$this->addFlash('error', "Compléter votre profil pour accéder à toutes les fonctionnalités du site!");
return $this->redirectToRoute('complete_profil');
}
return $this->redirectToRoute('homepage');
}
if($user->getStatus()!= User::STATUS_ACTIVE && $user->getValidationToken()==null){
$user->setStatus(User::STATUS_ACTIVE);
$em->flush();
return $this->render('user/account_actions.html.twig',[]);
}else{
return $this->redirectToRoute('homepage');
}
}
/**
* Search logement
* @return Response
* @Route("/account/search", name="search_form")
*/
public function searchFormAction()
{
return $this->render('user/search_form.html.twig',[]);
}
private function createUsername(User $user){
$em = $this->getDoctrine();
$firstname = explode( ' ',trim($user->getFirstname()));
$lastname = explode( ' ',trim($user->getLastname()));
$firstname = $firstname[0];
$lastname = $lastname[0];
$username = strtolower( $firstname . '.' . $lastname );
$list = $em->getEntityManager()->getRepository( User::class )->findBy(['username'=>$username]);
$length = sizeof($list);
if($length>0){
$username = $username.".";
$list = $em->getEntityManager()->getRepository( User::class )->getUserByUsername($username);
$length = sizeof($list);
if($length == 0){
$username = $username."1";
}else{
$username = $username.($length+1);
}
}
$user->setUsername($username);
}
/**
* Remove dfc account
* @param Remove dfc account
* @param Request $request
* @return Response
* @Route("/remove_dfc_account", name="remove_dfc_account")
*/
public function removeDFCAccount(Request $request,DfcService $dfc)
{
if ($request->isMethod(Request::METHOD_POST)) {
$user = $this->getUser();
if($user->getApplication()!=null && $user->getApplication()->getCandidateApplication()!=null){
try{
$em = $this->getDoctrine()->getManager();
$dfc->removeDFCAccount($user->getApplication()->getCandidateApplication());
$rentalRecords = $em->getRepository('App\Entity\RentalRecord')->getUserAdvertRental($user->getId());
foreach ($rentalRecords as $record){
$record->setStatus(RentalRecord::STATUS_REMOVED);
$record->setDocumentLink("");
$em->flush();
}
$application = $em->getRepository('App\Entity\UserApplication')->findOneBy(["user"=>$user->getId()]);
$em->remove($application);
$em->flush();
return new JsonResponse(['error' => false]);
}
catch (\Exception $ex){
return new JsonResponse(['error' => true,'message'=>$ex->getMessage()]);
}
}
}
return new JsonResponse(['error' => true,'message'=>"Requête invalide!"]);
}
/**
* User Account
* @param Request $request
* @param FileUploader $uploader
* @return Response
* @Route("/account", name="user_account")
*/
public function showUserAction(Request $request,FileUploader $uploader,DfcService $dfc)
{
$em = $this->getDoctrine()->getManager();
$tab = in_array($request->query->get('tab'), ['profile', 'advertisements', 'searches','favoris','reviews','applicationList','renterProfil','documentsInfo','guarantorInfo']) ? $request->query->get('tab') : 'profile';
$user = $this->getUser();
if (in_array('ROLE_PRO', $user->getRoles()) && $user->getAgency() == null) {
$this->addFlash('error', "Compléter votre profil pour accéder à toutes les fonctionnalités du site!");
return $this->redirectToRoute('complete_profil');
}
$advertisements = $user->getAdvertisements();
$searches = $user->getSearches();
$bookmarks = $user->getBookmarks();
$reviews = $em->getRepository('App\Entity\Review')->findActiveReview($user->getId());
$userCoupons = $em->getRepository('App\Entity\DiscountCoupon')->findActiveCoupon($user->getId());
$form = $this->createForm(UserProfileForm::class, $user);
$application_form = $this->createForm(ApplicationEditForm::class, $user->getApplication()!=null ? $user->getApplication()->getCandidateApplication(): new ApplicationInfo()) ;
$formBadgeUpload = null;
if(!$user->hasBadge()){
$formBadgeUpload = $this->createForm(BadgeForm::class, new Badge());
$formBadgeUpload->handleRequest($request);
if ($formBadgeUpload->isSubmitted() && $formBadgeUpload->isValid()) {
$tab = 'profile';
$dataSubmited = $formBadgeUpload->getData();
$code = $dataSubmited->getCode();
$badge = $em->getRepository('App\Entity\Badge')->findOneBy(['code'=>$code]);
if($badge !=null){
if($badge->getUserTenant()!=null){
$this->addFlash('error', 'Ce code a déjà été attribué à un autre locataire');
}else{
$badge->setUserTenant($user);
$em->flush();
$this->addFlash('success', 'Félicitation! Vous avez obtenu votre badge bon locataire!');
}
}else{
$this->addFlash('error', 'Ce code n\'existe pas');
}
}
}
$form->handleRequest($request);
$application_form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$tab = 'profile';
$current_user = $form->getData();
if($current_user->getUsername()==''){
$this->createUsername($current_user);
}
$em->persist($current_user);
$em->flush();
$this->addFlash('success', 'Votre profil a bien été mis à jour.');
}
if ($application_form->isSubmitted() && $application_form->isValid()) {
$tab = 'renterProfil';
$uploaded_application = $application_form->getData();
$application = $em->getRepository('App\Entity\ApplicationInfo')->find($uploaded_application->getId());
if($application->getStatus()!=ApplicationInfo::STATUS_VALIDATED){
//document Pièce d'identité
$identityDocument = $application_form['identityDoc']->getData();
if ($identityDocument!=null && $application->getIdentityDocument()->getStatus()!=ApplicationInfo::STATUS_VALIDATED) {
$fileName = $uploader->uploadFile($identityDocument);
$application->setIdentityDoc(null);
$file = new RentalRecordFile();
$file->setPath($fileName);
$file->setName($identityDocument->getClientOriginalName());
$file->setSize($identityDocument->getClientSize());
$file->setStatus(RentalRecordFile::STATUS_NOT_UPLOADED);
$file->setDfcId($application->getIdentityDocument()->GetDfcId());
$em->persist($file);
$em->flush();
$application->setIdentityDocument($file);
$application->setIdentityDocumentType($uploaded_application->getIdentityDocumentType());
}
//document situation d'hebergement
$addressProofDocument = $application_form['addressDoc']->getData();
if ($addressProofDocument && $addressProofDocument instanceof UploadedFile && $application->getAddressProofDocument()->getStatus()!=ApplicationInfo::STATUS_VALIDATED) {
$fileName = $uploader->uploadFile($addressProofDocument);
$application->setAddressDoc(null);
$file = new RentalRecordFile();
$file->setStatus(RentalRecordFile::STATUS_NOT_UPLOADED);
$file->setPath($fileName);
$file->setName($addressProofDocument->getClientOriginalName());
$file->setSize($addressProofDocument->getClientSize());
$file->setDfcId($application->getAddressProofDocument()->GetDfcId());
$em->persist($file);
$em->flush();
$application->setAddressProofDocument($file);
$application->setAddressProofDocumentType($uploaded_application->getAddressProofDocumentType());
}
//document situation professionnel
$situationProfessionalProofDocument = $application_form['situationProfessionalDoc']->getData();
if ($situationProfessionalProofDocument && $situationProfessionalProofDocument instanceof UploadedFile && $application->getSituationProfessionalProofDocument()->getStatus()!=ApplicationInfo::STATUS_VALIDATED) {
$fileName = $uploader->uploadFile($situationProfessionalProofDocument);
$application->setSituationProfessionalDoc(null);
$file = new RentalRecordFile();
$file->setStatus(RentalRecordFile::STATUS_NOT_UPLOADED);
$file->setPath($fileName);
$file->setName($situationProfessionalProofDocument->getClientOriginalName());
$file->setSize($situationProfessionalProofDocument->getClientSize());
$file->setDfcId($application->getSituationProfessionalProofDocument()->GetDfcId());
$em->persist($file);
$em->flush();
$application->setSituationProfessionalProofDocument($file);
$application->setSituationProfessional($uploaded_application->getSituationProfessional());
}
//document justificatif de ressource
$ressourceProofDocument = $application_form['ressourceDoc']->getData();
if ($ressourceProofDocument && $ressourceProofDocument instanceof UploadedFile && $application->getRessourceProofDocument()->getStatus()!=ApplicationInfo::STATUS_VALIDATED) {
$fileName = $uploader->uploadFile($ressourceProofDocument);
$application->setRessourceDoc(null);
$file = new RentalRecordFile();
$file->setStatus(RentalRecordFile::STATUS_NOT_UPLOADED);
$file->setPath($fileName);
$file->setName($ressourceProofDocument->getClientOriginalName());
$file->setSize($ressourceProofDocument->getClientSize());
$file->setDfcId($application->getRessourceProofDocument()->GetDfcId());
$em->persist($file);
$em->flush();
$application->setRessourceProofDocument($file);
$application->setRessourceProofDocumentType($uploaded_application->getRessourceProofDocumentType());
}
//document avis d'imposition
$taxNoticeProofDocument = $application_form['taxNoticeDoc']->getData();
if ($taxNoticeProofDocument && $taxNoticeProofDocument instanceof UploadedFile && $application->getTaxNoticeProofDocument()->getStatus()!=ApplicationInfo::STATUS_VALIDATED) {
$fileName = $uploader->uploadFile($taxNoticeProofDocument);
$application->setTaxNoticeDoc(null);
$file = new RentalRecordFile();
$file->setStatus(RentalRecordFile::STATUS_NOT_UPLOADED);
$file->setPath($fileName);
$file->setName($taxNoticeProofDocument->getClientOriginalName());
$file->setSize($taxNoticeProofDocument->getClientSize());
$file->setDfcId($application->getTaxNoticeProofDocument()->GetDfcId());
$em->persist($file);
$em->flush();
$application->setTaxNoticeProofDocument($file);
}
if($request->request->get('application_edit_form')['haveGuarantor'] == true){
$application->setHaveGuarantor(true);
//document Pièce d'identité garant
$identityDocumentGuarantor = $application_form['identityDocGuarantor']->getData();
if ($identityDocumentGuarantor !=null && $identityDocumentGuarantor instanceof UploadedFile) {
$fileName = $uploader->uploadFile($identityDocumentGuarantor);
$application->setIdentityDocGuarantor(null);
$file = new RentalRecordFile();
$file->setStatus(RentalRecordFile::STATUS_NOT_UPLOADED);
$file->setPath($fileName);
$file->setName($identityDocumentGuarantor->getClientOriginalName());
$file->setSize($identityDocumentGuarantor->getClientSize());
if($application->getIdentityDocumentGuarantor()!=null){
$file->setDfcId($application->getIdentityDocumentGuarantor()->GetDfcId());
}
$em->persist($file);
$em->flush();
$application->setIdentityDocumentGuarantor($file);
}
//document situation d'hebergement garant
$addressProofDocumentGuarantor = $application_form['addressDocGuarantor']->getData();
if ($addressProofDocumentGuarantor && $addressProofDocumentGuarantor instanceof UploadedFile) {
$fileName = $uploader->uploadFile($addressProofDocumentGuarantor);
$application->setAddressDocGuarantor(null);
$file = new RentalRecordFile();
$file->setStatus(RentalRecordFile::STATUS_NOT_UPLOADED);
$file->setPath($fileName);
$file->setName($addressProofDocumentGuarantor->getClientOriginalName());
$file->setSize($addressProofDocumentGuarantor->getClientSize());
if($application->getAddressProofDocumentGuarantor()!=null){
$file->setDfcId($application->getAddressProofDocumentGuarantor()->GetDfcId());
}
$em->persist($file);
$em->flush();
$application->setAddressProofDocumentGuarantor($file);
}
//document situation professionnel garant
$situationProfessionalProofDocumentGuarantor = $application_form['situationProfessionalDocGuarantor']->getData();
if ($situationProfessionalProofDocumentGuarantor && $situationProfessionalProofDocumentGuarantor instanceof UploadedFile) {
$fileName = $uploader->uploadFile($situationProfessionalProofDocumentGuarantor);
$application->setSituationProfessionalDocGuarantor(null);
$file = new RentalRecordFile();
$file->setStatus(RentalRecordFile::STATUS_NOT_UPLOADED);
$file->setPath($fileName);
$file->setName($situationProfessionalProofDocumentGuarantor->getClientOriginalName());
$file->setSize($situationProfessionalProofDocumentGuarantor->getClientSize());
if($application->getSituationProfessionalProofDocumentGuarantor()!=null){
$file->setDfcId($application->getSituationProfessionalProofDocumentGuarantor()->GetDfcId());
}
$em->persist($file);
$em->flush();
$application->setSituationProfessionalProofDocumentGuarantor($file);
}
//document justificatif de ressource garant
$ressourceProofDocumentGuarantor = $application_form['ressourceDocGuarantor']->getData();
if ($ressourceProofDocumentGuarantor && $ressourceProofDocumentGuarantor instanceof UploadedFile) {
$fileName = $uploader->uploadFile($ressourceProofDocumentGuarantor);
$application->setRessourceDocGuarantor(null);
$file = new RentalRecordFile();
$file->setStatus(RentalRecordFile::STATUS_NOT_UPLOADED);
$file->setPath($fileName);
$file->setName($ressourceProofDocumentGuarantor->getClientOriginalName());
$file->setSize($ressourceProofDocumentGuarantor->getClientSize());
if($application->getRessourceProofDocumentGuarantor()!=null){
$file->setDfcId($application->getRessourceProofDocumentGuarantor()->GetDfcId());
}
$em->persist($file);
$em->flush();
$application->setRessourceProofDocumentGuarantor($file);
}
//document avis d'imposition garant
$taxNoticeProofDocumentGuarantor = $application_form['taxNoticeDocGuarantor']->getData();
if ($taxNoticeProofDocumentGuarantor && $taxNoticeProofDocumentGuarantor instanceof UploadedFile) {
$fileName = $uploader->uploadFile($taxNoticeProofDocumentGuarantor);
$application->setTaxNoticeDocGuarantor(null);
$file = new RentalRecordFile();
$file->setStatus(RentalRecordFile::STATUS_NOT_UPLOADED);
$file->setPath($fileName);
$file->setName($taxNoticeProofDocumentGuarantor->getClientOriginalName());
$file->setSize($taxNoticeProofDocumentGuarantor->getClientSize());
if($application->getTaxNoticeProofDocumentGuarantor()!=null){
$file->setDfcId($application->getTaxNoticeProofDocumentGuarantor()->GetDfcId());
}
$em->persist($file);
$em->flush();
$application->setTaxNoticeProofDocumentGuarantor($file);
}
$application->setSituationProfessionalGuarantor($uploaded_application->getSituationProfessionalGuarantor());
$application->setIdentityDocumentGuarantorType($uploaded_application->getIdentityDocumentGuarantorType());
$application->setAddressProofDocumentGuarantorType($uploaded_application->getAddressProofDocumentGuarantorType());
$application->setRessourceProofDocumentGuarantorType($uploaded_application->getRessourceProofDocumentGuarantorType());
$application->setMontantRessourceGuarantor($uploaded_application->getMontantRessourceGuarantor());
$application->setHaveGuarantor(true);
}else{
//remove guarantor and document
$application->setMontantRessourceGuarantor('0');
$application->setHaveGuarantor(false);
}
$em->flush();
$dfc->updateDFCAccount($application,$em);
}
}
return $this->render('user/account.html.twig', [
'form' => $form->createView(),
'application_form' => $application_form->createView(),
'advertisements' => $advertisements,
'searches' => $searches,
'user' => $user,
'bookmarks' => $bookmarks,
'reviews' => $reviews,
'userCoupons' => $userCoupons,
'rentalRecords' => $user->getRentalRecords(),
'badgeForm' => $formBadgeUpload!=null ? $formBadgeUpload->createView() : null,
'tab' => $tab
]);
}
/**
* upload document for ad moderation
* @param Request $request
* @param FileUploader $uploader
* @return JsonResponse
* @Route("/account/update_avatar", name="update_avatar")
*/
public function documentUpload(Request $request, FileUploader $uploader)
{
$current_user = $this->getUser();
$file = $request->files->get('file');
$error = true;
$message = "";
if ($file instanceof UploadedFile && in_array($file->getMimeType(), ['image/png', 'image/jpeg'])) {
$fileName = $uploader->uploadImage($file);
$current_user->setAvatarPath($fileName);
$em = $this->getDoctrine()->getManager();
$em->flush();
$message = "Photo mis à jour!";
$error = false;
}
return new JsonResponse(['error'=>$error,'message'=>$message]);
}
/**
* @Route("/password/reset", name="password_reset")
*/
public function resetPasswordAction(Request $request)
{
// last username entered by the user
$lastUsername = $this->authenticationUtils->getLastUsername();
$form = $this->createForm(PasswordResetForm::class, [
'_username' => $lastUsername,
]);
$error = null;
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$form_user = $form->getData();
$username = $form_user['_username'];
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('App\Entity\User')
->findOneBy(['email' => $username]);
if ($user === null) {
$form->get('_username')->addError(new FormError('Adresse email inconnue'));
}else if($user->getStatus()==0){
$error = "Un lien d'activation a été envoyé à votre adresse e-mail. Veuillez cliquer sur ce lien pour activer votre compte";
}
else {
$token_date = $user->getTokenValidAt();
if ($token_date==null || $token_date->getTimestamp() < strtotime('+1 day')){
$token = rtrim(strtr(base64_encode(random_bytes(32)), '+/', '-_'), '=');
$user->setToken($token);
$user->setTokenValidAt(new \DateTime());
$em->persist($user);
$em->flush();
$this->mailSender->sendPasswordReset($user);
$this->addFlash('report', 'Un lien de réinitialisation vous a été envoyé par mail. Cliquez sur ce lien pour réinitiliaser votre mot de passe');
return $this->redirectToRoute('homepage');
}else{
$error = 'Vous devez attendre 24h apres la dernière demande pour pouvoir changer de mot de passe';
}
}
}
return $this->render(
'security/password_reset.html.twig', [
'error' => $error,
'form' => $form->createView()
]);
}
/**
* @Route("/password/change/{token}", name="password_change")
*/
public function changePasswordAction(Request $request, $token, LoginFormAuthenticator $authenticator)
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('App\Entity\User')
->findOneBy(['token' => $token]);
if ($user === null) {
throw new NotFoundHttpException('Cette url n\'est pas valide. Veuillez effectuer une nouvelle demande');
}
$token_date = $user->getTokenValidAt();
/** @var \DateTime $token_date */
if ($token_date->getTimestamp() > strtotime('+1 day')){
throw new NotFoundHttpException('Cette url a expirée. Veuillez effectuer une nouvelle demande');
}
$form = $this->createForm(PasswordChangeForm::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setToken(null);
$user->setTokenValidAt(null);
$em->persist($user);
$em->flush();
$this->addFlash('success', 'Mot de passe mis à jour');
return $this->redirectToRoute('security_login');
}
return $this->render(
'security/password_change.html.twig',
array(
'form' => $form->createView(),
)
);
}
/**
* Remove discountCoupon
* @param DiscountCoupon $coupon
* @param Request $request
* @Route("/coupons/remove/{id}", name="user_coupons_remove")
*/
public function removeCoupon(DiscountCoupon $coupon,Request $request)
{
if ($request->isMethod(Request::METHOD_POST)) {
$user = $this->getUser();
if($coupon->getUser()->getId()==$user->getId()){
$em = $this->getDoctrine()->getManager();
$coupon->setStatus(DiscountCoupon::STATUS_REMOVED);
$em->flush();
return new JsonResponse(['error' => false]);
}
}
throw new NotFoundHttpException();
}
/**
* @Route("/badge/generate", name="generate_badge")
*/
public function generateBadge(Request $request)
{
$user = $this->getUser();
if ($user->getAgency()!= null && $request->isMethod(Request::METHOD_POST) && $user->getAgency()->isCertified()) {
$badge = new Badge();
$badge->setCreatedAt(new \DateTime());
$badge->setCode(strtoupper($this->GenerateCode(6)));
$badge->setUserAgency($user);
$em = $this->getDoctrine()->getManager();
try{
$em->persist($badge);
$em->flush();
}
catch (\Exception $ex){
return new JsonResponse(['error' => true,'message'=>'Il s\'est produit une erreur pendant la génération de votre badge!']);
}
$shareLink = $this->generateUrl('share_badge', array('id' => $badge->getId()));
$removeLink = $this->generateUrl('user_badge_remove', array('id' => $badge->getId()));
return new JsonResponse([
'error' => false,
'badge' => [
'code' => $badge->getCode(),
'date' => $badge->getCreatedAt()->format("Y-m-d"),
'shareLink' => $shareLink,
'removeLink' =>$removeLink
]
]);
}
return new JsonResponse(['error' => true,'message'=>'Vous n\'êtes pas autorisé à générer des badges']);
}
/**
* Remove badge
* @param Badge $badge
* @param Request $request
* @Route("/badge/remove/{id}", name="user_badge_remove")
*/
public function removeBadge(Badge $badge,Request $request)
{
$user = $this->getUser();
if ($request->isMethod(Request::METHOD_POST) && $user->getId() == $badge->getUserAgency()->getId()) {
$em = $this->getDoctrine()->getManager();
try{
if($badge->getUserTenant()!=null){
$user = $badge->getUserTenant();
$user->setStatus(0);
$user->setBadge(null);
$em->flush();
}
$em->remove($badge);
$em->flush();
return new JsonResponse(['error' => false]);
}
catch (\Exception $ex){
return new JsonResponse(['error' => true,'message'=>$ex->getMessage()]);
}
return new JsonResponse(['error' => true]);
}
return new JsonResponse(['error' => true]);
}
/**
* @Route("/badge/share/{id}", name="share_badge")
*/
public function shareBadge(Request $request)
{
if ($request->isMethod(Request::METHOD_POST)) {
$em = $this->getDoctrine()->getManager();
$badgeId = $request->get("id");
$badge = $em->getRepository('App\Entity\Badge')->find($badgeId);
if($badge !=null){
$email = $request->get("email");
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return new JsonResponse(['error' => true, 'message' => 'Format adresse email invalide!']);
}
$user = $this->getUser();
$this->mailSender->sendBadgeByEmail($user,$badge->getCode(),$email);
return new JsonResponse(['error' => false, 'message' => 'Email envoyé à l\'adresse email : '.$email]);
}
return new JsonResponse(['error' => true, 'message' => 'Badge introuvable!']);
}
return new JsonResponse(['error' => true, 'message' => 'Requête invalide!']);
}
/**
* upload document for agency
* @param Request $request
* @param FileUploader $uploader
* @return JsonResponse
* @Route("/account/upload_agency_doc", name="upload_agency_doc")
*/
public function documentAgencyUpload(Request $request, FileUploader $uploader)
{
$current_user = $this->getUser();
$file = $request->files->get('file');
if ( $current_user->getAgency()!=null && $current_user->getAgency()->getStatus()!=3 && $current_user->getAgency()->getStatus()!=2 && $file instanceof UploadedFile ) {
$fileName = $uploader->uploadFile($file);
$doc = new AgencyDocument();
$doc->setPath($fileName);
$doc->setName($file->getClientOriginalName());
$doc->setSize($file->getClientSize());
$doc->setAgency($current_user->getAgency());
$doc->setUser($current_user);
$doc->setCreatedAt(new \DateTime());
$current_user->getAgency()->setStatus(2);
$em = $this->getDoctrine()->getManager();
$em->persist($doc);
$em->flush();
return new JsonResponse(['error'=>false,'message'=>'La vérification de vos documents est en cours de traitement!','document'=>[
'name' => $doc->getName(),
'id' => $doc->getId()
]]);
}
return new JsonResponse(['error'=>true,'message'=>'Requête invalide!']);
}
/**
* @Route("/activate-certified-account/{token}", name="activate_certified_account")
*/
public function activateCerifiedAccountAction($token,Request $request)
{
$em = $this->getDoctrine()->getManager();
$certifiedAgency = $em->getRepository('App\Entity\CertifiedAgency')
->findOneBy(['token' => $token]);
if ($certifiedAgency === null || $certifiedAgency->getAgency() == null || $certifiedAgency->getAgency()->isCertified()==true) {
throw new NotFoundHttpException('Le lien que vous avez suivi n\'existe pas ou a expiré');
}
$user = $em->getRepository('App\Entity\CertifiedAgency')
->findOneBy(['email' => $certifiedAgency->getEmail()]);
if ($user === null){
throw new NotFoundHttpException('Le lien que vous avez suivi n\'existe pas ou a expiré');
}
$certifiedAgency->setToken(null);
$em->flush();
return $this->get('security.authentication.guard_handler')
->authenticateUserAndHandleSuccess(
$user,
$request,
$this->get(LoginFormAuthenticator::class),
'main'
);
}
/**
* Check username
* @param Request $request
* @return JsonResponse
* @Route("/check-username", name="check_username")
*/
public function checkUsername(Request $request)
{
$username = $request->get('username');
if(isset($username)){
try{
$em = $this->getDoctrine()->getManager();
$list = $em->getRepository( User::class )->getUserByUsername($username);
$length = sizeof($list);
if($length == 0){
return new JsonResponse(['error' => false,"taken" => false]);
}else{
return new JsonResponse(['error' => false,"taken" => true,"message" => "Ce nom d'utilisateur est déjà utilisé. Essayez un autre nom."]);
}
}
catch (\Exception $ex){
return new JsonResponse(['error' => true,'message'=>"Une erreur est survenue! Veuillez réessayer un peu plus tard!"]);
}
}
return new JsonResponse(['error' => true,'message'=>"Requête invalide!"]);
}
private function GenerateCode($n) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomString = '';
for ($i = 0; $i < $n; $i++) {
$index = rand(0, strlen($characters) - 1);
$randomString .= $characters[$index];
}
return $randomString;
}
}