feat: persist travel snapshots and refresh extended availability
This commit is contained in:
1 parent
c1ab6d8687
commit
bc7fb794bf
31 files changed
+2328
-91
No files matched your search
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\BusProNet\XmlParser;
|
||||
|
||||
use App\BusProNet\Model\ExtendedAvailability;
|
||||
use App\BusProNet\Model\ExtendedServiceAvailabilityResponse;
|
||||
use Symfony\Component\DomCrawler\Crawler;
|
||||
|
||||
/**
|
||||
* Parser for VERFUEGBARKEIT2 service payloads.
|
||||
*
|
||||
* Extracts extended service-level attributes (dates, times, hints, constraints)
|
||||
* plus optional travel-level booking-status metadata.
|
||||
*/
|
||||
class ExtendedAvailabilitiesParser extends AbstractParser
|
||||
{
|
||||
/**
|
||||
* Parses extended availability services from API result node.
|
||||
*/
|
||||
public function parseServices(Crawler $result): ExtendedServiceAvailabilityResponse
|
||||
{
|
||||
$availabilities = [];
|
||||
|
||||
$result
|
||||
->filterXPath('//leistungen/leistung')
|
||||
->each(function (Crawler $node) use (&$availabilities) {
|
||||
$serviceId = (int) $node->attr('id');
|
||||
|
||||
$availability = new ExtendedAvailability();
|
||||
$availability->serviceId = $serviceId;
|
||||
$availability->status = $node->attr('status');
|
||||
$availability->available = (int) $node->attr('frei');
|
||||
$availability->price = $this->stringToFloat($node->attr('preis'));
|
||||
$availability->dateFrom = $this->stringToDate($node->attr('termin'));
|
||||
$availability->dateTo = $this->stringToDate($node->attr('bis'));
|
||||
$availability->timeFrom = $node->attr('uhrzeit_von');
|
||||
$availability->description = $node->attr('hinweis');
|
||||
|
||||
$ageFrom = $node->attr('altervon');
|
||||
if (null !== $ageFrom && '' !== trim($ageFrom)) {
|
||||
$availability->ageFrom = (int) $ageFrom;
|
||||
}
|
||||
|
||||
$ageTo = $node->attr('alterbis');
|
||||
if (null !== $ageTo && '' !== trim($ageTo)) {
|
||||
$availability->ageTo = (int) $ageTo;
|
||||
}
|
||||
|
||||
$mandatory = $node->attr('pflicht');
|
||||
if (null !== $mandatory && '' !== trim($mandatory)) {
|
||||
$availability->mandatory = $this->stringToBool($mandatory);
|
||||
}
|
||||
|
||||
$availabilities[$serviceId] = $availability;
|
||||
})
|
||||
;
|
||||
|
||||
$allowedBookingStatus = [];
|
||||
$travelStatus = null;
|
||||
$reiseNode = $result->filterXPath('//reise');
|
||||
|
||||
if (0 < $reiseNode->count()) {
|
||||
$travelStatus = $reiseNode->attr('status');
|
||||
|
||||
$bookingStatusPossible = $reiseNode->attr('buchungstatusmoeglich') ?? '';
|
||||
if ('' !== trim($bookingStatusPossible)) {
|
||||
$allowedBookingStatus = str_split($bookingStatusPossible);
|
||||
}
|
||||
}
|
||||
|
||||
return new ExtendedServiceAvailabilityResponse($availabilities, $allowedBookingStatus, $travelStatus);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user