<?php
namespace App\Controller;
use App\Service\AuthorizeNetService;
use App\Service\ChargesService;
use App\Service\CreditCardsService;
use App\Service\ExamRegistrationsService;
use App\Service\ExamRegistrationsTransactionsService;
use App\Service\PckPackagesService;
use App\Service\PckPackageTypesService;
use App\Service\PurchaseService;
use App\Service\SchoolInvoiceDetailsService;
use App\Service\SchoolService;
use App\Service\StudentsService;
use App\Service\TestSessionsService;
use App\Util\ParameterUtil;
use DateTime;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\Config\Definition\Exception\Exception;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class PaymentController extends BaseController
{
const PROCTOR_FEE_CHARGE_TYPE = 3;
const ADDITIONAL_FEE_CHARGE_TYPE = 4;
const ADDITIONAL_AND_PROCTOR_FEE_CHARGE_TYPE = 5;
/**
* @var AuthorizeNetService
*/
private $paymentService;
/**
* @var CreditCardsService
*/
private $paymentMethodService;
/**
* @var StudentsService
*/
private $studentsService;
/**
* @var ExamRegistrationsService
*/
private $examRegistrationsService;
/**
* @var PurchaseService
*/
private $purchaseService;
/**
* @var PckPackageTypesService
*/
private $pckPackageTypesService;
/**
* @var ChargesService
*/
private $chargesService;
private $logger;
/**
* @var PckPackagesService
*/
private $pckPackagesService;
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var SchoolService
*/
private $schoolService;
/**
* @var TestSessionsService
*/
private $testSessionsService;
private SchoolInvoiceDetailsService $schoolInvoiceDetailsService;
private ExamRegistrationsTransactionsService $examRegistrationsTransactionsService;
public function __construct(
AuthorizeNetService $paymentService,
CreditCardsService $paymentMethodService,
StudentsService $studentsService,
ExamRegistrationsService $examRegistrationsService,
PurchaseService $purchaseService,
PckPackageTypesService $pckPackageTypesService,
PckPackagesService $pckPackagesService,
ChargesService $chargesService,
SchoolService $schoolService,
SchoolInvoiceDetailsService $schoolInvoiceDetailsService,
ExamRegistrationsTransactionsService $examRegistrationsTransactionsService,
LoggerInterface $logger,
EntityManagerInterface $entityManager,
TestSessionsService $testSessionsService
) {
$this->paymentService = $paymentService;
$this->paymentMethodService = $paymentMethodService;
$this->studentsService = $studentsService;
$this->examRegistrationsService = $examRegistrationsService;
$this->purchaseService = $purchaseService;
$this->pckPackageTypesService = $pckPackageTypesService;
$this->chargesService = $chargesService;
$this->logger = $logger;
$this->pckPackagesService = $pckPackagesService;
$this->entityManager = $entityManager;
$this->schoolService = $schoolService;
$this->testSessionsService = $testSessionsService;
$this->schoolInvoiceDetailsService = $schoolInvoiceDetailsService;
$this->examRegistrationsTransactionsService = $examRegistrationsTransactionsService;
}
/**
* @Route("/api/oneTimePayment")
* @param Request $request
* @return mixed
*/
public function chargeOneTimePayment(Request $request)
{
try {
$content = $this->getContent($request);
$response = $this->paymentService->createAnAcceptPaymentTransaction(
ParameterUtil::getRequired($content->get('amount')),
ParameterUtil::getRequired($content->get('dataDescriptor')),
ParameterUtil::getRequired($content->get('dataValue'))
);
if (!$response) {
return $this->json(array('error' => 'Payment not processed'));
}
} catch (Exception $ex) {
return $this->json(array('error' => $ex->getMessage()));
}
return $this->json(($response));
}
// /**
// * @Route("/api/chargeCustomerProfile")
// * @param Request $request
// * @return mixed
// */
// public function chargeCustomerProfile(Request $request){
// try {
// $content = $this->getContent($request);
// $paymentId = $this->paymentService->chargeCustomerProfile(
// ParameterUtil::getRequired($content->get('customerProfileId')),
// ParameterUtil::getRequired($content->get('customerPaymentProfileId')),
// ParameterUtil::getRequired($content->get('amount')),
// $content->get('description')
// );
// if (!$paymentId) {
// return $this->json(array('error' => 'Payment not processed.'));
// }
// } catch (Exception $ex) {
// return $this->json(array('error' => $ex->getMessage()));
// }
// return $this->json(array('success' => array('message'=>'Payment saved.', 'transactionId'=>$paymentId)));
// }
// /**
// * @Route("/api/createCustomerProfile")
// * @param Request $request
// * @return mixed
// */
// public function createCustomerProfile(Request $request){
// try {
// $content = $this->getContent($request);
// $customerProfileId = $this->paymentService->createCustomerProfile(
// ParameterUtil::getRequired($content->get('email'))
// );
// if (!$customerProfileId) {
// return $this->json(array('error' => 'Customer profile not saved'));
// }
// } catch (Exception $ex) {
// return $this->json($ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
// }
// return $this->json(array('success' => array('message'=>'Customer Profile saved', 'customer profile Id'=>$customerProfileId)));
// }
/**
* @Route("/api/getPaymentMethods")
* @param Request $request
* @return mixed
*/
public function getPaymentMethods(Request $request)
{
try {
$studentId = parent::getStudentId($request, $this->logger);
$this->logger->error('getPaymentMethods studentId ' . $studentId);
$response = $this->paymentMethodService->getAllPaymentMethods($studentId);
} catch (Exception $ex) {
return $this->json($ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
}
return $this->json(($response));
}
/**
* @Route("/api/submitPaymentAndGetExam")
* @param Request $request
* @return mixed
*/
public function submitPaymentAndGetExam(Request $request, LoggerInterface $logger)
{
try {
$content = $this->getContent($request);
$studentId = parent::getStudentId($request, $this->logger);
$this->logger->error('SPAGE STUDENT ID ' . $studentId);
$response = $this->purchaseService->submitPaymentAndRegister(
$studentId,
ParameterUtil::getRequired($content->get('numberOfCredits')),
ParameterUtil::getRequired($content->get('ccId')),
ParameterUtil::getRequired($content->get('amount')),
ParameterUtil::getRequired($content->get('examId')),
false,
!$this->isAdmin($logger)
);
} catch (Exception $ex) {
return $this->json($ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
}
return $this->json(($response));
}
/**
* @Route("/api/purchasePackageAndRegister")
* @param Request $request
* @return mixed
*/
public function purchasePackageAndRegister(Request $request, LoggerInterface $logger)
{
try {
$content = $this->getContent($request);
$studentId = parent::getStudentId($request);
$student = $this->studentsService->find($studentId);
$examId = ParameterUtil::getRequired($content->get('examId'));
//find package
$package = $this->pckPackageTypesService->findPackageByCreditsAmount(ParameterUtil::getRequired($content->get('numberOfCredits')));
$ccExpMonth = ParameterUtil::getRequired($content->get('ccExpMonth'));
$ccExpYear = ParameterUtil::getRequired($content->get('ccExpYear'));
$acceptPaymentDescriptor = ParameterUtil::getRequired($content->get('acceptPaymentDescriptor'));
$acceptPaymentValue = ParameterUtil::getRequired($content->get('acceptPaymentValue'));
$ccName = ParameterUtil::getRequired($content->get('cardholderName'));
$ccLast4 = ParameterUtil::getRequired($content->get('ccLast4'));
$ccType = ParameterUtil::getRequired($content->get('cardType'));
$billingZipCode = ParameterUtil::getRequired($content->get('billingZipCode'));
$amount = ParameterUtil::getRequired($content->get('amount'));
$chargeResponse = $this->paymentService->chargeCustomerWithNewProfile(
$student,
$acceptPaymentDescriptor,
$acceptPaymentValue,
$amount,
$ccName,
$ccLast4,
$ccExpMonth,
$ccExpYear,
$billingZipCode,
$ccType,
$this->purchaseService->getChargeDescription($package['id'])
);
$response = $this->purchaseService->findPurchasePackageAndRegister(
$package,
$studentId,
$chargeResponse['ccId'],
$amount,
$student->getCimid(),
$chargeResponse['paymentProfileId'],
$chargeResponse,
$examId,
!$this->isAdmin($logger)
);
$response['paymentMethod'] =
array('cc4digits' => $ccLast4,'cardtype' => $this->paymentMethodService->getCCTypeValue($ccType),
'ccExpMonth' => $ccExpMonth,
'ccExpYear' => $ccExpYear, 'ccName' => $ccName, 'ccId' => $chargeResponse['ccId']);
} catch (Exception $ex) {
return $this->json($ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
}
return $this->json(($response));
}
/**
* @Route("/api/payProctorFee")
* @param Request $request
* @return mixed
*/
public function payProctorFee(Request $request)
{
try {
$content = $this->getContent($request);
$studentId = parent::getStudentId($request);
$student = $this->studentsService->find($studentId);
$examId = ParameterUtil::getRequired($content->get('examId'));
$registrationId = ParameterUtil::getRequired($content->get('registrationId'));
$ccExpMonth = ParameterUtil::getRequired($content->get('ccExpMonth'));
$ccExpYear = ParameterUtil::getRequired($content->get('ccExpYear'));
$acceptPaymentDescriptor = ParameterUtil::getRequired($content->get('acceptPaymentDescriptor'));
$acceptPaymentValue = ParameterUtil::getRequired($content->get('acceptPaymentValue'));
$ccName = ParameterUtil::getRequired($content->get('cardholderName'));
$ccLast4 = ParameterUtil::getRequired($content->get('ccLast4'));
$ccType = ParameterUtil::getRequired($content->get('cardType'));
$billingZipCode = ParameterUtil::getRequired($content->get('billingZipCode'));
$amount = ParameterUtil::getRequired($content->get('amount'));
$proctorFee = $content->get('proctorFee');
$registration = $this->examRegistrationsService->findById($registrationId);
//add payment only if proctor reserved wasn't set yet
if(!$registration->getProctorReserved()){
if ($amount > 0) {
$chargeDescription = ($amount - $proctorFee > 0) ? (($proctorFee > 0) ? 'Proctor fee and additional fee' : 'Additional fee') : 'Proctor Fee';
$chargeTypeId = ($amount - $proctorFee > 0) ? (($proctorFee > 0) ? self::ADDITIONAL_AND_PROCTOR_FEE_CHARGE_TYPE : self::ADDITIONAL_FEE_CHARGE_TYPE) : self::PROCTOR_FEE_CHARGE_TYPE;
$response = $this->paymentService->chargeCustomerWithNewProfile(
$student,
$acceptPaymentDescriptor,
$acceptPaymentValue,
$amount,
$ccName,
$ccLast4,
$ccExpMonth,
$ccExpYear,
$billingZipCode,
$ccType,
$chargeDescription
);
$this->chargesService->addStudentCharge(
$student,
$response['ccId'],
$student->getCimid(),
$response['paymentProfileId'],
$amount,
$response['transaction_id'],
$response['authNetResponse'],
$response['authResultCode'],
$chargeTypeId,
$registrationId
);
$response['paymentMethod'] =
array('cc4digits' => $ccLast4,'cardtype' => $this->paymentMethodService->getCCTypeValue($ccType),
'ccExpMonth' => $ccExpMonth,
'ccExpYear' => $ccExpYear, 'ccName' => $ccName, 'ccId' => $response['ccId']);
if (in_array($chargeTypeId, [4,5])) {
$response['chargeAdditionalCharge'] = 0;
}
} else {
$response = array();
}
$proctorReserved = $this->examRegistrationsService->setProctorReserved($registrationId);
$response['proctor_reserved'] = $proctorReserved;
}
else{
$response=array();
$response['proctor_reserved'] = $registration->getProctorReserved();
}
$proctorReserved = $this->examRegistrationsService->setProctorReserved($registrationId);
$response['proctor_reserved'] = $proctorReserved;
} catch (Exception $ex) {
return $this->json($ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
}
return $this->json(($response));
}
/**
* @Route("/api/payProctorFeeWithPaymentProfile")
* @param Request $request
* @return mixed
*/
public function payProctorFeeWithPaymentProfile(Request $request)
{
try {
$content = $this->getContent($request);
$studentId = parent::getStudentId($request);
$student = $this->studentsService->find($studentId);
$examId = ParameterUtil::getRequired($content->get('examId'));
//find package
$ccId = ParameterUtil::getRequired($content->get('ccId'));
$amount = ParameterUtil::getRequired($content->get('amount'));
$registrationId = ParameterUtil::getRequired($content->get('registrationId'));
$proctorFee = $content->get('proctorFee');
$registration = $this->examRegistrationsService->findById($registrationId);
//add payment only if proctor reserved wasn't set yet
if(!$registration->getProctorReserved()) {
$response = $this->payAdditionalFees($amount, $proctorFee, $ccId, $student, $registrationId);
$proctorReserved = $this->examRegistrationsService->setProctorReserved($registrationId);
$response['proctor_reserved'] = $proctorReserved;
}
else{
$response=[];
$response['proctor_reserved']=$registration->getProctorReserved();
}
} catch (Exception $ex) {
return $this->json($ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
}
return $this->json(($response));
}
private function payAdditionalFees($amount, $proctorFee, $ccId, $student, $registrationId, $allowDuplicateTransaction = false)
{
if ($amount > 0) {
$chargeDescription = ($amount - $proctorFee > 0) ? (($proctorFee > 0) ? 'Proctor fee and additional fee' : 'Additional fee') : 'Proctor Fee';
$chargeTypeId = ($amount - $proctorFee > 0) ? (($proctorFee > 0) ? self::ADDITIONAL_AND_PROCTOR_FEE_CHARGE_TYPE : self::ADDITIONAL_FEE_CHARGE_TYPE) : self::PROCTOR_FEE_CHARGE_TYPE;
$creditCard = $this->paymentMethodService->find($ccId);
$response = $this->paymentService->chargeCustomerProfile(
$student->getCimid(),
$creditCard->getCccimid(),
$amount,
$chargeDescription,
$student->getEmail(),
$student->getLastname() . ', ' . $student->getFirstname(),
$student->getId(),
$allowDuplicateTransaction
);
$this->chargesService->addStudentCharge(
$student,
$creditCard->getId(),
$student->getCimid(),
$creditCard->getCccimid(),
$amount,
$response['transaction_id'],
$response['authNetResponse'],
$response['authResultCode'],
$chargeTypeId,
$registrationId
);
if (in_array($chargeTypeId, [4,5])) {
$response['chargeAdditionalCharge'] = 0;
}
} else {
$response = array();
}
return $response;
}
/**
* @Route("/api/saveCreditCard")
* @param Request $request
* @return mixed
*/
public function saveCreditCard(Request $request)
{
$content = $this->getContent($request);
$studentId = ParameterUtil::getRequired($content->get('student_id'));
$student = $this->studentsService->find($studentId);
$ccExpMonth = ParameterUtil::getRequired($content->get('ccExpMonth'));
$ccExpYear = ParameterUtil::getRequired($content->get('ccExpYear'));
$acceptPaymentDescriptor = ParameterUtil::getRequired($content->get('acceptPaymentDescriptor'));
$acceptPaymentValue = ParameterUtil::getRequired($content->get('acceptPaymentValue'));
$ccName = ParameterUtil::getRequired($content->get('cardholderName'));
$ccLast4 = ParameterUtil::getRequired($content->get('ccLast4'));
$ccType = ParameterUtil::getRequired($content->get('cardType'));
$billingZipCode = ParameterUtil::getRequired($content->get('billingZipCode'));
$response = $this->paymentService->chargeCustomerWithNewProfile(
$student,
$acceptPaymentDescriptor,
$acceptPaymentValue,
null,
$ccName,
$ccLast4,
$ccExpMonth,
$ccExpYear,
$billingZipCode,
$ccType,
null,
false
);
return $this->json($this->paymentMethodService->getAllPaymentMethods($student->getId()));
// return $this->json(($response));
}
/**
* @Route("/api/payRegisterAndSchedule")
* @param Request $request
* @return mixed
*/
public function payRegisterAndSchedule(Request $request)
{
$content = $this->getContent($request);
$session = ParameterUtil::getRequired($content->get('session'));
$studentInfos = ParameterUtil::getRequired($content->get('studentInfos'));
$schoolId = ParameterUtil::getRequired($content->get('schoolId'));
$sendStudyMaterials = ParameterUtil::getRequired($content->get('sendStudyMaterials')) == 'true' ? 1 : 0;
$school = $this->schoolService->getSchool($schoolId);
$payRegisterAndScheduleSessionResponse = $this->purchaseService->payRegisterAndScheduleSession($studentInfos, $session, $school,$sendStudyMaterials);
$response['registrations'] = $payRegisterAndScheduleSessionResponse['registrations'];
$response['totalAmtChargedFromSchoolBalance']=$payRegisterAndScheduleSessionResponse['totalAmtChargedFromSchoolBalance'];
$response['schoolCurrentBalance']= $payRegisterAndScheduleSessionResponse['schoolCurrentBalance'];
$response['studentsPerSession'] = $this->testSessionsService->getStudentsPerSession($session['id']);
$response['accountReport'] = $this->schoolInvoiceDetailsService->getAccountReport($schoolId);
//$response['session']
return $this->json($response);
}
/**
* @Route("/api/admin/payRetakeFeeAndRegisterWithPaymentProfile")
* @param Request $request
* @return mixed
*/
public function payRetakeFeeAndRegisterWithPaymentProfile(Request $request)
{
$content = $this->getContent($request);
$studentId = ParameterUtil::getRequired($content->get('studentId'));
$examId = ParameterUtil::getRequired($content->get('examId'));
$ccId = ParameterUtil::getRequired($content->get('ccId'));
$amount = ParameterUtil::getRequired($content->get('amount'));
$vendorApprovalReasonId = ParameterUtil::getRequired($content->get('vendorApprovalReasonId'));
try {
$response = $this->examRegistrationsTransactionsService->payRetakeFeeAndRegister($studentId,$examId,$vendorApprovalReasonId,$amount,$ccId);
}
catch (\Throwable $t){
return $this->json($t->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
}
return $this->json($response);
}
/**
* @Route("/api/admin/payRetakeFeeAndRegisterWithNewPaymentProfile")
* @param Request $request
* @return mixed
*/
public function payRetakeFeeAndRegisterWithNewPaymentProfile(Request $request)
{
$content = $this->getContent($request);
$studentId = ParameterUtil::getRequired($content->get('studentId'));
$examId = ParameterUtil::getRequired($content->get('examId'));
$ccLast4 = ParameterUtil::getRequired($content->get('ccLast4'));
$ccExpMonth = ParameterUtil::getRequired($content->get('ccExpMonth'));
$ccExpYear = ParameterUtil::getRequired($content->get('ccExpYear'));
$billingZipCode = ParameterUtil::getRequired($content->get('billingZipCode'));
$acceptPaymentDescriptor = ParameterUtil::getRequired($content->get('acceptPaymentDescriptor'));
$acceptPaymentValue = ParameterUtil::getRequired($content->get('acceptPaymentValue'));
$cardholderName = ParameterUtil::getRequired($content->get('cardholderName'));
$cardType = ParameterUtil::getRequired($content->get('cardType'));
$amount = ParameterUtil::getRequired($content->get('amount'));
$vendorApprovalReasonId = ParameterUtil::getRequired($content->get('vendorApprovalReasonId'));
try {
$response = $this->examRegistrationsTransactionsService->payRetakeFeeAndRegister($studentId,$examId,$vendorApprovalReasonId,$amount,null,$ccLast4,$ccExpMonth,$ccExpYear,$acceptPaymentDescriptor,$acceptPaymentValue,$billingZipCode,$cardType,$cardholderName);
}
catch (\Throwable $t){
return $this->json($t->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR);
}
return $this->json($response);
}
}