feat: promotional and purchase vouchers

This commit is contained in:
Björn Fromme
2025-11-20 18:41:46 +01:00
parent 26681e5c62
commit aaa7e9f4c3
21 changed files with 847 additions and 6 deletions
@@ -69,6 +69,10 @@ class ApiResponseParser extends AbstractParser
return (new TravelParser())->parse($travelNode->first(), ...$additionalArgs);
case ApiClient::TYPE_AGENCIES:
return (new AgencyParser())->parse($resultNode);
case ApiClient::TYPE_PURCHASE_VOUCHER:
return (new PurchaseVoucherParser())->parse($resultNode);
case ApiClient::TYPE_PROMO_VOUCHER:
return (new PromoVoucherParser())->parse($resultNode);
}
throw new ResponseParserException('Unable to parse XML response');
@@ -0,0 +1,32 @@
<?php
declare(strict_types=1);
namespace App\BusProNet\XmlParser;
use App\BusProNet\Model\PromoVoucher;
use Symfony\Component\DomCrawler\Crawler;
final class PromoVoucherParser extends AbstractParser
{
public function parse(Crawler $node): PromoVoucher
{
$voucherNode = $node->filterXPath('//aktionsgutschein');
$code = trim($voucherNode->attr('code') ?? '');
$description = trim($voucherNode->attr('text') ?? '');
$applicability = $voucherNode->attr('pro_buchung_person') ?? '';
$discountAmount = $this->stringToFloat($voucherNode->attr('wert_betrag') ?? '0,00');
$discountPercentage = $this->stringToFloat($voucherNode->attr('wert_prozent') ?? '0,00');
$minimumPrice = $this->stringToFloat($voucherNode->attr('ab_preis') ?? '0,00');
return new PromoVoucher(
code: $code,
description: $description,
applicability: $applicability,
discountAmount: $discountAmount,
discountPercentage: $discountPercentage,
minimumPrice: $minimumPrice
);
}
}
@@ -0,0 +1,30 @@
<?php
declare(strict_types=1);
namespace App\BusProNet\XmlParser;
use App\BusProNet\Model\PurchaseVoucher;
use Symfony\Component\DomCrawler\Crawler;
final class PurchaseVoucherParser extends AbstractParser
{
public function parse(Crawler $node): PurchaseVoucher
{
$voucherNode = $node->filterXPath('//gutschein');
$voucherNumber = $this->getStringOrNullValue($voucherNode->filterXPath('//gutscheinnnr')) ?? '';
$redemptionCode = $this->getStringOrNullValue($voucherNode->filterXPath('//einloesecode')) ?? '';
$voucherId = $this->getIntOrNullValue($voucherNode->filterXPath('//idgutschein')) ?? 0;
$remainingBalance = $this->getFloatOrNullValue($voucherNode->filterXPath('//betrag')) ?? 0.0;
$type = $this->getStringOrNullValue($voucherNode->filterXPath('//art')) ?? '';
return new PurchaseVoucher(
voucherNumber: $voucherNumber,
redemptionCode: $redemptionCode,
voucherId: $voucherId,
remainingBalance: $remainingBalance,
type: $type
);
}
}