diff --git a/config/common.yml b/config/common.yml index d1f5fd08b..1a68ddae2 100644 --- a/config/common.yml +++ b/config/common.yml @@ -372,8 +372,12 @@ services: class: 'PrestaShop\Module\PrestashopCheckout\PayPal\Order\PayPalOrderSummaryViewBuilder' public: true arguments: - - '@ps_checkout.translations.translations' - - '@ps_checkout.funding_source.translation' + - '@ps_checkout.repository.pscheckoutcart' + - '@ps_checkout.paypal.provider.order' + - '@ps_checkout.prestashop.router' + - '@ps_checkout.paypal.order.translations' + - '@ps_checkout.context.shop' + ps_checkout.paypal.builder.view_order_summary: class: 'PrestaShop\Module\PrestashopCheckout\PayPal\Order\PayPalOrderSummaryViewBuilder' @@ -462,6 +466,7 @@ services: PrestaShop\Module\PrestashopCheckout\Order\Command\UpdateOrderStatusCommand: "ps_checkout.command.handler.order.update_order_status" PrestaShop\Module\PrestashopCheckout\Order\Matrice\Command\UpdateOrderMatriceCommand: "ps_checkout.command.handler.order.matrice.update_order_matrice" PrestaShop\Module\PrestashopCheckout\PayPal\Order\Command\CapturePayPalOrderCommand: "ps_checkout.command.handler.paypal.order.capture_paypal_order" + PrestaShop\Module\PrestashopCheckout\PayPal\Order\Command\CreatePayPalOrderCommand: "ps_checkout.command.handler.paypal.order.create_paypal_order" PrestaShop\Module\PrestashopCheckout\PayPal\Order\Command\SavePayPalOrderCommand: "ps_checkout.command.handler.paypal.order.save_paypal_order" PrestaShop\Module\PrestashopCheckout\Order\Query\GetOrderForPaymentCompletedQuery: "ps_checkout.query.handler.order.get_order_for_payment_completed" PrestaShop\Module\PrestashopCheckout\Order\Query\GetOrderForPaymentDeniedQuery: "ps_checkout.query.handler.order.get_order_for_payment_denied" @@ -471,6 +476,7 @@ services: PrestaShop\Module\PrestashopCheckout\Order\Query\GetOrderForApprovalReversedQuery: "ps_checkout.query.handler.order.get_order_for_approval_reversed" PrestaShop\Module\PrestashopCheckout\PayPal\Identity\Query\GetClientTokenPayPalQuery: "ps_checkout.query.handler.paypal.identity.get_client_token" PrestaShop\Module\PrestashopCheckout\PayPal\Order\Query\GetCurrentPayPalOrderStatusQuery: "ps_checkout.query.handler.paypal.order.get_current_paypal_order_status" + PrestaShop\Module\PrestashopCheckout\PayPal\Order\Query\GetPayPalOrderQuery: "ps_checkout.query.handler.paypal.order.get_paypal_order" PrestaShop\Module\PrestashopCheckout\PayPal\Order\Query\GetPayPalOrderForCheckoutCompletedQuery: "ps_checkout.query.handler.paypal.order.get_paypal_order_for_checkout_completed" PrestaShop\Module\PrestashopCheckout\PayPal\Order\Query\GetPayPalOrderForOrderConfirmationQuery: "ps_checkout.query.handler.paypal.order.get_paypal_order_for_order_confirmation" PrestaShop\Module\PrestashopCheckout\Checkout\Command\UpdatePaymentMethodSelectedCommand: "ps_checkout.query.handler.checkout.update_payment_method_selected" @@ -505,6 +511,7 @@ services: - "@ps_checkout.checkout.checker" - "@ps_checkout.paypal.order.service.check_transition_paypal_order_status" - "@ps_checkout.order.state.service.order_state_mapper" + - '@ps_checkout.paypal.configuration' ps_checkout.event.subscriber.paypal.capture: class: 'PrestaShop\Module\PrestashopCheckout\PayPal\Payment\Capture\EventSubscriber\PayPalCaptureEventSubscriber' @@ -564,6 +571,14 @@ services: arguments: - "@ps_checkout.event.dispatcher" + ps_checkout.command.handler.paypal.order.create_paypal_order: + class: 'PrestaShop\Module\PrestashopCheckout\PayPal\Order\CommandHandler\CreatePayPalOrderCommandHandler' + public: true + arguments: + - '@?' + - '@?' + - '@ps_checkout.event.dispatcher' + ps_checkout.command.handler.paypal.order.capture_paypal_order: class: 'PrestaShop\Module\PrestashopCheckout\PayPal\Order\CommandHandler\CapturePayPalOrderCommandHandler' public: true @@ -575,6 +590,14 @@ services: public: true arguments: - "@ps_checkout.repository.pscheckoutcart" + - '@ps_checkout.paypal.configuration' + + ps_checkout.query.handler.paypal.order.get_paypal_order: + class: 'PrestaShop\Module\PrestashopCheckout\PayPal\Order\QueryHandler\GetPayPalOrderQueryHandler' + public: true + arguments: + - '@ps_checkout.cache.paypal.order' + - '@ps_checkout.repository.pscheckoutcart' ps_checkout.query.handler.paypal.order.get_current_paypal_order_status: class: 'PrestaShop\Module\PrestashopCheckout\PayPal\Order\QueryHandler\GetCurrentPayPalOrderStatusQueryHandler' diff --git a/controllers/front/create.php b/controllers/front/create.php index 066250cfd..88eac3754 100755 --- a/controllers/front/create.php +++ b/controllers/front/create.php @@ -19,11 +19,14 @@ * @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0 */ +use PrestaShop\Module\PrestashopCheckout\Cart\Exception\CartNotFoundException; +use PrestaShop\Module\PrestashopCheckout\Cart\ValueObject\CartId; +use PrestaShop\Module\PrestashopCheckout\CommandBus\CommandBusInterface; use PrestaShop\Module\PrestashopCheckout\Controller\AbstractFrontController; use PrestaShop\Module\PrestashopCheckout\Exception\PsCheckoutException; -use PrestaShop\Module\PrestashopCheckout\Handler\CreatePaypalOrderHandler; +use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Command\CreatePayPalOrderCommand; +use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Query\GetPayPalOrderQuery; use PrestaShop\Module\PrestashopCheckout\PayPal\PayPalConfiguration; -use PrestaShop\Module\PrestashopCheckout\Repository\PsCheckoutCartRepository; /** * This controller receive ajax call to create a PayPal Order @@ -43,6 +46,9 @@ class Ps_CheckoutCreateModuleFrontController extends AbstractFrontController public function postProcess() { try { + /** @var CommandBusInterface $commandBus */ + $commandBus = $this->module->getService('ps_checkout.bus.command'); + // BEGIN Express Checkout $bodyValues = []; $bodyContent = file_get_contents('php://input'); @@ -92,102 +98,72 @@ public function postProcess() $this->context->cookie->write(); } // END Express Checkout + $cartId = (int) $this->context->cart->id; - if (false === Validate::isLoadedObject($this->context->cart)) { - $this->exitWithResponse([ - 'httpCode' => 400, - 'body' => 'No cart found.', - ]); - } - - /** @var PsCheckoutCartRepository $psCheckoutCartRepository */ - $psCheckoutCartRepository = $this->module->getService('ps_checkout.repository.pscheckoutcart'); - - /** @var PsCheckoutCart|false $psCheckoutCart */ - $psCheckoutCart = $psCheckoutCartRepository->findOneByCartId((int) $this->context->cart->id); - + $fundingSource = isset($bodyValues['fundingSource']) ? $bodyValues['fundingSource'] : 'paypal'; + $isHostedFields = isset($bodyValues['isHostedFields']) && $bodyValues['isHostedFields']; $isExpressCheckout = (isset($bodyValues['isExpressCheckout']) && $bodyValues['isExpressCheckout']) || empty($this->context->cart->id_address_delivery); - if (false !== $psCheckoutCart && $psCheckoutCart->isExpressCheckout() && $psCheckoutCart->isOrderAvailable()) { - $this->exitWithResponse([ - 'status' => true, - 'httpCode' => 200, - 'body' => [ - 'orderID' => $psCheckoutCart->paypal_order, - ], - 'exceptionCode' => null, - 'exceptionMessage' => null, - ]); - } + $commandBus->handle(new CreatePayPalOrderCommand(new CartId($cartId), $fundingSource, $isHostedFields, $isExpressCheckout)); + + $order = $commandBus->handle(new GetPayPalOrderQuery(null, new CartId($cartId))); + $orderId = $order['id']; // If we have a PayPal Order Id with a status CREATED or APPROVED or PAYER_ACTION_REQUIRED we mark it as CANCELED and create new one // This is needed because cart gets updated so we need to update paypal order too - if ( - false !== $psCheckoutCart && $psCheckoutCart->getPaypalOrderId() - ) { - $psCheckoutCart->paypal_status = PsCheckoutCart::STATUS_CANCELED; - $psCheckoutCartRepository->save($psCheckoutCart); - $psCheckoutCart = false; - } - - $paypalOrder = new CreatePaypalOrderHandler($this->context); - $response = $paypalOrder->handle($isExpressCheckout); - - if (false === $response['status']) { - throw new PsCheckoutException($response['exceptionMessage'], (int) $response['exceptionCode']); - } - - if (empty($response['body']['id'])) { - throw new PsCheckoutException('Paypal order id is missing.', PsCheckoutException::PAYPAL_ORDER_IDENTIFIER_MISSING); - } - - $paymentSource = isset($response['body']['payment_source']) ? key($response['body']['payment_source']) : 'paypal'; - $fundingSource = isset($bodyValues['fundingSource']) ? $bodyValues['fundingSource'] : $paymentSource; - $orderId = isset($bodyValues['orderID']) ? $bodyValues['orderID'] : null; - $isExpressCheckout = isset($bodyValues['isExpressCheckout']) && $bodyValues['isExpressCheckout']; - $isHostedFields = isset($bodyValues['isHostedFields']) && $bodyValues['isHostedFields']; - /** @var PayPalConfiguration $configuration */ - $configuration = $this->module->getService('ps_checkout.paypal.configuration'); - - $this->module->getLogger()->info( - 'PayPal Order created', - [ - 'PayPalOrderId' => $orderId, - 'FundingSource' => $fundingSource, - 'isExpressCheckout' => $isExpressCheckout, - 'isHostedFields' => $isHostedFields, - 'id_cart' => (int) $this->context->cart->id, - 'amount' => $this->context->cart->getOrderTotal(true, Cart::BOTH), - 'environment' => $configuration->getPaymentMode(), - 'intent' => $configuration->getIntent(), - ] - ); - - if (false === $psCheckoutCart) { - $psCheckoutCart = new PsCheckoutCart(); - $psCheckoutCart->id_cart = (int) $this->context->cart->id; - } - - $psCheckoutCart->paypal_funding = $fundingSource; - $psCheckoutCart->paypal_order = $response['body']['id']; - $psCheckoutCart->paypal_status = $response['body']['status']; - $psCheckoutCart->paypal_intent = $configuration->getIntent(); - $psCheckoutCart->paypal_token = $response['body']['client_token']; - $psCheckoutCart->paypal_token_expire = (new DateTime())->modify('+3550 seconds')->format('Y-m-d H:i:s'); - $psCheckoutCart->environment = $configuration->getPaymentMode(); - $psCheckoutCart->isExpressCheckout = isset($bodyValues['isExpressCheckout']) && $bodyValues['isExpressCheckout']; - $psCheckoutCart->isHostedFields = isset($bodyValues['isHostedFields']) && $bodyValues['isHostedFields']; - $psCheckoutCartRepository->save($psCheckoutCart); +// if ($psCheckoutCart && $psCheckoutCart->getPaypalOrderId()) { +// $psCheckoutCart->paypal_status = PsCheckoutCart::STATUS_CANCELED; +// $psCheckoutCartRepository->save($psCheckoutCart); +// $psCheckoutCart = false; +// } + +// $paypalOrder = $this->module->getService('ps_checkout.handler.order.create_order'); +// $response = $paypalOrder->handle($isExpressCheckout); + +// if (false === $response['status']) { +// throw new PsCheckoutException($response['exceptionMessage'], (int) $response['exceptionCode']); +// } +// +// if (empty($response['body']['id'])) { +// throw new PsCheckoutException('Paypal order id is missing.', PsCheckoutException::PAYPAL_ORDER_IDENTIFIER_MISSING); +// } + +// $paymentSource = isset($response['body']['payment_source']) ? key($response['body']['payment_source']) : 'paypal'; +// $fundingSource = isset($bodyValues['fundingSource']) ? $bodyValues['fundingSource'] : $paymentSource; +// $orderId = isset($bodyValues['orderID']) ? $bodyValues['orderID'] : null; +// $isExpressCheckout = isset($bodyValues['isExpressCheckout']) && $bodyValues['isExpressCheckout']; +// $isHostedFields = isset($bodyValues['isHostedFields']) && $bodyValues['isHostedFields']; +// /** @var PayPalConfiguration $configuration */ +// $configuration = $this->module->getService('ps_checkout.paypal.configuration'); +// +// $this->module->getLogger()->info( +// 'PayPal Order created', +// [ +// 'PayPalOrderId' => $orderId, +// 'FundingSource' => $fundingSource, +// 'isExpressCheckout' => $isExpressCheckout, +// 'isHostedFields' => $isHostedFields, +// 'id_cart' => (int) $this->context->cart->id, +// 'amount' => $this->context->cart->getOrderTotal(true, Cart::BOTH), +// 'environment' => $configuration->getPaymentMode(), +// 'intent' => $configuration->getIntent(), +// ] +// ); $this->exitWithResponse([ 'status' => true, 'httpCode' => 200, 'body' => [ - 'orderID' => $psCheckoutCart->paypal_order, + 'orderID' => $orderId, ], 'exceptionCode' => null, 'exceptionMessage' => null, ]); + } catch (CartNotFoundException $exception) { + $this->exitWithResponse([ + 'httpCode' => 400, + 'body' => 'No cart found.', + ]); } catch (Exception $exception) { $this->module->getLogger()->error( 'CreateController - Exception ' . $exception->getCode(), diff --git a/src/DTO/Orders/CreatePayPalOrderRequest.php b/src/DTO/Orders/CreatePayPalOrderRequest.php deleted file mode 100644 index 13f6ba1b5..000000000 --- a/src/DTO/Orders/CreatePayPalOrderRequest.php +++ /dev/null @@ -1,88 +0,0 @@ - - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0 - */ - -namespace PrestaShop\Module\PrestashopCheckout\DTO\Orders; - -use PrestaShop\Module\PrestashopCheckout\PayPal\Order\DTO\PaymentSourceRequest; -use PrestaShop\Module\PrestashopCheckout\PayPal\Order\DTO\PurchaseUnitRequest; - -class CreatePayPalOrderRequest -{ - /** - * @var string - */ - private $intent; - /** - * @var PurchaseUnitRequest[] - */ - private $purchase_units; - /** - * @var PaymentSourceRequest - */ - private $payment_source; - - /** - * @return string - */ - public function getIntent() - { - return $this->intent; - } - - /** - * @param string $intent - */ - public function setIntent($intent) - { - $this->intent = $intent; - } - - /** - * @return PurchaseUnitRequest[] - */ - public function getPurchaseUnits() - { - return $this->purchase_units; - } - - /** - * @param PurchaseUnitRequest[] $purchase_units - */ - public function setPurchaseUnits(array $purchase_units) - { - $this->purchase_units = $purchase_units; - } - - /** - * @return PaymentSourceRequest - */ - public function getPaymentSource() - { - return $this->payment_source; - } - - /** - * @param PaymentSourceRequest $payment_source - */ - public function setPaymentSource(PaymentSourceRequest $payment_source) - { - $this->payment_source = $payment_source; - } -} diff --git a/src/Handler/CreatePaypalOrderHandler.php b/src/Handler/CreatePaypalOrderHandler.php index 4831ce300..c3ae50b24 100644 --- a/src/Handler/CreatePaypalOrderHandler.php +++ b/src/Handler/CreatePaypalOrderHandler.php @@ -39,12 +39,8 @@ class CreatePaypalOrderHandler */ private $context; - public function __construct(Context $context = null) + public function __construct(Context $context) { - if (null === $context) { - $context = Context::getContext(); - } - $this->context = $context; } diff --git a/src/PayPal/Order/Command/CreatePayPalOrderCommand.php b/src/PayPal/Order/Command/CreatePayPalOrderCommand.php index b33c389f5..c9324f5ce 100644 --- a/src/PayPal/Order/Command/CreatePayPalOrderCommand.php +++ b/src/PayPal/Order/Command/CreatePayPalOrderCommand.php @@ -33,15 +33,25 @@ class CreatePayPalOrderCommand * @var string */ private $fundingSource; + /** + * @var bool + */ + private $isHostedFields; + /** + * @var bool + */ + private $isExpressCheckout; /** * @param CartId $cartId * @param string $fundingSource */ - public function __construct(CartId $cartId, $fundingSource) + public function __construct(CartId $cartId, $fundingSource, $isHostedFields, $isExpressCheckout) { $this->cartId = $cartId; $this->fundingSource = $fundingSource; + $this->isHostedFields = $isHostedFields; + $this->isExpressCheckout = $isExpressCheckout; } /** @@ -59,4 +69,20 @@ public function getFundingSource() { return $this->fundingSource; } + + /** + * @return bool + */ + public function isHostedFields() + { + return $this->isHostedFields; + } + + /** + * @return bool + */ + public function isExpressCheckout() + { + return $this->isExpressCheckout; + } } diff --git a/src/PayPal/Order/CommandHandler/CreatePayPalOrderCommandHandler.php b/src/PayPal/Order/CommandHandler/CreatePayPalOrderCommandHandler.php index 506aa89f6..972b3fcef 100644 --- a/src/PayPal/Order/CommandHandler/CreatePayPalOrderCommandHandler.php +++ b/src/PayPal/Order/CommandHandler/CreatePayPalOrderCommandHandler.php @@ -27,7 +27,6 @@ use PrestaShop\Module\PrestashopCheckout\PayPal\Order\CreatePayPalOrderPayloadBuilderInterface; use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Event\PayPalOrderCreatedEvent; use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Exception\PayPalOrderException; -use PrestaShop\Module\PrestashopCheckout\PayPal\Order\PayPalOrderHttpClientInterface; class CreatePayPalOrderCommandHandler { @@ -35,37 +34,22 @@ class CreatePayPalOrderCommandHandler * @var CartRepositoryInterface */ private $cartRepository; - /** * @var CreatePayPalOrderPayloadBuilderInterface */ private $createPayPalOrderPayloadBuilder; - - /** - * @var PayPalOrderHttpClientInterface - */ - private $orderHttpClient; - /** * @var EventDispatcherInterface */ private $eventDispatcher; - /** - * @param CartRepositoryInterface $cartRepository - * @param CreatePayPalOrderPayloadBuilderInterface $createPayPalOrderPayloadBuilder - * @param PayPalOrderHttpClientInterface $orderHttpClient - * @param EventDispatcherInterface $eventDispatcher - */ public function __construct( CartRepositoryInterface $cartRepository, CreatePayPalOrderPayloadBuilderInterface $createPayPalOrderPayloadBuilder, - PayPalOrderHttpClientInterface $orderHttpClient, EventDispatcherInterface $eventDispatcher ) { $this->cartRepository = $cartRepository; $this->createPayPalOrderPayloadBuilder = $createPayPalOrderPayloadBuilder; - $this->orderHttpClient = $orderHttpClient; $this->eventDispatcher = $eventDispatcher; } @@ -81,7 +65,12 @@ public function handle(CreatePayPalOrderCommand $command) { $cart = $this->cartRepository->getCartById($command->getCartId()); $payload = $this->createPayPalOrderPayloadBuilder->build($cart, $command->getFundingSource()); - $order = $this->orderHttpClient->createOrder($payload); - $this->eventDispatcher->dispatch(new PayPalOrderCreatedEvent($order->getId(), $order->toArray())); +// $this->eventDispatcher->dispatch(new PayPalOrderCreatedEvent( +// $order->getId(), +// $order->toArray(), +// $command->getCartId(), +// $command->isHostedFields(), +// $command->isExpressCheckout() +// )); } } diff --git a/src/PayPal/Order/CommandHandler/SavePayPalOrderCommandHandler.php b/src/PayPal/Order/CommandHandler/SavePayPalOrderCommandHandler.php index f083a905f..8e66a1aa1 100644 --- a/src/PayPal/Order/CommandHandler/SavePayPalOrderCommandHandler.php +++ b/src/PayPal/Order/CommandHandler/SavePayPalOrderCommandHandler.php @@ -41,6 +41,7 @@ public function __construct(PsCheckoutCartRepository $psCheckoutCartRepository) public function handle(SavePayPalOrderCommand $savePayPalOrderCommand) { + // TODO: To be repurposed try { /** @var PsCheckoutCart|false $psCheckoutCart */ $psCheckoutCart = $this->psCheckoutCartRepository->findOneByPayPalOrderId($savePayPalOrderCommand->getOrderPayPalId()->getValue()); diff --git a/src/PayPal/Order/CreatePayPalOrderPayloadBuilderInterface.php b/src/PayPal/Order/CreatePayPalOrderPayloadBuilderInterface.php index d83ff80ba..55be44e6c 100644 --- a/src/PayPal/Order/CreatePayPalOrderPayloadBuilderInterface.php +++ b/src/PayPal/Order/CreatePayPalOrderPayloadBuilderInterface.php @@ -21,7 +21,7 @@ namespace PrestaShop\Module\PrestashopCheckout\PayPal\Order; use PrestaShop\Module\PrestashopCheckout\Cart\CartInterface; -use PrestaShop\Module\PrestashopCheckout\DTO\Orders\CreatePayPalOrderRequest; +use PrestaShop\Module\PrestashopCheckout\PayPal\Order\DTO\CreatePayPalOrderRequest; interface CreatePayPalOrderPayloadBuilderInterface { diff --git a/src/PayPal/Order/Event/PayPalOrderCreatedEvent.php b/src/PayPal/Order/Event/PayPalOrderCreatedEvent.php index 375348587..fb8e04180 100644 --- a/src/PayPal/Order/Event/PayPalOrderCreatedEvent.php +++ b/src/PayPal/Order/Event/PayPalOrderCreatedEvent.php @@ -22,4 +22,45 @@ class PayPalOrderCreatedEvent extends PayPalOrderEvent { + /** + * @var int + */ + private $cartId; + /** + * @var bool + */ + private $isHostedFields; + /** + * @var bool + */ + private $isExpressCheckout; + + public function __construct($orderPayPalId, $orderPayPal, $cartId, $isHostedFields, $isExpressCheckout) + { + parent::__construct($orderPayPalId, $orderPayPal); + $this->cartId = $cartId; + $this->isHostedFields = $isHostedFields; + $this->isExpressCheckout = $isExpressCheckout; + } + + public function getCartId() + { + return $this->cartId; + } + + /** + * @return bool + */ + public function isHostedFields() + { + return $this->isHostedFields; + } + + /** + * @return bool + */ + public function isExpressCheckout() + { + return $this->isExpressCheckout; + } } diff --git a/src/PayPal/Order/EventSubscriber/PayPalOrderEventSubscriber.php b/src/PayPal/Order/EventSubscriber/PayPalOrderEventSubscriber.php index f27f134e7..c32f84103 100644 --- a/src/PayPal/Order/EventSubscriber/PayPalOrderEventSubscriber.php +++ b/src/PayPal/Order/EventSubscriber/PayPalOrderEventSubscriber.php @@ -21,6 +21,8 @@ namespace PrestaShop\Module\PrestashopCheckout\PayPal\Order\EventSubscriber; +use DateTime; +use Exception; use PrestaShop\Module\PrestashopCheckout\Checkout\CheckoutChecker; use PrestaShop\Module\PrestashopCheckout\CommandBus\CommandBusInterface; use PrestaShop\Module\PrestashopCheckout\Exception\PsCheckoutException; @@ -32,15 +34,17 @@ use PrestaShop\Module\PrestashopCheckout\Order\State\Service\OrderStateMapper; use PrestaShop\Module\PrestashopCheckout\PayPal\Order\CheckTransitionPayPalOrderStatusService; use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Command\CapturePayPalOrderCommand; -use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Command\SavePayPalOrderCommand; use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Event\PayPalOrderApprovalReversedEvent; use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Event\PayPalOrderApprovedEvent; use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Event\PayPalOrderCompletedEvent; use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Event\PayPalOrderCreatedEvent; use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Event\PayPalOrderEvent; +use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Exception\PayPalOrderException; use PrestaShop\Module\PrestashopCheckout\PayPal\Order\PayPalOrderStatus; +use PrestaShop\Module\PrestashopCheckout\PayPal\PayPalConfiguration; use PrestaShop\Module\PrestashopCheckout\Repository\PsCheckoutCartRepository; use Ps_checkout; +use PsCheckoutCart; use Psr\SimpleCache\CacheInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -80,6 +84,10 @@ class PayPalOrderEventSubscriber implements EventSubscriberInterface * @var CommandBusInterface */ private $commandBus; + /** + * @var PayPalConfiguration + */ + private $payPalConfiguration; public function __construct( Ps_checkout $module, @@ -87,7 +95,8 @@ public function __construct( CacheInterface $orderPayPalCache, CheckoutChecker $checkoutChecker, CheckTransitionPayPalOrderStatusService $checkTransitionPayPalOrderStatusService, - OrderStateMapper $orderStateMapper + OrderStateMapper $orderStateMapper, + PayPalConfiguration $payPalConfiguration ) { $this->module = $module; $this->psCheckoutCartRepository = $psCheckoutCartRepository; @@ -96,6 +105,7 @@ public function __construct( $this->checkTransitionPayPalOrderStatusService = $checkTransitionPayPalOrderStatusService; $this->orderStateMapper = $orderStateMapper; $this->commandBus = $this->module->getService('ps_checkout.bus.command'); + $this->payPalConfiguration = $payPalConfiguration; } /** @@ -127,78 +137,62 @@ public static function getSubscribedEvents() public function saveCreatedPayPalOrder(PayPalOrderCreatedEvent $event) { - $psCheckoutCart = $this->psCheckoutCartRepository->findOneByPayPalOrderId($event->getOrderPayPalId()->getValue()); - - if (false === $psCheckoutCart) { - throw new PsCheckoutException(sprintf('PayPal Order %s is not linked to a cart', $event->getOrderPayPalId()->getValue()), PsCheckoutException::PRESTASHOP_CART_NOT_FOUND); - } + $psCheckoutCart = $this->psCheckoutCartRepository->findOneByCartId($event->getCartId()); - if (!$this->checkTransitionPayPalOrderStatusService->checkAvailableStatus($psCheckoutCart->getPaypalStatus(), PayPalOrderStatus::CREATED)) { - return; + if ($psCheckoutCart && $psCheckoutCart->getPaypalOrderId()) { + $psCheckoutCart->paypal_status = PayPalOrderStatus::CANCELED; + $this->psCheckoutCartRepository->save($psCheckoutCart); } - $this->commandBus->handle(new SavePayPalOrderCommand( - $event->getOrderPayPalId()->getValue(), - PayPalOrderStatus::CREATED, - $event->getOrderPayPal() - )); + $order = $event->getOrderPayPal(); + $psCheckoutCart = new PsCheckoutCart(); + $psCheckoutCart->id_cart = $event->getCartId(); + $psCheckoutCart->paypal_funding = $order['payment_source']; + $psCheckoutCart->paypal_order = $order['id']; + $psCheckoutCart->paypal_status = $order['status']; + $psCheckoutCart->paypal_intent = $order['intent']; + $psCheckoutCart->paypal_token = $order['client_token']; + $psCheckoutCart->paypal_token_expire = (new DateTime())->modify('+3550 seconds')->format('Y-m-d H:i:s'); + $psCheckoutCart->environment = $this->payPalConfiguration->getPaymentMode(); + $psCheckoutCart->isExpressCheckout = $event->isExpressCheckout(); + $psCheckoutCart->isHostedFields = $event->isHostedFields(); + + $this->psCheckoutCartRepository->save($psCheckoutCart); } public function saveApprovedPayPalOrder(PayPalOrderApprovedEvent $event) { - $psCheckoutCart = $this->psCheckoutCartRepository->findOneByPayPalOrderId($event->getOrderPayPalId()->getValue()); - - if (false === $psCheckoutCart) { - throw new PsCheckoutException(sprintf('PayPal Order %s is not linked to a cart', $event->getOrderPayPalId()->getValue()), PsCheckoutException::PRESTASHOP_CART_NOT_FOUND); - } - - if (!$this->checkTransitionPayPalOrderStatusService->checkAvailableStatus($psCheckoutCart->getPaypalStatus(), PayPalOrderStatus::APPROVED)) { - return; - } - - $this->commandBus->handle(new SavePayPalOrderCommand( - $event->getOrderPayPalId()->getValue(), - PayPalOrderStatus::APPROVED, - $event->getOrderPayPal() - )); + $this->updateCheckoutCartStatus($event, PayPalOrderStatus::APPROVED); } public function saveCompletedPayPalOrder(PayPalOrderCompletedEvent $event) { - $psCheckoutCart = $this->psCheckoutCartRepository->findOneByPayPalOrderId($event->getOrderPayPalId()->getValue()); - - if (false === $psCheckoutCart) { - throw new PsCheckoutException(sprintf('PayPal Order %s is not linked to a cart', $event->getOrderPayPalId()->getValue()), PsCheckoutException::PRESTASHOP_CART_NOT_FOUND); - } - - if (!$this->checkTransitionPayPalOrderStatusService->checkAvailableStatus($psCheckoutCart->getPaypalStatus(), PayPalOrderStatus::COMPLETED)) { - return; - } - - $this->commandBus->handle(new SavePayPalOrderCommand( - $event->getOrderPayPalId()->getValue(), - PayPalOrderStatus::COMPLETED, - $event->getOrderPayPal() - )); + $this->updateCheckoutCartStatus($event, PayPalOrderStatus::COMPLETED); } public function saveApprovalReversedPayPalOrder(PayPalOrderApprovalReversedEvent $event) { - $psCheckoutCart = $this->psCheckoutCartRepository->findOneByPayPalOrderId($event->getOrderPayPalId()->getValue()); + $this->updateCheckoutCartStatus($event, PayPalOrderStatus::REVERSED); + } - if (false === $psCheckoutCart) { - throw new PsCheckoutException(sprintf('PayPal Order %s is not linked to a cart', $event->getOrderPayPalId()->getValue()), PsCheckoutException::PRESTASHOP_CART_NOT_FOUND); - } + private function updateCheckoutCartStatus(PayPalOrderEvent $event, $newOrderStatus) + { + try { + $psCheckoutCart = $this->psCheckoutCartRepository->findOneByPayPalOrderId($event->getOrderPayPalId()->getValue()); - if (!$this->checkTransitionPayPalOrderStatusService->checkAvailableStatus($psCheckoutCart->getPaypalStatus(), PayPalOrderStatus::REVERSED)) { - return; - } + if (false === $psCheckoutCart) { + throw new PsCheckoutException(sprintf('PayPal Order %s is not linked to a cart', $event->getOrderPayPalId()->getValue()), PsCheckoutException::PRESTASHOP_CART_NOT_FOUND); + } - $this->commandBus->handle(new SavePayPalOrderCommand( - $event->getOrderPayPalId()->getValue(), - PayPalOrderStatus::REVERSED, - $event->getOrderPayPal() - )); + if (!$this->checkTransitionPayPalOrderStatusService->checkAvailableStatus($psCheckoutCart->getPaypalStatus(), $newOrderStatus)) { + return; + } + + $psCheckoutCart->paypal_status = $newOrderStatus; + $this->psCheckoutCartRepository->save($psCheckoutCart); + } catch (Exception $exception) { + throw new PayPalOrderException(sprintf('Unable to retrieve PrestaShop cart #%d', $event->getOrderPayPalId()->getValue()), PayPalOrderException::SESSION_EXCEPTION, $exception); + } } public function capturePayPalOrder(PayPalOrderApprovedEvent $event) diff --git a/src/PayPal/Order/PayPalOrderHttpClientInterface.php b/src/PayPal/Order/PayPalOrderHttpClientInterface.php index 372c98b6b..17393d94d 100644 --- a/src/PayPal/Order/PayPalOrderHttpClientInterface.php +++ b/src/PayPal/Order/PayPalOrderHttpClientInterface.php @@ -20,8 +20,8 @@ namespace PrestaShop\Module\PrestashopCheckout\PayPal\Order; -use PrestaShop\Module\PrestashopCheckout\DTO\Orders\CreatePayPalOrderRequest; -use PrestaShop\Module\PrestashopCheckout\DTO\Orders\CreatePayPalOrderResponse; +use PrestaShop\Module\PrestashopCheckout\PayPal\Order\DTO\CreatePayPalOrderRequest; +use PrestaShop\Module\PrestashopCheckout\PayPal\Order\DTO\CreatePayPalOrderResponse; use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Exception\PayPalOrderException; interface PayPalOrderHttpClientInterface diff --git a/src/PayPal/Order/Query/GetPayPalOrderQuery.php b/src/PayPal/Order/Query/GetPayPalOrderQuery.php new file mode 100644 index 000000000..7e8ec33f0 --- /dev/null +++ b/src/PayPal/Order/Query/GetPayPalOrderQuery.php @@ -0,0 +1,59 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0 + */ + +namespace PrestaShop\Module\PrestashopCheckout\PayPal\Order\Query; + +use PrestaShop\Module\PrestashopCheckout\Cart\ValueObject\CartId; +use PrestaShop\PrestaShop\Core\Domain\Order\ValueObject\OrderId; + +class GetPayPalOrderQuery +{ + /** + * @var OrderId|null + */ + private $orderId; + /** + * @var CartId|null + */ + private $cartId; + + public function __construct(OrderId $orderId = null, CartId $cartId = null) + { + $this->orderId = $orderId; + $this->cartId = $cartId; + } + + /** + * @return OrderId + */ + public function getOrderId() + { + return $this->orderId; + } + + /** + * @return CartId|null + */ + public function getCartId() + { + return $this->cartId; + } +} diff --git a/src/DTO/Orders/CreatePayPalOrderResponse.php b/src/PayPal/Order/Query/GetPayPalOrderQueryResult.php similarity index 63% rename from src/DTO/Orders/CreatePayPalOrderResponse.php rename to src/PayPal/Order/Query/GetPayPalOrderQueryResult.php index ab8d77025..5c59f4f07 100644 --- a/src/DTO/Orders/CreatePayPalOrderResponse.php +++ b/src/PayPal/Order/Query/GetPayPalOrderQueryResult.php @@ -1,4 +1,5 @@ order = $order; } - public function toArray() + /** + * @return array + */ + public function getOrder() { - return []; + return $this->order; } } diff --git a/src/PayPal/Order/QueryHandler/GetPayPalOrderQueryHandler.php b/src/PayPal/Order/QueryHandler/GetPayPalOrderQueryHandler.php new file mode 100644 index 000000000..2b1df02a4 --- /dev/null +++ b/src/PayPal/Order/QueryHandler/GetPayPalOrderQueryHandler.php @@ -0,0 +1,64 @@ + + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0 + */ + +namespace PrestaShop\Module\PrestashopCheckout\PayPal\Order\QueryHandler; + +use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Query\GetPayPalOrderQuery; +use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Query\GetPayPalOrderQueryResult; +use PrestaShop\Module\PrestashopCheckout\Repository\PsCheckoutCartRepository; +use Psr\SimpleCache\CacheInterface; + +class GetPayPalOrderQueryHandler +{ + /** + * @var CacheInterface + */ + private $orderCache; + /** + * @var PsCheckoutCartRepository + */ + private $checkoutCartRepository; + + public function __construct(CacheInterface $orderCache, PsCheckoutCartRepository $checkoutCartRepository) + { + $this->orderCache = $orderCache; + $this->checkoutCartRepository = $checkoutCartRepository; + } + + /** + * @param GetPayPalOrderQuery $query + * + * @return GetPayPalOrderQueryResult + * + * @throws \PrestaShopException + */ + public function handle(GetPayPalOrderQuery $query) + { + $orderId = !$query->getOrderId()->getValue() ? null : $query->getOrderId()->getValue(); + + if (!$orderId) { + $psCheckoutCart = $this->checkoutCartRepository->findOneByCartId($query->getCartId()->getValue()); + $orderId = $psCheckoutCart->paypal_order; + } + + return new GetPayPalOrderQueryResult($this->orderCache->get($orderId)); + } +}