diff --git a/spec/Entity/RefundPaymentSpec.php b/spec/Entity/RefundPaymentSpec.php index 514df165..32c8cff2 100644 --- a/spec/Entity/RefundPaymentSpec.php +++ b/spec/Entity/RefundPaymentSpec.php @@ -14,15 +14,16 @@ namespace spec\Sylius\RefundPlugin\Entity; use PhpSpec\ObjectBehavior; +use Sylius\Component\Core\Model\OrderInterface; use Sylius\Component\Core\Model\PaymentMethodInterface; use Sylius\RefundPlugin\Entity\RefundPayment; use Sylius\RefundPlugin\Entity\RefundPaymentInterface; final class RefundPaymentSpec extends ObjectBehavior { - public function let(PaymentMethodInterface $paymentMethod): void + public function let(OrderInterface $order, PaymentMethodInterface $paymentMethod): void { - $this->beConstructedWith('000002', 100, 'USD', RefundPaymentInterface::STATE_NEW, $paymentMethod); + $this->beConstructedWith($order, 100, 'USD', RefundPaymentInterface::STATE_NEW, $paymentMethod); } public function it_is_initializable(): void @@ -40,8 +41,11 @@ public function it_has_no_id_by_default(): void $this->getId()->shouldReturn(null); } - public function it_has_order_number(): void + public function it_has_an_order(OrderInterface $order): void { + $order->getNumber()->willReturn('000002'); + + $this->getOrder()->shouldReturn($order); $this->getOrderNumber()->shouldReturn('000002'); } diff --git a/spec/Factory/RefundPaymentFactorySpec.php b/spec/Factory/RefundPaymentFactorySpec.php index 735862f1..9b518691 100644 --- a/spec/Factory/RefundPaymentFactorySpec.php +++ b/spec/Factory/RefundPaymentFactorySpec.php @@ -14,6 +14,7 @@ namespace spec\Sylius\RefundPlugin\Factory; use PhpSpec\ObjectBehavior; +use Sylius\Component\Core\Model\OrderInterface; use Sylius\Component\Core\Model\PaymentMethodInterface; use Sylius\Component\Core\Repository\PaymentMethodRepositoryInterface; use Sylius\RefundPlugin\Entity\RefundPayment; @@ -40,19 +41,21 @@ public function it_implements_refund_payment_factory_interface(): void public function it_creates_new_refund_payment( PaymentMethodRepositoryInterface $paymentMethodRepository, - PaymentMethodInterface $paymentMethod + PaymentMethodInterface $paymentMethod, + OrderInterface $order ): void { $paymentMethodRepository->find(1)->willReturn($paymentMethod); - $this->createWithData( - '0002', - 1000, - 'USD', - RefundPaymentInterface::STATE_NEW, - 1 - )->shouldBeLike( - new RefundPayment( - '0002', + $this + ->createWithData( + $order, + 1000, + 'USD', + RefundPaymentInterface::STATE_NEW, + 1 + ) + ->shouldBeLike(new RefundPayment( + $order->getWrappedObject(), 1000, 'USD', RefundPaymentInterface::STATE_NEW, diff --git a/spec/ProcessManager/RefundPaymentProcessManagerSpec.php b/spec/ProcessManager/RefundPaymentProcessManagerSpec.php index 3c5c12d7..cfd0ab0b 100644 --- a/spec/ProcessManager/RefundPaymentProcessManagerSpec.php +++ b/spec/ProcessManager/RefundPaymentProcessManagerSpec.php @@ -15,6 +15,8 @@ use Doctrine\ORM\EntityManagerInterface; use PhpSpec\ObjectBehavior; +use Sylius\Component\Core\Model\OrderInterface; +use Sylius\Component\Core\Repository\OrderRepositoryInterface; use Sylius\RefundPlugin\Entity\RefundPaymentInterface; use Sylius\RefundPlugin\Event\RefundPaymentGenerated; use Sylius\RefundPlugin\Event\UnitsRefunded; @@ -33,6 +35,7 @@ public function let( OrderFullyRefundedStateResolverInterface $orderFullyRefundedStateResolver, RelatedPaymentIdProviderInterface $relatedPaymentIdProvider, RefundPaymentFactoryInterface $refundPaymentFactory, + OrderRepositoryInterface $orderRepository, EntityManagerInterface $entityManager, MessageBusInterface $eventBus ): void { @@ -40,6 +43,7 @@ public function let( $orderFullyRefundedStateResolver, $relatedPaymentIdProvider, $refundPaymentFactory, + $orderRepository, $entityManager, $eventBus ); @@ -54,12 +58,16 @@ public function it_reacts_on_units_refunded_event_and_creates_refund_payment( OrderFullyRefundedStateResolverInterface $orderFullyRefundedStateResolver, RelatedPaymentIdProviderInterface $relatedPaymentIdProvider, RefundPaymentFactoryInterface $refundPaymentFactory, + OrderRepositoryInterface $orderRepository, EntityManagerInterface $entityManager, + MessageBusInterface $eventBus, RefundPaymentInterface $refundPayment, - MessageBusInterface $eventBus + OrderInterface $order ): void { + $orderRepository->findOneByNumber('000222')->willReturn($order); + $refundPaymentFactory->createWithData( - '000222', + $order, 1000, 'USD', RefundPaymentInterface::STATE_NEW, @@ -72,7 +80,7 @@ public function it_reacts_on_units_refunded_event_and_creates_refund_payment( $orderFullyRefundedStateResolver->resolve('000222')->shouldBeCalled(); $refundPayment->getId()->willReturn(10); - $refundPayment->getOrderNumber()->willReturn('000222'); + $refundPayment->getOrder()->willReturn($order); $refundPayment->getAmount()->willReturn(1000); $relatedPaymentIdProvider->getForRefundPayment($refundPayment)->willReturn(3); diff --git a/src/Entity/RefundPayment.php b/src/Entity/RefundPayment.php index 385041ee..f5afba62 100644 --- a/src/Entity/RefundPayment.php +++ b/src/Entity/RefundPayment.php @@ -13,6 +13,7 @@ namespace Sylius\RefundPlugin\Entity; +use Sylius\Component\Core\Model\OrderInterface; use Sylius\Component\Core\Model\PaymentMethodInterface; class RefundPayment implements RefundPaymentInterface @@ -20,8 +21,8 @@ class RefundPayment implements RefundPaymentInterface /** @var int|null */ protected $id; - /** @var string */ - protected $orderNumber; + /** @var OrderInterface */ + protected $order; /** @var int */ protected $amount; @@ -36,13 +37,13 @@ class RefundPayment implements RefundPaymentInterface protected $paymentMethod; public function __construct( - string $orderNumber, + OrderInterface $order, int $amount, string $currencyCode, string $state, PaymentMethodInterface $paymentMethod ) { - $this->orderNumber = $orderNumber; + $this->order = $order; $this->amount = $amount; $this->currencyCode = $currencyCode; $this->state = $state; @@ -54,9 +55,14 @@ public function getId(): ?int return $this->id; } + public function getOrder(): OrderInterface + { + return $this->order; + } + public function getOrderNumber(): string { - return $this->orderNumber; + return $this->getOrder()->getNumber(); } public function getAmount(): int diff --git a/src/Entity/RefundPaymentInterface.php b/src/Entity/RefundPaymentInterface.php index 1f14ddcf..d2dd4c62 100644 --- a/src/Entity/RefundPaymentInterface.php +++ b/src/Entity/RefundPaymentInterface.php @@ -13,6 +13,7 @@ namespace Sylius\RefundPlugin\Entity; +use Sylius\Component\Core\Model\OrderInterface; use Sylius\Component\Core\Model\PaymentMethodInterface; use Sylius\Component\Resource\Model\ResourceInterface; @@ -22,6 +23,9 @@ interface RefundPaymentInterface extends ResourceInterface public const STATE_COMPLETED = 'completed'; + public function getOrder(): OrderInterface; + + /** @deprecated this function is deprecated and will be removed in v1.0. Use RefundPaymentInterface::getOrder() instead */ public function getOrderNumber(): string; public function getAmount(): int; diff --git a/src/Factory/RefundPaymentFactory.php b/src/Factory/RefundPaymentFactory.php index c1cc8fd4..c9b05af4 100644 --- a/src/Factory/RefundPaymentFactory.php +++ b/src/Factory/RefundPaymentFactory.php @@ -13,6 +13,7 @@ namespace Sylius\RefundPlugin\Factory; +use Sylius\Component\Core\Model\OrderInterface; use Sylius\Component\Core\Model\PaymentMethodInterface; use Sylius\Component\Core\Repository\PaymentMethodRepositoryInterface; use Sylius\RefundPlugin\Entity\RefundPayment; @@ -29,7 +30,7 @@ public function __construct(PaymentMethodRepositoryInterface $paymentMethodRepos } public function createWithData( - string $orderNumber, + OrderInterface $order, int $amount, string $currencyCode, string $state, @@ -38,6 +39,6 @@ public function createWithData( /** @var PaymentMethodInterface $paymentMethod */ $paymentMethod = $this->paymentMethodRepository->find($paymentMethodId); - return new RefundPayment($orderNumber, $amount, $currencyCode, $state, $paymentMethod); + return new RefundPayment($order, $amount, $currencyCode, $state, $paymentMethod); } } diff --git a/src/Factory/RefundPaymentFactoryInterface.php b/src/Factory/RefundPaymentFactoryInterface.php index 1f865415..d9fccc42 100644 --- a/src/Factory/RefundPaymentFactoryInterface.php +++ b/src/Factory/RefundPaymentFactoryInterface.php @@ -13,12 +13,13 @@ namespace Sylius\RefundPlugin\Factory; +use Sylius\Component\Core\Model\OrderInterface; use Sylius\RefundPlugin\Entity\RefundPaymentInterface; interface RefundPaymentFactoryInterface { public function createWithData( - string $orderNumber, + OrderInterface $order, int $amount, string $currencyCode, string $state, diff --git a/src/ProcessManager/RefundPaymentProcessManager.php b/src/ProcessManager/RefundPaymentProcessManager.php index 689999bc..9931253b 100644 --- a/src/ProcessManager/RefundPaymentProcessManager.php +++ b/src/ProcessManager/RefundPaymentProcessManager.php @@ -14,6 +14,8 @@ namespace Sylius\RefundPlugin\ProcessManager; use Doctrine\ORM\EntityManagerInterface; +use Sylius\Component\Core\Model\OrderInterface; +use Sylius\Component\Core\Repository\OrderRepositoryInterface; use Sylius\RefundPlugin\Entity\RefundPaymentInterface; use Sylius\RefundPlugin\Event\RefundPaymentGenerated; use Sylius\RefundPlugin\Event\UnitsRefunded; @@ -21,6 +23,7 @@ use Sylius\RefundPlugin\Provider\RelatedPaymentIdProviderInterface; use Sylius\RefundPlugin\StateResolver\OrderFullyRefundedStateResolverInterface; use Symfony\Component\Messenger\MessageBusInterface; +use Webmozart\Assert\Assert; final class RefundPaymentProcessManager implements UnitsRefundedProcessStepInterface { @@ -33,6 +36,9 @@ final class RefundPaymentProcessManager implements UnitsRefundedProcessStepInter /** @var RefundPaymentFactoryInterface */ private $refundPaymentFactory; + /** @var OrderRepositoryInterface */ + private $orderRepository; + /** @var EntityManagerInterface */ private $entityManager; @@ -43,20 +49,26 @@ public function __construct( OrderFullyRefundedStateResolverInterface $orderFullyRefundedStateResolver, RelatedPaymentIdProviderInterface $relatedPaymentIdProvider, RefundPaymentFactoryInterface $refundPaymentFactory, + OrderRepositoryInterface $orderRepository, EntityManagerInterface $entityManager, MessageBusInterface $eventBus ) { $this->orderFullyRefundedStateResolver = $orderFullyRefundedStateResolver; $this->relatedPaymentIdProvider = $relatedPaymentIdProvider; $this->refundPaymentFactory = $refundPaymentFactory; + $this->orderRepository = $orderRepository; $this->entityManager = $entityManager; $this->eventBus = $eventBus; } public function next(UnitsRefunded $unitsRefunded): void { + /** @var OrderInterface|null $order */ + $order = $this->orderRepository->findOneByNumber($unitsRefunded->orderNumber()); + Assert::notNull($order); + $refundPayment = $this->refundPaymentFactory->createWithData( - $unitsRefunded->orderNumber(), + $order, $unitsRefunded->amount(), $unitsRefunded->currencyCode(), RefundPaymentInterface::STATE_NEW, diff --git a/src/Resources/config/doctrine/RefundPayment.orm.xml b/src/Resources/config/doctrine/RefundPayment.orm.xml index 124b92f3..6c11c244 100644 --- a/src/Resources/config/doctrine/RefundPayment.orm.xml +++ b/src/Resources/config/doctrine/RefundPayment.orm.xml @@ -11,7 +11,6 @@ - @@ -19,5 +18,9 @@ + + + + diff --git a/src/Resources/config/services/event_bus.xml b/src/Resources/config/services/event_bus.xml index ec1eb7d4..b957f77d 100644 --- a/src/Resources/config/services/event_bus.xml +++ b/src/Resources/config/services/event_bus.xml @@ -31,6 +31,7 @@ +