Des modules ajoutés et mise en page du CSS

This commit is contained in:
2021-01-20 12:37:48 +01:00
parent ae363c7447
commit 9ae46f8c88
409 changed files with 35050 additions and 6579 deletions

View File

@@ -0,0 +1,113 @@
<?php
/*************************************************************************************/
/* */
/* Thelia */
/* */
/* Copyright (c) OpenStudio */
/* email : info@thelia.net */
/* web : http://www.thelia.net */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 3 of the License */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* */
/*************************************************************************************/
namespace PayPal\Controller;
use PayPal\Form\ConfigurationForm;
use PayPal\PayPal;
use Thelia\Controller\Admin\BaseAdminController;
use Thelia\Core\Security\AccessManager;
use Thelia\Core\Security\Resource\AdminResources;
use Thelia\Core\Thelia;
use Thelia\Form\Exception\FormValidationException;
use Thelia\Tools\URL;
use Thelia\Tools\Version\Version;
/**
* Class ConfigurePaypal
* @package Paypal\Controller
*/
class ConfigurationController extends BaseAdminController
{
/*
* Checks paypal.configure || paypal.configure.sandbox form and save config into json file
*/
/**
* @return mixed|\Symfony\Component\HttpFoundation\Response|\Thelia\Core\HttpFoundation\Response
*/
public function configureAction()
{
if (null !== $response = $this->checkAuth(AdminResources::MODULE, 'Paypal', AccessManager::UPDATE)) {
return $response;
}
$configurationForm = $this->createForm(ConfigurationForm::FORM_NAME);
try {
$form = $this->validateForm($configurationForm, "POST");
// Get the form field values
$data = $form->getData();
foreach ($data as $name => $value) {
if (is_array($value)) {
$value = implode(';', $value);
}
Paypal::setConfigValue($name, $value);
}
$this->adminLogAppend(
"paypal.configuration.message",
AccessManager::UPDATE,
sprintf("Paypal configuration updated")
);
if ($this->getRequest()->get('save_mode') == 'stay') {
// If we have to stay on the same page, redisplay the configuration page/
$url = '/admin/module/Paypal';
} else {
// If we have to close the page, go back to the module back-office page.
$url = '/admin/modules';
}
return $this->generateRedirect(URL::getInstance()->absoluteUrl($url));
} catch (FormValidationException $ex) {
$error_msg = $this->createStandardFormValidationErrorMessage($ex);
} catch (\Exception $ex) {
$error_msg = $ex->getMessage();
}
$this->setupFormErrorContext(
$this->getTranslator()->trans("Paypal configuration", [], PayPal::DOMAIN_NAME),
$error_msg,
$configurationForm,
$ex
);
// Before 2.2, the errored form is not stored in session
if (Version::test(Thelia::THELIA_VERSION, '2.2', false, "<")) {
return $this->render('module-configure', [ 'module_code' => PayPal::getModuleCode()]);
} else {
return $this->generateRedirect(URL::getInstance()->absoluteUrl('/admin/module/PayPal'));
}
}
/**
* @return \Thelia\Core\HttpFoundation\Response
*/
public function logAction()
{
return $this->render('paypal/paypal-log');
}
}

View File

@@ -0,0 +1,315 @@
<?php
/*************************************************************************************/
/* */
/* Thelia */
/* */
/* Copyright (c) OpenStudio */
/* email : info@thelia.net */
/* web : http://www.thelia.net */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 3 of the License */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* */
/*************************************************************************************/
namespace PayPal\Controller;
use PayPal\Event\PayPalEvents;
use PayPal\Event\PayPalPlanifiedPaymentEvent;
use PayPal\Form\PayPalFormFields;
use PayPal\Form\PayPalPlanifiedPaymentCreateForm;
use PayPal\Form\PayPalPlanifiedPaymentUpdateForm;
use PayPal\Model\PaypalPlanifiedPayment;
use PayPal\Model\PaypalPlanifiedPaymentQuery;
use PayPal\PayPal;
use Symfony\Component\HttpFoundation\Response;
use Thelia\Controller\Admin\AbstractCrudController;
use Thelia\Core\Security\AccessManager;
/**
* Class PayPalPlanifiedPaymentController
* @package PayPal\Controller
*/
class PayPalPlanifiedPaymentController extends AbstractCrudController
{
/** @var string */
protected $currentRouter = PayPal::ROUTER;
/**
* PayPalPlanifiedPaymentController constructor.
*/
public function __construct()
{
parent::__construct(
'team',
'id',
'order',
'paypal.back.planified.payment',
PayPalEvents::PAYPAL_PLANIFIED_PAYMENT_CREATE,
PayPalEvents::PAYPAL_PLANIFIED_PAYMENT_UPDATE,
PayPalEvents::PAYPAL_PLANIFIED_PAYMENT_DELETE
);
}
/**
* The default action is displaying the list.
*
* @return Response
*/
public function defaultAction()
{
// Check current user authorization
if (null !== $response = $this->checkAuth($this->resourceCode, $this->getModuleCode(), AccessManager::VIEW)) {
return $response;
}
return $this->renderList();
}
/**
* Return the creation form for this object
* @return PayPalPlanifiedPaymentCreateForm
*/
protected function getCreationForm()
{
return $this->createForm(PayPalPlanifiedPaymentCreateForm::FORM_NAME);
}
/**
* Return the update form for this object
* @return PayPalPlanifiedPaymentUpdateForm
*/
protected function getUpdateForm()
{
return $this->createForm(PayPalPlanifiedPaymentUpdateForm::FORM_NAME);
}
/**
* Hydrate the update form for this object, before passing it to the update template
*
* @param PaypalPlanifiedPayment $object
* @return PayPalPlanifiedPaymentUpdateForm
*/
protected function hydrateObjectForm($object)
{
/** @var \Thelia\Model\Lang $lang */
$lang = $this->getRequest()->getSession()->get('thelia.current.lang');
$object->getTranslation($lang->getLocale());
$data = [
PayPalFormFields::FIELD_PP_ID => $object->getId(),
PayPalFormFields::FIELD_PP_TITLE => $object->getTitle(),
PayPalFormFields::FIELD_PP_DESCRIPTION => $object->getDescription(),
PayPalFormFields::FIELD_PP_FREQUENCY => $object->getFrequency(),
PayPalFormFields::FIELD_PP_FREQUENCY_INTERVAL => $object->getFrequencyInterval(),
PayPalFormFields::FIELD_PP_CYCLE => $object->getCycle(),
PayPalFormFields::FIELD_PP_MIN_AMOUNT => $object->getMinAmount(),
PayPalFormFields::FIELD_PP_MAX_AMOUNT => $object->getMaxAmount(),
PayPalFormFields::FIELD_PP_POSITION => $object->getPosition()
];
return $this->createForm(PayPalPlanifiedPaymentUpdateForm::FORM_NAME, 'form', $data);
}
/**
* Creates the creation event with the provided form data
*
* @param mixed $formData
* @return PayPalPlanifiedPaymentEvent
*/
protected function getCreationEvent($formData)
{
$planifiedPayment = new PaypalPlanifiedPayment();
$planifiedPayment = $this->fillObjectWithDataForm($planifiedPayment, $formData);
$planifiedPaymentEvent = new PayPalPlanifiedPaymentEvent($planifiedPayment);
return $planifiedPaymentEvent;
}
/**
* Creates the update event with the provided form data
*
* @param mixed $formData
* @return PayPalPlanifiedPaymentEvent
*/
protected function getUpdateEvent($formData)
{
if (null === $planifiedPayment = PaypalPlanifiedPaymentQuery::create()->findOneById($formData[PayPalFormFields::FIELD_PP_ID])) {
throw new \InvalidArgumentException(
$this->getTranslator()->trans(
'Invalid planified payment id : %id',
['%id' => $formData[PayPalFormFields::FIELD_PP_ID]],
PayPal::DOMAIN_NAME
)
);
}
$planifiedPayment = $this->fillObjectWithDataForm($planifiedPayment, $formData);
$planifiedPaymentEvent = new PayPalPlanifiedPaymentEvent($planifiedPayment);
return $planifiedPaymentEvent;
}
/**
* @param PaypalPlanifiedPayment $planifiedPayment
* @param $formData
* @return PaypalPlanifiedPayment
*/
protected function fillObjectWithDataForm(PaypalPlanifiedPayment $planifiedPayment, $formData)
{
$planifiedPayment
->setFrequency($formData[PayPalFormFields::FIELD_PP_FREQUENCY])
->setFrequencyInterval($formData[PayPalFormFields::FIELD_PP_FREQUENCY_INTERVAL])
->setCycle($formData[PayPalFormFields::FIELD_PP_CYCLE])
->setMinAmount($formData[PayPalFormFields::FIELD_PP_MIN_AMOUNT])
->setMaxAmount($formData[PayPalFormFields::FIELD_PP_MAX_AMOUNT])
->setLocale($formData[PayPalFormFields::FIELD_PP_LOCALE])
->setTitle($formData[PayPalFormFields::FIELD_PP_TITLE])
->setDescription($formData[PayPalFormFields::FIELD_PP_DESCRIPTION])
;
return $planifiedPayment;
}
/**
* Creates the delete event with the provided form data
* @return PayPalPlanifiedPaymentEvent
*/
protected function getDeleteEvent()
{
return new PayPalPlanifiedPaymentEvent(
$this->getExistingObject()
);
}
/**
* Return true if the event contains the object, e.g. the action has updated the object in the event.
*
* @param PayPalPlanifiedPaymentEvent $event
* @return bool
*/
protected function eventContainsObject($event)
{
return $event->getPayPalPlanifiedPayment() ? true : false;
}
/**
* Get the created object from an event.
* @param PayPalPlanifiedPaymentEvent $event
* @return PaypalPlanifiedPayment
*/
protected function getObjectFromEvent($event)
{
return $event->getPayPalPlanifiedPayment();
}
/**
* Load an existing object from the database
* @return PaypalPlanifiedPayment
*/
protected function getExistingObject()
{
if (null === $planifiedPayment = PaypalPlanifiedPaymentQuery::create()->findOneById((int)$this->getRequest()->get('planifiedPaymentId'))) {
throw new \InvalidArgumentException(
$this->getTranslator()->trans('Invalid planified payment id : %id',
['%id' => (int)$this->getRequest()->get('planifiedPaymentId')], PayPal::DOMAIN_NAME)
);
}
return $planifiedPayment;
}
/**
* Returns the object label form the object event (name, title, etc.)
*
* @param PaypalPlanifiedPayment $object
* @return string
*/
protected function getObjectLabel($object)
{
return $object->getTitle();
}
/**
* Returns the object ID from the object
*
* @param PaypalPlanifiedPayment $object
* @return int
*/
protected function getObjectId($object)
{
return $object->getId();
}
/**
* Render the main list template
*
* @param mixed $currentOrder , if any, null otherwise.
* @return Response
*/
protected function renderListTemplate($currentOrder)
{
$this->getListOrderFromSession('planified_payment', 'order', 'manual');
return $this->render(
'paypal/planified-payment',
[
'order' => $currentOrder,
'selected_menu' => 'planified'
]
);
}
/**
* Render the edition template
* @return Response
*/
protected function renderEditionTemplate()
{
return $this->render('paypal/planified-payment-edit', $this->getEditionArguments());
}
/**
* Must return a RedirectResponse instance
* @return Response
*/
protected function redirectToEditionTemplate()
{
return $this->generateRedirectFromRoute(
'paypal.admin.configuration.planified.update',
[],
$this->getEditionArguments()
);
}
/**
* Must return a RedirectResponse instance
* @return Response
*/
protected function redirectToListTemplate()
{
return $this->generateRedirectFromRoute('paypal.admin.configuration.planified');
}
/**
* @return array
*/
private function getEditionArguments()
{
return [
'planifiedPaymentId' => (int)$this->getRequest()->get('planifiedPaymentId')
];
}
}

View File

@@ -0,0 +1,936 @@
<?php
/*************************************************************************************/
/* */
/* Thelia */
/* */
/* Copyright (c) OpenStudio */
/* email : info@thelia.net */
/* web : http://www.thelia.net */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 3 of the License */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* */
/*************************************************************************************/
namespace PayPal\Controller;
use Front\Controller\OrderController;
use Monolog\Logger;
use PayPal\Api\Details;
use PayPal\Api\PayerInfo;
use PayPal\Event\PayPalCartEvent;
use PayPal\Event\PayPalCustomerEvent;
use PayPal\Event\PayPalEvents;
use PayPal\Event\PayPalOrderEvent;
use PayPal\Exception\PayPalConnectionException;
use PayPal\Model\PaypalCart;
use PayPal\Model\PaypalCartQuery;
use PayPal\Model\PaypalCustomer;
use PayPal\Model\PaypalCustomerQuery;
use PayPal\Model\PaypalOrder;
use PayPal\Model\PaypalOrderQuery;
use PayPal\PayPal;
use PayPal\Service\PayPalAgreementService;
use PayPal\Service\PayPalCustomerService;
use PayPal\Service\PayPalLoggerService;
use PayPal\Service\PayPalPaymentService;
use Propel\Runtime\Propel;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Router;
use Thelia\Core\Event\Address\AddressCreateOrUpdateEvent;
use Thelia\Core\Event\Customer\CustomerCreateOrUpdateEvent;
use Thelia\Core\Event\Customer\CustomerLoginEvent;
use Thelia\Core\Event\Delivery\DeliveryPostageEvent;
use Thelia\Core\Event\Order\OrderEvent;
use Thelia\Core\Event\Order\OrderManualEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Core\Translation\Translator;
use Thelia\Model\AddressQuery;
use Thelia\Model\CartQuery;
use Thelia\Model\Country;
use Thelia\Model\CountryQuery;
use Thelia\Model\CustomerQuery;
use Thelia\Model\CustomerTitleQuery;
use Thelia\Model\ModuleQuery;
use Thelia\Model\Order;
use Thelia\Model\OrderQuery;
use Thelia\Model\OrderStatusQuery;
use Thelia\Module\Exception\DeliveryException;
use Thelia\Tools\URL;
/**
* Class PayPalResponseController
* @package PayPal\Controller
*/
class PayPalResponseController extends OrderController
{
/**
* @param $orderId
*/
public function cancelAction($orderId)
{
if (null !== $order = OrderQuery::create()->findOneById($orderId)) {
$event = new OrderEvent($order);
$event->setStatus(OrderStatusQuery::getCancelledStatus()->getId());
$this->dispatch(TheliaEvents::ORDER_UPDATE_STATUS, $event);
}
}
/**
* @param $orderId
* @return RedirectResponse
*/
public function okAction($orderId)
{
$con = Propel::getConnection();
$con->beginTransaction();
try {
$payerId = $this->getRequest()->query->get('PayerID');
$token = $this->getRequest()->query->get('token');
$payPalOrder = PaypalOrderQuery::create()->findOneById($orderId);
if (null !== $payPalOrder && null !== $payerId) {
$response = $this->executePayment($payPalOrder, $payPalOrder->getPaymentId(), $payerId, $token);
} else {
$con->rollBack();
$message = Translator::getInstance()->trans(
'Method okAction => One of this parameter is invalid : $payerId = %payer_id, $orderId = %order_id',
[
'%payer_id' => $payerId,
'%order_id' => $orderId
],
PayPal::DOMAIN_NAME
);
PayPalLoggerService::log(
$message,
[
'order_id' => $orderId
],
Logger::CRITICAL
);
$response = $this->getPaymentFailurePageUrl($orderId, $message);
}
} catch (PayPalConnectionException $e) {
$message = sprintf('url : %s. data : %s. message : %s', $e->getUrl(), $e->getData(), $e->getMessage());
PayPalLoggerService::log(
$message,
[
'order_id' => $orderId
],
Logger::CRITICAL
);
$response = $this->getPaymentFailurePageUrl($orderId, $e->getMessage());
} catch (\Exception $e) {
PayPalLoggerService::log(
$e->getMessage(),
[
'order_id' => $orderId
],
Logger::CRITICAL
);
$response = $this->getPaymentFailurePageUrl($orderId, $e->getMessage());
}
$con->commit();
return $response;
}
/**
* @param string $routeId
* @return RedirectResponse
*/
public function expressCheckoutAction($routeId = 'cart.view', $fromCartView = true)
{
$session = $this->getRequest()->getSession();
$cart = $session->getSessionCart($this->getDispatcher());
if (null !== $cart) {
/** @var PayPalPaymentService $payPalService */
$payPalService = $this->getContainer()->get(PayPal::PAYPAL_PAYMENT_SERVICE_ID);
$payment = $payPalService->makePaymentFromCart(
$cart,
null,
false,
$fromCartView
);
$response = new RedirectResponse($payment->getApprovalLink());
return $response;
}
return $this->getUrlFromRouteId('cart.view');
}
public function invoiceExpressCheckoutAction()
{
return $this->expressCheckoutAction('order.invoice', false);
}
/**
* @param int $cartId
* @return RedirectResponse
* @throws PayPalConnectionException
* @throws \Exception
*/
public function invoiceExpressCheckoutOkAction($cartId)
{
$con = Propel::getConnection();
$con->beginTransaction();
try {
$this->fillCartWithExpressCheckout();
$response = $this->executeExpressCheckoutAction(false);
} catch (PayPalConnectionException $e) {
$con->rollBack();
$message = sprintf('url : %s. data : %s. message : %s', $e->getUrl(), $e->getData(), $e->getMessage());
$customerId = null;
if (isset($customer)) {
$customerId = $customer->getId();
}
PayPalLoggerService::log(
$message,
[
'customer_id' => $customerId
],
Logger::CRITICAL
);
throw $e;
} catch(\Exception $e) {
$con->rollBack();
$customerId = null;
if (isset($customer)) {
$customerId = $customer->getId();
}
PayPalLoggerService::log(
$e->getMessage(),
[
'customer_id' => $customerId
],
Logger::CRITICAL
);
throw $e;
}
$con->commit();
return $response;
}
public function invoiceExpressCheckoutKoAction($cartId)
{
return $this->getUrlFromRouteId('order.invoice');
}
/**
* @return RedirectResponse
* @throws PayPalConnectionException
* @throws \Exception
*/
public function expressCheckoutOkAction()
{
$con = Propel::getConnection();
$con->beginTransaction();
try {
$this->fillCartWithExpressCheckout();
$response = $this->getUrlFromRouteId('order.delivery');
} catch (PayPalConnectionException $e) {
$con->rollBack();
$message = sprintf('url : %s. data : %s. message : %s', $e->getUrl(), $e->getData(), $e->getMessage());
$customerId = null;
if (isset($customer)) {
$customerId = $customer->getId();
}
PayPalLoggerService::log(
$message,
[
'customer_id' => $customerId
],
Logger::CRITICAL
);
throw $e;
} catch(\Exception $e) {
$con->rollBack();
$customerId = null;
if (isset($customer)) {
$customerId = $customer->getId();
}
PayPalLoggerService::log(
$e->getMessage(),
[
'customer_id' => $customerId
],
Logger::CRITICAL
);
throw $e;
}
$con->commit();
return $response;
}
/**
* @return RedirectResponse|\Symfony\Component\HttpFoundation\Response
*/
public function executeExpressCheckoutAction($fromCartView = true)
{
if (null === $responseParent = parent::deliver()) {
if ($fromCartView) {
return $responseParent;
}
}
$con = Propel::getConnection();
$con->beginTransaction();
try {
$session = $this->getRequest()->getSession();
$cart = $session->getSessionCart($this->getDispatcher());
if (null === $payPalCart = PaypalCartQuery::create()->findOneById($cart->getId())) {
$con->rollBack();
return $responseParent;
}
if (null === $payPalCart->getExpressPaymentId() || null === $payPalCart->getExpressPayerId() || null === $payPalCart->getExpressToken()) {
$con->rollBack();
return $responseParent;
}
/** @var PayPalPaymentService $payPalPaymentService */
$payPalPaymentService = $this->container->get(PayPal::PAYPAL_PAYMENT_SERVICE_ID);
$payment = $payPalPaymentService->getPaymentDetails($payPalCart->getExpressPaymentId());
$payerInfo = $payment->getPayer()->getPayerInfo();
//Check if invoice adresse already exist
if (null === $payerInfo->getBillingAddress()) {
$line1 = $payerInfo->getShippingAddress()->getLine1();
$zipCode = $payerInfo->getShippingAddress()->getPostalCode();
} else {
$line1 = $payerInfo->getBillingAddress()->getLine1();
$zipCode = $payerInfo->getBillingAddress()->getPostalCode();
}
/** @var \Thelia\Model\Address $invoiceAddress */
if (null === $invoiceAddress = AddressQuery::create()
->filterByCustomerId($cart->getCustomerId())
->filterByIsDefault(0)
->filterByAddress1($line1)
->filterByZipcode($zipCode)
->findOne()) {
$event = $this->createAddressEvent($payerInfo);
$event->setCustomer($cart->getCustomer());
$this->dispatch(TheliaEvents::ADDRESS_CREATE, $event);
$invoiceAddress = $event->getAddress();
}
if (null === $payPalCustomer = PaypalCustomerQuery::create()->findOneById($cart->getCustomerId())) {
$payPalCustomer = new PaypalCustomer();
$payPalCustomer->setId($cart->getCustomerId());
}
$payPalCustomer
->setPaypalUserId($payerInfo->getPayerId())
->setName($payerInfo->getFirstName())
->setGivenName($payerInfo->getFirstName() . ' ' . $payerInfo->getLastName())
->setFamilyName($payerInfo->getLastName())
->setMiddleName($payerInfo->getMiddleName())
->setBirthday($payerInfo->getBirthDate())
->setLocale($this->getRequest()->getSession()->getLang()->getLocale())
->setPhoneNumber($payerInfo->getPhone())
->setPayerId($payerInfo->getPayerId())
->setPostalCode($payerInfo->getShippingAddress()->getPostalCode())
->setCountry($payerInfo->getShippingAddress()->getCountryCode())
->setStreetAddress($payerInfo->getShippingAddress()->getLine1() . $payerInfo->getShippingAddress()->getLine2())
;
$payPalCustomerEvent = new PayPalCustomerEvent($payPalCustomer);
$this->dispatch(PayPalEvents::PAYPAL_CUSTOMER_UPDATE, $payPalCustomerEvent);
/** @var \Thelia\Model\Address $deliveryAddress */
$deliveryAddress = $cart->getCustomer()->getDefaultAddress();
/** @var \Thelia\Model\Module $deliveryModule */
$deliveryModule = ModuleQuery::create()->filterByActivate(1)->findOne();
/** @var \Thelia\Model\Module $paymentModule */
$paymentModule = ModuleQuery::create()->findPk(PayPal::getModuleId());
/** @var \Thelia\Model\Currency $currency */
$currency = $cart->getCurrency();
$lang = $this->getRequest()->getSession()->getLang();
$order = new Order();
$order
->setCustomerId($cart->getCustomerId())
->setCurrencyId($currency->getId())
->setCurrencyRate($currency->getRate())
->setStatusId(OrderStatusQuery::getNotPaidStatus()->getId())
->setLangId($lang->getDefaultLanguage()->getId())
->setChoosenDeliveryAddress($deliveryAddress)
->setChoosenInvoiceAddress($invoiceAddress)
;
$orderEvent = new OrderEvent($order);
/* get postage amount */
$moduleInstance = $deliveryModule->getDeliveryModuleInstance($this->container);
$deliveryPostageEvent = new DeliveryPostageEvent($moduleInstance, $cart, $deliveryAddress);
$this->getDispatcher()->dispatch(
TheliaEvents::MODULE_DELIVERY_GET_POSTAGE,
$deliveryPostageEvent
);
if (!$deliveryPostageEvent->isValidModule() || null === $deliveryPostageEvent->getPostage()) {
throw new DeliveryException(
$this->getTranslator()->trans('The delivery module is not valid.', [], PayPal::DOMAIN_NAME)
);
}
$postage = $deliveryPostageEvent->getPostage();
$orderEvent->setPostage($postage->getAmount());
$orderEvent->setPostageTax($postage->getAmountTax());
$orderEvent->setPostageTaxRuleTitle($postage->getTaxRuleTitle());
$orderEvent->setDeliveryAddress($deliveryAddress->getId());
$orderEvent->setInvoiceAddress($invoiceAddress->getId());
$orderEvent->setDeliveryModule($deliveryModule->getId());
$orderEvent->setPaymentModule($paymentModule->getId());
$this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_DELIVERY_ADDRESS, $orderEvent);
$this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_INVOICE_ADDRESS, $orderEvent);
$this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_POSTAGE, $orderEvent);
$this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_DELIVERY_MODULE, $orderEvent);
$this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_PAYMENT_MODULE, $orderEvent);
$orderManualEvent = new OrderManualEvent(
$orderEvent->getOrder(),
$orderEvent->getOrder()->getCurrency(),
$orderEvent->getOrder()->getLang(),
$cart,
$cart->getCustomer()
);
$this->getDispatcher()->dispatch(TheliaEvents::ORDER_CREATE_MANUAL, $orderManualEvent);
$order = $orderManualEvent->getPlacedOrder();
$payPalOrderEvent = $payPalPaymentService->generatePayPalOrder($order);
$payPalPaymentService->updatePayPalOrder($payPalOrderEvent->getPayPalOrder(), $payment->getState(), $payment->getId());
$response = $this->executePayment(
$payPalOrderEvent->getPayPalOrder(),
$payPalCart->getExpressPaymentId(),
$payPalCart->getExpressPayerId(),
$payPalCart->getExpressToken(),
PayPal::PAYPAL_METHOD_EXPRESS_CHECKOUT,
$payPalPaymentService->createDetails(
$order->getPostage(),
$order->getPostageTax(),
$order->getTotalAmount($tax, false)
)
);
$con->commit();
} catch (PayPalConnectionException $e) {
$con->rollBack();
$message = sprintf('url : %s. data : %s. message : %s', $e->getUrl(), $e->getData(), $e->getMessage());
$customerId = null;
if (isset($customer)) {
$customerId = $customer->getId();
}
PayPalLoggerService::log(
$message,
[
'customer_id' => $customerId
],
Logger::CRITICAL
);
$response = $responseParent;
} catch(\Exception $e) {
$con->rollBack();
$customerId = null;
if (isset($customer)) {
$customerId = $customer->getId();
}
PayPalLoggerService::log(
$e->getMessage(),
[
'customer_id' => $customerId
],
Logger::CRITICAL
);
$response = $responseParent;
}
$con->commit();
return $response;
}
/**
*
*/
public function expressCheckoutKoAction()
{
PayPalLoggerService::log(
Translator::getInstance()->trans('Express Checkout login failed', [], PayPal::DOMAIN_NAME),
[],
Logger::WARNING
);
return $this->getUrlFromRouteId('cart.view');
}
/**
* Method called when a customer log in with PayPal.
* @return RedirectResponse
* @throws \Exception
*/
public function loginOkAction()
{
if (null !== $authorizationCode = $this->getRequest()->query->get('code')) {
/** @var PayPalCustomerService $payPalCustomerService */
$payPalCustomerService = $this->container->get(PayPal::PAYPAL_CUSTOMER_SERVICE_ID);
$openIdUserinfo = $payPalCustomerService->getUserInfoWithAuthorizationCode($authorizationCode);
$payPalCustomer = $payPalCustomerService->getCurrentPayPalCustomer();
$payPalCustomer
->setPaypalUserId($openIdUserinfo->getUserId())
->setName($openIdUserinfo->getName())
->setGivenName($openIdUserinfo->getGivenName())
->setFamilyName($openIdUserinfo->getFamilyName())
->setMiddleName($openIdUserinfo->getMiddleName())
->setPicture($openIdUserinfo->getPicture())
->setEmailVerified($openIdUserinfo->getEmailVerified())
->setGender($openIdUserinfo->getGender())
->setBirthday($openIdUserinfo->getBirthday())
->setZoneinfo($openIdUserinfo->getZoneinfo())
->setLocale($openIdUserinfo->getLocale())
->setLanguage($openIdUserinfo->getLanguage())
->setVerified($openIdUserinfo->getVerified())
->setPhoneNumber($openIdUserinfo->getPhoneNumber())
->setVerifiedAccount($openIdUserinfo->getVerifiedAccount())
->setAccountType($openIdUserinfo->getAccountType())
->setAgeRange($openIdUserinfo->getAgeRange())
->setPayerId($openIdUserinfo->getPayerId())
->setPostalCode($openIdUserinfo->getAddress()->getPostalCode())
->setLocality($openIdUserinfo->getAddress()->getLocality())
->setRegion($openIdUserinfo->getAddress()->getRegion())
->setCountry($openIdUserinfo->getAddress()->getCountry())
->setStreetAddress($openIdUserinfo->getAddress()->getStreetAddress())
;
$payPalCustomerEvent = new PayPalCustomerEvent($payPalCustomer);
$this->dispatch(PayPalEvents::PAYPAL_CUSTOMER_UPDATE, $payPalCustomerEvent);
$this->dispatch(TheliaEvents::CUSTOMER_LOGIN, new CustomerLoginEvent($payPalCustomerEvent->getPayPalCustomer()->getCustomer()));
}
return new RedirectResponse(URL::getInstance()->absoluteUrl($this->getSession()->getReturnToUrl()));
}
/**
* @param $orderId
* @return RedirectResponse
*/
public function agreementOkAction($orderId)
{
$con = Propel::getConnection();
$con->beginTransaction();
$token = $this->getRequest()->query->get('token');
$payPalOrder = PaypalOrderQuery::create()->findOneById($orderId);
if (null !== $payPalOrder && null !== $token) {
try {
/** @var PayPalAgreementService $payPalAgreementService */
$payPalAgreementService = $this->container->get(PayPal::PAYPAL_AGREEMENT_SERVICE_ID);
$agreement = $payPalAgreementService->activateBillingAgreementByToken($token);
$payPalOrder
->setState($agreement->getState())
->setAgreementId($agreement->getId())
->setPayerId($agreement->getPayer()->getPayerInfo()->getPayerId())
->setToken($token)
;
$payPalOrderEvent = new PayPalOrderEvent($payPalOrder);
$this->dispatch(PayPalEvents::PAYPAL_ORDER_UPDATE, $payPalOrderEvent);
$event = new OrderEvent($payPalOrder->getOrder());
$event->setStatus(OrderStatusQuery::getPaidStatus()->getId());
$this->dispatch(TheliaEvents::ORDER_UPDATE_STATUS, $event);
$response = $this->getPaymentSuccessPageUrl($orderId);
PayPalLoggerService::log(
Translator::getInstance()->trans(
'Order payed with success in PayPal with method : %method',
[
'%method' => PayPal::PAYPAL_METHOD_PLANIFIED_PAYMENT
],
PayPal::DOMAIN_NAME
),
[
'order_id' => $payPalOrder->getId(),
'customer_id' => $payPalOrder->getOrder()->getCustomerId()
],
Logger::INFO
);
} catch (PayPalConnectionException $e) {
$con->rollBack();
$message = sprintf('url : %s. data : %s. message : %s', $e->getUrl(), $e->getData(), $e->getMessage());
PayPalLoggerService::log(
$message,
[
'customer_id' => $orderId
],
Logger::CRITICAL
);
$response = $this->getPaymentFailurePageUrl($orderId, $e->getMessage());
} catch (\Exception $e) {
$con->rollBack();
PayPalLoggerService::log(
$e->getMessage(),
[
'order_id' => $orderId
],
Logger::CRITICAL
);
$response = $this->getPaymentFailurePageUrl($orderId, $e->getMessage());
}
} else {
$con->rollBack();
$message = Translator::getInstance()->trans(
'Method agreementOkAction => One of this parameter is invalid : $token = %token, $orderId = %order_id',
[
'%token' => $token,
'%order_id' => $orderId
],
PayPal::DOMAIN_NAME
);
PayPalLoggerService::log(
$message,
[
'order_id' => $orderId
],
Logger::CRITICAL
);
$response = $this->getPaymentFailurePageUrl($orderId, $message);
}
$con->commit();
return $response;
}
/**
* @param $orderId
*/
public function ipnAction($orderId)
{
PayPalLoggerService::log('GUIGIT', ['hook' => 'guigit', 'order_id' => $orderId], Logger::DEBUG);
PayPalLoggerService::log(
print_r($this->getRequest()->request, true),
[
'hook' => 'guigit',
'order_id' => $orderId
],
Logger::DEBUG
);
PayPalLoggerService::log(
print_r($this->getRequest()->attributes, true),
[
'hook' => 'guigit',
'order_id' => $orderId
],
Logger::DEBUG
);
}
/**
* Return the order payment success page URL
*
* @param $orderId
* @return RedirectResponse
*/
public function getPaymentSuccessPageUrl($orderId)
{
return $this->getUrlFromRouteId('order.placed', ['order_id' => $orderId]);
}
/**
* @throws \Exception
* @throws \Propel\Runtime\Exception\PropelException
*/
protected function fillCartWithExpressCheckout()
{
$paymentId = $this->getRequest()->get('paymentId');
$token = $this->getRequest()->get('token');
$payerId = $this->getRequest()->get('PayerID');
$cartId = $this->getRequest()->get('cartId');
$cart = CartQuery::create()->findOneById($this->getRequest()->get('cartId'));
if (null === $paymentId || null === $token || null === $payerId || null === $cart) {
PayPalLoggerService::log(
Translator::getInstance()->trans('Express checkout failed in expressCheckoutOkAction() function', [], PayPal::DOMAIN_NAME),
[],
Logger::CRITICAL
);
}
PayPalLoggerService::log(
Translator::getInstance()->trans('Express checkout begin with cart %id', ['%id' => $cartId], PayPal::DOMAIN_NAME)
);
/** @var PayPalPaymentService $payPalPaymentService */
$payPalPaymentService = $this->container->get(PayPal::PAYPAL_PAYMENT_SERVICE_ID);
$payment = $payPalPaymentService->getPaymentDetails($paymentId);
$payerInfo = $payment->getPayer()->getPayerInfo();
if (null === $customer = CustomerQuery::create()->findOneByEmail($payment->getPayer()->getPayerInfo()->getEmail())) {
$customerCreateEvent = $this->createEventInstance($payerInfo);
$this->dispatch(TheliaEvents::CUSTOMER_CREATEACCOUNT, $customerCreateEvent);
$customer = $customerCreateEvent->getCustomer();
}
//Save informations to use them after customer has choosen the delivery method
if (null === $payPalCart = PaypalCartQuery::create()->findOneById($cartId)) {
$payPalCart = new PaypalCart();
$payPalCart->setId($cartId);
}
$payPalCart
->setExpressPaymentId($paymentId)
->setExpressPayerId($payerId)
->setExpressToken($token)
;
$payPalCartEvent = new PayPalCartEvent($payPalCart);
$this->getDispatcher()->dispatch(PayPalEvents::PAYPAL_CART_UPDATE, $payPalCartEvent);
$cart->setCustomerId($customer->getId())->save();
$clonedCart = clone $cart;
$this->dispatch(TheliaEvents::CUSTOMER_LOGIN, new CustomerLoginEvent($customer));
//In case of the current customer has changed, re affect the correct cart and customer session
$this->getSecurityContext()->setCustomerUser($customer);
$clonedCart->save();
$this->getRequest()->getSession()->set("thelia.cart_id", $clonedCart->getId());
}
/**
* @param $routeId
* @param array $params
* @return RedirectResponse
*/
protected function getUrlFromRouteId($routeId, $params = [])
{
$frontOfficeRouter = $this->getContainer()->get('router.front');
return new RedirectResponse(
URL::getInstance()->absoluteUrl(
$frontOfficeRouter->generate(
$routeId,
$params,
Router::ABSOLUTE_URL
)
)
);
}
/**
* Redirect the customer to the failure payment page. if $message is null, a generic message is displayed.
*
* @param $orderId
* @param $message
* @return RedirectResponse
*/
public function getPaymentFailurePageUrl($orderId, $message)
{
$frontOfficeRouter = $this->getContainer()->get('router.front');
return new RedirectResponse(
URL::getInstance()->absoluteUrl(
$frontOfficeRouter->generate(
"order.failed",
array(
"order_id" => $orderId,
"message" => $message
),
Router::ABSOLUTE_URL
)
)
);
}
/**
* @param PaypalOrder $payPalOrder
* @param $paymentId
* @param $payerId
* @param $token
* @param string $method
* @param Details|null $details
* @return RedirectResponse
*/
protected function executePayment(PaypalOrder $payPalOrder, $paymentId, $payerId, $token, $method = PayPal::PAYPAL_METHOD_PAYPAL, Details $details = null)
{
/** @var PayPalPaymentService $payPalService */
$payPalService = $this->getContainer()->get(PayPal::PAYPAL_PAYMENT_SERVICE_ID);
$payment = $payPalService->executePayment($paymentId, $payerId, $details);
$payPalOrder
->setState($payment->getState())
->setPayerId($payerId)
->setToken($token)
;
$payPalOrderEvent = new PayPalOrderEvent($payPalOrder);
$this->dispatch(PayPalEvents::PAYPAL_ORDER_UPDATE, $payPalOrderEvent);
$event = new OrderEvent($payPalOrder->getOrder());
$event->setStatus(OrderStatusQuery::getPaidStatus()->getId());
$this->dispatch(TheliaEvents::ORDER_UPDATE_STATUS, $event);
$response = $this->getPaymentSuccessPageUrl($payPalOrder->getId());
PayPalLoggerService::log(
Translator::getInstance()->trans(
'Order payed with success in PayPal with method : %method',
[
'%method' => $method
],
PayPal::DOMAIN_NAME
),
[
'order_id' => $payPalOrder->getId(),
'customer_id' => $payPalOrder->getOrder()->getCustomerId()
],
Logger::INFO
);
return $response;
}
/**
* @param PayerInfo $payerInfo
* @return \Thelia\Core\Event\Customer\CustomerCreateOrUpdateEvent
*/
protected function createEventInstance(PayerInfo $payerInfo)
{
if (null === $country = CountryQuery::create()->findOneByIsoalpha2($payerInfo->getShippingAddress()->getCountryCode())) {
$country = Country::getDefaultCountry();
}
$customerCreateEvent = new CustomerCreateOrUpdateEvent(
CustomerTitleQuery::create()->findOne()->getId(),
$payerInfo->getFirstName(),
$payerInfo->getLastName(),
$payerInfo->getShippingAddress()->getLine1(),
$payerInfo->getShippingAddress()->getLine2(),
null,
$payerInfo->getPhone(),
null,
$payerInfo->getShippingAddress()->getPostalCode(),
$payerInfo->getShippingAddress()->getCity(),
$country->getId(),
$payerInfo->getEmail(),
'random',
$this->getRequest()->getSession()->getLang()->getId(),
null,
null,
null,
null,
null,
null
);
return $customerCreateEvent;
}
/**
* @param PayerInfo $payerInfo
* @return AddressCreateOrUpdateEvent
*/
protected function createAddressEvent(PayerInfo $payerInfo)
{
if (null !== $payerInfo->getBillingAddress()) {
$countryCode = $payerInfo->getBillingAddress()->getCountryCode();
$line1 = $payerInfo->getBillingAddress()->getLine1();
$line2 = $payerInfo->getBillingAddress()->getLine2();
$zipCode = $payerInfo->getBillingAddress()->getPostalCode();
$city = $payerInfo->getBillingAddress()->getCity();
} else {
$countryCode = $payerInfo->getShippingAddress()->getCountryCode();
$line1 = $payerInfo->getShippingAddress()->getLine1();
$line2 = $payerInfo->getShippingAddress()->getLine2();
$zipCode = $payerInfo->getShippingAddress()->getPostalCode();
$city = $payerInfo->getShippingAddress()->getCity();
}
if (null === $country = CountryQuery::create()->findOneByIsoalpha2($countryCode)) {
$country = Country::getDefaultCountry();
}
return new AddressCreateOrUpdateEvent(
'Express checkout PayPal',
CustomerTitleQuery::create()->findOne()->getId(),
$payerInfo->getFirstName(),
$payerInfo->getLastName(),
$line1,
($line2)?$line2:'',
'',
$zipCode,
$city,
$country->getId(),
$payerInfo->getPhone(),
$payerInfo->getPhone(),
'',
0,
null
);
}
}

View File

@@ -0,0 +1,336 @@
<?php
/*************************************************************************************/
/* */
/* Thelia */
/* */
/* Copyright (c) OpenStudio */
/* email : info@thelia.net */
/* web : http://www.thelia.net */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 3 of the License */
/* */
/* This program is distributed in the hope that it will be useful, */
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
/* GNU General Public License for more details. */
/* */
/* You should have received a copy of the GNU General Public License */
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* */
/*************************************************************************************/
namespace PayPal\Controller;
use Monolog\Logger;
use PayPal\Event\PayPalEvents;
use PayPal\Event\PayPalOrderEvent;
use PayPal\Exception\PayPalConnectionException;
use PayPal\Model\PaypalOrderQuery;
use PayPal\Model\PaypalPlanQuery;
use PayPal\PayPal;
use PayPal\Service\PayPalAgreementService;
use PayPal\Service\PayPalLoggerService;
use Propel\Runtime\Propel;
use Thelia\Controller\Front\BaseFrontController;
use Thelia\Core\Event\Order\OrderEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Core\HttpFoundation\Request;
use Thelia\Core\Translation\Translator;
use Thelia\Model\OrderStatusQuery;
/**
* Class PayPalWebHookController
* @package PayPal\Controller
*/
class PayPalWebHookController extends BaseFrontController
{
const HOOK_BILLING_PLAN_CREATED = 'BILLING.PLAN.CREATED';
const HOOK_BILLING_PLAN_UPDATED = 'BILLING.PLAN.UPDATED';
const HOOK_BILLING_SUBSCRIPTION_CREATED = 'BILLING.SUBSCRIPTION.CREATED';
const HOOK_PAYMENT_SALE_COMPLETED = 'PAYMENT.SALE.COMPLETED';
const HOOK_PAYMENT_SALE_DENIED = 'PAYMENT.SALE.DENIED';
//Classic PayPal payment
const RESOURCE_TYPE_SALE = 'sale';
//Planified payment
const RESOURCE_TYPE_PLAN = 'plan';
const RESOURCE_TYPE_AGREEMENT = 'agreement';
/**
* Example of array received in posted params :
*
*
* Array (
* 'id' => 'WH-0LU96374794024348-4WG31854RU4949452',
* 'event_version' => 1.0,
* 'create_time' => '2017-02-03T15:31:29Z',
* 'resource_type' => 'plan',
* 'event_type' => 'BILLING.PLAN.CREATED',
* 'summary' => 'A billing plan was created',
* 'resource' => Array (
* 'merchant_preferences' => Array (
* 'setup_fee' => Array (
* 'currency' => 'EUR',
* 'value' => 0
* ),
* 'return_url' => 'http://25b3ee89.ngrok.io/thelia_2_3_3/web/module/paypal/agreement/ok/208',
* 'cancel_url' => 'http://25b3ee89.ngrok.io/thelia_2_3_3/web/module/paypal/agreement/ko/208',
* 'auto_bill_amount' => 'NO',
* 'initial_fail_amount_action' => 'CONTINUE',
* 'max_fail_attempts' => 0
* ),
* 'update_time' => '2017-02-03T15:31:29.348Z',
* 'create_time' => '2017-02-03T15:31:29.348Z',
* 'name' => 'plan for order 208',
* 'description' => false,
* 'links' => Array (
* 0 => Array (
* 'href' => 'api.sandbox.paypal.com/v1/payments/billing-plans/P-2DV20774VJ3968037ASNA3RA',
* 'rel' => 'self',
* 'method' => 'GET'
* )
* ),
* 'payment_definitions' => Array (
* 0 => Array (
* 'name' => 'payment definition for order 208',
* 'type' => 'REGULAR',
* 'frequency' => 'Day',
* 'frequency_interval' => 1,
* 'amount' => Array (
* 'currency' => 'EUR',
* 'value' => 3.9
* ),
* 'cycles' => 5,
* 'charge_models' => Array (
* 0 => Array (
* 'type' => 'SHIPPING',
* 'amount' => Array (
* 'currency' => 'EUR',
* 'value' => 0
* ),
* 'id' => 'CHM-26B03456D8799461GASNA3RA'
* )
* ),
* 'id' => 'PD-3FB00313143031422ASNA3RA'
* )
* ),
* 'id' => 'P-2DV20774VJ3968037ASNA3RA',
* 'state' => 'CREATED',
* 'type' => 'FIXED'
* ),
* 'links' => Array (
* 0 => Array (
* 'href' => 'https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-0LU96374794024348-4WG31854RU4949452',
* 'rel' => 'self',
* 'method' => 'GET'
* ),
* 1 => Array (
* 'href' => 'https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-0LU96374794024348-4WG31854RU4949452/resend',
* 'rel' => 'resend',
* 'method' => 'POST'
* )
* )
* );
*/
public function allAction()
{
$eventType = $this->getRequest()->request->get('event_type');
$resource = $this->getRequest()->request->get('resource');
$resourceType = $this->getRequest()->request->get('resource_type');
$details = [
'request' => $this->getRequest()->request->all()
];
$params = [
'hook' => $eventType
];
$con = Propel::getConnection();
$con->beginTransaction();
try {
$title = $this->getTitle($this->getRequest());
if (is_array($resource)) {
switch (strtolower($resourceType)) {
case self::RESOURCE_TYPE_SALE:
if (isset($resource['parent_payment'])) {
$params = $this->getParamsForSale($resource['parent_payment'], $params, $eventType);
}
if (isset($resource['billing_agreement_id'])) {
$params = $this->getParamsForAgreement($resource['billing_agreement_id'], $params);
}
break;
case self::RESOURCE_TYPE_PLAN:
if (isset($resource['id'])) {
$params = $this->getParamsForPlan($resource['id'], $params);
}
break;
case self::RESOURCE_TYPE_AGREEMENT:
if (isset($resource['id'])) {
$params = $this->getParamsForAgreement($resource['id'], $params);
}
break;
default:
break;
}
}
PayPalLoggerService::log(
'<h3>' . $title . '</h3>' . $this->printRecursiveData($details),
$params,
Logger::INFO
);
$con->commit();
} catch (PayPalConnectionException $e) {
$con->rollBack();
$message = sprintf('url : %s. data : %s. message : %s', $e->getUrl(), $e->getData(), $e->getMessage());
PayPalLoggerService::log($message, $params, Logger::CRITICAL);
PayPalLoggerService::log($this->printRecursiveData($this->getRequest()->request), $params, Logger::CRITICAL);
} catch (\Exception $e) {
$con->rollBack();
PayPalLoggerService::log($e->getMessage(), $params, Logger::CRITICAL);
PayPalLoggerService::log($this->printRecursiveData($this->getRequest()->request), $params, Logger::CRITICAL);
}
}
/**
* @param Request $request
* @return string
*/
protected function getTitle(Request $request)
{
$summary = $request->request->get('summary');
$title = '';
if (null !== $request->get('event_type')) {
$title .= $request->get('event_type') . ' : ';
}
$title .= $summary;
return $title;
}
/**
* @param null $paymentId
* @param array $params
* @param null $eventType
* @return array
*/
protected function getParamsForSale($paymentId = null, $params = [], $eventType = null)
{
if (null !== $payPalOrder = PaypalOrderQuery::create()->findOneByPaymentId($paymentId)) {
$params['order_id'] = $payPalOrder->getId();
$params['customer_id'] = $payPalOrder->getOrder()->getCustomerId();
if ($eventType === self::HOOK_PAYMENT_SALE_DENIED) {
$event = new OrderEvent($payPalOrder->getOrder());
$event->setStatus(OrderStatusQuery::getCancelledStatus()->getId());
$this->dispatch(TheliaEvents::ORDER_UPDATE_STATUS, $event);
}
}
return $params;
}
/**
* @param null $planId
* @param array $params
* @return array
*/
protected function getParamsForPlan($planId = null, $params = [])
{
if (null !== $payPalPlan = PaypalPlanQuery::create()->findOneByPlanId($planId)) {
$params['order_id'] = $payPalPlan->getPaypalOrderId();
$params['customer_id'] = $payPalPlan->getPaypalOrder()->getOrder()->getCustomerId();
}
return $params;
}
/**
* @param null $agreementId
* @param array $params
* @return array
*/
protected function getParamsForAgreement($agreementId = null, $params = [])
{
if (null !== $payPalOrder = PaypalOrderQuery::create()->filterByAgreementId($agreementId)->orderById()->findOne()) {
// Do not duplicate order for the first PayPal payment because order has just been created.
// We will duplicate this order for the next PayPal payment :)
if ($payPalOrder->getPlanifiedActualCycle() > 0) {
$params['order_id'] = $payPalOrder->getId();
$params['customer_id'] = $payPalOrder->getOrder()->getCustomerId();
/** @var PayPalAgreementService $payPalAgreementService */
$payPalAgreementService = $this->container->get(PayPal::PAYPAL_AGREEMENT_SERVICE_ID);
$newOrder = $payPalAgreementService->duplicateOrder($payPalOrder->getOrder());
Translator::getInstance()->trans(
'New recursive invoice from order %id',
['%id' => $payPalOrder->getId()],
PayPal::DOMAIN_NAME
);
PayPalLoggerService::log(
'<h3>New recursive invoice from order ' . $payPalOrder->getId() . '</h3>',
[
'order_id' => $newOrder->getId(),
'customer_id' => $payPalOrder->getOrder()->getCustomerId()
],
Logger::INFO
);
}
$payPalOrder->setPlanifiedActualCycle($payPalOrder->getPlanifiedActualCycle() + 1);
$payPalOrderEvent = new PayPalOrderEvent($payPalOrder);
$this->getDispatcher()->dispatch(PayPalEvents::PAYPAL_ORDER_UPDATE, $payPalOrderEvent);
}
return $params;
}
/**
* @param array $data
* @param int $deep
* @return string
*/
protected function printRecursiveData($data = [], $deep = 0)
{
$formatedString = '';
foreach ($data as $key => $value) {
for ($i = 0; $i <= $deep; $i++) {
$formatedString .= '&nbsp;&nbsp;&nbsp;&nbsp;';
}
if (is_array($value)) {
$formatedString .= '<strong>' . $key . '&nbsp;:&nbsp;</strong><br />' . $this->printRecursiveData($value, $deep + 1);
} else {
$formatedString .= '<strong>' . $key . '&nbsp;:&nbsp;</strong>' . $value . '<br />';
}
}
return $formatedString;
}
}