src/Controller/StudentController.php line 511

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Students;
  4. use App\Repository\StudentsRepository;
  5. use App\Repository\VendorsRepository;
  6. use App\Service\CollegeService;
  7. use App\Service\CreditCardsService;
  8. use App\Service\EmailService;
  9. use App\Service\ExamsService;
  10. use App\Service\ExamStudyMaterialsService;
  11. use App\Service\ExamVendorService;
  12. use App\Service\MembershipTypeService;
  13. use App\Service\PckPackagesService;
  14. use App\Service\ExamRegistrationsService;
  15. use App\Service\PurchaseService;
  16. use App\Service\QueryLogService;
  17. use App\Service\SchoolService;
  18. use App\Service\StudentsService;
  19. use App\Util\ParameterUtil;
  20. use DateTime;
  21. use Psr\Log\LoggerInterface;
  22. use Symfony\Component\HttpFoundation\Response;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. use Symfony\Component\Config\Definition\Exception\Exception;
  25. use Symfony\Component\HttpFoundation\Request;
  26. class StudentController extends BaseController
  27. {
  28. /**
  29. * @var StudentsService
  30. */
  31. private $studentService;
  32. /**
  33. * @var PckPackagesService
  34. */
  35. private $pckPackagesService;
  36. /**
  37. * @var ExamRegistrationsService
  38. */
  39. private $registrationsService;
  40. /**
  41. * @var PurchaseService
  42. */
  43. private $purchaseService;
  44. private $examsService;
  45. private $examStudyMaterialsService;
  46. private $logger;
  47. /**
  48. * @var CreditCardsService
  49. */
  50. private $creditCardsService;
  51. /**
  52. * @var SchoolService
  53. */
  54. private $schoolService;
  55. private MembershipTypeService $membershipTypeService;
  56. private StudentsRepository $studentsRepository;
  57. private QueryLogService $queryLogService;
  58. public function __construct(
  59. StudentsService $studentService,
  60. StudentsRepository $studentsRepository,
  61. PckPackagesService $pckPackagesService,
  62. ExamRegistrationsService $registrationsService,
  63. PurchaseService $purchaseService,
  64. ExamsService $examsService,
  65. CreditCardsService $creditCardsService,
  66. ExamStudyMaterialsService $examStudyMaterialsService,
  67. SchoolService $schoolService,
  68. MembershipTypeService $membershipTypeService,
  69. QueryLogService $queryLogService,
  70. LoggerInterface $logger
  71. ) {
  72. $this->studentService = $studentService;
  73. $this->pckPackagesService = $pckPackagesService;
  74. $this->registrationsService = $registrationsService;
  75. $this->purchaseService = $purchaseService;
  76. $this->examsService = $examsService;
  77. $this->examStudyMaterialsService = $examStudyMaterialsService;
  78. $this->logger = $logger;
  79. $this->creditCardsService = $creditCardsService;
  80. $this->schoolService = $schoolService;
  81. $this->membershipTypeService = $membershipTypeService;
  82. $this->studentsRepository = $studentsRepository;
  83. $this->queryLogService = $queryLogService;
  84. }
  85. /**
  86. * @Route("/api/getStudentByQuery", name="app_studentByQuery")
  87. */
  88. public function getStudentByQuery(Request $request)
  89. {
  90. try {
  91. $findBy = ParameterUtil::getRequired($_GET['findBy'], 'findBy');
  92. $findValue = ParameterUtil::getRequired($_GET['findValue'], 'findValue');
  93. /** @var Students $student */
  94. $student = $this->studentService->getStudentAndCollege($findBy, $findValue);
  95. if (!$student) {
  96. throw new Exception("Student not found.");
  97. }
  98. } catch (Exception $ex) {
  99. return new Response(json_encode($ex->getMessage()), 500);
  100. }
  101. return $this->json($student);
  102. }
  103. /**
  104. * @Route("/api/findTTIStudent")
  105. * @return mixed
  106. */
  107. public function findTTIStudent(Request $request) {
  108. try {
  109. $response = $this->studentService->findTTIStudent(
  110. ParameterUtil::getRequired($_GET['ttiStudentId'], 'ttiStudentId')
  111. );
  112. } catch (Exception $ex) {
  113. return new Response(json_encode($ex->getMessage()), 500);
  114. }
  115. return $this->json($response);
  116. }
  117. /**
  118. * @Route("/api/findTTIStudentByDobSsn")
  119. * @return mixed
  120. */
  121. public function findTTIStudentByDobSsn(Request $request) {
  122. try {
  123. $response = $this->studentService->findOneBy(
  124. array('dob'=>new DateTime(ParameterUtil::getRequired($_GET['dob'], 'dob')),
  125. 'ssn'=>'XXX-XX-'.ParameterUtil::getRequired($_GET['ssn'], 'ssn'))
  126. );
  127. } catch (Exception $ex) {
  128. return new Response(json_encode($ex->getMessage()), 500);
  129. }
  130. return $this->json($response);
  131. }
  132. /**
  133. * @Route("/api/updateMembershipType")
  134. * @return mixed
  135. */
  136. public function updateMembershipType(Request $request) {
  137. try {
  138. $content = $this->getContent($request);
  139. $studentId = ParameterUtil::getRequired($content->get('studentId'), 'studentId');
  140. $student = $this->studentService->find($studentId);
  141. $ttiDob = null;
  142. $ttiSsn = null;
  143. if (!$student) {
  144. $ttiDob = new DateTime($content->get('dob'));
  145. $ttiSsn = $content->get('ssn');
  146. }
  147. $this->logger->info("before updateMembershipType");
  148. $response = $this->studentService->updateMembershipType(
  149. $student,
  150. $ttiDob,
  151. $ttiSsn,
  152. MembershipTypeService::NON_MEMBER
  153. );
  154. $this->logger->info("updateMembershipType response ".print_r($response, true));
  155. } catch (Exception $ex) {
  156. return new Response(json_encode($ex->getMessage()), 500);
  157. }
  158. return $this->json($response);
  159. }
  160. /**
  161. * @Route("/api/student/add")
  162. */
  163. public function addStudent(Request $request, EmailService $emailService, SchoolService $schoolService, CollegeService $collegeService,
  164. MembershipTypeService $membershipTypeService)
  165. {
  166. return $this->addNewStudent($request,$emailService,$schoolService,$collegeService, $membershipTypeService,true);
  167. }
  168. /**
  169. * @Route("/api/student/tti/add")
  170. */
  171. public function addStudentForTTI(Request $request, StudentsService $studentsService)
  172. {
  173. try {
  174. $content = $this->getContent($request);
  175. $response = $this->studentService->addStudent(
  176. ParameterUtil::getRequired($content->get('firstName'),'firstName'),
  177. ParameterUtil::getRequired($content->get('lastName'),'lastName'),
  178. $content->get('maidenName'),
  179. ParameterUtil::getRequired($content->get('last4Ssn'),'last4Ssn'),
  180. new DateTime(ParameterUtil::getRequired($content->get('dob'),'dob')),
  181. ParameterUtil::getRequired($content->get('gender'),'gender'),
  182. ParameterUtil::getRequired($content->get('email'),'email'),
  183. ParameterUtil::getRequired($content->get('phone1'),'phone1'),
  184. $content->get('phone2'),
  185. ParameterUtil::getRequired($content->get('address'),'address'),
  186. ParameterUtil::getRequired($content->get('city'),'city'),
  187. ParameterUtil::getRequired($content->get('state'),'state'),
  188. ParameterUtil::getRequired($content->get('zip'),'zip'),
  189. ParameterUtil::getRequired($content->get('country'),'country'),
  190. null,
  191. $content->get('collegeId'),
  192. MembershipTypeService::MEMBER,
  193. null,
  194. null,
  195. null,
  196. null,
  197. ParameterUtil::getRequired($content->get('ttiStudentId'),'ttiStudentId')
  198. );
  199. } catch (Exception $ex) {
  200. return new Response(json_encode($ex->getMessage()), 500);
  201. }
  202. return $this->json($response);
  203. }
  204. /**
  205. * @Route("/api/student_add")
  206. */
  207. public function addSchoolStudent(Request $request, EmailService $emailService, SchoolService $schoolService, CollegeService $collegeService,
  208. MembershipTypeService $membershipTypeService)
  209. {
  210. return $this->addNewStudent($request,$emailService,$schoolService,$collegeService,$membershipTypeService);
  211. }
  212. private function addNewStudent( Request $request,
  213. EmailService $emailService,
  214. SchoolService $schoolService,
  215. CollegeService $collegeService,
  216. MembershipTypeService $membershipTypeService,
  217. $isNonMemberInvite = false){
  218. try {
  219. $content = $this->getContent($request);
  220. $isForSchool = $content->get('isForSchool') ?: false;
  221. $isRegularAddEditStudent = $content->get('isRegularAddEditStudent') ?: false;
  222. $firstName = ParameterUtil::getRequired($content->get('firstName'), 'firstName');
  223. $lastName = ParameterUtil::getRequired($content->get('lastName'), 'lastName');
  224. $maidenName = $content->get('maidenName');
  225. $confirmDoubleSsnDob = $content->get('confirmDoubleSsnDob');
  226. $last4ssn = ParameterUtil::getRequired($content->get('last4ssn'), 'last4ssn');
  227. if (!$this->studentService->validSsn($last4ssn)) {
  228. throw new Exception("SSN is not valid.");
  229. }
  230. $dob = ParameterUtil::getRequired($content->get('dob'), 'dob');
  231. if (!$this->studentService->validDob($dob)) {
  232. throw new Exception("DOB is not valid.");
  233. }
  234. $dob = new DateTime($dob);
  235. $email = ParameterUtil::getRequired($content->get('email'), 'email');
  236. $email = base64_decode($email, true) ? base64_decode($email) : $email;
  237. $gender = ParameterUtil::getRequired($content->get('gender'), 'gender');
  238. $cellphone = ParameterUtil::getRequired($content->get('cellphone'), 'cellphone');
  239. $phone = $content->get('phone');
  240. $address = ParameterUtil::getRequired($content->get('address'), 'address');
  241. $city = ParameterUtil::getRequired($content->get('city'), 'city');
  242. $state = $content->get('state');
  243. $zip = ParameterUtil::getRequired($content->get('zip'), 'zip');
  244. $country = ParameterUtil::getRequired($content->get('country'), 'country');
  245. $schoolId = $content->get('schoolId');
  246. if ($schoolId && !$isForSchool) {
  247. $schoolId = base64_decode($schoolId, true) ? base64_decode($schoolId) : $schoolId;
  248. }
  249. elseif($schoolId && $isForSchool){
  250. $schoolId = (int)$schoolId;
  251. }
  252. $collegeId = ParameterUtil::getRequired($content->get('collegeId'), 'collegeId');
  253. $membershipTypeId = ParameterUtil::getRequired($content->get('membershipTypeId'), 'membershipTypeId');
  254. $cohort = $content->get('cohort') ? (int)$content->get('cohort') : null;
  255. if (!$isForSchool && !$isRegularAddEditStudent) {
  256. $password = ParameterUtil::getRequired($content->get('password'), 'password');
  257. } else
  258. $password = null;
  259. try {
  260. $emailExists = $this->studentService->findByEmail($email);
  261. if ($emailExists) {
  262. $this->logger->error("Email already exists ($email). ");
  263. return new Response(json_encode('Email already exists. Please contact support@jewishstudiesenrichment.com for assistance.'), 500);
  264. }
  265. } catch (Exception $e) {
  266. $this->logger->error('Error checking email. ' . $e->getMessage());
  267. return new Response(json_encode('Error: Please contact support@jewishstudiesenrichment.com for assistance.'), 500);
  268. }
  269. try {
  270. $studentsExists = $this->studentService->findStudentsWithSsnDob($dob->format('Y-m-d'), $last4ssn, true);
  271. if ($studentsExists && !$confirmDoubleSsnDob) {
  272. if($isForSchool){
  273. 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);
  274. }
  275. else if($isRegularAddEditStudent){
  276. if(array_search($firstName,array_column($studentsExists, 'firstname')) !== false)
  277. {
  278. 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);
  279. }
  280. return $this->json(['Error'=>'Student exists with same ssn/dob','students'=>$studentsExists]);
  281. }
  282. else{
  283. return new Response(json_encode('Error: Please contact support@jewishstudiesenrichment.com for assistance.'),500);
  284. }
  285. }
  286. } catch (Exception $e) {
  287. $this->logger->error('Error checking dob/ssn. ' . $e->getMessage());
  288. return new Response(json_encode('Error: Please contact support@jewishstudiesenrichment.com for assistance.'), 500);
  289. }
  290. $setPassword = !$isForSchool && !$isRegularAddEditStudent;
  291. try {
  292. $student = $this->studentService->registerStudent($firstName, $lastName, $maidenName, $last4ssn, $dob, $gender, $email,
  293. $cellphone, $phone, $address, $city, $state, $zip, $country, $schoolId, $collegeId, $membershipTypeId,
  294. $password, $setPassword,$cohort,$isNonMemberInvite);
  295. } catch (Exception $e) {
  296. $this->logger->error('Error adding student. ' . $e->getMessage());
  297. return new Response(json_encode($e->getMessage()), 500);
  298. }
  299. $this->sendStudentRegistrationToBackOffice(
  300. $schoolService,
  301. $collegeService,
  302. $emailService,
  303. $membershipTypeService,
  304. $schoolId,
  305. $collegeId,
  306. $membershipTypeId,
  307. $firstName,
  308. $lastName,
  309. $maidenName,
  310. $last4ssn,
  311. $dob,
  312. $gender,
  313. $email,
  314. $cellphone,
  315. $phone,
  316. $address,
  317. $city,
  318. $state,
  319. $zip,
  320. $country,
  321. $cohort
  322. );
  323. $response['student']=$student;
  324. $response['paymentMethods']= $this->creditCardsService->getAllPaymentMethods($student->getId());
  325. if($schoolId){
  326. $response['school']=$this->schoolService->getSchoolForSchoolSession($schoolId);
  327. $response['allSchoolStudents'] = $this->studentService->getAllSchoolStudents($schoolId);
  328. }
  329. return $this->json($response);
  330. //return new Response(json_encode('Registration complete.'), 200);
  331. } catch (Exception $ex) {
  332. return new Response(json_encode($ex->getMessage()), 500);
  333. }
  334. }
  335. private function sendStudentRegistrationToBackOffice($schoolService, $collegeService, $emailService, $membershipTypeService, $schoolId,
  336. $collegeId, $membershipTypeId, $firstName, $lastName, $maidenName, $last4ssn, $dob, $gender, $email, $cellphone,
  337. $phone, $address, $city, $state, $zip, $country,$cohort='') {
  338. try {
  339. $schoolName = '';
  340. $collegeName = '';
  341. $membershipTypeName = '';
  342. if ($schoolId) {
  343. $school = $schoolService->find($schoolId);
  344. if ($school) {
  345. $schoolName = $school->getName();
  346. }
  347. }
  348. if($collegeId){
  349. $college = $collegeService->find($collegeId);
  350. if ($college) {
  351. $collegeName = $college->getName();
  352. }
  353. }
  354. $membershipType = $membershipTypeService->find($membershipTypeId);
  355. if ($membershipType) {
  356. $membershipTypeName = $membershipType->getName();
  357. }
  358. $emailService->sendStudentRegistrationToBackOffice(
  359. $firstName,
  360. $lastName,
  361. $maidenName,
  362. $last4ssn,
  363. $dob,
  364. $gender,
  365. $email,
  366. $cellphone,
  367. $phone,
  368. $address,
  369. $city,
  370. $state,
  371. $zip,
  372. $country,
  373. $schoolName,
  374. $collegeName,
  375. $membershipTypeName,$cohort
  376. );
  377. } catch (Exception $e) {
  378. $this->logger->error('Record of student registration not sent. ' . $e->getMessage());
  379. }
  380. }
  381. /**
  382. * @Route("/api/confirmToken", name="app_confirmToken")
  383. */
  384. public function confirmToken(Request $request)
  385. {
  386. try {
  387. $content = $this->getContent($request);
  388. $response = $this->studentService->confirmToken(
  389. ParameterUtil::getRequired($content->get('studentId')),
  390. ParameterUtil::getRequired($content->get('token'))
  391. );
  392. } catch (Exception $ex) {
  393. return new Response(json_encode($ex->getMessage()), 500);
  394. }
  395. return $this->json(array('success' => $response));
  396. }
  397. /**
  398. * @Route("/api/resetPassword", name="app_resetPassword")
  399. */
  400. public function resetPassword(Request $request)
  401. {
  402. try {
  403. $content = $this->getContent($request);
  404. $type = $content->get('type') ?: null;
  405. $response = $this->studentService->resetPassword(
  406. ParameterUtil::getRequired($content->get('studentId')),
  407. ParameterUtil::getRequired($content->get('password')),
  408. $type
  409. );
  410. } catch (Exception $ex) {
  411. return new Response(json_encode($ex->getMessage()), 500);
  412. }
  413. return $this->json(array('success' => $response));
  414. }
  415. /**
  416. * @Route("/api/forgotPasswordRequest", name="app_forgotPasswordRequest")
  417. */
  418. public function forgotPasswordRequest(Request $request)
  419. {
  420. try {
  421. $content = $this->getContent($request);
  422. $response = $this->studentService->forgotPasswordRequest(
  423. ParameterUtil::getRequired($content->get('email'))
  424. );
  425. } catch (Exception $ex) {
  426. return new Response($ex->getMessage(), $ex->getCode());
  427. }
  428. return $this->json($response);
  429. }
  430. /**
  431. * @Route("/api/emailStudyMaterials", name="app_emailStudyMaterials")
  432. */
  433. public function emailStudyMaterials(Request $request)
  434. {
  435. try {
  436. $studentId = parent::getStudentId($request);
  437. $student = $this->studentService->find($studentId);
  438. if (!$student) {
  439. throw new Exception("Student not found.");
  440. }
  441. $content = $this->getContent($request);
  442. $examId = ParameterUtil::getRequired($content->get('examId'));
  443. $exam = $this->examsService->find($examId);
  444. if (!$exam) {
  445. throw new Exception("Exam not found - $examId");
  446. }
  447. $response = $this->examStudyMaterialsService->emailStudyMaterials($student, $exam);
  448. } catch (Exception $ex) {
  449. return new Response($ex->getMessage());
  450. }
  451. return $this->json($response);
  452. }
  453. /**
  454. * @Route("/api/cron/emailVendorsWithCollegeUpdate", name="app_cron_email_vendors_with_college_update")
  455. */
  456. public function emailVendorsWithCollegeUpdate(Request $request)
  457. {
  458. $auth = $request->headers->get('token-auth');
  459. if ($auth == $_ENV['TTI_REQUEST_AUTH']) {
  460. try {
  461. $response = $this->studentService->emailVendorsWithCollegeUpdate();
  462. } catch (Exception $ex) {
  463. return new Response($ex->getMessage(), 500);
  464. }
  465. } else {
  466. return new Response('false authentication', 401);
  467. }
  468. return new Response($response);
  469. }
  470. /**
  471. * @Route("/api/getCreditsInfo", name="app_getCreditsInfo")
  472. */
  473. public function getCreditsInfo(Request $request)
  474. {
  475. try {
  476. $studentId = parent::getStudentId($request);
  477. $student = $this->studentService->find($studentId);
  478. $response['totalCredits'] = $this->pckPackagesService->getTotalCreditsAvailable($studentId);
  479. $response['pricePerCredit'] = $this->membershipTypeService->getPricePerCreditByStudentId($studentId);
  480. $response['specialPackages'] = $this->pckPackagesService->getSpecialActivePackages($studentId);
  481. $response['packageBuyingDisabled'] = $student->getMembershiptype() != '1';
  482. $response['vendorSpecificPackage'] = $this->pckPackagesService->getVendorSpecificPackage($studentId);
  483. $response['creditsDetails'] = $this->pckPackagesService->getDetailedTotalCreditsAvailable($studentId);
  484. $response['examAllowedPackage'] = $this->pckPackagesService->getExamsAllowedPackage($studentId);
  485. $response['examAllowedPckCreditBalance'] = $this->pckPackagesService->getExamsAllowedPackageCreditBalance($studentId);
  486. $response['freeCreditForSeminaryStudyRetakes'] = $this->pckPackagesService->getNumberFreeSeminaryStudyRetakesCreditsAvailable($studentId);
  487. } catch (Exception $ex) {
  488. return $this->json(array('error' => $ex->getMessage()));
  489. }
  490. return $this->json($response);
  491. }
  492. /**
  493. * @Route("/api/getStudentPackages", name="app_getStudentPackages")
  494. */
  495. public function getStudentPackages(Request $request)
  496. {
  497. try {
  498. $studentId = parent::getStudentId($request);
  499. $response = $this->pckPackagesService->getAvailablePackages($studentId);
  500. } catch (Exception $ex) {
  501. return $this->json(array('error' => $ex->getMessage()));
  502. }
  503. return $this->json(array('success' => $response));
  504. }
  505. /**
  506. * @Route("/api/getStudentsAccordingSchool")
  507. */
  508. public function getStudentsAccordingSchool(Request $request)
  509. {
  510. try {
  511. $schoolId = $request->query->get('schoolId');
  512. $response = $this->studentService->getStudentsAccordingSchool($schoolId);
  513. } catch (Exception $ex) {
  514. return $this->json(array('error' => $ex->getMessage()));
  515. }
  516. return $this->json($response);
  517. }
  518. /**
  519. * @Route("/api/getInfoForAddStudent")
  520. */
  521. public function getInfoForAddStudent(){
  522. try{
  523. $schools = $this->schoolService->findAllWithLatestCohort();
  524. $membershipTypes = $this->membershipTypeService->findAllActive();
  525. }catch (Exception $ex) {
  526. return $this->json(array('error' => $ex->getMessage()));
  527. }
  528. return $this->json(['schools'=>$schools,'membershipTypes'=>$membershipTypes]);
  529. }
  530. /**
  531. * @Route("/api/getStudentInfo")
  532. */
  533. public function getStudentInfo(Request $request){
  534. try{
  535. $content = $this->getContent($request);
  536. $isTtiMember = $content->get('isTtiMember');
  537. $studentId = $content->get('student_id') ? $content->get('student_id') : ParameterUtil::getRequired($content->get('studentId'), 'studentId');
  538. if ($isTtiMember) {
  539. /** @var Students $student */
  540. $student = $this->studentService->findOneBy(array('ttistudentid' => $studentId));
  541. } else {
  542. /** @var Students $student */
  543. $student = $this->studentService->find($studentId);
  544. }
  545. if (!$student) {
  546. throw new Exception("Student not found.");
  547. }
  548. // $studentId =$content->get('jseStudentId');
  549. $student = $this->studentService->findStudents(null,null,null,
  550. null,null,null,$student->getId())[0];
  551. $student['logs'] = $this->queryLogService->findAllStudentLogs($student['id']);
  552. $student['registrations'] = $this->registrationsService->getAllRegistrationsInfoForStudentCard($student['id']);
  553. $student['studentPackages'] = $this->pckPackagesService->getStudentPackagesToDisplay($student['id']);
  554. return $this->json($student);
  555. }catch (Exception $ex) {
  556. return $this->json(array('error' => $ex->getMessage()));
  557. }
  558. }
  559. }