Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion spec/Event/RefundPaymentGeneratedSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
9 changes: 8 additions & 1 deletion spec/ProcessManager/RefundPaymentProcessManagerSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand All @@ -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();

Expand Down
73 changes: 73 additions & 0 deletions spec/Provider/DefaultRelatedPaymentIdProviderSpec.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?php

declare(strict_types=1);

namespace spec\Sylius\RefundPlugin\Provider;

use PhpSpec\ObjectBehavior;
use Sylius\Component\Core\Model\OrderInterface;
use Sylius\Component\Core\Model\PaymentInterface;
use Sylius\Component\Core\Repository\OrderRepositoryInterface;
use Sylius\RefundPlugin\Entity\RefundPaymentInterface;
use Sylius\RefundPlugin\Exception\CompletedPaymentNotFound;
use Sylius\RefundPlugin\Exception\OrderNotFound;
use Sylius\RefundPlugin\Provider\RelatedPaymentIdProviderInterface;

final class DefaultRelatedPaymentIdProviderSpec extends ObjectBehavior
{
function let(OrderRepositoryInterface $orderRepository): void
{
$this->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])
;
}
}
19 changes: 17 additions & 2 deletions src/Event/RefundPaymentGenerated.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -54,4 +64,9 @@ public function paymentMethodId(): int
{
return $this->paymentMethodId;
}

public function paymentId(): int
{
return $this->paymentId;
}
}
13 changes: 13 additions & 0 deletions src/Exception/CompletedPaymentNotFound.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

declare(strict_types=1);

namespace Sylius\RefundPlugin\Exception;

final class CompletedPaymentNotFound extends \InvalidArgumentException
{
public static function withNumber(string $orderNumber): self
{
return new self(sprintf('Order with number "%s" has no completed payments', $orderNumber));
}
}
9 changes: 8 additions & 1 deletion src/ProcessManager/RefundPaymentProcessManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,17 @@
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
{
/** @var OrderFullyRefundedStateResolverInterface */
private $orderFullyRefundedStateResolver;

/** @var RelatedPaymentIdProviderInterface */
private $relatedPaymentIdProvider;

/** @var RefundPaymentFactoryInterface */
private $refundPaymentFactory;

Expand All @@ -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;
Expand All @@ -56,7 +62,8 @@ public function __invoke(UnitsRefunded $event): void
$event->orderNumber(),
$event->amount(),
$event->currencyCode(),
$event->paymentMethodId()
$event->paymentMethodId(),
$this->relatedPaymentIdProvider->getForRefundPayment($refundPayment)
));

$this->orderFullyRefundedStateResolver->resolve($event->orderNumber());
Expand Down
42 changes: 42 additions & 0 deletions src/Provider/DefaultRelatedPaymentIdProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

declare(strict_types=1);

namespace Sylius\RefundPlugin\Provider;

use Sylius\Component\Core\Model\OrderInterface;
use Sylius\Component\Core\Model\PaymentInterface;
use Sylius\Component\Core\Repository\OrderRepositoryInterface;
use Sylius\RefundPlugin\Entity\RefundPaymentInterface;
use Sylius\RefundPlugin\Exception\CompletedPaymentNotFound;
use Sylius\RefundPlugin\Exception\OrderNotFound;

final class DefaultRelatedPaymentIdProvider implements RelatedPaymentIdProviderInterface
{
/** @var OrderRepositoryInterface */
private $orderRepository;

public function __construct(OrderRepositoryInterface $orderRepository)
{
$this->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();
}
}
12 changes: 12 additions & 0 deletions src/Provider/RelatedPaymentIdProviderInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

declare(strict_types=1);

namespace Sylius\RefundPlugin\Provider;

use Sylius\RefundPlugin\Entity\RefundPaymentInterface;

interface RelatedPaymentIdProviderInterface
{
public function getForRefundPayment(RefundPaymentInterface $refundPayment): int;
}
1 change: 1 addition & 0 deletions src/Resources/config/services/event_bus.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

<service id="Sylius\RefundPlugin\ProcessManager\RefundPaymentProcessManager">
<argument type="service" id="Sylius\RefundPlugin\StateResolver\OrderFullyRefundedStateResolver" />
<argument type="service" id="Sylius\RefundPlugin\Provider\RelatedPaymentIdProviderInterface" />
<argument type="service" id="Sylius\RefundPlugin\Factory\RefundPaymentFactory" />
<argument type="service" id="doctrine.orm.default_entity_manager" />
<argument type="service" id="prooph_service_bus.sylius_refund_event_bus" />
Expand Down
4 changes: 4 additions & 0 deletions src/Resources/config/services/provider.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,9 @@
<service id="Sylius\RefundPlugin\Provider\UnitRefundedTotalProvider">
<argument type="service" id="sylius_refund.repository.refund" />
</service>

<service id="Sylius\RefundPlugin\Provider\RelatedPaymentIdProviderInterface" class="Sylius\RefundPlugin\Provider\DefaultRelatedPaymentIdProvider">
<argument type="service" id="sylius.repository.order" />
</service>
</services>
</container>