<?php
namespace App\Controller;
use App\Entity\Students;
use App\Repository\StudentsRepository;
use App\Repository\VendorsRepository;
use App\Service\CollegeService;
use App\Service\CreditCardsService;
use App\Service\EmailService;
use App\Service\ExamsService;
use App\Service\ExamStudyMaterialsService;
use App\Service\ExamVendorService;
use App\Service\MembershipTypeService;
use App\Service\PckPackagesService;
use App\Service\ExamRegistrationsService;
use App\Service\PurchaseService;
use App\Service\QueryLogService;
use App\Service\SchoolService;
use App\Service\StudentsService;
use App\Util\ParameterUtil;
use DateTime;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Config\Definition\Exception\Exception;
use Symfony\Component\HttpFoundation\Request;
class StudentController extends BaseController
{
/**
* @var StudentsService
*/
private $studentService;
/**
* @var PckPackagesService
*/
private $pckPackagesService;
/**
* @var ExamRegistrationsService
*/
private $registrationsService;
/**
* @var PurchaseService
*/
private $purchaseService;
private $examsService;
private $examStudyMaterialsService;
private $logger;
/**
* @var CreditCardsService
*/
private $creditCardsService;
/**
* @var SchoolService
*/
private $schoolService;
private MembershipTypeService $membershipTypeService;
private StudentsRepository $studentsRepository;
private QueryLogService $queryLogService;
public function __construct(
StudentsService $studentService,
StudentsRepository $studentsRepository,
PckPackagesService $pckPackagesService,
ExamRegistrationsService $registrationsService,
PurchaseService $purchaseService,
ExamsService $examsService,
CreditCardsService $creditCardsService,
ExamStudyMaterialsService $examStudyMaterialsService,
SchoolService $schoolService,
MembershipTypeService $membershipTypeService,
QueryLogService $queryLogService,
LoggerInterface $logger
) {
$this->studentService = $studentService;
$this->pckPackagesService = $pckPackagesService;
$this->registrationsService = $registrationsService;
$this->purchaseService = $purchaseService;
$this->examsService = $examsService;
$this->examStudyMaterialsService = $examStudyMaterialsService;
$this->logger = $logger;
$this->creditCardsService = $creditCardsService;
$this->schoolService = $schoolService;
$this->membershipTypeService = $membershipTypeService;
$this->studentsRepository = $studentsRepository;
$this->queryLogService = $queryLogService;
}
/**
* @Route("/api/getStudentByQuery", name="app_studentByQuery")
*/
public function getStudentByQuery(Request $request)
{
try {
$findBy = ParameterUtil::getRequired($_GET['findBy'], 'findBy');
$findValue = ParameterUtil::getRequired($_GET['findValue'], 'findValue');
/** @var Students $student */
$student = $this->studentService->getStudentAndCollege($findBy, $findValue);
if (!$student) {
throw new Exception("Student not found.");
}
} catch (Exception $ex) {
return new Response(json_encode($ex->getMessage()), 500);
}
return $this->json($student);
}
/**
* @Route("/api/findTTIStudent")
* @return mixed
*/
public function findTTIStudent(Request $request) {
try {
$response = $this->studentService->findTTIStudent(
ParameterUtil::getRequired($_GET['ttiStudentId'], 'ttiStudentId')
);
} catch (Exception $ex) {
return new Response(json_encode($ex->getMessage()), 500);
}
return $this->json($response);
}
/**
* @Route("/api/findTTIStudentByDobSsn")
* @return mixed
*/
public function findTTIStudentByDobSsn(Request $request) {
try {
$response = $this->studentService->findOneBy(
array('dob'=>new DateTime(ParameterUtil::getRequired($_GET['dob'], 'dob')),
'ssn'=>'XXX-XX-'.ParameterUtil::getRequired($_GET['ssn'], 'ssn'))
);
} catch (Exception $ex) {
return new Response(json_encode($ex->getMessage()), 500);
}
return $this->json($response);
}
/**
* @Route("/api/updateMembershipType")
* @return mixed
*/
public function updateMembershipType(Request $request) {
try {
$content = $this->getContent($request);
$studentId = ParameterUtil::getRequired($content->get('studentId'), 'studentId');
$student = $this->studentService->find($studentId);
$ttiDob = null;
$ttiSsn = null;
if (!$student) {
$ttiDob = new DateTime($content->get('dob'));
$ttiSsn = $content->get('ssn');
}
$this->logger->info("before updateMembershipType");
$response = $this->studentService->updateMembershipType(
$student,
$ttiDob,
$ttiSsn,
MembershipTypeService::NON_MEMBER
);
$this->logger->info("updateMembershipType response ".print_r($response, true));
} catch (Exception $ex) {
return new Response(json_encode($ex->getMessage()), 500);
}
return $this->json($response);
}
/**
* @Route("/api/student/add")
*/
public function addStudent(Request $request, EmailService $emailService, SchoolService $schoolService, CollegeService $collegeService,
MembershipTypeService $membershipTypeService)
{
return $this->addNewStudent($request,$emailService,$schoolService,$collegeService, $membershipTypeService,true);
}
/**
* @Route("/api/student/tti/add")
*/
public function addStudentForTTI(Request $request, StudentsService $studentsService)
{
try {
$content = $this->getContent($request);
$response = $this->studentService->addStudent(
ParameterUtil::getRequired($content->get('firstName'),'firstName'),
ParameterUtil::getRequired($content->get('lastName'),'lastName'),
$content->get('maidenName'),
ParameterUtil::getRequired($content->get('last4Ssn'),'last4Ssn'),
new DateTime(ParameterUtil::getRequired($content->get('dob'),'dob')),
ParameterUtil::getRequired($content->get('gender'),'gender'),
ParameterUtil::getRequired($content->get('email'),'email'),
ParameterUtil::getRequired($content->get('phone1'),'phone1'),
$content->get('phone2'),
ParameterUtil::getRequired($content->get('address'),'address'),
ParameterUtil::getRequired($content->get('city'),'city'),
ParameterUtil::getRequired($content->get('state'),'state'),
ParameterUtil::getRequired($content->get('zip'),'zip'),
ParameterUtil::getRequired($content->get('country'),'country'),
null,
$content->get('collegeId'),
MembershipTypeService::MEMBER,
null,
null,
null,
null,
ParameterUtil::getRequired($content->get('ttiStudentId'),'ttiStudentId')
);
} catch (Exception $ex) {
return new Response(json_encode($ex->getMessage()), 500);
}
return $this->json($response);
}
/**
* @Route("/api/student_add")
*/
public function addSchoolStudent(Request $request, EmailService $emailService, SchoolService $schoolService, CollegeService $collegeService,
MembershipTypeService $membershipTypeService)
{
return $this->addNewStudent($request,$emailService,$schoolService,$collegeService,$membershipTypeService);
}
private function addNewStudent( Request $request,
EmailService $emailService,
SchoolService $schoolService,
CollegeService $collegeService,
MembershipTypeService $membershipTypeService,
$isNonMemberInvite = false){
try {
$content = $this->getContent($request);
$isForSchool = $content->get('isForSchool') ?: false;
$isRegularAddEditStudent = $content->get('isRegularAddEditStudent') ?: false;
$firstName = ParameterUtil::getRequired($content->get('firstName'), 'firstName');
$lastName = ParameterUtil::getRequired($content->get('lastName'), 'lastName');
$maidenName = $content->get('maidenName');
$confirmDoubleSsnDob = $content->get('confirmDoubleSsnDob');
$last4ssn = ParameterUtil::getRequired($content->get('last4ssn'), 'last4ssn');
if (!$this->studentService->validSsn($last4ssn)) {
throw new Exception("SSN is not valid.");
}
$dob = ParameterUtil::getRequired($content->get('dob'), 'dob');
if (!$this->studentService->validDob($dob)) {
throw new Exception("DOB is not valid.");
}
$dob = new DateTime($dob);
$email = ParameterUtil::getRequired($content->get('email'), 'email');
$email = base64_decode($email, true) ? base64_decode($email) : $email;
$gender = ParameterUtil::getRequired($content->get('gender'), 'gender');
$cellphone = ParameterUtil::getRequired($content->get('cellphone'), 'cellphone');
$phone = $content->get('phone');
$address = ParameterUtil::getRequired($content->get('address'), 'address');
$city = ParameterUtil::getRequired($content->get('city'), 'city');
$state = $content->get('state');
$zip = ParameterUtil::getRequired($content->get('zip'), 'zip');
$country = ParameterUtil::getRequired($content->get('country'), 'country');
$schoolId = $content->get('schoolId');
if ($schoolId && !$isForSchool) {
$schoolId = base64_decode($schoolId, true) ? base64_decode($schoolId) : $schoolId;
}
elseif($schoolId && $isForSchool){
$schoolId = (int)$schoolId;
}
$collegeId = ParameterUtil::getRequired($content->get('collegeId'), 'collegeId');
$membershipTypeId = ParameterUtil::getRequired($content->get('membershipTypeId'), 'membershipTypeId');
$cohort = $content->get('cohort') ? (int)$content->get('cohort') : null;
if (!$isForSchool && !$isRegularAddEditStudent) {
$password = ParameterUtil::getRequired($content->get('password'), 'password');
} else
$password = null;
try {
$emailExists = $this->studentService->findByEmail($email);
if ($emailExists) {
$this->logger->error("Email already exists ($email). ");
return new Response(json_encode('Email already exists. Please contact support@jewishstudiesenrichment.com for assistance.'), 500);
}
} catch (Exception $e) {
$this->logger->error('Error checking email. ' . $e->getMessage());
return new Response(json_encode('Error: Please contact support@jewishstudiesenrichment.com for assistance.'), 500);
}
try {
$studentsExists = $this->studentService->findStudentsWithSsnDob($dob->format('Y-m-d'), $last4ssn, true);
if ($studentsExists && !$confirmDoubleSsnDob) {
if($isForSchool){
return new Response(json_encode('Error: There is an existing JSE student with the same ssn/dob, please contact support@jewishstudiesenrichment.com for assistance.'),500);
}
else if($isRegularAddEditStudent){
if(array_search($firstName,array_column($studentsExists, 'firstname')) !== false)
{
return new Response(json_encode('Error: There is an existing JSE student with the same ssn/dob/firstName, please contact support@jewishstudiesenrichment.com for assistance.'),500);
}
return $this->json(['Error'=>'Student exists with same ssn/dob','students'=>$studentsExists]);
}
else{
return new Response(json_encode('Error: Please contact support@jewishstudiesenrichment.com for assistance.'),500);
}
}
} catch (Exception $e) {
$this->logger->error('Error checking dob/ssn. ' . $e->getMessage());
return new Response(json_encode('Error: Please contact support@jewishstudiesenrichment.com for assistance.'), 500);
}
$setPassword = !$isForSchool && !$isRegularAddEditStudent;
try {
$student = $this->studentService->registerStudent($firstName, $lastName, $maidenName, $last4ssn, $dob, $gender, $email,
$cellphone, $phone, $address, $city, $state, $zip, $country, $schoolId, $collegeId, $membershipTypeId,
$password, $setPassword,$cohort,$isNonMemberInvite);
} catch (Exception $e) {
$this->logger->error('Error adding student. ' . $e->getMessage());
return new Response(json_encode($e->getMessage()), 500);
}
$this->sendStudentRegistrationToBackOffice(
$schoolService,
$collegeService,
$emailService,
$membershipTypeService,
$schoolId,
$collegeId,
$membershipTypeId,
$firstName,
$lastName,
$maidenName,
$last4ssn,
$dob,
$gender,
$email,
$cellphone,
$phone,
$address,
$city,
$state,
$zip,
$country,
$cohort
);
$response['student']=$student;
$response['paymentMethods']= $this->creditCardsService->getAllPaymentMethods($student->getId());
if($schoolId){
$response['school']=$this->schoolService->getSchoolForSchoolSession($schoolId);
$response['allSchoolStudents'] = $this->studentService->getAllSchoolStudents($schoolId);
}
return $this->json($response);
//return new Response(json_encode('Registration complete.'), 200);
} catch (Exception $ex) {
return new Response(json_encode($ex->getMessage()), 500);
}
}
private function sendStudentRegistrationToBackOffice($schoolService, $collegeService, $emailService, $membershipTypeService, $schoolId,
$collegeId, $membershipTypeId, $firstName, $lastName, $maidenName, $last4ssn, $dob, $gender, $email, $cellphone,
$phone, $address, $city, $state, $zip, $country,$cohort='') {
try {
$schoolName = '';
$collegeName = '';
$membershipTypeName = '';
if ($schoolId) {
$school = $schoolService->find($schoolId);
if ($school) {
$schoolName = $school->getName();
}
}
if($collegeId){
$college = $collegeService->find($collegeId);
if ($college) {
$collegeName = $college->getName();
}
}
$membershipType = $membershipTypeService->find($membershipTypeId);
if ($membershipType) {
$membershipTypeName = $membershipType->getName();
}
$emailService->sendStudentRegistrationToBackOffice(
$firstName,
$lastName,
$maidenName,
$last4ssn,
$dob,
$gender,
$email,
$cellphone,
$phone,
$address,
$city,
$state,
$zip,
$country,
$schoolName,
$collegeName,
$membershipTypeName,$cohort
);
} catch (Exception $e) {
$this->logger->error('Record of student registration not sent. ' . $e->getMessage());
}
}
/**
* @Route("/api/confirmToken", name="app_confirmToken")
*/
public function confirmToken(Request $request)
{
try {
$content = $this->getContent($request);
$response = $this->studentService->confirmToken(
ParameterUtil::getRequired($content->get('studentId')),
ParameterUtil::getRequired($content->get('token'))
);
} catch (Exception $ex) {
return new Response(json_encode($ex->getMessage()), 500);
}
return $this->json(array('success' => $response));
}
/**
* @Route("/api/resetPassword", name="app_resetPassword")
*/
public function resetPassword(Request $request)
{
try {
$content = $this->getContent($request);
$type = $content->get('type') ?: null;
$response = $this->studentService->resetPassword(
ParameterUtil::getRequired($content->get('studentId')),
ParameterUtil::getRequired($content->get('password')),
$type
);
} catch (Exception $ex) {
return new Response(json_encode($ex->getMessage()), 500);
}
return $this->json(array('success' => $response));
}
/**
* @Route("/api/forgotPasswordRequest", name="app_forgotPasswordRequest")
*/
public function forgotPasswordRequest(Request $request)
{
try {
$content = $this->getContent($request);
$response = $this->studentService->forgotPasswordRequest(
ParameterUtil::getRequired($content->get('email'))
);
} catch (Exception $ex) {
return new Response($ex->getMessage(), $ex->getCode());
}
return $this->json($response);
}
/**
* @Route("/api/emailStudyMaterials", name="app_emailStudyMaterials")
*/
public function emailStudyMaterials(Request $request)
{
try {
$studentId = parent::getStudentId($request);
$student = $this->studentService->find($studentId);
if (!$student) {
throw new Exception("Student not found.");
}
$content = $this->getContent($request);
$examId = ParameterUtil::getRequired($content->get('examId'));
$exam = $this->examsService->find($examId);
if (!$exam) {
throw new Exception("Exam not found - $examId");
}
$response = $this->examStudyMaterialsService->emailStudyMaterials($student, $exam);
} catch (Exception $ex) {
return new Response($ex->getMessage());
}
return $this->json($response);
}
/**
* @Route("/api/cron/emailVendorsWithCollegeUpdate", name="app_cron_email_vendors_with_college_update")
*/
public function emailVendorsWithCollegeUpdate(Request $request)
{
$auth = $request->headers->get('token-auth');
if ($auth == $_ENV['TTI_REQUEST_AUTH']) {
try {
$response = $this->studentService->emailVendorsWithCollegeUpdate();
} catch (Exception $ex) {
return new Response($ex->getMessage(), 500);
}
} else {
return new Response('false authentication', 401);
}
return new Response($response);
}
/**
* @Route("/api/getCreditsInfo", name="app_getCreditsInfo")
*/
public function getCreditsInfo(Request $request)
{
try {
$studentId = parent::getStudentId($request);
$student = $this->studentService->find($studentId);
$response['totalCredits'] = $this->pckPackagesService->getTotalCreditsAvailable($studentId);
$response['pricePerCredit'] = $this->membershipTypeService->getPricePerCreditByStudentId($studentId);
$response['specialPackages'] = $this->pckPackagesService->getSpecialActivePackages($studentId);
$response['packageBuyingDisabled'] = $student->getMembershiptype() != '1';
$response['vendorSpecificPackage'] = $this->pckPackagesService->getVendorSpecificPackage($studentId);
$response['creditsDetails'] = $this->pckPackagesService->getDetailedTotalCreditsAvailable($studentId);
$response['examAllowedPackage'] = $this->pckPackagesService->getExamsAllowedPackage($studentId);
$response['examAllowedPckCreditBalance'] = $this->pckPackagesService->getExamsAllowedPackageCreditBalance($studentId);
$response['freeCreditForSeminaryStudyRetakes'] = $this->pckPackagesService->getNumberFreeSeminaryStudyRetakesCreditsAvailable($studentId);
} catch (Exception $ex) {
return $this->json(array('error' => $ex->getMessage()));
}
return $this->json($response);
}
/**
* @Route("/api/getStudentPackages", name="app_getStudentPackages")
*/
public function getStudentPackages(Request $request)
{
try {
$studentId = parent::getStudentId($request);
$response = $this->pckPackagesService->getAvailablePackages($studentId);
} catch (Exception $ex) {
return $this->json(array('error' => $ex->getMessage()));
}
return $this->json(array('success' => $response));
}
/**
* @Route("/api/getStudentsAccordingSchool")
*/
public function getStudentsAccordingSchool(Request $request)
{
try {
$schoolId = $request->query->get('schoolId');
$response = $this->studentService->getStudentsAccordingSchool($schoolId);
} catch (Exception $ex) {
return $this->json(array('error' => $ex->getMessage()));
}
return $this->json($response);
}
/**
* @Route("/api/getInfoForAddStudent")
*/
public function getInfoForAddStudent(){
try{
$schools = $this->schoolService->findAllWithLatestCohort();
$membershipTypes = $this->membershipTypeService->findAllActive();
}catch (Exception $ex) {
return $this->json(array('error' => $ex->getMessage()));
}
return $this->json(['schools'=>$schools,'membershipTypes'=>$membershipTypes]);
}
/**
* @Route("/api/getStudentInfo")
*/
public function getStudentInfo(Request $request){
try{
$content = $this->getContent($request);
$isTtiMember = $content->get('isTtiMember');
$studentId = $content->get('student_id') ? $content->get('student_id') : ParameterUtil::getRequired($content->get('studentId'), 'studentId');
if ($isTtiMember) {
/** @var Students $student */
$student = $this->studentService->findOneBy(array('ttistudentid' => $studentId));
} else {
/** @var Students $student */
$student = $this->studentService->find($studentId);
}
if (!$student) {
throw new Exception("Student not found.");
}
// $studentId =$content->get('jseStudentId');
$student = $this->studentService->findStudents(null,null,null,
null,null,null,$student->getId())[0];
$student['logs'] = $this->queryLogService->findAllStudentLogs($student['id']);
$student['registrations'] = $this->registrationsService->getAllRegistrationsInfoForStudentCard($student['id']);
$student['studentPackages'] = $this->pckPackagesService->getStudentPackagesToDisplay($student['id']);
return $this->json($student);
}catch (Exception $ex) {
return $this->json(array('error' => $ex->getMessage()));
}
}
}