From cac828363047c40aa6ceb5d1b40170a316d7d059 Mon Sep 17 00:00:00 2001 From: Mateusz Zalewski Date: Tue, 2 Oct 2018 12:56:31 +0200 Subject: [PATCH 1/3] Related payment id in RefundPaymentGenerated event --- spec/Event/RefundPaymentGeneratedSpec.php | 3 ++- src/Event/RefundPaymentGenerated.php | 19 +++++++++++++++++-- .../RefundPaymentProcessManager.php | 3 ++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/spec/Event/RefundPaymentGeneratedSpec.php b/spec/Event/RefundPaymentGeneratedSpec.php index 4d3437a5..14aab649 100644 --- a/spec/Event/RefundPaymentGeneratedSpec.php +++ b/spec/Event/RefundPaymentGeneratedSpec.php @@ -10,12 +10,13 @@ final class RefundPaymentGeneratedSpec extends ObjectBehavior { function it_represents_an_immutable_fact_that_refund_payment_has_been_generated(): void { - $this->beConstructedWith(1, '000222', 10000, 'GBP', 2); + $this->beConstructedWith(1, '000222', 10000, 'GBP', 2, 3); $this->id()->shouldReturn(1); $this->orderNumber()->shouldReturn('000222'); $this->amount()->shouldReturn(10000); $this->currencyCode()->shouldReturn('GBP'); $this->paymentMethodId()->shouldReturn(2); + $this->paymentId()->shouldReturn(3); } } diff --git a/src/Event/RefundPaymentGenerated.php b/src/Event/RefundPaymentGenerated.php index 48b44ac6..ffe57f14 100644 --- a/src/Event/RefundPaymentGenerated.php +++ b/src/Event/RefundPaymentGenerated.php @@ -21,13 +21,23 @@ final class RefundPaymentGenerated /** @var int */ private $paymentMethodId; - public function __construct(int $id, string $orderNumber, int $amount, string $currencyCode, int $paymentMethodId) - { + /** @var int */ + private $paymentId; + + public function __construct( + int $id, + string $orderNumber, + int $amount, + string $currencyCode, + int $paymentMethodId, + int $paymentId + ) { $this->id = $id; $this->orderNumber = $orderNumber; $this->amount = $amount; $this->currencyCode = $currencyCode; $this->paymentMethodId = $paymentMethodId; + $this->paymentId = $paymentId; } public function id(): int @@ -54,4 +64,9 @@ public function paymentMethodId(): int { return $this->paymentMethodId; } + + public function paymentId(): int + { + return $this->paymentId; + } } diff --git a/src/ProcessManager/RefundPaymentProcessManager.php b/src/ProcessManager/RefundPaymentProcessManager.php index 33964856..a5824ec8 100644 --- a/src/ProcessManager/RefundPaymentProcessManager.php +++ b/src/ProcessManager/RefundPaymentProcessManager.php @@ -56,7 +56,8 @@ public function __invoke(UnitsRefunded $event): void $event->orderNumber(), $event->amount(), $event->currencyCode(), - $event->paymentMethodId() + $event->paymentMethodId(), + 1 )); $this->orderFullyRefundedStateResolver->resolve($event->orderNumber()); From 856685ba0836f81898b508c4582eb2282ec224b3 Mon Sep 17 00:00:00 2001 From: Mateusz Zalewski Date: Tue, 2 Oct 2018 13:10:33 +0200 Subject: [PATCH 2/3] Default service for getting related payment id for refund payment --- .../DefaultRelatedPaymentIdProviderSpec.php | 73 +++++++++++++++++++ src/Exception/CompletedPaymentNotFound.php | 13 ++++ .../DefaultRelatedPaymentIdProvider.php | 42 +++++++++++ .../RelatedPaymentIdProviderInterface.php | 12 +++ src/Resources/config/services/provider.xml | 4 + 5 files changed, 144 insertions(+) create mode 100644 spec/Provider/DefaultRelatedPaymentIdProviderSpec.php create mode 100644 src/Exception/CompletedPaymentNotFound.php create mode 100644 src/Provider/DefaultRelatedPaymentIdProvider.php create mode 100644 src/Provider/RelatedPaymentIdProviderInterface.php diff --git a/spec/Provider/DefaultRelatedPaymentIdProviderSpec.php b/spec/Provider/DefaultRelatedPaymentIdProviderSpec.php new file mode 100644 index 00000000..6f81b78e --- /dev/null +++ b/spec/Provider/DefaultRelatedPaymentIdProviderSpec.php @@ -0,0 +1,73 @@ +beConstructedWith($orderRepository); + } + + function it_implements_related_payment_id_provider_interface(): void + { + $this->shouldImplement(RelatedPaymentIdProviderInterface::class); + } + + function it_provides_id_of_last_completed_payment_from_refund_payment_order( + OrderRepositoryInterface $orderRepository, + RefundPaymentInterface $refundPayment, + OrderInterface $order, + PaymentInterface $payment + ): void { + $refundPayment->getOrderNumber()->willReturn('000333'); + + $orderRepository->findOneByNumber('000333')->willReturn($order); + + $order->getLastPayment(PaymentInterface::STATE_COMPLETED)->willReturn($payment); + + $payment->getId()->willReturn(4); + + $this->getForRefundPayment($refundPayment)->shouldReturn(4); + } + + function it_throws_exception_if_there_is_no_order_with_given_number( + OrderRepositoryInterface $orderRepository, + RefundPaymentInterface $refundPayment + ): void { + $refundPayment->getOrderNumber()->willReturn('000666'); + $orderRepository->findOneByNumber('000666')->willReturn(null); + + $this + ->shouldThrow(OrderNotFound::withNumber('000666')) + ->during('getForRefundPayment', [$refundPayment]) + ; + } + + function it_throws_exception_if_order_has_no_completed_payments( + OrderRepositoryInterface $orderRepository, + RefundPaymentInterface $refundPayment, + OrderInterface $order + ): void { + $refundPayment->getOrderNumber()->willReturn('000666'); + $orderRepository->findOneByNumber('000666')->willReturn($order); + + $order->getLastPayment(PaymentInterface::STATE_COMPLETED)->willReturn(null); + + $this + ->shouldThrow(CompletedPaymentNotFound::withNumber('000666')) + ->during('getForRefundPayment', [$refundPayment]) + ; + } +} diff --git a/src/Exception/CompletedPaymentNotFound.php b/src/Exception/CompletedPaymentNotFound.php new file mode 100644 index 00000000..c8119edf --- /dev/null +++ b/src/Exception/CompletedPaymentNotFound.php @@ -0,0 +1,13 @@ +orderRepository = $orderRepository; + } + + public function getForRefundPayment(RefundPaymentInterface $refundPayment): int + { + $orderNumber = $refundPayment->getOrderNumber(); + /** @var OrderInterface|null $order */ + $order = $this->orderRepository->findOneByNumber($orderNumber); + + if ($order === null) { + throw OrderNotFound::withNumber($orderNumber); + } + + $payment = $order->getLastPayment(PaymentInterface::STATE_COMPLETED); + + if ($payment === null) { + throw CompletedPaymentNotFound::withNumber($orderNumber); + } + + return $payment->getId(); + } +} diff --git a/src/Provider/RelatedPaymentIdProviderInterface.php b/src/Provider/RelatedPaymentIdProviderInterface.php new file mode 100644 index 00000000..14b44856 --- /dev/null +++ b/src/Provider/RelatedPaymentIdProviderInterface.php @@ -0,0 +1,12 @@ + + + + + From 23ea93f4a052388cdebd73170feef4c63e617415 Mon Sep 17 00:00:00 2001 From: Mateusz Zalewski Date: Tue, 2 Oct 2018 13:13:53 +0200 Subject: [PATCH 3/3] Use related payment id provider during refund payment generation --- spec/ProcessManager/RefundPaymentProcessManagerSpec.php | 9 ++++++++- src/ProcessManager/RefundPaymentProcessManager.php | 8 +++++++- src/Resources/config/services/event_bus.xml | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/spec/ProcessManager/RefundPaymentProcessManagerSpec.php b/spec/ProcessManager/RefundPaymentProcessManagerSpec.php index bc8edd6d..d06ac3df 100644 --- a/spec/ProcessManager/RefundPaymentProcessManagerSpec.php +++ b/spec/ProcessManager/RefundPaymentProcessManagerSpec.php @@ -13,18 +13,21 @@ use Sylius\RefundPlugin\Event\UnitsRefunded; use Sylius\RefundPlugin\Factory\RefundPaymentFactoryInterface; use Sylius\RefundPlugin\Model\OrderItemUnitRefund; +use Sylius\RefundPlugin\Provider\RelatedPaymentIdProviderInterface; use Sylius\RefundPlugin\StateResolver\OrderFullyRefundedStateResolverInterface; final class RefundPaymentProcessManagerSpec extends ObjectBehavior { function let( OrderFullyRefundedStateResolverInterface $orderFullyRefundedStateResolver, + RelatedPaymentIdProviderInterface $relatedPaymentIdProvider, RefundPaymentFactoryInterface $refundPaymentFactory, EntityManagerInterface $entityManager, EventBus $eventBus ): void { $this->beConstructedWith( $orderFullyRefundedStateResolver, + $relatedPaymentIdProvider, $refundPaymentFactory, $entityManager, $eventBus @@ -33,6 +36,7 @@ function let( function it_reacts_on_units_refunded_event_and_creates_refund_payment( OrderFullyRefundedStateResolverInterface $orderFullyRefundedStateResolver, + RelatedPaymentIdProviderInterface $relatedPaymentIdProvider, RefundPaymentFactoryInterface $refundPaymentFactory, EntityManagerInterface $entityManager, RefundPaymentInterface $refundPayment, @@ -55,13 +59,16 @@ function it_reacts_on_units_refunded_event_and_creates_refund_payment( $refundPayment->getOrderNumber()->willReturn('000222'); $refundPayment->getAmount()->willReturn(1000); + $relatedPaymentIdProvider->getForRefundPayment($refundPayment)->willReturn(3); + $eventBus->dispatch(Argument::that(function (RefundPaymentGenerated $event): bool { return $event->id() === 10 && $event->orderNumber() === '000222' && $event->amount() === 1000 && $event->currencyCode() === 'USD' && - $event->paymentMethodId() === 1 + $event->paymentMethodId() === 1 && + $event->paymentId() === 3 ; }))->shouldBeCalled(); diff --git a/src/ProcessManager/RefundPaymentProcessManager.php b/src/ProcessManager/RefundPaymentProcessManager.php index a5824ec8..7ffab579 100644 --- a/src/ProcessManager/RefundPaymentProcessManager.php +++ b/src/ProcessManager/RefundPaymentProcessManager.php @@ -10,6 +10,7 @@ use Sylius\RefundPlugin\Event\RefundPaymentGenerated; use Sylius\RefundPlugin\Event\UnitsRefunded; use Sylius\RefundPlugin\Factory\RefundPaymentFactoryInterface; +use Sylius\RefundPlugin\Provider\RelatedPaymentIdProviderInterface; use Sylius\RefundPlugin\StateResolver\OrderFullyRefundedStateResolverInterface; final class RefundPaymentProcessManager @@ -17,6 +18,9 @@ final class RefundPaymentProcessManager /** @var OrderFullyRefundedStateResolverInterface */ private $orderFullyRefundedStateResolver; + /** @var RelatedPaymentIdProviderInterface */ + private $relatedPaymentIdProvider; + /** @var RefundPaymentFactoryInterface */ private $refundPaymentFactory; @@ -28,11 +32,13 @@ final class RefundPaymentProcessManager public function __construct( OrderFullyRefundedStateResolverInterface $orderFullyRefundedStateResolver, + RelatedPaymentIdProviderInterface $relatedPaymentIdProvider, RefundPaymentFactoryInterface $refundPaymentFactory, EntityManagerInterface $entityManager, EventBus $eventBus ) { $this->orderFullyRefundedStateResolver = $orderFullyRefundedStateResolver; + $this->relatedPaymentIdProvider = $relatedPaymentIdProvider; $this->refundPaymentFactory = $refundPaymentFactory; $this->entityManager = $entityManager; $this->eventBus = $eventBus; @@ -57,7 +63,7 @@ public function __invoke(UnitsRefunded $event): void $event->amount(), $event->currencyCode(), $event->paymentMethodId(), - 1 + $this->relatedPaymentIdProvider->getForRefundPayment($refundPayment) )); $this->orderFullyRefundedStateResolver->resolve($event->orderNumber()); diff --git a/src/Resources/config/services/event_bus.xml b/src/Resources/config/services/event_bus.xml index 8bafd0fb..9bc4c5b0 100644 --- a/src/Resources/config/services/event_bus.xml +++ b/src/Resources/config/services/event_bus.xml @@ -20,6 +20,7 @@ +