From 974ddbef1002915b5c2ff22c90f1ec72ac912dea Mon Sep 17 00:00:00 2001 From: Mateusz Date: Thu, 25 Jun 2026 14:42:07 +0200 Subject: [PATCH 1/2] Dispatch OrderPaymentPaid event based on order payment state --- .../OrderPaymentPaidProducer.php | 5 +++- .../OrderPaymentPaidProducerTest.php | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/EventProducer/OrderPaymentPaidProducer.php b/src/EventProducer/OrderPaymentPaidProducer.php index 751fa1b7..d3d1d7ee 100644 --- a/src/EventProducer/OrderPaymentPaidProducer.php +++ b/src/EventProducer/OrderPaymentPaidProducer.php @@ -15,6 +15,7 @@ use Sylius\Component\Core\Model\OrderInterface; use Sylius\Component\Core\Model\PaymentInterface; +use Sylius\Component\Core\OrderPaymentStates; use Sylius\InvoicingPlugin\Doctrine\ORM\InvoiceRepositoryInterface; use Sylius\InvoicingPlugin\Event\OrderPaymentPaid; use Symfony\Component\Clock\ClockInterface; @@ -51,6 +52,8 @@ private function shouldEventBeDispatched(PaymentInterface $payment): bool /** @var OrderInterface $order */ $order = $payment->getOrder(); - return null !== $order && null !== $this->invoiceRepository->findOneByOrder($order); + return null !== $order + && $order->getPaymentState() === OrderPaymentStates::STATE_PAID + && null !== $this->invoiceRepository->findOneByOrder($order); } } diff --git a/tests/Unit/EventProducer/OrderPaymentPaidProducerTest.php b/tests/Unit/EventProducer/OrderPaymentPaidProducerTest.php index 44df02f7..3609290a 100644 --- a/tests/Unit/EventProducer/OrderPaymentPaidProducerTest.php +++ b/tests/Unit/EventProducer/OrderPaymentPaidProducerTest.php @@ -17,6 +17,7 @@ use PHPUnit\Framework\TestCase; use Sylius\Component\Core\Model\OrderInterface; use Sylius\Component\Core\Model\PaymentInterface; +use Sylius\Component\Core\OrderPaymentStates; use Sylius\InvoicingPlugin\Doctrine\ORM\InvoiceRepositoryInterface; use Sylius\InvoicingPlugin\Entity\InvoiceInterface; use Sylius\InvoicingPlugin\Event\OrderPaymentPaid; @@ -42,6 +43,7 @@ public function it_dispatches_order_payment_paid_event_for_payment(): void $payment->method('getOrder')->willReturn($order); $order->method('getNumber')->willReturn('0000001'); + $order->method('getPaymentState')->willReturn(OrderPaymentStates::STATE_PAID); $clock->method('now')->willReturn($dateTime); $invoiceRepository->method('findOneByOrder')->with($order)->willReturn($invoice); @@ -83,6 +85,7 @@ public function it_does_not_dispatch_event_when_there_is_no_invoice_related_to_o $payment->method('getOrder')->willReturn($order); $order->method('getNumber')->willReturn('0000001'); + $order->method('getPaymentState')->willReturn(OrderPaymentStates::STATE_PAID); $invoiceRepository->method('findOneByOrder')->with($order)->willReturn(null); $eventBus->expects($this->never())->method('dispatch'); @@ -91,4 +94,26 @@ public function it_does_not_dispatch_event_when_there_is_no_invoice_related_to_o $producer = new OrderPaymentPaidProducer($eventBus, $clock, $invoiceRepository); $producer($payment); } + + #[Test] + public function it_does_not_dispatch_event_when_order_is_only_partially_paid(): void + { + $eventBus = $this->createMock(MessageBusInterface::class); + $clock = $this->createMock(ClockInterface::class); + $invoiceRepository = $this->createMock(InvoiceRepositoryInterface::class); + $payment = $this->createMock(PaymentInterface::class); + $order = $this->createMock(OrderInterface::class); + $invoice = $this->createMock(InvoiceInterface::class); + + $payment->method('getOrder')->willReturn($order); + $order->method('getNumber')->willReturn('0000001'); + $order->method('getPaymentState')->willReturn(OrderPaymentStates::STATE_PARTIALLY_PAID); + $invoiceRepository->method('findOneByOrder')->with($order)->willReturn($invoice); + + $eventBus->expects($this->never())->method('dispatch'); + $clock->expects($this->never())->method('now'); + + $producer = new OrderPaymentPaidProducer($eventBus, $clock, $invoiceRepository); + $producer($payment); + } } From 7a5eb9ab779d61b93a4bd86f90e5fc976cc06688 Mon Sep 17 00:00:00 2001 From: Mateusz Date: Fri, 26 Jun 2026 08:53:21 +0200 Subject: [PATCH 2/2] [Fix] Set wkhtmltopdf binary path from environment variable --- config/config.yaml | 1 + src/EventProducer/OrderPaymentPaidProducer.php | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index a75863b3..e2de6fa4 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -20,6 +20,7 @@ sylius_mailer: knp_snappy: pdf: enabled: true + binary: '%env(WKHTMLTOPDF_PATH)%' sylius_grid: templates: diff --git a/src/EventProducer/OrderPaymentPaidProducer.php b/src/EventProducer/OrderPaymentPaidProducer.php index d3d1d7ee..7d812fd1 100644 --- a/src/EventProducer/OrderPaymentPaidProducer.php +++ b/src/EventProducer/OrderPaymentPaidProducer.php @@ -52,8 +52,8 @@ private function shouldEventBeDispatched(PaymentInterface $payment): bool /** @var OrderInterface $order */ $order = $payment->getOrder(); - return null !== $order - && $order->getPaymentState() === OrderPaymentStates::STATE_PAID - && null !== $this->invoiceRepository->findOneByOrder($order); + return null !== $order && + $order->getPaymentState() === OrderPaymentStates::STATE_PAID && + null !== $this->invoiceRepository->findOneByOrder($order); } }