src/Controller/PaymentController.php line 294

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Service\AuthorizeNetService;
  4. use App\Service\ChargesService;
  5. use App\Service\CreditCardsService;
  6. use App\Service\ExamRegistrationsService;
  7. use App\Service\ExamRegistrationsTransactionsService;
  8. use App\Service\PckPackagesService;
  9. use App\Service\PckPackageTypesService;
  10. use App\Service\PurchaseService;
  11. use App\Service\SchoolInvoiceDetailsService;
  12. use App\Service\SchoolService;
  13. use App\Service\StudentsService;
  14. use App\Service\TestSessionsService;
  15. use App\Util\ParameterUtil;
  16. use DateTime;
  17. use Doctrine\ORM\EntityManager;
  18. use Doctrine\ORM\EntityManagerInterface;
  19. use Psr\Log\LoggerInterface;
  20. use Symfony\Component\Config\Definition\Exception\Exception;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\HttpFoundation\Response;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. class PaymentController extends BaseController
  25. {
  26. const PROCTOR_FEE_CHARGE_TYPE = 3;
  27. const ADDITIONAL_FEE_CHARGE_TYPE = 4;
  28. const ADDITIONAL_AND_PROCTOR_FEE_CHARGE_TYPE = 5;
  29. /**
  30. * @var AuthorizeNetService
  31. */
  32. private $paymentService;
  33. /**
  34. * @var CreditCardsService
  35. */
  36. private $paymentMethodService;
  37. /**
  38. * @var StudentsService
  39. */
  40. private $studentsService;
  41. /**
  42. * @var ExamRegistrationsService
  43. */
  44. private $examRegistrationsService;
  45. /**
  46. * @var PurchaseService
  47. */
  48. private $purchaseService;
  49. /**
  50. * @var PckPackageTypesService
  51. */
  52. private $pckPackageTypesService;
  53. /**
  54. * @var ChargesService
  55. */
  56. private $chargesService;
  57. private $logger;
  58. /**
  59. * @var PckPackagesService
  60. */
  61. private $pckPackagesService;
  62. /**
  63. * @var EntityManagerInterface
  64. */
  65. private $entityManager;
  66. /**
  67. * @var SchoolService
  68. */
  69. private $schoolService;
  70. /**
  71. * @var TestSessionsService
  72. */
  73. private $testSessionsService;
  74. private SchoolInvoiceDetailsService $schoolInvoiceDetailsService;
  75. private ExamRegistrationsTransactionsService $examRegistrationsTransactionsService;
  76. public function __construct(
  77. AuthorizeNetService $paymentService,
  78. CreditCardsService $paymentMethodService,
  79. StudentsService $studentsService,
  80. ExamRegistrationsService $examRegistrationsService,
  81. PurchaseService $purchaseService,
  82. PckPackageTypesService $pckPackageTypesService,
  83. PckPackagesService $pckPackagesService,
  84. ChargesService $chargesService,
  85. SchoolService $schoolService,
  86. SchoolInvoiceDetailsService $schoolInvoiceDetailsService,
  87. ExamRegistrationsTransactionsService $examRegistrationsTransactionsService,
  88. LoggerInterface $logger,
  89. EntityManagerInterface $entityManager,
  90. TestSessionsService $testSessionsService
  91. ) {
  92. $this->paymentService = $paymentService;
  93. $this->paymentMethodService = $paymentMethodService;
  94. $this->studentsService = $studentsService;
  95. $this->examRegistrationsService = $examRegistrationsService;
  96. $this->purchaseService = $purchaseService;
  97. $this->pckPackageTypesService = $pckPackageTypesService;
  98. $this->chargesService = $chargesService;
  99. $this->logger = $logger;
  100. $this->pckPackagesService = $pckPackagesService;
  101. $this->entityManager = $entityManager;
  102. $this->schoolService = $schoolService;
  103. $this->testSessionsService = $testSessionsService;
  104. $this->schoolInvoiceDetailsService = $schoolInvoiceDetailsService;
  105. $this->examRegistrationsTransactionsService = $examRegistrationsTransactionsService;
  106. }
  107. /**
  108. * @Route("/api/oneTimePayment")
  109. * @param Request $request
  110. * @return mixed
  111. */
  112. public function chargeOneTimePayment(Request $request)
  113. {
  114. try {
  115. $content = $this->getContent($request);
  116. $response = $this->paymentService->createAnAcceptPaymentTransaction(
  117. ParameterUtil::getRequired($content->get('amount')),
  118. ParameterUtil::getRequired($content->get('dataDescriptor')),
  119. ParameterUtil::getRequired($content->get('dataValue'))
  120. );
  121. if (!$response) {
  122. return $this->json(array('error' => 'Payment not processed'));
  123. }
  124. } catch (Exception $ex) {
  125. return $this->json(array('error' => $ex->getMessage()));
  126. }
  127. return $this->json(($response));
  128. }
  129. // /**
  130. // * @Route("/api/chargeCustomerProfile")
  131. // * @param Request $request
  132. // * @return mixed
  133. // */
  134. // public function chargeCustomerProfile(Request $request){
  135. // try {
  136. // $content = $this->getContent($request);
  137. // $paymentId = $this->paymentService->chargeCustomerProfile(
  138. // ParameterUtil::getRequired($content->get('customerProfileId')),
  139. // ParameterUtil::getRequired($content->get('customerPaymentProfileId')),
  140. // ParameterUtil::getRequired($content->get('amount')),
  141. // $content->get('description')
  142. // );
  143. // if (!$paymentId) {
  144. // return $this->json(array('error' => 'Payment not processed.'));
  145. // }
  146. // } catch (Exception $ex) {
  147. // return $this->json(array('error' => $ex->getMessage()));
  148. // }
  149. // return $this->json(array('success' => array('message'=>'Payment saved.', 'transactionId'=>$paymentId)));
  150. // }
  151. // /**
  152. // * @Route("/api/createCustomerProfile")
  153. // * @param Request $request
  154. // * @return mixed
  155. // */
  156. // public function createCustomerProfile(Request $request){
  157. // try {
  158. // $content = $this->getContent($request);
  159. // $customerProfileId = $this->paymentService->createCustomerProfile(
  160. // ParameterUtil::getRequired($content->get('email'))
  161. // );
  162. // if (!$customerProfileId) {
  163. // return $this->json(array('error' => 'Customer profile not saved'));
  164. // }
  165. // } catch (Exception $ex) {
  166. // return $this->json($ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
  167. // }
  168. // return $this->json(array('success' => array('message'=>'Customer Profile saved', 'customer profile Id'=>$customerProfileId)));
  169. // }
  170. /**
  171. * @Route("/api/getPaymentMethods")
  172. * @param Request $request
  173. * @return mixed
  174. */
  175. public function getPaymentMethods(Request $request)
  176. {
  177. try {
  178. $studentId = parent::getStudentId($request, $this->logger);
  179. $this->logger->error('getPaymentMethods studentId ' . $studentId);
  180. $response = $this->paymentMethodService->getAllPaymentMethods($studentId);
  181. } catch (Exception $ex) {
  182. return $this->json($ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
  183. }
  184. return $this->json(($response));
  185. }
  186. /**
  187. * @Route("/api/submitPaymentAndGetExam")
  188. * @param Request $request
  189. * @return mixed
  190. */
  191. public function submitPaymentAndGetExam(Request $request, LoggerInterface $logger)
  192. {
  193. try {
  194. $content = $this->getContent($request);
  195. $studentId = parent::getStudentId($request, $this->logger);
  196. $this->logger->error('SPAGE STUDENT ID ' . $studentId);
  197. $response = $this->purchaseService->submitPaymentAndRegister(
  198. $studentId,
  199. ParameterUtil::getRequired($content->get('numberOfCredits')),
  200. ParameterUtil::getRequired($content->get('ccId')),
  201. ParameterUtil::getRequired($content->get('amount')),
  202. ParameterUtil::getRequired($content->get('examId')),
  203. false,
  204. !$this->isAdmin($logger)
  205. );
  206. } catch (Exception $ex) {
  207. return $this->json($ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
  208. }
  209. return $this->json(($response));
  210. }
  211. /**
  212. * @Route("/api/purchasePackageAndRegister")
  213. * @param Request $request
  214. * @return mixed
  215. */
  216. public function purchasePackageAndRegister(Request $request, LoggerInterface $logger)
  217. {
  218. try {
  219. $content = $this->getContent($request);
  220. $studentId = parent::getStudentId($request);
  221. $student = $this->studentsService->find($studentId);
  222. $examId = ParameterUtil::getRequired($content->get('examId'));
  223. //find package
  224. $package = $this->pckPackageTypesService->findPackageByCreditsAmount(ParameterUtil::getRequired($content->get('numberOfCredits')));
  225. $ccExpMonth = ParameterUtil::getRequired($content->get('ccExpMonth'));
  226. $ccExpYear = ParameterUtil::getRequired($content->get('ccExpYear'));
  227. $acceptPaymentDescriptor = ParameterUtil::getRequired($content->get('acceptPaymentDescriptor'));
  228. $acceptPaymentValue = ParameterUtil::getRequired($content->get('acceptPaymentValue'));
  229. $ccName = ParameterUtil::getRequired($content->get('cardholderName'));
  230. $ccLast4 = ParameterUtil::getRequired($content->get('ccLast4'));
  231. $ccType = ParameterUtil::getRequired($content->get('cardType'));
  232. $billingZipCode = ParameterUtil::getRequired($content->get('billingZipCode'));
  233. $amount = ParameterUtil::getRequired($content->get('amount'));
  234. $chargeResponse = $this->paymentService->chargeCustomerWithNewProfile(
  235. $student,
  236. $acceptPaymentDescriptor,
  237. $acceptPaymentValue,
  238. $amount,
  239. $ccName,
  240. $ccLast4,
  241. $ccExpMonth,
  242. $ccExpYear,
  243. $billingZipCode,
  244. $ccType,
  245. $this->purchaseService->getChargeDescription($package['id'])
  246. );
  247. $response = $this->purchaseService->findPurchasePackageAndRegister(
  248. $package,
  249. $studentId,
  250. $chargeResponse['ccId'],
  251. $amount,
  252. $student->getCimid(),
  253. $chargeResponse['paymentProfileId'],
  254. $chargeResponse,
  255. $examId,
  256. !$this->isAdmin($logger)
  257. );
  258. $response['paymentMethod'] =
  259. array('cc4digits' => $ccLast4,'cardtype' => $this->paymentMethodService->getCCTypeValue($ccType),
  260. 'ccExpMonth' => $ccExpMonth,
  261. 'ccExpYear' => $ccExpYear, 'ccName' => $ccName, 'ccId' => $chargeResponse['ccId']);
  262. } catch (Exception $ex) {
  263. return $this->json($ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
  264. }
  265. return $this->json(($response));
  266. }
  267. /**
  268. * @Route("/api/payProctorFee")
  269. * @param Request $request
  270. * @return mixed
  271. */
  272. public function payProctorFee(Request $request)
  273. {
  274. try {
  275. $content = $this->getContent($request);
  276. $studentId = parent::getStudentId($request);
  277. $student = $this->studentsService->find($studentId);
  278. $examId = ParameterUtil::getRequired($content->get('examId'));
  279. $registrationId = ParameterUtil::getRequired($content->get('registrationId'));
  280. $ccExpMonth = ParameterUtil::getRequired($content->get('ccExpMonth'));
  281. $ccExpYear = ParameterUtil::getRequired($content->get('ccExpYear'));
  282. $acceptPaymentDescriptor = ParameterUtil::getRequired($content->get('acceptPaymentDescriptor'));
  283. $acceptPaymentValue = ParameterUtil::getRequired($content->get('acceptPaymentValue'));
  284. $ccName = ParameterUtil::getRequired($content->get('cardholderName'));
  285. $ccLast4 = ParameterUtil::getRequired($content->get('ccLast4'));
  286. $ccType = ParameterUtil::getRequired($content->get('cardType'));
  287. $billingZipCode = ParameterUtil::getRequired($content->get('billingZipCode'));
  288. $amount = ParameterUtil::getRequired($content->get('amount'));
  289. $proctorFee = $content->get('proctorFee');
  290. $registration = $this->examRegistrationsService->findById($registrationId);
  291. //add payment only if proctor reserved wasn't set yet
  292. if(!$registration->getProctorReserved()){
  293. if ($amount > 0) {
  294. $chargeDescription = ($amount - $proctorFee > 0) ? (($proctorFee > 0) ? 'Proctor fee and additional fee' : 'Additional fee') : 'Proctor Fee';
  295. $chargeTypeId = ($amount - $proctorFee > 0) ? (($proctorFee > 0) ? self::ADDITIONAL_AND_PROCTOR_FEE_CHARGE_TYPE : self::ADDITIONAL_FEE_CHARGE_TYPE) : self::PROCTOR_FEE_CHARGE_TYPE;
  296. $response = $this->paymentService->chargeCustomerWithNewProfile(
  297. $student,
  298. $acceptPaymentDescriptor,
  299. $acceptPaymentValue,
  300. $amount,
  301. $ccName,
  302. $ccLast4,
  303. $ccExpMonth,
  304. $ccExpYear,
  305. $billingZipCode,
  306. $ccType,
  307. $chargeDescription
  308. );
  309. $this->chargesService->addStudentCharge(
  310. $student,
  311. $response['ccId'],
  312. $student->getCimid(),
  313. $response['paymentProfileId'],
  314. $amount,
  315. $response['transaction_id'],
  316. $response['authNetResponse'],
  317. $response['authResultCode'],
  318. $chargeTypeId,
  319. $registrationId
  320. );
  321. $response['paymentMethod'] =
  322. array('cc4digits' => $ccLast4,'cardtype' => $this->paymentMethodService->getCCTypeValue($ccType),
  323. 'ccExpMonth' => $ccExpMonth,
  324. 'ccExpYear' => $ccExpYear, 'ccName' => $ccName, 'ccId' => $response['ccId']);
  325. if (in_array($chargeTypeId, [4,5])) {
  326. $response['chargeAdditionalCharge'] = 0;
  327. }
  328. } else {
  329. $response = array();
  330. }
  331. $proctorReserved = $this->examRegistrationsService->setProctorReserved($registrationId);
  332. $response['proctor_reserved'] = $proctorReserved;
  333. }
  334. else{
  335. $response=array();
  336. $response['proctor_reserved'] = $registration->getProctorReserved();
  337. }
  338. $proctorReserved = $this->examRegistrationsService->setProctorReserved($registrationId);
  339. $response['proctor_reserved'] = $proctorReserved;
  340. } catch (Exception $ex) {
  341. return $this->json($ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
  342. }
  343. return $this->json(($response));
  344. }
  345. /**
  346. * @Route("/api/payProctorFeeWithPaymentProfile")
  347. * @param Request $request
  348. * @return mixed
  349. */
  350. public function payProctorFeeWithPaymentProfile(Request $request)
  351. {
  352. try {
  353. $content = $this->getContent($request);
  354. $studentId = parent::getStudentId($request);
  355. $student = $this->studentsService->find($studentId);
  356. $examId = ParameterUtil::getRequired($content->get('examId'));
  357. //find package
  358. $ccId = ParameterUtil::getRequired($content->get('ccId'));
  359. $amount = ParameterUtil::getRequired($content->get('amount'));
  360. $registrationId = ParameterUtil::getRequired($content->get('registrationId'));
  361. $proctorFee = $content->get('proctorFee');
  362. $registration = $this->examRegistrationsService->findById($registrationId);
  363. //add payment only if proctor reserved wasn't set yet
  364. if(!$registration->getProctorReserved()) {
  365. $response = $this->payAdditionalFees($amount, $proctorFee, $ccId, $student, $registrationId);
  366. $proctorReserved = $this->examRegistrationsService->setProctorReserved($registrationId);
  367. $response['proctor_reserved'] = $proctorReserved;
  368. }
  369. else{
  370. $response=[];
  371. $response['proctor_reserved']=$registration->getProctorReserved();
  372. }
  373. } catch (Exception $ex) {
  374. return $this->json($ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
  375. }
  376. return $this->json(($response));
  377. }
  378. private function payAdditionalFees($amount, $proctorFee, $ccId, $student, $registrationId, $allowDuplicateTransaction = false)
  379. {
  380. if ($amount > 0) {
  381. $chargeDescription = ($amount - $proctorFee > 0) ? (($proctorFee > 0) ? 'Proctor fee and additional fee' : 'Additional fee') : 'Proctor Fee';
  382. $chargeTypeId = ($amount - $proctorFee > 0) ? (($proctorFee > 0) ? self::ADDITIONAL_AND_PROCTOR_FEE_CHARGE_TYPE : self::ADDITIONAL_FEE_CHARGE_TYPE) : self::PROCTOR_FEE_CHARGE_TYPE;
  383. $creditCard = $this->paymentMethodService->find($ccId);
  384. $response = $this->paymentService->chargeCustomerProfile(
  385. $student->getCimid(),
  386. $creditCard->getCccimid(),
  387. $amount,
  388. $chargeDescription,
  389. $student->getEmail(),
  390. $student->getLastname() . ', ' . $student->getFirstname(),
  391. $student->getId(),
  392. $allowDuplicateTransaction
  393. );
  394. $this->chargesService->addStudentCharge(
  395. $student,
  396. $creditCard->getId(),
  397. $student->getCimid(),
  398. $creditCard->getCccimid(),
  399. $amount,
  400. $response['transaction_id'],
  401. $response['authNetResponse'],
  402. $response['authResultCode'],
  403. $chargeTypeId,
  404. $registrationId
  405. );
  406. if (in_array($chargeTypeId, [4,5])) {
  407. $response['chargeAdditionalCharge'] = 0;
  408. }
  409. } else {
  410. $response = array();
  411. }
  412. return $response;
  413. }
  414. /**
  415. * @Route("/api/saveCreditCard")
  416. * @param Request $request
  417. * @return mixed
  418. */
  419. public function saveCreditCard(Request $request)
  420. {
  421. $content = $this->getContent($request);
  422. $studentId = ParameterUtil::getRequired($content->get('student_id'));
  423. $student = $this->studentsService->find($studentId);
  424. $ccExpMonth = ParameterUtil::getRequired($content->get('ccExpMonth'));
  425. $ccExpYear = ParameterUtil::getRequired($content->get('ccExpYear'));
  426. $acceptPaymentDescriptor = ParameterUtil::getRequired($content->get('acceptPaymentDescriptor'));
  427. $acceptPaymentValue = ParameterUtil::getRequired($content->get('acceptPaymentValue'));
  428. $ccName = ParameterUtil::getRequired($content->get('cardholderName'));
  429. $ccLast4 = ParameterUtil::getRequired($content->get('ccLast4'));
  430. $ccType = ParameterUtil::getRequired($content->get('cardType'));
  431. $billingZipCode = ParameterUtil::getRequired($content->get('billingZipCode'));
  432. $response = $this->paymentService->chargeCustomerWithNewProfile(
  433. $student,
  434. $acceptPaymentDescriptor,
  435. $acceptPaymentValue,
  436. null,
  437. $ccName,
  438. $ccLast4,
  439. $ccExpMonth,
  440. $ccExpYear,
  441. $billingZipCode,
  442. $ccType,
  443. null,
  444. false
  445. );
  446. return $this->json($this->paymentMethodService->getAllPaymentMethods($student->getId()));
  447. // return $this->json(($response));
  448. }
  449. /**
  450. * @Route("/api/payRegisterAndSchedule")
  451. * @param Request $request
  452. * @return mixed
  453. */
  454. public function payRegisterAndSchedule(Request $request)
  455. {
  456. $content = $this->getContent($request);
  457. $session = ParameterUtil::getRequired($content->get('session'));
  458. $studentInfos = ParameterUtil::getRequired($content->get('studentInfos'));
  459. $schoolId = ParameterUtil::getRequired($content->get('schoolId'));
  460. $sendStudyMaterials = ParameterUtil::getRequired($content->get('sendStudyMaterials')) == 'true' ? 1 : 0;
  461. $school = $this->schoolService->getSchool($schoolId);
  462. $payRegisterAndScheduleSessionResponse = $this->purchaseService->payRegisterAndScheduleSession($studentInfos, $session, $school,$sendStudyMaterials);
  463. $response['registrations'] = $payRegisterAndScheduleSessionResponse['registrations'];
  464. $response['totalAmtChargedFromSchoolBalance']=$payRegisterAndScheduleSessionResponse['totalAmtChargedFromSchoolBalance'];
  465. $response['schoolCurrentBalance']= $payRegisterAndScheduleSessionResponse['schoolCurrentBalance'];
  466. $response['studentsPerSession'] = $this->testSessionsService->getStudentsPerSession($session['id']);
  467. $response['accountReport'] = $this->schoolInvoiceDetailsService->getAccountReport($schoolId);
  468. //$response['session']
  469. return $this->json($response);
  470. }
  471. /**
  472. * @Route("/api/admin/payRetakeFeeAndRegisterWithPaymentProfile")
  473. * @param Request $request
  474. * @return mixed
  475. */
  476. public function payRetakeFeeAndRegisterWithPaymentProfile(Request $request)
  477. {
  478. $content = $this->getContent($request);
  479. $studentId = ParameterUtil::getRequired($content->get('studentId'));
  480. $examId = ParameterUtil::getRequired($content->get('examId'));
  481. $ccId = ParameterUtil::getRequired($content->get('ccId'));
  482. $amount = ParameterUtil::getRequired($content->get('amount'));
  483. $vendorApprovalReasonId = ParameterUtil::getRequired($content->get('vendorApprovalReasonId'));
  484. try {
  485. $response = $this->examRegistrationsTransactionsService->payRetakeFeeAndRegister($studentId,$examId,$vendorApprovalReasonId,$amount,$ccId);
  486. }
  487. catch (\Throwable $t){
  488. return $this->json($t->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
  489. }
  490. return $this->json($response);
  491. }
  492. /**
  493. * @Route("/api/admin/payRetakeFeeAndRegisterWithNewPaymentProfile")
  494. * @param Request $request
  495. * @return mixed
  496. */
  497. public function payRetakeFeeAndRegisterWithNewPaymentProfile(Request $request)
  498. {
  499. $content = $this->getContent($request);
  500. $studentId = ParameterUtil::getRequired($content->get('studentId'));
  501. $examId = ParameterUtil::getRequired($content->get('examId'));
  502. $ccLast4 = ParameterUtil::getRequired($content->get('ccLast4'));
  503. $ccExpMonth = ParameterUtil::getRequired($content->get('ccExpMonth'));
  504. $ccExpYear = ParameterUtil::getRequired($content->get('ccExpYear'));
  505. $billingZipCode = ParameterUtil::getRequired($content->get('billingZipCode'));
  506. $acceptPaymentDescriptor = ParameterUtil::getRequired($content->get('acceptPaymentDescriptor'));
  507. $acceptPaymentValue = ParameterUtil::getRequired($content->get('acceptPaymentValue'));
  508. $cardholderName = ParameterUtil::getRequired($content->get('cardholderName'));
  509. $cardType = ParameterUtil::getRequired($content->get('cardType'));
  510. $amount = ParameterUtil::getRequired($content->get('amount'));
  511. $vendorApprovalReasonId = ParameterUtil::getRequired($content->get('vendorApprovalReasonId'));
  512. try {
  513. $response = $this->examRegistrationsTransactionsService->payRetakeFeeAndRegister($studentId,$examId,$vendorApprovalReasonId,$amount,null,$ccLast4,$ccExpMonth,$ccExpYear,$acceptPaymentDescriptor,$acceptPaymentValue,$billingZipCode,$cardType,$cardholderName);
  514. }
  515. catch (\Throwable $t){
  516. return $this->json($t->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
  517. }
  518. return $this->json($response);
  519. }
  520. }