<?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');
}
}