<?php
/**
* Created by PhpStorm.
* User: jhonn
* Date: 8/24/2018
* Time: 2:35 PM
*/
namespace App\Controller;
use App\Entity\Answers;
use App\Entity\Company;
use App\Entity\Ebook;
use App\Entity\Group;
use App\Entity\Question;
use App\Entity\Role;
use App\Entity\Student;
use App\Entity\Survey;
use App\Entity\SurveySent;
use App\Entity\Team;
use App\Entity\Trainer;
use App\Entity\Users;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
public function login(AuthenticationUtils $authenticationUtils, Request $request)
{
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', array(
'last_username' => $lastUsername,
'error' => $error,
));
}
public function register(UserPasswordEncoderInterface $encoder, Request $request)
{
$entityManager = $this->getDoctrine()->getManager();
// if($request->request->get('id')!=0){
//
// $user = $entityManager->getRepository(AdminUsers::class)
// ->find($request->request->get('id'));;
// }else{
//
// }
// $plainPassword = $request->request->get('password');
// $name= $request->request->get('name');
// $email = $request->request->get('email');
$plainPassword = '123qwe!@#QWE';
$name= 'admin';
$email = 'admin@grid.com';
$user = new Users();
$user->setUsername($email);
$user->setName($name);
if($plainPassword!=""){
$encoded = $encoder->encodePassword($user, $plainPassword);
$user->setPassword($encoded);
}
elseif ($user->getId()==null){
return "error";
}
// whatever *your* User object is
$user->setIsActive(true);
$roleId = $request->request->get('role');
$roleId = 1;
$role = $entityManager->getRepository(Role::class)
->find($roleId);;
$user->addRole($role);
$entityManager->persist($user);
$entityManager->flush();
return $this->redirectToRoute('users_list');
}
public function deleteTrainer( Request $request){
$id = $request->request->get('id');
$entityManager = $this->getDoctrine()->getManager();
$trainer = $entityManager->getRepository(Users::class)
->find($id);;
$entityManager->remove($trainer);
$entityManager->flush();
return new Response('success',200);
}
public function registerTrainer(UserPasswordEncoderInterface $encoder, Request $request,\Swift_Mailer $mailer)
{
$entityManager = $this->getDoctrine()->getManager();
// if($request->request->get('id')!=0){
//
// $user = $entityManager->getRepository(AdminUsers::class)
// ->find($request->request->get('id'));;
// }else{
//
// }
// $plainPassword = $request->request->get('password');
$name= $request->request->get('name');
$email = $request->request->get('email');
$plainPassword = '123qwe!@#QWE';
$user = new Users();
$user->setUsername($email);
$user->setName($name);
if($plainPassword!=""){
$encoded = $encoder->encodePassword($user, $plainPassword);
$user->setPassword($encoded);
}
elseif ($user->getId()==null){
return "error";
}
// whatever *your* User object is
$user->setIsActive(true);
// $roleId = $request->request->get('role');
$roleId = 2;
$role = $entityManager->getRepository(Role::class)
->find($roleId);;
$user->addRole($role);
$entityManager->persist($user);
$entityManager->flush();
$trainer = new Trainer();
$trainer->setFirstName($name);
$trainer->setId($user);
$entityManager->persist($trainer);
$entityManager->flush();
$message = (new \Swift_Message('Your Password Have been successfully changed '))
->setFrom('gridsurvey@Gridinternational.com')
->setTo($user->getUsername())
->setBody(
$this->renderView(
// templates/emails/registration.html.twig
'emails/trainerChangePassword.html.twig',
['user' => $user]
),
'text/html'
)
;
$mailer->send($message);
return $this->redirectToRoute('trainer-list');
}
public function studentCreatePost(UserPasswordEncoderInterface $encoder, Request $request,\Swift_Mailer $mailer)
{
$name= $request->request->get('name');
$email = $request->request->get('email');
$company = $request->request->get('company');
$manager = $request->request->get('manager');
$secondManager = $request->request->get('secondManager');
$student= $this->registerStudentIfNotExist($encoder,$email,$name);
$entityManager = $this->getDoctrine()->getManager();
if($company!=0){
$company = $entityManager->getRepository(Company::class)
->find($company);
$student->setCompany($company);
}
$teamid = $request->request->get('team');
if($teamid!=0){
$team = $entityManager->getRepository(Team::class)
->find($teamid);
$student->setTeam($team);
}
if($manager!=0){
$manager = $entityManager->getRepository(Users::class)
->find($manager);
$student->setManagerId($manager);
} if($secondManager!=0){
$secondManager = $entityManager->getRepository(Users::class)
->find($secondManager);
$student->setSecondManagerId($secondManager);
}
$entityManager->persist($student);
$entityManager->flush();
$this->sendRegistrationEmailToStudent($student,$mailer);
return $this->redirectToRoute('Student-list');
}
public function studentCreateBulkPost(UserPasswordEncoderInterface $encoder, Request $request,\Swift_Mailer $mailer)
{
$entityManager = $this->getDoctrine()->getManager();
$file = $request->files->get('students');
$language = $request->request->get('lang');
$extension = $file->guessExtension();
if('csv' == $extension) {
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv();
} elseif('xls'==$extension) {
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls();
}
else {
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
}
$spreadsheet = $reader->load($file);
$students = $spreadsheet->getActiveSheet()->toArray();
$companyid = $request->request->get('company');
if($companyid!=0){
$company = $entityManager->getRepository(Company::class)
->find($companyid);
}
$teamid = $request->request->get('team');
if($teamid!=0){
$team = $entityManager->getRepository(Team::class)
->find($teamid);
}
$i = 0;
foreach ($students as $student){
$i++;
if($student[0]!="email" && $student[0]!="Email" && $student[0]!=null){
$studentId = $this->registerStudentIfNotExist($encoder,$student[0],$student[1]);
if($studentId!=false){
if($studentId->getCompany()!=null){
$itIsOldUser = true;
}
else{
$itIsOldUser = false;
}
if($companyid!=0){
$studentId->setCompany($company);
$entityManager->persist($studentId);
$entityManager->flush();
}
if($teamid!=0){
$studentId->setTeam($team);
$entityManager->persist($studentId);
$entityManager->flush();
}
if(!$itIsOldUser){
$this->sendRegistrationEmailToStudent($studentId,$mailer);
}
}
}
}
return $this->redirectToRoute('Student-list');
}
public function registerStudentIfNotExist(UserPasswordEncoderInterface $encoder,
$email,$name,$id=0)
{
$entityManager = $this->getDoctrine()->getManager();
if($id!=0){
$studentObj = $entityManager->getRepository(Users::class)
->find($id);
}else{
$studentObj = $entityManager->getRepository(Users::class)
->findOneBy(array('username'=>$email));
}
if($studentObj!=null){
$student = $entityManager->getRepository(Student::class)
->findOneBy(array('id'=>$studentObj));
return $student;
}
else{
if($name==null){
return false;
}
$token = $this->generateRandomString(10);
$plainPassword = $token;
$user = new Users();
$user->setUsername($email);
$user->setName($email);
$user->setToken($token);
$user->setOuthtoken(md5(uniqid(rand())));
if($plainPassword!=""){
$encoded = $encoder->encodePassword($user, $plainPassword);
$user->setPassword($encoded);
}
elseif ($user->getId()==null){
return "error";
}
// whatever *your* User object is
$user->setIsActive(true);
// $roleId = $request->request->get('role');
$roleId = 2;
$role = $entityManager->getRepository(Role::class)->find($roleId);;
$user->addRole($role);
$entityManager->persist($user);
$entityManager->flush();
$studentObj = new Student();
$studentObj->setFirstName($name);
$studentObj->setId($user);
$entityManager->persist($studentObj);
$entityManager->flush();
return $studentObj;
}
}
public function createClass(UserPasswordEncoderInterface $encoder,Request $request){
$entityManager = $this->getDoctrine()->getManager();
$id = $request->request->get('id');
if($id==null || $id==0)
$class = new Group();
else
$class = $entityManager->getRepository(Group::class)
->find($id);
$class->setName( $request->request->get('name')) ;
$class->setStartDay(new \DateTime($request->request->get('start')));
$class->setEndDay(new \DateTime($request->request->get('end')));
$entityManager->persist($class);
$entityManager->flush();
foreach ( $class->getTrainer() as $trainer){
$class->removeTrainer($trainer);
}
$trainers = $request->request->get('trainers');
foreach ( $trainers as $trainer){
$trainer = $entityManager->getRepository(Trainer::class)
->find($trainer);;
$class->addTrainer($trainer);
}
foreach ( $class->getBook() as $book){
$class->removeBook($book);
}
$books = $request->request->get('books');
foreach ( $books as $book){
$book = $entityManager->getRepository(Ebook::class)
->find($book);;
$class->addBook($book);
}
foreach ( $class->getStudent() as $student){
$class->removeStudent($student);
}
$students = $request->request->get('students');
foreach ( $students as $student){
$name= "";
$studentId = $this->registerStudentIfNotExist($encoder,"","",$student);
$class->addStudent($studentId);
}
$entityManager->persist($class);
$entityManager->flush();
return $this->redirectToRoute('class-list');
}
public function CreateSurvey(UserPasswordEncoderInterface $encoder, Request $request,\Swift_Mailer $mailer){
$entityManager = $this->getDoctrine()->getManager();
$id =$request->request->get('id');
if ($id==0) {
$survey= new Survey();
}
else{
$survey = $entityManager->getRepository(Survey::class)
->find($id);
}
$survey->setName($request->request->get('name'));
$survey->setStartDate(new \DateTime($request->request->get('start')));
$survey->setEndDate(new \DateTime($request->request->get('end')));
$survey->setType($request->request->get('type'));
$removedStudentIdArray = array();
foreach ( $survey->getStudent() as $student){
$removedStudentIdArray[]=$student->getId()->getId();
}
iF($request->request->has('students')){
$students = $request->request->get('students');
}
else{
$students =array();
}
$IdsToRemove = array_diff($removedStudentIdArray, $students);
foreach ($IdsToRemove as $stuendIdRemove){
$student = $this->registerStudentIfNotExist($encoder,"","",$stuendIdRemove);
$survey->removeStudent($student);
}
$IdsToAdd = array_diff($students,$removedStudentIdArray );
foreach ($IdsToAdd as $stuendIdAdd){
$student = $this->registerStudentIfNotExist($encoder,"","",$stuendIdAdd);
$survey->addStudent($student);
}
$importError = false;
$listOfFalseEmail ="" ;
if( $request->files->has('students-xls')) {
//this is only on create
$file = $request->files->get('students-xls');
if($file!=null){
$extension = $file->guessExtension();
if('csv' == $extension) {
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv();
} else {
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
}
$spreadsheet = $reader->load($file);
$students = $spreadsheet->getActiveSheet()->toArray();
$i = 0;
foreach ($students as $student){
$i++;
if($student[0]!="email" && $student[0]!=null){
$studentId = $this->registerStudentIfNotExist($encoder,$student[0],null);
if($studentId!=false){
$survey->addStudent($studentId);
}else{
$importError = true;
$listOfFalseEmail = $listOfFalseEmail." ".$student[0]." , ";
}
}
}
}
}
if(!$importError){
$entityManager->persist($survey);
$entityManager->flush();
foreach ( $survey->getStudent() as $student){
if(!in_array($student->getId()->getId(),$removedStudentIdArray)){
$this->sendSurveyEmailToStudent($student,$survey,$mailer);
}
}
if($request->request->get('type')==0){
return $this->redirectToRoute('General-survey-survey-list');
}
else if($request->request->get('type')==1){
return $this->redirectToRoute('teams-survey-survey-list');
} else if($request->request->get('type')==2){
return $this->redirectToRoute('managment-survey-survey-list');
} else if($request->request->get('type')==3){
return $this->redirectToRoute('General-survey-survey-list_arabic');
}else if($request->request->get('type')==4){
return $this->redirectToRoute('Small-general-survey-survey-list');
}else if($request->request->get('type')==5){
return $this->redirectToRoute('Small-teams-survey-list');
}else if($request->request->get('type')==6){
return $this->redirectToRoute('Small-management-survey-list');
}
}
else{
$companies = $this->getDoctrine()
->getRepository(Company::class)
->findAll();
$students = $this->getDoctrine()
->getRepository(Student::class)
->findAll();
return $this->render('admin/survey-create.html.twig',array('survey'=>$survey,'type'=>$survey->getType(),
'companies'=>$companies,'students'=>$students,'error_list'=>$listOfFalseEmail));
}
}
public function sendSurveyEmailToStudent($student,$survey,\Swift_Mailer $mailer)
{
$entityManager = $this->getDoctrine()->getManager();
$message = (new \Swift_Message('Survey email '))
->setFrom('gridsurvey@Gridinternational.com')
->setTo($student->getId()->getUsername())
->setBody(
$this->renderView(
// templates/emails/registration.html.twig
'emails/survey-email-type-'.$survey->getType().'.html.twig',
['student' => $student,'survey'=>$survey]
),
'text/html'
);
return $mailer->send($message);
return true;
}
public function sendSurveyReminderEmailToStudent($student,$survey,\Swift_Mailer $mailer)
{
$entityManager = $this->getDoctrine()->getManager();
$surveyNotSubmited = $entityManager->getRepository(SurveySent::class)
->findOneBy(
array('userid' => $student->getId(),
'status' => 0,'surveyid'=>$survey->getId()
)
);
if($surveyNotSubmited){
$message = (new \Swift_Message('Survey Reminder '))
->setFrom('gridsurvey@Gridinternational.com')
->setTo($student->getId()->getUsername())
->setBody(
$this->renderView(
// templates/emails/registration.html.twig
'emails/survey-email-type-'.$survey->getType().'-reminder.html.twig',
['student' => $student,'survey'=>$survey]
),
'text/html'
);
return $mailer->send($message);
}
return false;
}
public function sendRegistrationEmailToStudent($student,\Swift_Mailer $mailer)
{
$entityManager = $this->getDoctrine()->getManager();
$message = (new \Swift_Message('GRID; workshop subscription '))
->setFrom('gridsurvey@Gridinternational.com')
->setTo(trim($student->getId()->getUsername()))
->setBody(
$this->renderView(
// templates/emails/registration.html.twig
'emails/student-registered-email.html.twig',
['student' => $student]
),
'text/html'
)
;
return $mailer->send($message);
return true;
}
public function testSendSurveyEmail($id,\Swift_Mailer $mailer){
$entityManager = $this->getDoctrine()->getManager();
$counter= 0;
$Survey = $entityManager->getRepository(Survey::class)
->find($id);
foreach ($Survey->getStudent() as $studentObj){
$result= $this->sendSurveyReminderEmailToStudent($studentObj,$Survey,$mailer);
if($result!=false){
$counter++;
}
}
return new \Symfony\Component\HttpFoundation\Response(
$counter ,200
);
}
function generateRandomString($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
public function testSendPasswordEmailBySurvey($id,\Swift_Mailer $mailer)
{
$entityManager = $this->getDoctrine()->getManager();
$counter = 0;
$Survey = $entityManager->getRepository(Survey::class)
->find($id);
foreach ($Survey->getStudent() as $studentObj) {
$this->sendRegistrationEmailToStudent($studentObj, $mailer);
$counter++;
}
return new \Symfony\Component\HttpFoundation\Response(
$counter ,200
); }
public function resetPassword(Request $request){
$token = $request->query->get('token');
$entityManager = $this->getDoctrine()->getManager();
$user = $entityManager
->getRepository(Users::class)
->findOneBy(array('token'=>$token));
if($user==null){
return $this->redirectToRoute('login');
}
return $this->render('security/change-password.html.twig',array('user'=>$user));
}
public function changePassword(UserPasswordEncoderInterface $encoder, Request $request , \Swift_Mailer $mailer)
{
$entityManager = $this->getDoctrine()->getManager();
$user = $entityManager
->getRepository(Users::class)
->findOneBy(array('token'=>$request->request->get('token')));
if($user==null)
{
return $this->redirectToRoute('home');
}
$plainPassword = $request->request->get('password');
if($plainPassword!=""){
$encoded = $encoder->encodePassword($user, $plainPassword);
$user->setPassword($encoded);
}
$user->setToken(md5(uniqid(rand())));
$entityManager->persist($user);
$entityManager->flush();
return $this->redirectToRoute('home');
}
public function sendRestPassEmail(UserPasswordEncoderInterface $encoder, Request $request , \Swift_Mailer $mailer)
{
$entityManager = $this->getDoctrine()->getManager();
$user = $entityManager
->getRepository(Users::class)
->findOneBy(array('username'=>$request->request->get('email')));
if($user==null)
{
$msg= 'Email not registered please contact the admin ';
return $this->render('security/resetPassResponse.html.twig',array('msg'=>$msg));
}
$user->setToken(md5(uniqid(rand())));
$entityManager->persist($user);
$entityManager->flush();
$message = (new \Swift_Message('Reset Password '))
->setFrom('gridsurvey@Gridinternational.com')
->setTo($user->getUsername())
->setBody(
$this->renderView(
// templates/emails/registration.html.twig
'emails/passwordResetEmail.html.twig',
['user' => $user]
),
'text/html'
)
;
$mailer->send($message);
$msg= 'Reset password email sent to your inbox ';
return $this->render('security/resetPassResponse.html.twig',array('msg'=>$msg));
}
}