diff --git a/Cron/SendPendingPaymentReminders.php b/Cron/SendPendingPaymentReminders.php index 373ebe3c158..e43184d1549 100644 --- a/Cron/SendPendingPaymentReminders.php +++ b/Cron/SendPendingPaymentReminders.php @@ -61,7 +61,6 @@ public function __construct( $this->sortOrderFactory = $sortOrderFactory; $this->dateTime = $dateTime; $this->paymentReminder = $paymentReminder; - $this->config = $config; } public function execute() diff --git a/Service/Order/PaymentReminder.php b/Service/Order/PaymentReminder.php index b085ac7eed7..b6ef89a9e58 100644 --- a/Service/Order/PaymentReminder.php +++ b/Service/Order/PaymentReminder.php @@ -8,6 +8,7 @@ use Magento\Framework\Exception\NoSuchEntityException; use Magento\Sales\Api\Data\OrderInterface; +use Magento\Sales\Api\Data\OrderItemInterface; use Magento\Sales\Api\OrderRepositoryInterface; use Magento\Sales\Model\Order; use Mollie\Payment\Api\Data\PendingPaymentReminderInterface; @@ -87,6 +88,20 @@ public function send(PendingPaymentReminderInterface $pendingPaymentReminder): O return $order; } + if (!$this->orderIsInStock($order)) { + $this->logger->addInfoLog( + 'info', + sprintf( + 'On or more products from order #%s are not stock, not sending payment reminder', + $order->getIncrementId() + ) + ); + + $this->pendingPaymentReminderRepository->delete($pendingPaymentReminder); + + return $order; + } + $this->logger->addInfoLog( 'info', sprintf('Preparing to send the payment reminder for order #%s', $order->getIncrementId()) @@ -132,4 +147,16 @@ private function isAlreadySend(OrderInterface $order): bool return false; } } + + private function orderIsInStock(OrderInterface $order): bool + { + /** @var OrderItemInterface $item */ + foreach ($order->getAllVisibleItems() as $item) { + if (!$item->getProduct()->isSaleable()) { + return false; + } + } + + return true; + } } diff --git a/Test/Integration/Service/Order/PaymentReminderTest.php b/Test/Integration/Service/Order/PaymentReminderTest.php index fe854f9fc13..1fe60660390 100644 --- a/Test/Integration/Service/Order/PaymentReminderTest.php +++ b/Test/Integration/Service/Order/PaymentReminderTest.php @@ -2,6 +2,8 @@ namespace Mollie\Payment\Test\Integration\Service\Order; +use Magento\Catalog\Model\Product\Attribute\Source\Status; +use Magento\Sales\Model\Order; use Mollie\Payment\Api\Data\PendingPaymentReminderInterface; use Mollie\Payment\Service\Order\PaymentReminder; use Mollie\Payment\Service\Order\SecondChanceEmail; @@ -31,4 +33,33 @@ public function testDoesNotSendReminderWhenAlreadyPaid(): void $instance->send($pendingPaymentReminder); } + + /** + * @magentoDataFixture Magento/Sales/_files/order.php + * @return void + */ + public function testDoesNotSendReminderWhenProductsNotInStock(): void + { + $order = $this->loadOrder('100000001'); + $order->setState(Order::STATE_PENDING_PAYMENT); + $order->save(); + + foreach ($order->getItems() as $item) { + $item->getProduct()->setStatus(Status::STATUS_DISABLED); + } + + /** @var PendingPaymentReminderInterface $pendingPaymentReminder */ + $pendingPaymentReminder = $this->objectManager->create(PendingPaymentReminderInterface::class); + $pendingPaymentReminder->setOrderId($order->getId()); + + $secondChanceMock = $this->createMock(SecondChanceEmail::class); + $secondChanceMock->expects($this->never())->method('send'); + + /** @var PaymentReminder $instance */ + $instance = $this->objectManager->create(PaymentReminder::class, [ + 'secondChanceEmail' => $secondChanceMock, + ]); + + $instance->send($pendingPaymentReminder); + } }