- <?php
- namespace CoreBundle\Controller;
- use CoreBundle\Ecommerce\Payment\Paypal\ConfirmationMailTrait;
- use CoreBundle\Ecommerce\Payment\Paypal\PaypalAuthCredentialsTrait;
- use CoreBundle\Ecommerce\Payment\Paypal\PaypalCreatePaymentTrait;
- use CoreBundle\Ecommerce\Payment\Paypal\PaypalExecutePaymentTrait;
- use Pimcore\Bundle\EcommerceFrameworkBundle\Exception\UnsupportedException;
- use CoreBundle\Services\CartProductStockChecker;
- use Pimcore\Bundle\EcommerceFrameworkBundle\Factory;
- use Pimcore\Localization\IntlFormatter;
- use Pimcore\Localization\LocaleService;
- use Pimcore\Log\ApplicationLogger;
- use Pimcore\Model\DataObject\OnlineShopOrder;
- use Pimcore\Model\Site;
- use Symfony\Component\HttpFoundation\Request;
- use Symfony\Component\HttpFoundation\Response;
- use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
- class PaypalPlusPaymentController extends AbstractCartAware
- {
-     use PaypalAuthCredentialsTrait,
-         PaypalCreatePaymentTrait,
-         PaypalExecutePaymentTrait,
-         ConfirmationMailTrait;
-     /**
-      * @var ApplicationLogger
-      */
-     private $logger;
-     /**
-      * @var string $bundleName
-      */
-     public $bundleName;
-     /**
-      * @inheritDoc
-      */
-     public function __construct(ApplicationLogger $logger)
-     {
-         $this->logger = $logger;
-         $this->bundleName = Site::getCurrentSite()->getRootDocument()->getModule();
-     }
-     /**
-      * @param FilterControllerEvent $event
-      */
-     public function onKernelController(FilterControllerEvent $event)
-     {
-         parent::onKernelController($event);
-         $cart = $this->getCart();
-         $this->view->cart = $cart;
-     }
-     public function createAction()
-     {
-         $response = $this->createPayment();
-         $this->addResponseHeader('Content-Type', 'application/json');
-         $this->disableViewAutoRender();
-         return new Response($response);
-     }
-     public function executeAction(Request $request)
-     {
-         $response = $this->executePayment($request->get('paymentID'), $request->get('payerID'));
-         $this->disableViewAutoRender();
-         return new Response(json_encode($response));
-     }
-     public function paymentAction(Request $request)
-     {
-         $cart = $this->getCart();
-         /** @var CartProductStockChecker $cartProductStockChecker */
-         $cartProductStockChecker = $this->get('core.cart_product_stock_checker');
-         $messages = $cartProductStockChecker->checkStockOfProductinCart($cart, false);
-         if (count($messages) > 0) {
-             $this->addFlash('error', $messages);
-             return $this->redirect($this->generateUrl('shopHandlerCart', ['action' => 'list']));
-         }
-         $this->view->currentStep = 'payment';
-         $checkoutManager = Factory::getInstance()->getCheckoutManager($cart);
-         $confirmStep = $checkoutManager->getCheckoutStep('confirm');
-         $paymentStep = $checkoutManager->getCheckoutStep('payment');
-         $trackingManager = Factory::getInstance()->getTrackingManager();
-         $trackingManager->trackCheckoutStep($confirmStep, $cart, 2);
-         $checkoutManager->commitStep($confirmStep, $cart);
-         $trackingManager->trackCheckoutStep($paymentStep, $cart, 3);
-         $shippingAddress = $checkoutManager->getCheckoutStep('deliveryaddress');
-         $this->view->shippingAddress = $shippingAddress->getData();
-         $this->view->editBillingShippingUrl = $this->generateUrl('shopHandlerCheckout', ['action' => 'delivery', 'mode' => 'edit']);
-         $this->view->cart = $cart;
-         CheckoutController::logStepData($request->getClientIp(), $paymentStep, $cart);
-         $checkoutManager->commitStep($paymentStep, $cart);
-         $createPayment = $this->createPayment();
-         if (is_array($createPayment) && $createPayment['status'] == 2) {
-             $errorMessage = '[' . $this->bundleName . ']: ' . $createPayment['message'];
-             $this->logger->error($errorMessage, ['component' => 'Payment']);
-         }
-         $this->view->cartUrl = $this->generateUrl('shopHandlerCart', ['action' => 'list']);
-         $total = $cart->getPriceCalculator()->getGrandTotal()->getGrossAmount()->asNumeric();
-         if ($total == 0) {
-             $this->view->approvalUrl = '';
-             $this->view->returnUrl = $this->generateUrl('shopHandlerPayment', ['action' => 'donewithoutpayment']);
-         } else {
-             CheckoutController::logStepData($request->getClientIp(), 'approvalUrl', $createPayment->links[1]->href);
-             $this->view->approvalUrl = $createPayment->links[1]->href;
-         }
-     }
-     public function doneAction(Request $request, ApplicationLogger $logger)
-     {
-         $response = $this->executePayment($request->get('paymentId'), $request->get('PayerID'));
-         if ($response['status'] == 1) {
-             $this->view->currentStep = 'completed';
-             CheckoutController::logStepData($request->getClientIp(), 'completed', $response);
-             $this->view->order = OnlineShopOrder::getByOrdernumber($response['sale_id'], 1);
-             return $this->render('Checkout/completed.html.twig', $this->view->getAllParameters());
-         }
-         $errorMessage = '[' . $this->bundleName . ']: ' . $response['message'];
-         $logger->error($errorMessage, ['component' => 'Payment']);
-         return $this->render('Payment/payment.html.twig');
-     }
-      /**
-      * @return Response
-      * @throws UnsupportedException
-      */
-     public function doneWithoutPaymentAction() :Response
-     {
-         $cart = $this->getCart();
-         $total = $cart->getPriceCalculator()->getGrandTotal()->getGrossAmount()->asNumeric();
-            if (!is_null($cart) && $total == 0) {
-              $orderCompleteService = $this->get('core.payment_save_order_send_email');
-              $orderCompleteService->saveOrder($cart);
-              $this->view->currentStep = 'completed';
-              return $this->render('Checkout/completed.html.twig', $this->view->getAllParameters());
-         }
-         $errorMessage = '[' . $this->bundleName . ']: Your cart doesnt exist or total is not 0';
-         $this->logger->error($errorMessage, ['component' => 'Payment']);
-         return $this->render('Payment/payment.html.twig');
-     }
- }
-