<?php
namespace App\Service\App\Merchant\Invoice\Listener;
use App\Repository\Merchant\Contract\IOrderRepository;
use App\Service\App\Merchant\CustomFeature\Implementation\InvoiceCustomFeature;
use App\Service\App\Merchant\Invoice\Contract\ICreateCreditNoteByInvoiceIdService;
use App\Service\App\Merchant\Invoice\Contract\IPayInvoiceService;
use App\Service\App\Merchant\Payment\Event\RefundPaymentEvent;
class RefundPaymentListener
{
/**
* Create credit invoice service
*
* @var ICreateCreditNoteByInvoiceIdService
*/
private ICreateCreditNoteByInvoiceIdService $createCreditNoteByInvoiceIdService;
/**
* Pay invoice service
*
* @var IPayInvoiceService
*/
private IPayInvoiceService $payInvoiceService;
/**
* Invoice custom feature instance
*
* @var InvoiceCustomFeature
*/
private InvoiceCustomFeature $invoiceCustomFeature;
/**
* Order repository
*
* @var IOrderRepository
*/
private IOrderRepository $orderRepository;
/**
* Constructor
*
* @param ICreateCreditNoteByInvoiceIdService $createCreditNoteByInvoiceIdService
* @param IPayInvoiceService $payInvoiceService
* @param InvoiceCustomFeature $invoiceCustomFeature
* @param IOrderRepository $orderRepository
*/
public function __construct(
ICreateCreditNoteByInvoiceIdService $createCreditNoteByInvoiceIdService,
IPayInvoiceService $payInvoiceService,
InvoiceCustomFeature $invoiceCustomFeature,
IOrderRepository $orderRepository
)
{
$this->createCreditNoteByInvoiceIdService = $createCreditNoteByInvoiceIdService;
$this->payInvoiceService = $payInvoiceService;
$this->invoiceCustomFeature = $invoiceCustomFeature;
$this->orderRepository = $orderRepository;
}
/**
* Listen on refund payment event
*
* @param RefundPaymentEvent $event
* @return void
*/
public function onAction(RefundPaymentEvent $event): void
{
if ($this->invoiceCustomFeature->isEnabled() && $event->getRequest()->isMakeCreditInvoice()) {
$order = $this->orderRepository->getOrder($event->getRequest()->getId());
if ($order && $order->getInvoice()) {
$invoice = $this->createCreditNoteByInvoiceIdService->perform(
$order->getInvoice()->getId()
);
$this->payInvoiceService->perform($invoice->getId(), $event->getRequest()->getReason());
}
}
}
}