<?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\ICreateInvoiceByOrderIdService;
use App\Service\App\Merchant\Invoice\Contract\IPayInvoiceService;
use App\Service\App\Merchant\Payment\Event\ConfirmPaymentEvent;
use App\Types\InvoiceStatus;
class ConfirmPaymentListener
{
/**
* Create invoice service
*
* @var ICreateInvoiceByOrderIdService
*/
private ICreateInvoiceByOrderIdService $createInvoiceService;
/**
* 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 ICreateInvoiceByOrderIdService $createInvoiceService
* @param IPayInvoiceService $payInvoiceService
* @param InvoiceCustomFeature $invoiceCustomFeature
* @param IOrderRepository $orderRepository
*/
public function __construct(
ICreateInvoiceByOrderIdService $createInvoiceService,
IPayInvoiceService $payInvoiceService,
InvoiceCustomFeature $invoiceCustomFeature,
IOrderRepository $orderRepository
)
{
$this->createInvoiceService = $createInvoiceService;
$this->payInvoiceService = $payInvoiceService;
$this->invoiceCustomFeature = $invoiceCustomFeature;
$this->orderRepository = $orderRepository;
}
/**
* Listen on confirm payment event
*
* @param ConfirmPaymentEvent $event
* @return void
*/
public function onAction(ConfirmPaymentEvent $event): void
{
if ($this->invoiceCustomFeature->isEnabled()) {
$order = $this->orderRepository->getOrder($event->getRequest()->getId());
$invoice = $order->getInvoice();
$reason = $event->getRequest()->getReason() ?? '';
if ($invoice && $invoice->getStatus() != InvoiceStatus::STATUS_PAID) {
$this->payInvoiceService->perform($invoice->getId(), $reason);
} else if ($order->isAutoMakeInvoiceOnReceive()) {
// skip for 0 amount orders
if (!$order->getAmount()) {
return;
}
$res = $this->createInvoiceService->perform($event->getRequest()->getId());
$this->payInvoiceService->perform($res->getId(), $reason);
}
}
}
}