Files
myep/src/BusProNet/XmlParser/AvailabilitiesParser.php
T

70 lines
2.4 KiB
PHP

<?php
namespace App\BusProNet\XmlParser;
use App\BusProNet\Model\Availability;
use App\BusProNet\Model\BaseData;
use App\BusProNet\Model\Room;
use App\BusProNet\Model\ServiceAvailabilityResponse;
use Symfony\Component\DomCrawler\Crawler;
class AvailabilitiesParser extends AbstractParser
{
public function parseServices(Crawler $result): ServiceAvailabilityResponse
{
$availabilities = [];
$result
->filterXPath('//leistungen/leistung')
->each(function (Crawler $node) use (&$availabilities) {
$availability = new Availability();
$availability->serviceId = (int) $node->attr('id');
$availability->status = $node->attr('status');
$availability->available = (int) $node->attr('frei');
$availability->price = $this->stringToFloat($node->attr('preis'));
$availabilities[$availability->serviceId] = $availability;
})
;
// Parse travel-level booking status from <reise> node
$allowedBookingStatus = [];
$travelStatus = null;
$reiseNode = $result->filterXPath('//reise');
if ($reiseNode->count() > 0) {
$travelStatus = $reiseNode->attr('status');
$bookingStatusPossible = $reiseNode->attr('buchungstatusmoeglich') ?? '';
if ('' !== $bookingStatusPossible) {
$allowedBookingStatus = str_split($bookingStatusPossible);
}
}
return new ServiceAvailabilityResponse($availabilities, $allowedBookingStatus, $travelStatus);
}
public function parseRooms(Crawler $result): BaseData
{
$availabilities = [];
$result
->filterXPath('//unterbringungen/unterbringung')
->each(function (Crawler $node) use (&$availabilities) {
$room = new Room();
$room->id = (int) $node->attr('id_zimmer');
$room->label = (string) $node->attr('bezeichnung');
$room->category = (string) $node->attr('kategorie');
$room->board = (string) $node->attr('verpflegung');
$room->available = (int) $node->attr('frei');
$room->status = (string) $node->attr('status');
$room->price = $this->stringToFloat($node->attr('preis'));
$availabilities[$room->id] = $room;
})
;
return new BaseData($availabilities);
}
}