<?php
namespace App\InsuranceCompany\Uniqa\SOAP\Subscriber;
use App\InsuranceCompany\Common\Type\ResultProviderInterface;
use App\InsuranceCompany\Uniqa\Exception\Exception;
use App\InsuranceCompany\Uniqa\SOAP\Generated\Type\GetPolicyDueInstallmentResult;
use App\InsuranceCompany\Uniqa\SOAP\Generated\Type\Info;
use App\InsuranceCompany\Uniqa\SOAP\Interfaces\ResultInterface;
use Phpro\SoapClient\Event\ResponseEvent;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use UnexpectedValueException;
/**
* Class ErrorHandlingSubscriber
*/
class ErrorHandlingSubscriber implements EventSubscriberInterface
{
/**
* Constructor
*
* @param LoggerInterface $logger
*/
public function __construct(
private readonly LoggerInterface $logger,
)
{
}
/**
* @param ResponseEvent $event
* @throws Exception
*/
public function onClientResponse(ResponseEvent $event)
{
$response = $event->getResponse();
if (!($response instanceof ResultProviderInterface)) {
throw new UnexpectedValueException('Response type is not a result provider');
}
$result = $response->getResult();
if (!($result instanceof ResultInterface)) {
throw new UnexpectedValueException('Result type is not a result');
}
$this->logger->info('Correlation ID: ' . $result->getCorrelationID());
$status = $result->getStatus();
$statusCode = $status->getStatusType();
if ($statusCode === 0) {
return;
}
$info = $status->getInfo()->getArray();
// Even if there are no unpaid installments, client name is returned and used in
// installment payment request
if ($result instanceof GetPolicyDueInstallmentResult) {
$noUnpaidInstallmentsInfo = array_filter($info, static fn(Info $info) =>
$info->getType() === 'ERROR' && $info->getCode() === 'PSM-401'
);
if (count($noUnpaidInstallmentsInfo) > 0) {
return;
}
}
throw Exception::fromInfoAndStatus($info, $statusCode);
}
/**
* {@inheritdoc}
* @noinspection PhpArrayShapeAttributeCanBeAddedInspection
*/
public static function getSubscribedEvents(): array
{
return [
ResponseEvent::class => 'onClientResponse',
];
}
}