70 lines
2.4 KiB
PHP
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);
|
|
}
|
|
}
|