Skip to content

Commit 2702b2d

Browse files
Merge pull request #76 from Zales0123/refactor-refund-payment-creation
🌊
2 parents 74c0fbb + 1f297da commit 2702b2d

File tree

7 files changed

+134
-33
lines changed

7 files changed

+134
-33
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace spec\Sylius\RefundPlugin\Event;
6+
7+
use PhpSpec\ObjectBehavior;
8+
9+
final class RefundPaymentGeneratedSpec extends ObjectBehavior
10+
{
11+
function it_represents_an_immutable_fact_that_refund_payment_has_been_generated(): void
12+
{
13+
$this->beConstructedWith(1, '000222', 10000, 'GBP', 2);
14+
15+
$this->id()->shouldReturn(1);
16+
$this->orderNumber()->shouldReturn('000222');
17+
$this->amount()->shouldReturn(10000);
18+
$this->currencyCode()->shouldReturn('GBP');
19+
$this->paymentMethodId()->shouldReturn(2);
20+
}
21+
}

spec/Listener/UnitsRefundedEventListenerSpec.php renamed to spec/ProcessManager/RefundPaymentProcessManagerSpec.php

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,57 +2,68 @@
22

33
declare(strict_types=1);
44

5-
namespace spec\Sylius\RefundPlugin\Listener;
5+
namespace spec\Sylius\RefundPlugin\ProcessManager;
66

77
use Doctrine\ORM\EntityManagerInterface;
88
use PhpSpec\ObjectBehavior;
9+
use Prooph\ServiceBus\EventBus;
10+
use Prophecy\Argument;
911
use Sylius\RefundPlugin\Entity\RefundPaymentInterface;
12+
use Sylius\RefundPlugin\Event\RefundPaymentGenerated;
1013
use Sylius\RefundPlugin\Event\UnitsRefunded;
1114
use Sylius\RefundPlugin\Factory\RefundPaymentFactoryInterface;
1215
use Sylius\RefundPlugin\Model\OrderItemUnitRefund;
1316
use Sylius\RefundPlugin\StateResolver\OrderFullyRefundedStateResolverInterface;
14-
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
15-
use Symfony\Component\HttpFoundation\Session\Session;
1617

17-
final class UnitsRefundedEventListenerSpec extends ObjectBehavior
18+
final class RefundPaymentProcessManagerSpec extends ObjectBehavior
1819
{
1920
function let(
20-
Session $session,
2121
OrderFullyRefundedStateResolverInterface $orderFullyRefundedStateResolver,
2222
RefundPaymentFactoryInterface $refundPaymentFactory,
23-
EntityManagerInterface $entityManager
23+
EntityManagerInterface $entityManager,
24+
EventBus $eventBus
2425
): void {
2526
$this->beConstructedWith(
26-
$session,
2727
$orderFullyRefundedStateResolver,
2828
$refundPaymentFactory,
29-
$entityManager
29+
$entityManager,
30+
$eventBus
3031
);
3132
}
3233

33-
function it_listens_to_units_refunded_event_and_add_success_flash_after_it_occurs(
34-
Session $session,
35-
FlashBagInterface $flashBag,
34+
function it_reacts_on_units_refunded_event_and_creates_refund_payment(
3635
OrderFullyRefundedStateResolverInterface $orderFullyRefundedStateResolver,
3736
RefundPaymentFactoryInterface $refundPaymentFactory,
3837
EntityManagerInterface $entityManager,
39-
RefundPaymentInterface $refundPayment
38+
RefundPaymentInterface $refundPayment,
39+
EventBus $eventBus
4040
): void {
4141
$refundPaymentFactory->createWithData(
4242
'000222',
4343
1000,
4444
'USD',
45-
RefundPaymentInterface::STATE_NEW, 1
45+
RefundPaymentInterface::STATE_NEW,
46+
1
4647
)->willReturn($refundPayment);
4748

4849
$entityManager->persist($refundPayment)->shouldBeCalled();
4950
$entityManager->flush()->shouldBeCalled();
5051

5152
$orderFullyRefundedStateResolver->resolve('000222')->shouldBeCalled();
5253

53-
$session->getFlashBag()->willReturn($flashBag);
54+
$refundPayment->getId()->willReturn(10);
55+
$refundPayment->getOrderNumber()->willReturn('000222');
56+
$refundPayment->getAmount()->willReturn(1000);
5457

55-
$flashBag->add('success', 'sylius_refund.units_successfully_refunded')->shouldBeCalled();
58+
$eventBus->dispatch(Argument::that(function (RefundPaymentGenerated $event): bool {
59+
return
60+
$event->id() === 10 &&
61+
$event->orderNumber() === '000222' &&
62+
$event->amount() === 1000 &&
63+
$event->currencyCode() === 'USD' &&
64+
$event->paymentMethodId() === 1
65+
;
66+
}))->shouldBeCalled();
5667

5768
$this(new UnitsRefunded('000222', [new OrderItemUnitRefund(1, 500), new OrderItemUnitRefund(2, 500)], [1], 1, 1000, 'USD', 'Comment'));
5869
}

src/Action/Admin/RefundUnitsAction.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public function __invoke(Request $request): Response
4343
{
4444
try {
4545
$this->commandBus->dispatch($this->commandCreator->fromRequest($request));
46+
47+
$this->session->getFlashBag()->add('success', 'sylius_refund.units_successfully_refunded');
4648
} catch (CommandDispatchException $exception) {
4749
$this->session->getFlashBag()->add('error', $exception->getPrevious()->getMessage());
4850
} catch (\InvalidArgumentException $exception) {

src/Entity/RefundPaymentInterface.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ interface RefundPaymentInterface extends ResourceInterface
1212
public const STATE_NEW = 'New';
1313
public const STATE_COMPLETED = 'Completed';
1414

15+
public function getOrderNumber(): string;
16+
1517
public function getAmount(): int;
1618

1719
public function getCurrencyCode(): string;
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Sylius\RefundPlugin\Event;
6+
7+
final class RefundPaymentGenerated
8+
{
9+
/** @var int */
10+
private $id;
11+
12+
/** @var string */
13+
private $orderNumber;
14+
15+
/** @var int */
16+
private $amount;
17+
18+
/** @var string */
19+
private $currencyCode;
20+
21+
/** @var int */
22+
private $paymentMethodId;
23+
24+
public function __construct(int $id, string $orderNumber, int $amount, string $currencyCode, int $paymentMethodId)
25+
{
26+
$this->id = $id;
27+
$this->orderNumber = $orderNumber;
28+
$this->amount = $amount;
29+
$this->currencyCode = $currencyCode;
30+
$this->paymentMethodId = $paymentMethodId;
31+
}
32+
33+
public function id(): int
34+
{
35+
return $this->id;
36+
}
37+
38+
public function orderNumber(): string
39+
{
40+
return $this->orderNumber;
41+
}
42+
43+
public function amount(): int
44+
{
45+
return $this->amount;
46+
}
47+
48+
public function currencyCode(): string
49+
{
50+
return $this->currencyCode;
51+
}
52+
53+
public function paymentMethodId(): int
54+
{
55+
return $this->paymentMethodId;
56+
}
57+
}

src/Listener/UnitsRefundedEventListener.php renamed to src/ProcessManager/RefundPaymentProcessManager.php

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,18 @@
22

33
declare(strict_types=1);
44

5-
namespace Sylius\RefundPlugin\Listener;
5+
namespace Sylius\RefundPlugin\ProcessManager;
66

77
use Doctrine\ORM\EntityManagerInterface;
8+
use Prooph\ServiceBus\EventBus;
89
use Sylius\RefundPlugin\Entity\RefundPaymentInterface;
10+
use Sylius\RefundPlugin\Event\RefundPaymentGenerated;
911
use Sylius\RefundPlugin\Event\UnitsRefunded;
1012
use Sylius\RefundPlugin\Factory\RefundPaymentFactoryInterface;
1113
use Sylius\RefundPlugin\StateResolver\OrderFullyRefundedStateResolverInterface;
12-
use Symfony\Component\HttpFoundation\Session\Session;
1314

14-
final class UnitsRefundedEventListener
15+
final class RefundPaymentProcessManager
1516
{
16-
/** @var Session */
17-
private $session;
18-
1917
/** @var OrderFullyRefundedStateResolverInterface */
2018
private $orderFullyRefundedStateResolver;
2119

@@ -25,16 +23,19 @@ final class UnitsRefundedEventListener
2523
/** @var EntityManagerInterface */
2624
private $entityManager;
2725

26+
/** @var EventBus */
27+
private $eventBus;
28+
2829
public function __construct(
29-
Session $session,
3030
OrderFullyRefundedStateResolverInterface $orderFullyRefundedStateResolver,
3131
RefundPaymentFactoryInterface $refundPaymentFactory,
32-
EntityManagerInterface $entityManager
32+
EntityManagerInterface $entityManager,
33+
EventBus $eventBus
3334
) {
34-
$this->session = $session;
3535
$this->orderFullyRefundedStateResolver = $orderFullyRefundedStateResolver;
3636
$this->refundPaymentFactory = $refundPaymentFactory;
3737
$this->entityManager = $entityManager;
38+
$this->eventBus = $eventBus;
3839
}
3940

4041
public function __invoke(UnitsRefunded $event): void
@@ -50,7 +51,14 @@ public function __invoke(UnitsRefunded $event): void
5051
$this->entityManager->persist($refundPayment);
5152
$this->entityManager->flush();
5253

54+
$this->eventBus->dispatch(new RefundPaymentGenerated(
55+
$refundPayment->getId(),
56+
$event->orderNumber(),
57+
$event->amount(),
58+
$event->currencyCode(),
59+
$event->paymentMethodId()
60+
));
61+
5362
$this->orderFullyRefundedStateResolver->resolve($event->orderNumber());
54-
$this->session->getFlashBag()->add('success', 'sylius_refund.units_successfully_refunded');
5563
}
5664
}

src/Resources/config/services/event_bus.xml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,6 @@
66

77
<service id="Prooph\ServiceBus\EventBus" alias="prooph_service_bus.sylius_refund_event_bus" />
88

9-
<service id="Sylius\RefundPlugin\Listener\UnitsRefundedEventListener">
10-
<argument type="service" id="session" />
11-
<argument type="service" id="Sylius\RefundPlugin\StateResolver\OrderFullyRefundedStateResolver" />
12-
<argument type="service" id="Sylius\RefundPlugin\Factory\RefundPaymentFactory" />
13-
<argument type="service" id="doctrine.orm.default_entity_manager" />
14-
<tag name="prooph_service_bus.sylius_refund_event_bus.route_target" message-detection="true" />
15-
</service>
16-
179
<service id="Sylius\RefundPlugin\Listener\CreditMemoGeneratedEventListener">
1810
<argument type="service" id="sylius_refund.repository.credit_memo" />
1911
<argument type="service" id="sylius.repository.order" />
@@ -25,5 +17,13 @@
2517
<argument type="service" id="prooph_service_bus.sylius_refund_command_bus" />
2618
<tag name="prooph_service_bus.sylius_refund_event_bus.route_target" message-detection="true" />
2719
</service>
20+
21+
<service id="Sylius\RefundPlugin\ProcessManager\RefundPaymentProcessManager">
22+
<argument type="service" id="Sylius\RefundPlugin\StateResolver\OrderFullyRefundedStateResolver" />
23+
<argument type="service" id="Sylius\RefundPlugin\Factory\RefundPaymentFactory" />
24+
<argument type="service" id="doctrine.orm.default_entity_manager" />
25+
<argument type="service" id="prooph_service_bus.sylius_refund_event_bus" />
26+
<tag name="prooph_service_bus.sylius_refund_event_bus.route_target" message-detection="true" />
27+
</service>
2828
</services>
2929
</container>

0 commit comments

Comments
 (0)