<?php
namespace EADPlataforma\Controller\Admin;
use EADPlataforma\Entity\ProductTeam;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use EADPlataforma\Entity\Product;
use EADPlataforma\Entity\ProductOffer;
use EADPlataforma\Entity\ProductCoupon;
use EADPlataforma\Entity\Transaction;
use EADPlataforma\Entity\Enrollment;
use EADPlataforma\Entity\User;
use EADPlataforma\Entity\UserCard;
use EADPlataforma\Entity\UserSubscription;
USE EADPlataforma\Enum\UserSubscriptionEnum;
use EADPlataforma\Enum\UserCardEnum;
use EADPlataforma\Enum\TagsMarketingEnum;
use EADPlataforma\Enum\WebhookEnum;
use EADPlataforma\Enum\ProductCouponEnum;
use EADPlataforma\Enum\NotificationEnum;
use EADPlataforma\Enum\ErrorEnum;
/**
* @Route(
* path = "/admin/user/subscription",
* schemes = {"http|https"}
* )
* @Cache(
* maxage = "0",
* smaxage = "0",
* expires = "now",
* public = false
* )
*/
class UserSubscriptionController extends AbstractController {
public function getEntityClass(){
return UserSubscription::class;
}
/**
* @Route(
* path = "/list/paginate",
* methods = {"GET"}
* )
*/
public function getUserSubscriptions(Request $request) {
if(!$this->configuration->isModuleActive("product_subscription_module")){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$this->requestUtil->setRequest($request)->setData();
$columns = [
"us.id",
"us.status",
"u.name",
"p.title",
"DATE_FORMAT(us.dateStart, '%Y-%m-%d %H:%i:%s') AS dateStart",
"DATE_FORMAT(us.dateLastPayment, '%Y-%m-%d %H:%i:%s') AS dateLastPayment",
"DATE_FORMAT(us.dateNextPayment, '%Y-%m-%d %H:%i:%s') AS dateNextPayment",
"us.automaticRenewal",
"us.chargeNumber",
"us.chargeNumberMax",
"us.lifetime",
"us.price",
"u.email",
"u.customField"
];
$userClass = User::class;
$productClass = Product::class;
$productOfferClass = ProductOffer::class;
$productTeamClass = ProductTeam::class;
$joins = [
"{$userClass} AS u" => "u.id = us.user",
"{$productClass} AS p" => "p.id = us.product",
"{$productOfferClass} AS po" => "po.id = us.productOffer"
];
$searchText = $this->requestUtil->getField('searchText');
$userId = (int)$this->requestUtil->getField('user');
$productId = (int)$this->requestUtil->getField('product');
$status = $this->requestUtil->getField('status');
$paymentMethod = $this->requestUtil->getField('paymentMethod');
$orderParam = $this->requestUtil->getField('order');
$limit = $this->requestUtil->getField('limit');
$offset = $this->requestUtil->getField('offset');
$dateStart = $this->requestUtil->getField('dateStart');
$dateEnd = $this->requestUtil->getField('dateEnd');
$dateStartNextPayment = $this->requestUtil->getField('dateStartNextPayment');
$dateEndNextPayment = $this->requestUtil->getField('dateEndNextPayment');
$filter = [];
$filter["whereText"] = "us.id > 0 ";
$filterDelete = $this->requestUtil->getDeletedParam();
if($userId != $this->user->getId()){
$permission = $this->userPermissionUtil->getPermission(
"financial",
"user_subscription",
"see"
);
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
if(
!$this->userPermissionUtil->isHigh($permission)
){
$filter["whereText"] .= " AND p.id IN (
SELECT
IDENTITY(pteam.product)
FROM {$productTeamClass} AS pteam
WHERE pteam.deleted = 0
AND pteam.user = {$this->user->getId()}
) ";
}
}
if(!empty($userId)){
$filter["us.user"] = $userId;
}
if(!empty($productId)){
$filter["us.product"] = $productId;
}
if(!is_null($status)){
$filter["us.status"] = $status;
}
if(!is_null($paymentMethod)){
$filter["us.paymentMethod"] = $paymentMethod;
}
if(!empty($dateStart) && !empty($dateEnd)){
$filter["whereText"] .= "
AND DATE_FORMAT(us.dateStart, '%Y-%m-%d') BETWEEN '{$dateStart}' AND '{$dateEnd}'
";
}
if(!empty($dateStartNextPayment) && !empty($dateEndNextPayment)){
$filter["whereText"] .= "
AND DATE_FORMAT(us.dateNextPayment, '%Y-%m-%d') BETWEEN '{$dateStartNextPayment}' AND '{$dateEndNextPayment}'
";
}
$order = [ "us.id" => "DESC" ];
if(!empty($orderParam)){
$order = json_decode($orderParam, true);
}
$data = $this->repository->paginate(
"us",
$searchText,
$columns,
$joins,
$filter,
$order,
$limit,
$offset,
$filterDelete
);
foreach ($data['rows'] as $key => $item) {
$item = (object)$item;
$item->statusText = $this->repository->getStringStatus($item->status);
$data['rows'][$key] = $item;
}
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/my/list/paginate",
* methods = {"GET"}
* )
*/
public function getMyUserSubscriptions(Request $request) {
if(!$this->configuration->isModuleActive("product_subscription_module")){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$this->requestUtil->setRequest($request)->setData();
$columns = [
"us.id",
"us.status",
"u.name",
"p.title",
"DATE_FORMAT(us.dateStart, '%Y-%m-%d %H:%i:%s') AS dateStart",
"DATE_FORMAT(us.dateLastPayment, '%Y-%m-%d %H:%i:%s') AS dateLastPayment",
"DATE_FORMAT(us.dateNextPayment, '%Y-%m-%d %H:%i:%s') AS dateNextPayment",
"us.automaticRenewal",
"us.chargeNumber",
"us.chargeNumberMax",
"us.lifetime",
"us.price",
"u.email",
"u.customField"
];
$userClass = User::class;
$productClass = Product::class;
$productOfferClass = ProductOffer::class;
$joins = [
"{$userClass} AS u" => "u.id = us.user",
"{$productClass} AS p" => "p.id = us.product",
"{$productOfferClass} AS po" => "po.id = us.productOffer",
];
$searchText = $this->requestUtil->getField('searchText');
$userId = $this->user->getId();
$productId = (int)$this->requestUtil->getField('product');
$status = $this->requestUtil->getField('status');
$paymentMethod = $this->requestUtil->getField('paymentMethod');
$orderParam = $this->requestUtil->getField('order');
$limit = $this->requestUtil->getField('limit');
$offset = $this->requestUtil->getField('offset');
$dateStart = $this->requestUtil->getField('dateStart');
$dateEnd = $this->requestUtil->getField('dateEnd');
$dateStartNextPayment = $this->requestUtil->getField('dateStartNextPayment');
$dateEndNextPayment = $this->requestUtil->getField('dateEndNextPayment');
$filter = [];
$filterDelete = $this->requestUtil->getDeletedParam();
if(!empty($userId)){
$filter["us.user"] = $userId;
}
if(!empty($productId)){
$filter["us.product"] = $productId;
}
if(!is_null($status)){
$filter["us.status"] = $status;
}
if(!is_null($paymentMethod)){
$filter["us.paymentMethod"] = $paymentMethod;
}
if(!empty($dateStart) && !empty($dateEnd)){
$filter["whereText"] = "DATE_FORMAT(us.dateStart, '%Y-%m-%d') BETWEEN '{$dateStart}' AND '{$dateEnd}'";
}
if(!empty($dateStartNextPayment) && !empty($dateEndNextPayment)){
$filter["whereText"] = "
DATE_FORMAT(us.dateNextPayment, '%Y-%m-%d') BETWEEN '{$dateStartNextPayment}' AND '{$dateEndNextPayment}'
";
}
$order = [ "us.id" => "DESC" ];
if(!empty($orderParam)){
$order = json_decode($orderParam, true);
}
$data = $this->repository->paginate(
"us",
$searchText,
$columns,
$joins,
$filter,
$order,
$limit,
$offset,
$filterDelete
);
foreach ($data['rows'] as $key => $item) {
$item = (object)$item;
$item->statusText = $this->repository->getStringStatus($item->status);
$data['rows'][$key] = $item;
}
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/detail/{id}",
* methods = {"GET"},
* requirements = { "id" = "\d+" }
* )
*/
public function getUserSubscription(Request $request) {
if(!$this->configuration->isModuleActive("product_subscription_module")){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$permission = $this->userPermissionUtil->getPermission(
"financial",
"user_subscription",
"see"
);
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$userSubscriptionId = $request->get('id');
$userSubscription = $this->repository->findOneBy([
"id" => $userSubscriptionId,
"deleted" => UserSubscriptionEnum::ITEM_NO_DELETED
]);
if (!$userSubscription) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$userCheckoutInfo = $userSubscription->getUserCheckoutInfo();
$priceReal = $userSubscription->getPrice();
$productCoupon = $userSubscription->getProductCoupon();
$chargeNumbers = $userSubscription->getChargeNumber();
$membershipFee = $userSubscription->getMembershipFee();
$isRenew = ($userSubscription->getDateRenew('Y-m-d') == date('Y-m-d'));
$isLifetime = $userSubscription->getLifetime() == UserSubscriptionEnum::YES;
if(!empty($userSubscription->getCouponKey()) && !empty($productCoupon)){
if(
$userSubscription->getCouponLifetime() == UserSubscriptionEnum::YES ||
$chargeNumbers < $userSubscription->getCouponNumberCharges()
){
$productCouponRepository = $this->em->getRepository(ProductCoupon::class);
if($userSubscription->getCouponApplyMembershipFee() == ProductCouponEnum::YES){
if($isRenew){
$membershipFee = $productCouponRepository->applyDiscount(
$productCoupon,
$membershipFee
);
}
}else{
$priceReal = $productCouponRepository->applyDiscount(
$productCoupon,
$priceReal
);
}
}
}
if(
($isRenew && !$isLifetime) ||
empty($userSubscription->getChargeNumber()) ||
empty($userSubscription->getDateNextPayment())
){
$priceReal = $priceReal + $membershipFee;
}
$info = (object)$userSubscription->toReturn();
$info->priceReal = $priceReal;
$data = [
"userSubscription" => $info,
"product" => $userSubscription->getProduct()->toReturn(),
"productOffer" => $userSubscription->getProductOffer()->toReturn(),
"userCheckoutInfo" => (
$userCheckoutInfo ? $userCheckoutInfo->toReturn() : null
),
];
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/edit/{id}",
* methods = {"PUT"},
* requirements = { "id" = "\d+" }
* )
*/
public function editAdminUserSubscription(Request $request) {
if(!$this->configuration->isModuleActive("product_subscription_module")){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$permission = $this->userPermissionUtil->getPermission(
"financial",
"user_subscription",
"edit"
);
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$userSubscriptionId = $request->get('id');
$userSubscription = $this->repository->findOneBy([
"id" => $userSubscriptionId,
"deleted" => UserSubscriptionEnum::ITEM_NO_DELETED
]);
if(!$userSubscription) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
if($userSubscription->getStatus() == UserSubscriptionEnum::STATUS_COMPLETED) {
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$oldCycle = $userSubscription->getCycle();
$oldChargeNumberMax = $userSubscription->getChargeNumberMax();
$oldDateNextPayment = $userSubscription->getDateNextPayment();
$groupsValidation = [];
if($this->requestUtil->issetField('cycle')){
$userSubscription->setCycle((int)$this->requestUtil->getField('cycle'));
}
if($this->requestUtil->issetField('chargeNumberMax')){
$userSubscription->setChargeNumberMax(
(int)$this->requestUtil->getField('chargeNumberMax')
);
}
if($this->requestUtil->issetField('lifetime')){
$userSubscription->setLifetime((int)$this->requestUtil->getField('lifetime'));
}
if($this->requestUtil->issetField('dateNextPayment')){
$groupsValidation[] = "editUserSubscription";
$userSubscription->setDateNextPayment(
$this->requestUtil->getField('dateNextPayment')
);
}
if($this->requestUtil->issetField('price')){
$userSubscription->setPrice(
(float)$this->requestUtil->getField('price')
);
}
if($this->requestUtil->issetField('membershipFee')){
$userSubscription->setMembershipFee(
(float)$this->requestUtil->getField('membershipFee')
);
}
$dateRenew = $userSubscription->getDateRenew();
if($userSubscription->getLifetime() == UserSubscriptionEnum::YES){
$dateRenew = null;
}else if($userSubscription->getLifetime() == UserSubscriptionEnum::NO){
if(
$oldCycle != $userSubscription->getCycle() ||
$oldChargeNumberMax != $userSubscription->getChargeNumberMax()
){
$dateStart = $userSubscription->getDateStart();
$periodRenew = $this->repository->getPlanCycle(
$userSubscription->getCycle(),
$userSubscription->getChargeNumberMax()
);
$dateRenew = date('Y-m-d', strtotime($periodRenew));
}
}
$userSubscription->setDateRenew($dateRenew);
if($userSubscription->getCycle() == UserSubscriptionEnum::CYCLE_MONTHLY){
$userSubscription->setInstallments(UserSubscriptionEnum::YES);
$userSubscription->setInstallmentsFree(UserSubscriptionEnum::YES);
}
$addDay = 0;
if(
$userSubscription->getPaymentMethod() == UserSubscriptionEnum::PAYMENT_BILL ||
$userSubscription->getPaymentMethod() == UserSubscriptionEnum::PAYMENT_PIX
){
$addDay = 7;
}
if($oldDateNextPayment != $userSubscription->getDateNextPayment()){
$time1 = strtotime($userSubscription->getDateNextPayment());
$time2 = strtotime("+ {$addDay} day");
if($time2 >= $time1){ // check is a old date
return $this->eadResponse([ 'dateNextPayment' ], ErrorEnum::ACTION_INVALID);
}
//check if is a new date and if can charge this month
$month = date('m', $time1);
$year = date('Y', $time1);
$thisMonth = date('m');
$thisYear = date('Y');
if($month == $thisMonth && $year == $thisYear){
$tRe = $this->em->getRepository(Transaction::class);
$chargeNumber = $tRe->countTransactionByUserSubscriptionInMonth(
$userSubscription
);
if($chargeNumber >= 1){ //check exist payment in this month
return $this->eadResponse(
[ 'dateNextPayment' ],
ErrorEnum::ACTION_INVALID
);
}
}
}
$errors = $this->validateEntity($userSubscription, $groupsValidation);
if($errors){
return $this->eadResponse($errors, ErrorEnum::FIELD_EMPTY);
}
if(!empty($userSubscription->getDateLastPayment())){
if($oldDateNextPayment != $userSubscription->getDateNextPayment()){
//get enrollments and update expire and support date
$enrolmmentRepository = $this->em->getRepository(Enrollment::class);
$enrollments = $enrolmmentRepository->getEnrollmentsByUserSubscription(
$userSubscription
);
foreach ($enrollments as $key => $enrollment) {
$enrollment->setDatePeriod(
$userSubscription->getDateNextPayment('Y-m-d H:i:s')
);
$enrollment->setDateSupport(
$userSubscription->getDateNextPayment('Y-m-d H:i:s')
);
}
}
}
$this->em->flush();
$data = $userSubscription->toReturn();
$this->userLogService->logUpdate(
"user_subscription",
$userSubscription->getId(),
$data
);
//webhook
$this->repository->sendWebhook($userSubscription);
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/edit/status/{id}",
* name = "editStatusUserSubscription",
* methods = {"PUT"},
* requirements = { "id" = "\d+" }
* )
*/
public function editStatusUserSubscription(Request $request) {
if(!$this->configuration->isModuleActive("product_subscription_module")){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$userSubscriptionId = $request->get('id');
$userSubscription = $this->repository->findOneBy([
"id" => $userSubscriptionId,
"deleted" => UserSubscriptionEnum::ITEM_NO_DELETED
]);
if(!$userSubscription) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$isStudent = ($userSubscription->getUser()->getId() == $this->user->getId());
if(!$isStudent){
$permission = $this->userPermissionUtil->getPermission(
"financial",
"user_subscription",
"edit"
);
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
}
$this->requestUtil->setRequest($request)->setData();
$oldStatus = $userSubscription->getStatus();
$oldAutomaticRenewal = $userSubscription->getAutomaticRenewal();
if($this->requestUtil->issetField('status')){
$oldStatus = $userSubscription->getStatus();
if($oldStatus == UserSubscriptionEnum::STATUS_COMPLETED){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$userSubscription->setStatus((int)$this->requestUtil->getField('status'));
if($userSubscription->getStatus() == UserSubscriptionEnum::STATUS_CANCELED){
$userSubscription->setDateCancel(date('Y-m-d'));
$userSubscription->setCancelReason(UserSubscriptionEnum::CANCELED_BY_ADMIN);
if($isStudent){
$userSubscription->setCancelReason(UserSubscriptionEnum::CANCELED_BY_STUDENT);
}
}
}
if($this->requestUtil->issetField('automaticRenewal')){
if($oldStatus == UserSubscriptionEnum::STATUS_BLOCKED){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$userSubscription->setAutomaticRenewal(
(int)$this->requestUtil->getField('automaticRenewal')
);
}
$chargeNow = UserSubscriptionEnum::NO;
$today = date('Y-m-d');
$dateRenew = $userSubscription->getDateRenew();
if($oldAutomaticRenewal != $userSubscription->getAutomaticRenewal()){
if($userSubscription->getAutomaticRenewal() == UserSubscriptionEnum::YES){
$userSubscription->setStatus(UserSubscriptionEnum::STATUS_ACTIVE);
$periodRenew = $this->repository->getPlanCycle(
$userSubscription->getCycle(),
$userSubscription->getChargeNumberMax()
);
$t1 = strtotime($today);
$t3 = strtotime($dateRenew);
if($t1 > $t3 && !empty($dateRenew)){
$userSubscription->setChargeNumber(0);
$chargeNow = UserSubscriptionEnum::YES;
$dateRenew = date('Y-m-d', strtotime($today . $periodRenew));
}else{
$dateRenew = date('Y-m-d', strtotime(
$userSubscription->getDateLastPayment() . $periodRenew
));
}
$userSubscription->setDateRenew($dateRenew);
}
}
if($oldStatus != $userSubscription->getStatus()){
if(
$oldStatus == UserSubscriptionEnum::STATUS_CANCELED ||
$oldStatus == UserSubscriptionEnum::STATUS_BLOCKED
){
if($userSubscription->getProductCoupon()){
if($userSubscription->getCouponLifetime() == UserSubscriptionEnum::YES){
$userSubscription->setCouponKey(null);
$userSubscription->setCouponType(null);
$userSubscription->setCouponApplyMembershipFee(UserSubscriptionEnum::NO);
$userSubscription->setCouponLifetime(UserSubscriptionEnum::NO);
$userSubscription->setCouponNumberCharges(null);
$userSubscription->setCouponDiscount(null);
$userSubscription->setProductCoupon(null);
}else{
$pcR = $this->em->getRepository(ProductCoupon::class);
$productCoupon = $pcR->findValidProductCouponByProductOffer(
$userSubscription->getCouponKey(),
$userSubscription->getProductOffer()
);
if(!$productCoupon){
$userSubscription->setCouponKey(null);
$userSubscription->setCouponType(null);
$userSubscription->setCouponApplyMembershipFee(UserSubscriptionEnum::NO);
$userSubscription->setCouponLifetime(UserSubscriptionEnum::NO);
$userSubscription->setCouponNumberCharges(null);
$userSubscription->setCouponDiscount(null);
$userSubscription->setProductCoupon(null);
}
}
}
}
if($userSubscription->getStatus() == UserSubscriptionEnum::STATUS_ACTIVE){
$userSubscription->getDateReactivation($today);
$chargeNumber = $userSubscription->getChargeNumber();
$chargeNumberMax = $userSubscription->getChargeNumberMax();
$lifetime = $userSubscription->getLifetime();
$t1 = strtotime($today);
$t2 = strtotime($userSubscription->getDateNextPayment());
$t3 = strtotime($dateRenew);
if(
$t1 > $t3 && $oldAutomaticRenewal == UserSubscriptionEnum::YES &&
$lifetime == UserSubscriptionEnum::NO
){
$chargeNumber = 0;
$chargeNow = UserSubscriptionEnum::YES;
}else if(
$t1 > $t2 &&
(
$chargeNumber < $chargeNumberMax ||
$lifetime == UserSubscriptionEnum::YES
)
){
$chargeNow = UserSubscriptionEnum::YES;
}
$userSubscription->setChargeNumber($chargeNumber);
}else if($userSubscription->getStatus() == UserSubscriptionEnum::STATUS_CANCELED){
$userSubscription->getDateCancel($today);
// send email
$emailService = $this->generalService->getService('EmailService');
$user = $userSubscription->getUser();
if($emailService->checkUserToSend($user)){
$emailService->setToEmail($user->getEmail());
$emailService->setToName($user->getName());
$subText = $this->configuration->getLanguage(
'subscription_cancel.subject', 'email'
);
$subject = "{$subText} - {$userSubscription->getProduct()->getTitle()}";
$emailService->setSubject($subject);
$domain = "https://{$this->client->getDomainPrimary()}";
$emailService->setData([
"userName" => $user->getName(),
"planTitle" => $userSubscription->getProduct()->getTitle(),
"btnLink" => "{$domain}/subscriptions/{$userSubscription->getId()}"
]);
$emailService->setTemplateBody("subscription_cancel");
$emailService->send();
}
// send marketing
$marketingService = $this->generalService->getService(
'Marketing\\MarketingService'
);
$marketingService->setTag(TagsMarketingEnum::TAG_CANCELED_SUBSCRIPTION);
$marketingService->setTextComplement(
$userSubscription->getProduct()->getTitle()
);
$marketingService->setUser($userSubscription->getUser());
$marketingService->send();
$notificationService = $this->generalService->getService(
'NotificationService'
);
// send notification
$notificationService->create(
$userSubscription->getUser(),
$userSubscription->getProduct()->getUser(),
NotificationEnum::ORIGIN_USER_SUBSCRIPTION_CANCELED,
$userSubscription->getId()
);
$notificationService->create(
$userSubscription->getProduct()->getUser(),
$userSubscription->getUser(),
NotificationEnum::ORIGIN_USER_SUBSCRIPTION_CANCELED,
$userSubscription->getId()
);
}
}
$errors = $this->validateEntity($userSubscription);
if($errors){
return $this->eadResponse($errors, ErrorEnum::FIELD_EMPTY);
}
if($chargeNow == UserSubscriptionEnum::YES){
$this->repository->processTransactionUserSubscription($userSubscription);
}
$data = $userSubscription->toReturn();
$this->userLogService->logUpdate(
"user_subscription",
$userSubscription->getId(),
$data
);
$this->em->flush();
//webhook
$this->repository->sendWebhook($userSubscription);
return $this->eadResponse([ "success" => 1 ]);
}
/**
* @Route(
* path = "/edit/method/{id}",
* name = "editMethodUserSubscription",
* methods = {"PUT"},
* requirements = { "id" = "\d+" }
* )
*/
public function editMethodUserSubscription(Request $request) {
if(!$this->configuration->isModuleActive("product_subscription_module")){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$userSubscriptionId = $request->get('id');
$userSubscription = $this->repository->findOneBy([
"id" => $userSubscriptionId,
"deleted" => UserSubscriptionEnum::ITEM_NO_DELETED
]);
if(!$userSubscription) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$this->requestUtil->setRequest($request)->setData();
if($this->requestUtil->issetField('paymentMethod')){
$paymentMethod = (int)$this->requestUtil->getField('paymentMethod');
if(empty($paymentMethod)){
return $this->eadResponse([ "paymentMethod" ], ErrorEnum::FIELD_EMPTY);
}
$userSubscription->setPaymentMethod($paymentMethod);
}
if($userSubscription->getPaymentMethod() == UserSubscriptionEnum::PAYMENT_CARD){
$userCardId = (int)$this->requestUtil->getField('userCard');
if(empty($userCardId)){
return $this->eadResponse([ "userCard" ], ErrorEnum::FIELD_EMPTY);
}
$userCardRepository = $this->em->getRepository(UserCard::class);
$oldUserCard = $userSubscription->getUserCard();
$userCard = $userCardRepository->findOneBy([
"id" => $userCardId,
"user" => $userSubscription->getUser()->getId(),
"deleted" => UserCardEnum::ITEM_NO_DELETED,
]);
if($userCard){
$userSubscription->setUserCard($userCard);
if($oldUserCard){
if($oldUserCard->getId() == $userCard->getId()){
return $this->eadResponse([ "success" => 1 ]);
}
}
}else{
return $this->eadResponse([ "userCard" ], ErrorEnum::FIELD_EMPTY);
}
}
$today = date('Y-m-d');
$chargeNumber = $userSubscription->getChargeNumber();
$chargeNumberMax = $userSubscription->getChargeNumberMax();
$lifetime = $userSubscription->getLifetime();
$t1 = strtotime($today);
$t2 = strtotime($userSubscription->getDateNextPayment());
if(
$t1 > $t2 &&
(
$chargeNumber < $chargeNumberMax ||
$lifetime == UserSubscriptionEnum::YES
)
){
$this->repository->processTransactionUserSubscription($userSubscription);
}
$data = $userSubscription->toReturn();
$this->userLogService->logUpdate(
"user_subscription",
$userSubscription->getId(),
$data
);
$this->em->flush();
//webhook
$this->repository->sendWebhook($userSubscription);
return $this->eadResponse([ "success" => 1 ]);
}
/**
* @Route(
* path = "/process/payment/{id}",
* name = "processPayment",
* methods = {"GET"},
* requirements = { "id" = "\d+" }
* )
*/
public function processPayment(Request $request) {
if(!$this->configuration->isModuleActive("product_subscription_module")){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$userSubscriptionId = $request->get('id');
$userSubscription = $this->repository->findOneBy([
"id" => $userSubscriptionId,
"deleted" => UserSubscriptionEnum::ITEM_NO_DELETED
]);
if(!$userSubscription) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$this->requestUtil->setRequest($request)->setData();
$data = $this->repository->processTransactionUserSubscription($userSubscription);
if(!empty($data['errorMessage'])){
$userSubscription->setErrorMessage($data['errorMessage']);
$this->em->flush();
return $this->eadResponse([
"message" => $data['errorMessage']
], ErrorEnum::ACTION_INVALID);
}
$this->em->flush();
//webhook
$this->repository->sendWebhook($userSubscription);
return $this->eadResponse([
"success" => 1,
"data" => $data
]);
}
/**
* @Route(
* path = "/edit/many",
* methods = {"PUT"}
* )
*/
public function editManyUserSubscription(Request $request) {
if(!$this->configuration->isModuleActive("product_subscription_module")){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$permission = $this->userPermissionUtil->getPermission(
"financial",
"user_subscription",
"edit_many"
);
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$userId = $this->requestUtil->getField('userId');
$productId = $this->requestUtil->getField('productId');
$price = $this->requestUtil->getField('price');
$newStatus = $this->requestUtil->getField('newStatus');
$status = $this->requestUtil->getField('status');
$dateStart = $this->requestUtil->getField('dateStart');
$dateEnd = $this->requestUtil->getField('dateEnd');
$dateStartNextPayment = $this->requestUtil->getField('dateStartNextPayment');
$dateEndNextPayment = $this->requestUtil->getField('dateEndNextPayment');
$userSubscriptionStatus = [
UserSubscriptionEnum::STATUS_CANCELED,
UserSubscriptionEnum::STATUS_COMPLETED,
UserSubscriptionEnum::STATUS_BLOCKED
];
if((!in_array($newStatus, $userSubscriptionStatus) && !empty($newStatus)) ||
(is_null($newStatus) && is_null($price)))
{
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$this->repository->editManyUserSubscription(
$userId,
$productId,
$price,
$newStatus,
$status,
$dateStart,
$dateEnd,
$dateStartNextPayment,
$dateEndNextPayment
);
return $this->eadResponse([ "success" => 1 ]);
}
/**
* @Route(
* path = "/block/many",
* methods = {"PUT"}
* )
*/
public function blockManyUserSubscription(Request $request) {
if(!$this->configuration->isModuleActive("product_subscription_module")){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$permission = $this->userPermissionUtil->getPermission(
"financial",
"user_subscription",
"edit_many"
);
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$itemIds = json_decode($this->requestUtil->getField('itemIds'));
if(empty($itemIds) || !is_array($itemIds)){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
foreach ($itemIds as $key => $itemId) {
$userSubscription = $this->repository->find($itemId);
if($userSubscription){
$userSubscription->setStatus(UserSubscriptionEnum::STATUS_BLOCKED);
}
}
$this->em->flush();
return $this->eadResponse([ "success" => 1 ]);
}
}