vendor/rawafed/cloud-services-bundle/Controller/SubscriptionController.php line 22

Open in your IDE?
  1. <?php
  2. namespace Rawafed\CloudServicesBundle\Controller;
  3. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  4. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use Rawafed\CloudServicesBundle\Entity\BillingSettings;
  11. use Rawafed\CloudServicesBundle\Entity\Client;
  12. use Rawafed\CloudServicesBundle\Entity\Package;
  13. use Rawafed\CloudServicesBundle\Entity\Subscription;
  14. use Rawafed\CloudServicesBundle\Form\SubscriptionType;
  15. use Rawafed\PaymentBundle\Entity\BillingPeriod;
  16. use Rawafed\CloudServicesBundle\Exception\SubscriptionIsNotReadyException;
  17. use Rawafed\CloudServicesBundle\Exception\SubscriptionNotFoundException;
  18. use Rawafed\CloudServicesBundle\Exception\SubscriptionIsSuspenededException;
  19. class SubscriptionController extends AbstractController
  20. {
  21.     /**
  22.      * @Route("/subscriptions", name="cloud_subscription_list")
  23.      * @Security("is_granted('IS_AUTHENTICATED_REMEMBERED')")
  24.      * @Template
  25.      */
  26.     public function subscriptionsAction(Request $request)
  27.     {
  28.         $user $this->getUser();
  29.         if($this->container->has('navigation')) {
  30.             $breadcrumbBuilder $this->get('navigation')->getBreadcrumbBuilder();
  31.             $breadcrumbBuilder
  32.                 ->moveTo('homepage')
  33.                 ->add('cloud_services.titles.subscriptions''cloud_subscription_list')
  34.             ;
  35.         }
  36.         $entityManager $this->getDoctrine()->getManager();
  37.         $subscriptionRepo $entityManager->getRepository(Subscription::class);
  38.         $subscriptions $subscriptionRepo->getUserSubscriptions($user);
  39.         return [
  40.             'subscriptions' => $subscriptions,
  41.             'cloudManager' => $this->get('cloud_manager')
  42.         ];
  43.     }
  44.     /**
  45.      * @Route("/subscription/new", name="cloud_subscription_new")
  46.      * @Security("is_granted('IS_AUTHENTICATED_REMEMBERED')")
  47.      * @Template
  48.      */
  49.     public function newSubscriptionAction(Request $request)
  50.     {
  51.         $entityManager $this->getDoctrine()->getManager();
  52.         $user $this->getUser();
  53.         $packageId $this->get('session')->get('packageId');
  54.         $package null;
  55.         if($packageId) {
  56.             $packageRepo $entityManager->getRepository(Package::class);
  57.             $package $packageRepo->find($packageId);
  58.         }
  59.         if(!$package) {
  60.             return $this->redirectToRoute('cloud_package_pricing');
  61.         }
  62.         if($this->container->has('navigation')) {
  63.             $breadcrumbBuilder $this->get('navigation')->getBreadcrumbBuilder();
  64.             $breadcrumbBuilder
  65.                 ->moveTo('homepage')
  66.                 ->add('cloud_services.titles.subscriptions''cloud_subscription_list')
  67.                 ->add('cloud_services.titles.new_subscription''cloud_subscription_new')
  68.             ;
  69.         }
  70.         $subscription = new Subscription();
  71.         $subscription->setPackage($package);
  72.         $clientRepo $entityManager->getRepository(Client::class);
  73.         $clients $clientRepo->getUserClients($user);
  74.         if(!$clients || !count($clients)) {
  75.             return $this->redirectToRoute('cloud_client_new');
  76.         }
  77.         $billingPeriod $this->get('session')->get('billing_period');
  78.         $billingSettings = new BillingSettings();
  79.         if(strcasecmp($billingPeriodBillingPeriod::YEAR) === 0) {
  80.             $billingSettings->setBillingPeriod(BillingPeriod::YEAR);
  81.         } else {
  82.             $billingSettings->setBillingPeriod(BillingPeriod::MONTH);
  83.         }
  84.         $subscription->setBillingSettings($billingSettings);
  85.         if(count($clients) == 1) {
  86.             $subscription->setClient($clients[0]);
  87.         }
  88.         $subscriptionForm $this->createForm(SubscriptionType::class, $subscription, ['clients' => $clients]);
  89.         $subscriptionForm->handleRequest($request);
  90.         if($subscriptionForm->isSubmitted() && $subscriptionForm->isValid()) {
  91.             $subscription $subscriptionForm->getData();
  92.             $billingSettings $subscription->getBillingSettings();
  93.             if(!$billingSettings->getBillingName()) {
  94.                 $billingName $subscription->getClient()->getContacts()[0]->getRealName();
  95.                 $billingSettings->setBillingName($billingName);
  96.             }
  97.             if(!$billingSettings->getBillingEmail()) {
  98.                 $billingEmail $subscription->getClient()->getContacts()[0]->getEmail();
  99.                 $billingSettings->setBillingEmail($billingEmail);
  100.             }
  101.             $entityManager $this->getDoctrine()->getManager();
  102.             $entityManager->persist($subscription);
  103.             $entityManager->flush();
  104.             $translator $this->get('translator');
  105.             $freePeriod $package->getFreePeriod();
  106.             if($freePeriod == 0) {
  107.                 ///////////
  108.                 // TODO: move logic in this action & SubscriptionsMonitoringCommand to a service
  109.                 $paymentPeriodStart = new \DateTime();
  110.                 $paymentPeriodStart->setTime(00);
  111.                 $invoiceItems = new \Doctrine\Common\Collections\ArrayCollection();
  112.                 $setupFees $package->getSetupFees();
  113.                 if($setupFees 0) {
  114.                     $invoiceItem = new \Rawafed\PaymentBundle\Entity\InvoiceItem();
  115.                     $invoiceItem->setAmount($setupFees * ($package->getSetupFeesDiscount() / 100));
  116.                     $invoiceItem->setDescription($translator->trans('cloud_services.fields.setup_fees'));
  117.                     $invoiceItems->add($invoiceItem);
  118.                 }
  119.                 $billingSettings $subscription->getBillingSettings();
  120.                 $billingPeriod $billingSettings->getBillingPeriod();
  121.                 $paymentPeriodEnd = new \DateTime();
  122.                 $paymentPeriodEnd->add(new \DateInterval($billingPeriod == BillingPeriod::YEAR 'P1Y' 'P1M'));
  123.                 $invoiceItem = new \Rawafed\PaymentBundle\Entity\InvoiceItem();
  124.                 if($billingPeriod == BillingPeriod::YEAR) {
  125.                     $yearlyFees $package->getYearlyFees();
  126.                     $invoiceItem->setAmount($yearlyFees * ($package->getYearlyFeesDiscount() / 100));
  127.                     $invoiceItem->setDescription($translator->trans('cloud_services.fields.yearly_fees'));
  128.                 } else {
  129.                     $monthlyFees $package->getMonthlyFees();
  130.                     $invoiceItem->setAmount($monthlyFees * ($package->getMonthlyFeesDiscount() / 100));
  131.                     $invoiceItem->setDescription($translator->trans('cloud_services.fields.monthly_fees'));
  132.                 }
  133.                 $invoiceItems->add($invoiceItem);
  134.                 $invoiceSubmissionPeriod $this->getParameter('cloud_services.invoice_submission_period');
  135.                 $invoiceIssueDate = new \DateTime();
  136.                 $invoiceIssueDate->sub(new \DateInterval('P' $invoiceSubmissionPeriod .'D'));
  137.                 $invoiceRepo $entityManager->getRepository(\Rawafed\PaymentBundle\Entity\Invoice::class);
  138.                 $invoiceNumber $invoiceRepo->getNextInvoiceNumber();
  139.                 $invoice = new \Rawafed\PaymentBundle\Entity\Invoice();
  140.                 $invoice->setInvoiceNumber($invoiceNumber);
  141.                 $invoice->setIssueDate(new \DateTime());
  142.                 $invoice->setDueDate(new \DateTime());
  143.                 $invoice->setCurrency($billingSettings->getCurrency());
  144.                 foreach($invoiceItems as $invoiceItem) {
  145.                     if($billingSettings->getCountry()->getId() == 'SA') {
  146.                         $invoiceItem->setVat(0.05 $invoiceItem->getAmount());
  147.                     }
  148.                     $invoice->addItem($invoiceItem);
  149.                 }
  150.                 $subscriptionPayment = new \Rawafed\CloudServicesBundle\Entity\SubscriptionPayment();
  151.                 $subscriptionPayment->setSubscription($subscription);
  152.                 $subscriptionPayment->setInvoice($invoice);
  153.                 $subscriptionPayment->setPeriodStart(new \DateTime());
  154.                 $subscriptionPayment->setPeriodEnd($paymentPeriodEnd);
  155.                 $entityManager->persist($invoice);
  156.                 $entityManager->persist($subscriptionPayment);
  157.                 $entityManager->flush();
  158.                 //return $this->redirectToRoute('cloud_billing_checkout', ['number' => $invoiceNumber]);
  159.                 return $this->redirectToRoute('cloud_billing_invoice', ['number' => $invoiceNumber]);
  160.                 ///////////
  161.             } else {
  162.                 $this->get('session')->getFlashBag()->add(
  163.                     'success'$translator->trans('cloud_services.messages.subscription_created')
  164.                 );
  165.                 return $this->redirectToRoute('cloud_subscription_list');
  166.             }
  167.         }
  168.         return [
  169.             'subscription' => $subscription,
  170.             'form' => $subscriptionForm->createView(),
  171.         ];
  172.     }
  173.     /**
  174.      * @Route("/subscription/check-name", name="cloud_subscription_check_name")
  175.      * @Security("is_granted('IS_AUTHENTICATED_REMEMBERED')")
  176.      */
  177.     public function checkNameAction(Request $request)
  178.     {
  179.         $name $request->request->get('name');
  180.         $cloudManager $this->get('cloud_manager');
  181.         $result $cloudManager->checkAppNameValidity($name);
  182.         $message '';
  183.         if($result !== true) {
  184.             $message 'cloud_services.messages.invalid_app_name';
  185.             $result false;
  186.         } else {
  187.             $result $cloudManager->checkAppNameAvailability($name);
  188.             if(!$result) {
  189.                 $message 'cloud_services.messages.app_name_not_available';
  190.             }
  191.         }
  192.         $translator $this->get('translator');
  193.         $response = [
  194.             'result' => $result,
  195.             'message' => $translator->trans($message)
  196.         ];
  197.         return new JsonResponse($response);
  198.     }
  199.     /**
  200.      * @Route("/subscription/{name}", name="cloud_subscription_view")
  201.      * @Security("is_granted('IS_AUTHENTICATED_REMEMBERED')")
  202.      * @Template
  203.      */
  204.     public function viewSubscriptionAction(Request $request$name)
  205.     {
  206.         $entityManager $this->getDoctrine()->getManager();
  207.         $subscriptionRepo $entityManager->getRepository(Subscription::class);
  208.         $subscription $subscriptionRepo->findByName($name);
  209.         $status $subscription->getStatus();
  210.         if(!$subscription) {
  211.             throw new NotFoundHttpException('There is no subscription with name: ' $name);
  212.         }
  213.         $user $this->getUser();
  214.         if(!$subscription->getClient()->getContacts()->contains($user)) {
  215.             throw $this->createAccessDeniedException();
  216.         }
  217.         if($this->container->has('navigation')) {
  218.             $breadcrumbBuilder $this->get('navigation')->getBreadcrumbBuilder();
  219.             $breadcrumbBuilder
  220.                 ->moveTo('homepage')
  221.                 ->add('cloud_services.titles.subscriptions''cloud_subscription_list')
  222.                 ->add($name'cloud_subscription_view')
  223.             ;
  224.         }
  225.         $subscriptionForm $this->createForm(SubscriptionType::class, $subscription);
  226.         $subscriptionForm->handleRequest($request);
  227.         if($subscriptionForm->isSubmitted() && $subscriptionForm->isValid()) {
  228.             $subscription->setStatus($status);
  229.             $entityManager $this->getDoctrine()->getManager();
  230.             $entityManager->persist($subscription);
  231.             $entityManager->flush();
  232.             return $this->redirectToRoute('cloud_subscription_view', ['name' => $name]);
  233.         }
  234.         return [
  235.             'subscription' => $subscription,
  236.             'form' => $subscriptionForm->createView(),
  237.         ];
  238.     }
  239.     /**
  240.      * @Route("/subscription/{name}/status", name="cloud_subscription_status")
  241.      * @Template
  242.      */
  243.     public function subscriptionStatusAction(Request $request$name)
  244.     {
  245.         if($this->container->has('navigation')) {
  246.             $breadcrumbBuilder $this->get('navigation')->getBreadcrumbBuilder();
  247.             $breadcrumbBuilder
  248.                 ->moveTo('homepage')
  249.                 ->add('cloud_services.titles.subscription_status''cloud_subscription_status')
  250.             ;
  251.         }
  252.         $cloudManager $this->get('cloud_manager');
  253.         $status null;
  254.         $url null;
  255.         try {
  256.             $subscription $cloudManager->getApp($name);
  257.             $status 'ok';
  258.             $url $cloudManager->getAppUrl($name);
  259.             $message sprintf('App %s is up and running'$name);
  260.         } catch(SubscriptionNotFoundException $ex) {
  261.             $status 'not_found';
  262.             $message 'cloud_services.messages.subscription_is_not_found';
  263.         } catch(SubscriptionIsNotReadyException $ex) {
  264.             $status 'not_ready';
  265.             $message 'cloud_services.messages.subscription_is_not_ready';
  266.         } catch(SubscriptionIsSuspenededException $ex) {
  267.             $status 'suspeneded';
  268.             $message 'cloud_services.messages.subscription_is_not_active';
  269.         } catch(\Exception $ex) {
  270.             $message $ex->getMessage();
  271.         }
  272.         if($request->isXmlHttpRequest()) {
  273.             $response = [
  274.                 'name' => $name,
  275.                 'status' => $status,
  276.                 'message' => $message,
  277.             ];
  278.             if($url) {
  279.                 $response['url'] = $url;
  280.             }
  281.             return new JsonResponse($response);
  282.         } else {
  283.             return [
  284.                 'message' => $message,
  285.                 'name' => $name,
  286.             ];
  287.         }
  288.     }
  289. }