src/Controller/Admin/UserSubscriptionController.php line 49

Open in your IDE?
  1. <?php
  2. namespace EADPlataforma\Controller\Admin;
  3. use EADPlataforma\Entity\ProductTeam;
  4. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\Routing\Annotation\Route;
  7. use EADPlataforma\Entity\Product;
  8. use EADPlataforma\Entity\ProductOffer;
  9. use EADPlataforma\Entity\ProductCoupon;
  10. use EADPlataforma\Entity\Transaction;
  11. use EADPlataforma\Entity\Enrollment;
  12. use EADPlataforma\Entity\User;
  13. use EADPlataforma\Entity\UserCard;
  14. use EADPlataforma\Entity\UserSubscription;
  15. USE EADPlataforma\Enum\UserSubscriptionEnum;
  16. use EADPlataforma\Enum\UserCardEnum;
  17. use EADPlataforma\Enum\TagsMarketingEnum;
  18. use EADPlataforma\Enum\WebhookEnum;
  19. use EADPlataforma\Enum\ProductCouponEnum;
  20. use EADPlataforma\Enum\NotificationEnum;
  21. use EADPlataforma\Enum\ErrorEnum;
  22. /**
  23.  * @Route(
  24.  *      path          = "/admin/user/subscription",
  25.  *      schemes         = {"http|https"}
  26.  * )
  27.  * @Cache(
  28.  *      maxage          = "0",
  29.  *      smaxage         = "0",
  30.  *      expires         = "now",
  31.  *      public          = false
  32.  * )
  33.  */
  34. class UserSubscriptionController extends AbstractController {
  35.     
  36.     public function getEntityClass(){
  37.         return UserSubscription::class;
  38.     }
  39.     /**
  40.      * @Route(
  41.      *      path          = "/list/paginate",
  42.      *      methods       = {"GET"}
  43.      * )
  44.      */
  45.     public function getUserSubscriptions(Request $request) {
  46.         if(!$this->configuration->isModuleActive("product_subscription_module")){
  47.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  48.         }
  49.         $this->requestUtil->setRequest($request)->setData();
  50.         
  51.         $columns = [
  52.             "us.id"
  53.             "us.status",
  54.             "u.name",
  55.             "p.title",
  56.             "DATE_FORMAT(us.dateStart, '%Y-%m-%d %H:%i:%s') AS dateStart",
  57.             "DATE_FORMAT(us.dateLastPayment, '%Y-%m-%d %H:%i:%s') AS dateLastPayment",
  58.             "DATE_FORMAT(us.dateNextPayment, '%Y-%m-%d %H:%i:%s') AS dateNextPayment",
  59.             "us.automaticRenewal",
  60.             "us.chargeNumber",
  61.             "us.chargeNumberMax",
  62.             "us.lifetime",
  63.             "us.price",
  64.             "u.email",
  65.             "u.customField"
  66.         ];
  67.         
  68.         $userClass User::class;
  69.         $productClass Product::class;
  70.         $productOfferClass ProductOffer::class;
  71.         $productTeamClass ProductTeam::class;
  72.         $joins = [
  73.             "{$userClass} AS u" => "u.id = us.user",
  74.             "{$productClass} AS p" => "p.id = us.product",
  75.             "{$productOfferClass} AS po" => "po.id = us.productOffer"
  76.         ];
  77.         $searchText $this->requestUtil->getField('searchText');
  78.         $userId = (int)$this->requestUtil->getField('user');
  79.         $productId = (int)$this->requestUtil->getField('product');
  80.         $status $this->requestUtil->getField('status');
  81.         $paymentMethod $this->requestUtil->getField('paymentMethod');
  82.         $orderParam $this->requestUtil->getField('order');
  83.         $limit $this->requestUtil->getField('limit');
  84.         $offset $this->requestUtil->getField('offset');
  85.         $dateStart $this->requestUtil->getField('dateStart');
  86.         $dateEnd $this->requestUtil->getField('dateEnd');
  87.         $dateStartNextPayment $this->requestUtil->getField('dateStartNextPayment');
  88.         $dateEndNextPayment $this->requestUtil->getField('dateEndNextPayment');
  89.         $filter = [];
  90.         $filter["whereText"] = "us.id > 0 ";
  91.         $filterDelete $this->requestUtil->getDeletedParam();
  92.         if($userId != $this->user->getId()){
  93.             $permission $this->userPermissionUtil->getPermission(
  94.                 "financial"
  95.                 "user_subscription"
  96.                 "see"
  97.             );
  98.             if($this->userPermissionUtil->isLow($permission)){
  99.                 return $this->eadResponse(nullErrorEnum::PERMISSION);
  100.             }
  101.             if(
  102.                 !$this->userPermissionUtil->isHigh($permission)
  103.             ){
  104.                 $filter["whereText"] .= " AND p.id IN ( 
  105.                                             SELECT
  106.                                                IDENTITY(pteam.product)
  107.                                             FROM {$productTeamClass} AS pteam 
  108.                                             WHERE pteam.deleted = 0 
  109.                                             AND pteam.user = {$this->user->getId()}
  110.                                         ) ";
  111.             }
  112.         }
  113.         if(!empty($userId)){
  114.             $filter["us.user"] = $userId;
  115.         }
  116.         if(!empty($productId)){
  117.             $filter["us.product"] = $productId;
  118.         }
  119.         if(!is_null($status)){
  120.             $filter["us.status"] = $status;
  121.         }
  122.         if(!is_null($paymentMethod)){
  123.             $filter["us.paymentMethod"] = $paymentMethod;
  124.         }
  125.         if(!empty($dateStart) && !empty($dateEnd)){
  126.             $filter["whereText"] .= "
  127.                 AND DATE_FORMAT(us.dateStart, '%Y-%m-%d') BETWEEN '{$dateStart}' AND '{$dateEnd}'
  128.             ";
  129.         }
  130.         if(!empty($dateStartNextPayment) && !empty($dateEndNextPayment)){
  131.             $filter["whereText"] .= "
  132.                 AND DATE_FORMAT(us.dateNextPayment, '%Y-%m-%d') BETWEEN '{$dateStartNextPayment}' AND '{$dateEndNextPayment}'
  133.             ";
  134.         }
  135.         $order = [ "us.id" => "DESC" ];
  136.         if(!empty($orderParam)){
  137.             $order json_decode($orderParamtrue);
  138.         }
  139.         $data $this->repository->paginate(
  140.             "us"
  141.             $searchText
  142.             $columns
  143.             $joins
  144.             $filter
  145.             $order
  146.             $limit
  147.             $offset
  148.             $filterDelete
  149.         );
  150.         foreach ($data['rows'] as $key => $item) {
  151.             $item = (object)$item;
  152.             $item->statusText $this->repository->getStringStatus($item->status);
  153.             $data['rows'][$key] = $item;
  154.         }
  155.         return $this->eadResponse($data);
  156.     }
  157.     /**
  158.      * @Route(
  159.      *      path          = "/my/list/paginate",
  160.      *      methods       = {"GET"}
  161.      * )
  162.      */
  163.     public function getMyUserSubscriptions(Request $request) {
  164.         if(!$this->configuration->isModuleActive("product_subscription_module")){
  165.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  166.         }
  167.         $this->requestUtil->setRequest($request)->setData();
  168.         
  169.         $columns = [
  170.             "us.id"
  171.             "us.status",
  172.             "u.name",
  173.             "p.title",
  174.             "DATE_FORMAT(us.dateStart, '%Y-%m-%d %H:%i:%s') AS dateStart",
  175.             "DATE_FORMAT(us.dateLastPayment, '%Y-%m-%d %H:%i:%s') AS dateLastPayment",
  176.             "DATE_FORMAT(us.dateNextPayment, '%Y-%m-%d %H:%i:%s') AS dateNextPayment",
  177.             "us.automaticRenewal",
  178.             "us.chargeNumber",
  179.             "us.chargeNumberMax",
  180.             "us.lifetime",
  181.             "us.price",
  182.             "u.email",
  183.             "u.customField"
  184.         ];
  185.         
  186.         $userClass User::class;
  187.         $productClass Product::class;
  188.         $productOfferClass ProductOffer::class;
  189.         $joins = [
  190.             "{$userClass} AS u" => "u.id = us.user",
  191.             "{$productClass} AS p" => "p.id = us.product",
  192.             "{$productOfferClass} AS po" => "po.id = us.productOffer",
  193.         ];
  194.         $searchText $this->requestUtil->getField('searchText');
  195.         $userId $this->user->getId();
  196.         $productId = (int)$this->requestUtil->getField('product');
  197.         $status $this->requestUtil->getField('status');
  198.         $paymentMethod $this->requestUtil->getField('paymentMethod');
  199.         $orderParam $this->requestUtil->getField('order');
  200.         $limit $this->requestUtil->getField('limit');
  201.         $offset $this->requestUtil->getField('offset');
  202.         $dateStart $this->requestUtil->getField('dateStart');
  203.         $dateEnd $this->requestUtil->getField('dateEnd');
  204.         $dateStartNextPayment $this->requestUtil->getField('dateStartNextPayment');
  205.         $dateEndNextPayment $this->requestUtil->getField('dateEndNextPayment');
  206.         $filter = [];
  207.         $filterDelete $this->requestUtil->getDeletedParam();
  208.         if(!empty($userId)){
  209.             $filter["us.user"] = $userId;
  210.         }
  211.         if(!empty($productId)){
  212.             $filter["us.product"] = $productId;
  213.         }
  214.         if(!is_null($status)){
  215.             $filter["us.status"] = $status;
  216.         }
  217.         if(!is_null($paymentMethod)){
  218.             $filter["us.paymentMethod"] = $paymentMethod;
  219.         }
  220.         if(!empty($dateStart) && !empty($dateEnd)){
  221.             $filter["whereText"] = "DATE_FORMAT(us.dateStart, '%Y-%m-%d') BETWEEN '{$dateStart}' AND '{$dateEnd}'";
  222.         }
  223.         if(!empty($dateStartNextPayment) && !empty($dateEndNextPayment)){
  224.             $filter["whereText"] = "
  225.                 DATE_FORMAT(us.dateNextPayment, '%Y-%m-%d') BETWEEN '{$dateStartNextPayment}' AND '{$dateEndNextPayment}'
  226.             ";
  227.         }
  228.         $order = [ "us.id" => "DESC" ];
  229.         if(!empty($orderParam)){
  230.             $order json_decode($orderParamtrue);
  231.         }
  232.         $data $this->repository->paginate(
  233.             "us"
  234.             $searchText
  235.             $columns
  236.             $joins
  237.             $filter
  238.             $order
  239.             $limit
  240.             $offset
  241.             $filterDelete
  242.         );
  243.         foreach ($data['rows'] as $key => $item) {
  244.             $item = (object)$item;
  245.             $item->statusText $this->repository->getStringStatus($item->status);
  246.             $data['rows'][$key] = $item;
  247.         }
  248.         return $this->eadResponse($data);
  249.     }
  250.     /**
  251.      * @Route(
  252.      *      path          = "/detail/{id}",
  253.      *      methods       = {"GET"},
  254.      *      requirements  = { "id" = "\d+" }
  255.      * )
  256.      */
  257.     public function getUserSubscription(Request $request) {
  258.         if(!$this->configuration->isModuleActive("product_subscription_module")){
  259.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  260.         }
  261.         $permission $this->userPermissionUtil->getPermission(
  262.             "financial"
  263.             "user_subscription"
  264.             "see"
  265.         );
  266.         if($this->userPermissionUtil->isLow($permission)){
  267.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  268.         }
  269.         $userSubscriptionId $request->get('id');
  270.         $userSubscription $this->repository->findOneBy([
  271.             "id" => $userSubscriptionId,
  272.             "deleted" => UserSubscriptionEnum::ITEM_NO_DELETED
  273.         ]);
  274.         if (!$userSubscription) {
  275.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  276.         }
  277.         $userCheckoutInfo $userSubscription->getUserCheckoutInfo();
  278.         $priceReal $userSubscription->getPrice();
  279.         $productCoupon $userSubscription->getProductCoupon();
  280.         $chargeNumbers $userSubscription->getChargeNumber();
  281.         $membershipFee $userSubscription->getMembershipFee();
  282.         $isRenew = ($userSubscription->getDateRenew('Y-m-d') == date('Y-m-d'));
  283.         $isLifetime $userSubscription->getLifetime() == UserSubscriptionEnum::YES;
  284.         if(!empty($userSubscription->getCouponKey()) && !empty($productCoupon)){
  285.             if(
  286.                 $userSubscription->getCouponLifetime() == UserSubscriptionEnum::YES || 
  287.                 $chargeNumbers $userSubscription->getCouponNumberCharges()
  288.             ){
  289.                 $productCouponRepository $this->em->getRepository(ProductCoupon::class);
  290.                 if($userSubscription->getCouponApplyMembershipFee() == ProductCouponEnum::YES){
  291.                     if($isRenew){
  292.                         $membershipFee $productCouponRepository->applyDiscount(
  293.                             $productCoupon
  294.                             $membershipFee
  295.                         );
  296.                     }
  297.                 }else{
  298.                     $priceReal $productCouponRepository->applyDiscount(
  299.                         $productCoupon
  300.                         $priceReal
  301.                     );
  302.                 }
  303.             }
  304.         }
  305.         if(
  306.             ($isRenew && !$isLifetime) ||
  307.             empty($userSubscription->getChargeNumber()) || 
  308.             empty($userSubscription->getDateNextPayment())
  309.         ){
  310.             $priceReal $priceReal $membershipFee;
  311.         }
  312.         $info = (object)$userSubscription->toReturn();
  313.         $info->priceReal $priceReal;
  314.         $data = [
  315.             "userSubscription" => $info,
  316.             "product" => $userSubscription->getProduct()->toReturn(),
  317.             "productOffer" => $userSubscription->getProductOffer()->toReturn(),
  318.             "userCheckoutInfo" => ( 
  319.                 $userCheckoutInfo $userCheckoutInfo->toReturn() : null 
  320.             ),
  321.         ];
  322.         return $this->eadResponse($data);
  323.     }
  324.     /**
  325.      * @Route(
  326.      *      path          = "/edit/{id}",
  327.      *      methods       = {"PUT"},
  328.      *      requirements  = { "id" = "\d+" }
  329.      * )
  330.      */
  331.     public function editAdminUserSubscription(Request $request) {
  332.         if(!$this->configuration->isModuleActive("product_subscription_module")){
  333.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  334.         }
  335.         $permission $this->userPermissionUtil->getPermission(
  336.             "financial"
  337.             "user_subscription"
  338.             "edit"
  339.         );
  340.         if($this->userPermissionUtil->isLow($permission)){
  341.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  342.         }
  343.         $this->requestUtil->setRequest($request)->setData();
  344.         $userSubscriptionId $request->get('id');
  345.         $userSubscription $this->repository->findOneBy([
  346.             "id" => $userSubscriptionId,
  347.             "deleted" => UserSubscriptionEnum::ITEM_NO_DELETED
  348.         ]);
  349.         if(!$userSubscription) {
  350.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  351.         }
  352.         if($userSubscription->getStatus() == UserSubscriptionEnum::STATUS_COMPLETED) {
  353.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  354.         }
  355.         $oldCycle $userSubscription->getCycle();
  356.         $oldChargeNumberMax $userSubscription->getChargeNumberMax();
  357.         $oldDateNextPayment $userSubscription->getDateNextPayment();
  358.         $groupsValidation = [];
  359.         if($this->requestUtil->issetField('cycle')){
  360.             $userSubscription->setCycle((int)$this->requestUtil->getField('cycle'));
  361.         }
  362.         if($this->requestUtil->issetField('chargeNumberMax')){
  363.             $userSubscription->setChargeNumberMax(
  364.                 (int)$this->requestUtil->getField('chargeNumberMax')
  365.             );
  366.         }
  367.         if($this->requestUtil->issetField('lifetime')){
  368.             $userSubscription->setLifetime((int)$this->requestUtil->getField('lifetime'));
  369.         }
  370.         if($this->requestUtil->issetField('dateNextPayment')){
  371.             $groupsValidation[] = "editUserSubscription";
  372.             $userSubscription->setDateNextPayment(
  373.                 $this->requestUtil->getField('dateNextPayment')
  374.             );
  375.         }
  376.         if($this->requestUtil->issetField('price')){
  377.             $userSubscription->setPrice(
  378.                 (float)$this->requestUtil->getField('price')
  379.             );
  380.         }
  381.         if($this->requestUtil->issetField('membershipFee')){
  382.             $userSubscription->setMembershipFee(
  383.                 (float)$this->requestUtil->getField('membershipFee')
  384.             );
  385.         }
  386.         $dateRenew $userSubscription->getDateRenew();
  387.         if($userSubscription->getLifetime() == UserSubscriptionEnum::YES){
  388.             $dateRenew null;
  389.         }else if($userSubscription->getLifetime() == UserSubscriptionEnum::NO){
  390.             if(
  391.                 $oldCycle != $userSubscription->getCycle() || 
  392.                 $oldChargeNumberMax != $userSubscription->getChargeNumberMax()
  393.             ){
  394.                 $dateStart $userSubscription->getDateStart();
  395.                 $periodRenew $this->repository->getPlanCycle(
  396.                     $userSubscription->getCycle(), 
  397.                     $userSubscription->getChargeNumberMax()
  398.                 );
  399.                 $dateRenew date('Y-m-d'strtotime($periodRenew));
  400.             }
  401.         }
  402.         $userSubscription->setDateRenew($dateRenew);
  403.         if($userSubscription->getCycle() == UserSubscriptionEnum::CYCLE_MONTHLY){
  404.             $userSubscription->setInstallments(UserSubscriptionEnum::YES);
  405.             $userSubscription->setInstallmentsFree(UserSubscriptionEnum::YES);
  406.         }
  407.         $addDay 0;
  408.         if(
  409.             $userSubscription->getPaymentMethod() == UserSubscriptionEnum::PAYMENT_BILL || 
  410.             $userSubscription->getPaymentMethod() == UserSubscriptionEnum::PAYMENT_PIX
  411.         ){
  412.             $addDay 7;
  413.         }
  414.         if($oldDateNextPayment != $userSubscription->getDateNextPayment()){
  415.             $time1 strtotime($userSubscription->getDateNextPayment());
  416.             $time2 strtotime("+ {$addDay} day");
  417.             if($time2 >= $time1){ // check is a old date
  418.                 return $this->eadResponse([ 'dateNextPayment' ], ErrorEnum::ACTION_INVALID);
  419.             }
  420.             //check if is a new date and if can charge this month
  421.             $month date('m'$time1);
  422.             $year date('Y'$time1);
  423.             $thisMonth date('m');
  424.             $thisYear date('Y');
  425.             if($month == $thisMonth && $year == $thisYear){
  426.                 $tRe $this->em->getRepository(Transaction::class);
  427.                 $chargeNumber $tRe->countTransactionByUserSubscriptionInMonth(
  428.                     $userSubscription
  429.                 );
  430.                 if($chargeNumber >= 1){ //check exist payment in this month
  431.                     return $this->eadResponse(
  432.                         [ 'dateNextPayment' ], 
  433.                         ErrorEnum::ACTION_INVALID
  434.                     );
  435.                 }
  436.             }
  437.         }
  438.         $errors $this->validateEntity($userSubscription$groupsValidation);
  439.         if($errors){
  440.             return $this->eadResponse($errorsErrorEnum::FIELD_EMPTY);
  441.         }
  442.         if(!empty($userSubscription->getDateLastPayment())){
  443.             if($oldDateNextPayment != $userSubscription->getDateNextPayment()){
  444.                 //get enrollments and update expire and support date
  445.                 $enrolmmentRepository $this->em->getRepository(Enrollment::class);
  446.                 $enrollments $enrolmmentRepository->getEnrollmentsByUserSubscription(
  447.                     $userSubscription
  448.                 );
  449.                 foreach ($enrollments as $key => $enrollment) {
  450.                     $enrollment->setDatePeriod(
  451.                         $userSubscription->getDateNextPayment('Y-m-d H:i:s')
  452.                     );
  453.                     
  454.                     $enrollment->setDateSupport(
  455.                         $userSubscription->getDateNextPayment('Y-m-d H:i:s')
  456.                     );
  457.                 }
  458.             }
  459.         }
  460.         $this->em->flush();
  461.         $data $userSubscription->toReturn();
  462.         $this->userLogService->logUpdate(
  463.             "user_subscription"
  464.             $userSubscription->getId(), 
  465.             $data
  466.         );
  467.         //webhook
  468.         $this->repository->sendWebhook($userSubscription);
  469.         return $this->eadResponse($data);
  470.     }
  471.     /**
  472.      * @Route(
  473.      *      path          = "/edit/status/{id}",
  474.      *      name          = "editStatusUserSubscription",
  475.      *      methods       = {"PUT"},
  476.      *      requirements  = { "id" = "\d+" }
  477.      * )
  478.      */
  479.     public function editStatusUserSubscription(Request $request) {
  480.         if(!$this->configuration->isModuleActive("product_subscription_module")){
  481.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  482.         }
  483.         
  484.         $userSubscriptionId $request->get('id');
  485.         $userSubscription $this->repository->findOneBy([
  486.             "id" => $userSubscriptionId,
  487.             "deleted" => UserSubscriptionEnum::ITEM_NO_DELETED
  488.         ]);
  489.         if(!$userSubscription) {
  490.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  491.         }
  492.         $isStudent = ($userSubscription->getUser()->getId() == $this->user->getId());
  493.         if(!$isStudent){
  494.             $permission $this->userPermissionUtil->getPermission(
  495.                 "financial"
  496.                 "user_subscription"
  497.                 "edit"
  498.             );
  499.             if($this->userPermissionUtil->isLow($permission)){
  500.                 return $this->eadResponse(nullErrorEnum::PERMISSION);
  501.             }
  502.         }
  503.         $this->requestUtil->setRequest($request)->setData();
  504.         $oldStatus $userSubscription->getStatus();
  505.         $oldAutomaticRenewal $userSubscription->getAutomaticRenewal();
  506.         if($this->requestUtil->issetField('status')){
  507.             $oldStatus $userSubscription->getStatus();
  508.             if($oldStatus == UserSubscriptionEnum::STATUS_COMPLETED){
  509.                 return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  510.             }
  511.             $userSubscription->setStatus((int)$this->requestUtil->getField('status'));
  512.             if($userSubscription->getStatus() == UserSubscriptionEnum::STATUS_CANCELED){
  513.                 $userSubscription->setDateCancel(date('Y-m-d'));
  514.                 $userSubscription->setCancelReason(UserSubscriptionEnum::CANCELED_BY_ADMIN);
  515.                 if($isStudent){
  516.                     $userSubscription->setCancelReason(UserSubscriptionEnum::CANCELED_BY_STUDENT);
  517.                 }
  518.             }
  519.         }
  520.         if($this->requestUtil->issetField('automaticRenewal')){
  521.             if($oldStatus == UserSubscriptionEnum::STATUS_BLOCKED){
  522.                 return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  523.             }
  524.             $userSubscription->setAutomaticRenewal(
  525.                 (int)$this->requestUtil->getField('automaticRenewal')
  526.             );
  527.         }
  528.         $chargeNow UserSubscriptionEnum::NO;
  529.         $today date('Y-m-d');
  530.         $dateRenew $userSubscription->getDateRenew();
  531.         if($oldAutomaticRenewal != $userSubscription->getAutomaticRenewal()){
  532.             if($userSubscription->getAutomaticRenewal() == UserSubscriptionEnum::YES){
  533.                 $userSubscription->setStatus(UserSubscriptionEnum::STATUS_ACTIVE);
  534.                 $periodRenew $this->repository->getPlanCycle(
  535.                     $userSubscription->getCycle(), 
  536.                     $userSubscription->getChargeNumberMax()
  537.                 );
  538.                 $t1 strtotime($today);
  539.                 $t3 strtotime($dateRenew);
  540.                 if($t1 $t3 && !empty($dateRenew)){
  541.                     $userSubscription->setChargeNumber(0);
  542.                     $chargeNow UserSubscriptionEnum::YES;
  543.                     $dateRenew date('Y-m-d'strtotime($today $periodRenew));
  544.                 }else{
  545.                     $dateRenew date('Y-m-d'strtotime(
  546.                         $userSubscription->getDateLastPayment() . $periodRenew
  547.                     ));
  548.                 }
  549.                 $userSubscription->setDateRenew($dateRenew);
  550.             }
  551.         }
  552.         if($oldStatus != $userSubscription->getStatus()){
  553.             if(
  554.                 $oldStatus == UserSubscriptionEnum::STATUS_CANCELED ||
  555.                 $oldStatus == UserSubscriptionEnum::STATUS_BLOCKED
  556.             ){
  557.                 if($userSubscription->getProductCoupon()){
  558.                     if($userSubscription->getCouponLifetime() == UserSubscriptionEnum::YES){
  559.                         $userSubscription->setCouponKey(null);
  560.                         $userSubscription->setCouponType(null);
  561.                         $userSubscription->setCouponApplyMembershipFee(UserSubscriptionEnum::NO);
  562.                         $userSubscription->setCouponLifetime(UserSubscriptionEnum::NO);
  563.                         $userSubscription->setCouponNumberCharges(null);
  564.                         $userSubscription->setCouponDiscount(null);
  565.                         $userSubscription->setProductCoupon(null);
  566.                     }else{
  567.                         $pcR $this->em->getRepository(ProductCoupon::class);
  568.                         $productCoupon $pcR->findValidProductCouponByProductOffer(
  569.                             $userSubscription->getCouponKey(), 
  570.                             $userSubscription->getProductOffer()
  571.                         );
  572.                         if(!$productCoupon){
  573.                             $userSubscription->setCouponKey(null);
  574.                             $userSubscription->setCouponType(null);
  575.                             $userSubscription->setCouponApplyMembershipFee(UserSubscriptionEnum::NO);
  576.                             $userSubscription->setCouponLifetime(UserSubscriptionEnum::NO);
  577.                             $userSubscription->setCouponNumberCharges(null);
  578.                             $userSubscription->setCouponDiscount(null);
  579.                             $userSubscription->setProductCoupon(null);
  580.                         }
  581.                     }
  582.                 }
  583.             }
  584.             if($userSubscription->getStatus() == UserSubscriptionEnum::STATUS_ACTIVE){
  585.                 $userSubscription->getDateReactivation($today);
  586.                 $chargeNumber $userSubscription->getChargeNumber();
  587.                 $chargeNumberMax $userSubscription->getChargeNumberMax();
  588.                 $lifetime $userSubscription->getLifetime();
  589.                 $t1 strtotime($today);
  590.                 $t2 strtotime($userSubscription->getDateNextPayment());
  591.                 $t3 strtotime($dateRenew);
  592.                 if(
  593.                     $t1 $t3 && $oldAutomaticRenewal == UserSubscriptionEnum::YES && 
  594.                     $lifetime == UserSubscriptionEnum::NO
  595.                 ){
  596.                     $chargeNumber 0;
  597.                     $chargeNow UserSubscriptionEnum::YES;
  598.                 }else if(
  599.                     $t1 $t2 && 
  600.                     (
  601.                         $chargeNumber $chargeNumberMax || 
  602.                         $lifetime == UserSubscriptionEnum::YES
  603.                     )
  604.                 ){
  605.                     $chargeNow UserSubscriptionEnum::YES;
  606.                 }
  607.                 $userSubscription->setChargeNumber($chargeNumber);
  608.             }else if($userSubscription->getStatus() == UserSubscriptionEnum::STATUS_CANCELED){
  609.                 $userSubscription->getDateCancel($today);
  610.                 // send email
  611.                 $emailService $this->generalService->getService('EmailService');
  612.                 $user $userSubscription->getUser();
  613.                 if($emailService->checkUserToSend($user)){
  614.                     $emailService->setToEmail($user->getEmail());
  615.                     $emailService->setToName($user->getName());
  616.                     $subText $this->configuration->getLanguage(
  617.                         'subscription_cancel.subject''email'
  618.                     );
  619.                     $subject "{$subText} - {$userSubscription->getProduct()->getTitle()}";
  620.                     $emailService->setSubject($subject);
  621.                     $domain "https://{$this->client->getDomainPrimary()}";
  622.                     $emailService->setData([
  623.                         "userName" => $user->getName(),
  624.                         "planTitle" => $userSubscription->getProduct()->getTitle(),
  625.                         "btnLink" => "{$domain}/subscriptions/{$userSubscription->getId()}"
  626.                     ]);
  627.                     $emailService->setTemplateBody("subscription_cancel");
  628.                     $emailService->send();
  629.                 }
  630.                 // send marketing
  631.                 $marketingService $this->generalService->getService(
  632.                     'Marketing\\MarketingService'
  633.                 );
  634.                 $marketingService->setTag(TagsMarketingEnum::TAG_CANCELED_SUBSCRIPTION);
  635.                 $marketingService->setTextComplement(
  636.                     $userSubscription->getProduct()->getTitle()
  637.                 );
  638.                 $marketingService->setUser($userSubscription->getUser());
  639.                 $marketingService->send();
  640.                 $notificationService $this->generalService->getService(
  641.                     'NotificationService'
  642.                 );
  643.                 // send notification
  644.                 $notificationService->create(
  645.                     $userSubscription->getUser(),
  646.                     $userSubscription->getProduct()->getUser(),
  647.                     NotificationEnum::ORIGIN_USER_SUBSCRIPTION_CANCELED,
  648.                     $userSubscription->getId()
  649.                 );
  650.                 
  651.                 $notificationService->create(
  652.                     $userSubscription->getProduct()->getUser(),
  653.                     $userSubscription->getUser(),
  654.                     NotificationEnum::ORIGIN_USER_SUBSCRIPTION_CANCELED,
  655.                     $userSubscription->getId()
  656.                 );
  657.             }
  658.         }
  659.         $errors $this->validateEntity($userSubscription);
  660.         if($errors){
  661.             return $this->eadResponse($errorsErrorEnum::FIELD_EMPTY);
  662.         }
  663.         if($chargeNow == UserSubscriptionEnum::YES){
  664.             $this->repository->processTransactionUserSubscription($userSubscription);
  665.         }
  666.         $data $userSubscription->toReturn();
  667.         $this->userLogService->logUpdate(
  668.             "user_subscription"
  669.             $userSubscription->getId(), 
  670.             $data
  671.         );
  672.         $this->em->flush();
  673.         //webhook
  674.         $this->repository->sendWebhook($userSubscription);
  675.     
  676.         return $this->eadResponse([ "success" => ]);
  677.     }
  678.     /**
  679.      * @Route(
  680.      *      path          = "/edit/method/{id}",
  681.      *      name          = "editMethodUserSubscription",
  682.      *      methods       = {"PUT"},
  683.      *      requirements  = { "id" = "\d+" }
  684.      * )
  685.      */
  686.     public function editMethodUserSubscription(Request $request) {
  687.         if(!$this->configuration->isModuleActive("product_subscription_module")){
  688.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  689.         }
  690.         $userSubscriptionId $request->get('id');
  691.         $userSubscription $this->repository->findOneBy([
  692.             "id" => $userSubscriptionId,
  693.             "deleted" => UserSubscriptionEnum::ITEM_NO_DELETED
  694.         ]);
  695.         if(!$userSubscription) {
  696.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  697.         }
  698.         $this->requestUtil->setRequest($request)->setData();
  699.         if($this->requestUtil->issetField('paymentMethod')){
  700.             $paymentMethod = (int)$this->requestUtil->getField('paymentMethod');
  701.             if(empty($paymentMethod)){
  702.                 return $this->eadResponse([ "paymentMethod" ], ErrorEnum::FIELD_EMPTY);
  703.             }
  704.             
  705.             $userSubscription->setPaymentMethod($paymentMethod);
  706.         }
  707.         if($userSubscription->getPaymentMethod() == UserSubscriptionEnum::PAYMENT_CARD){
  708.             $userCardId = (int)$this->requestUtil->getField('userCard');
  709.             if(empty($userCardId)){
  710.                 return $this->eadResponse([ "userCard" ], ErrorEnum::FIELD_EMPTY);
  711.             }
  712.             $userCardRepository $this->em->getRepository(UserCard::class);
  713.             $oldUserCard $userSubscription->getUserCard();
  714.             $userCard $userCardRepository->findOneBy([
  715.                 "id" => $userCardId,
  716.                 "user" => $userSubscription->getUser()->getId(),
  717.                 "deleted" => UserCardEnum::ITEM_NO_DELETED,
  718.             ]);
  719.             if($userCard){
  720.                 $userSubscription->setUserCard($userCard);
  721.                 if($oldUserCard){
  722.                     if($oldUserCard->getId() == $userCard->getId()){
  723.                         return $this->eadResponse([ "success" => ]);
  724.                     }
  725.                 }
  726.             }else{
  727.                 return $this->eadResponse([ "userCard" ], ErrorEnum::FIELD_EMPTY);
  728.             }
  729.         }
  730.         $today date('Y-m-d');
  731.         $chargeNumber $userSubscription->getChargeNumber();
  732.         $chargeNumberMax $userSubscription->getChargeNumberMax();
  733.         $lifetime $userSubscription->getLifetime();
  734.         $t1 strtotime($today);
  735.         $t2 strtotime($userSubscription->getDateNextPayment());
  736.         if(
  737.             $t1 $t2 && 
  738.             (
  739.                 $chargeNumber $chargeNumberMax || 
  740.                 $lifetime == UserSubscriptionEnum::YES
  741.             )
  742.         ){
  743.             $this->repository->processTransactionUserSubscription($userSubscription);
  744.         }
  745.         $data $userSubscription->toReturn();
  746.         $this->userLogService->logUpdate(
  747.             "user_subscription"
  748.             $userSubscription->getId(), 
  749.             $data
  750.         );
  751.         $this->em->flush();
  752.         //webhook
  753.         $this->repository->sendWebhook($userSubscription);
  754.         return $this->eadResponse([ "success" => ]);
  755.     }
  756.     /**
  757.      * @Route(
  758.      *      path          = "/process/payment/{id}",
  759.      *      name          = "processPayment",
  760.      *      methods       = {"GET"},
  761.      *      requirements  = { "id" = "\d+" }
  762.      * )
  763.      */
  764.     public function processPayment(Request $request) {
  765.         if(!$this->configuration->isModuleActive("product_subscription_module")){
  766.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  767.         }
  768.         $userSubscriptionId $request->get('id');
  769.         $userSubscription $this->repository->findOneBy([
  770.             "id" => $userSubscriptionId,
  771.             "deleted" => UserSubscriptionEnum::ITEM_NO_DELETED
  772.         ]);
  773.         if(!$userSubscription) {
  774.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  775.         }
  776.         $this->requestUtil->setRequest($request)->setData();
  777.         $data $this->repository->processTransactionUserSubscription($userSubscription);
  778.         if(!empty($data['errorMessage'])){
  779.             $userSubscription->setErrorMessage($data['errorMessage']);
  780.             $this->em->flush();
  781.             return $this->eadResponse([ 
  782.                 "message" => $data['errorMessage']
  783.             ], ErrorEnum::ACTION_INVALID);
  784.         }
  785.         $this->em->flush();
  786.         //webhook
  787.         $this->repository->sendWebhook($userSubscription);
  788.         return $this->eadResponse([ 
  789.             "success" => 1
  790.             "data" => $data 
  791.         ]);
  792.     }
  793.     /**
  794.      * @Route(
  795.      *      path          = "/edit/many",
  796.      *      methods       = {"PUT"}
  797.      * )
  798.      */
  799.     public function editManyUserSubscription(Request $request) {
  800.         if(!$this->configuration->isModuleActive("product_subscription_module")){
  801.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  802.         }
  803.         $permission $this->userPermissionUtil->getPermission(
  804.             "financial",
  805.             "user_subscription",
  806.             "edit_many"
  807.         );
  808.         
  809.         if($this->userPermissionUtil->isLow($permission)){
  810.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  811.         }
  812.         $this->requestUtil->setRequest($request)->setData();
  813.         
  814.         $userId $this->requestUtil->getField('userId');
  815.         $productId $this->requestUtil->getField('productId');
  816.         $price $this->requestUtil->getField('price');
  817.         $newStatus $this->requestUtil->getField('newStatus');
  818.         $status $this->requestUtil->getField('status');
  819.         $dateStart $this->requestUtil->getField('dateStart');
  820.         $dateEnd $this->requestUtil->getField('dateEnd');
  821.         $dateStartNextPayment $this->requestUtil->getField('dateStartNextPayment');
  822.         $dateEndNextPayment $this->requestUtil->getField('dateEndNextPayment');
  823.         $userSubscriptionStatus = [
  824.             UserSubscriptionEnum::STATUS_CANCELED
  825.             UserSubscriptionEnum::STATUS_COMPLETED
  826.             UserSubscriptionEnum::STATUS_BLOCKED
  827.         ];
  828.         if((!in_array($newStatus$userSubscriptionStatus) && !empty($newStatus)) || 
  829.             (is_null($newStatus) && is_null($price)))
  830.         {
  831.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  832.         }
  833.         $this->repository->editManyUserSubscription(
  834.             $userId,
  835.             $productId,
  836.             $price
  837.             $newStatus,
  838.             $status
  839.             $dateStart
  840.             $dateEnd,
  841.             $dateStartNextPayment,
  842.             $dateEndNextPayment
  843.         );
  844.         return $this->eadResponse([ "success" => ]);
  845.     }
  846.     /**
  847.      * @Route(
  848.      *      path          = "/block/many",
  849.      *      methods       = {"PUT"}
  850.      * )
  851.      */
  852.     public function blockManyUserSubscription(Request $request) {
  853.         if(!$this->configuration->isModuleActive("product_subscription_module")){
  854.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  855.         }
  856.         $permission $this->userPermissionUtil->getPermission(
  857.             "financial"
  858.             "user_subscription"
  859.             "edit_many"
  860.         );
  861.         
  862.         if($this->userPermissionUtil->isLow($permission)){
  863.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  864.         }
  865.         $this->requestUtil->setRequest($request)->setData();
  866.         $itemIds json_decode($this->requestUtil->getField('itemIds'));
  867.         
  868.         if(empty($itemIds) || !is_array($itemIds)){
  869.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  870.         }
  871.         foreach ($itemIds as $key => $itemId) {
  872.             $userSubscription $this->repository->find($itemId);
  873.             if($userSubscription){
  874.                 $userSubscription->setStatus(UserSubscriptionEnum::STATUS_BLOCKED);
  875.             }
  876.         }
  877.         $this->em->flush();
  878.         return $this->eadResponse([ "success" => ]);
  879.     }
  880. }