Files
myep/src/BusProNet/ApiResponseParser/ResponseParser.php
T
2024-11-20 18:32:09 +01:00

56 lines
2.2 KiB
PHP

<?php
namespace App\BusProNet\ApiResponseParser;
use App\BusProNet\ApiClient;
use App\BusProNet\Exception\ResponseParserException;
class ResponseParser
{
/**
* @throws ResponseParserException
*/
public function parseXmlString(string $type, string $content): mixed
{
$xml = simplexml_load_string($content);
// Override type when present in XML to catch error responses
$responseType = $type;
$responseTypeXml = $xml->xpath('satz/@typ');
if (0 < count($responseTypeXml)) {
$responseType = (string) $xml->xpath('satz/@typ')[0];
}
switch ($responseType) {
case ApiClient::TYPE_NOTIFICATION:
return (new NotificationResponseParser())->parse($xml);
case ApiClient::TYPE_CUSTOMER_DATA:
$subType = (string) $xml->art;
switch ($subType) {
case 'Adressdaten':
case 'Adressdaten_Ändern':
return (new PersonalDataResponseParser())->parse($xml);
case 'SelektionCRM':
case 'SelektionCRM_Ändern':
return (new CrmAttributesResponseParser())->parse($xml);
case 'Vorgänge':
return (new BookingsResponseParser())->parse($xml);
case 'Vorgang_Details':
return (new BookingResponseParser())->parse($xml);
case 'Dokumentdruck':
return (new DocumentsResponseParser())->parseDocuments($xml);
case 'Vorgangdruck':
return (new DocumentsResponseParser())->parseConfirmation($xml);
}
break;
case ApiClient::TYPE_BASE_DATA_COUNTRIES:
return (new CountriesResponseParser())->parse($xml);
case ApiClient::TYPE_MUTABLE_FIELDS:
return (new MutableFieldsResponseParser())->parse($xml);
case ApiClient::TYPE_AVAILABILITY:
return (new AvailabilitiesResponseParser())->parse($xml);
}
throw new ResponseParserException('Unable to parse XML response');
}
}