diff --git a/src/BusProNet/XmlLoader/PickupLoader.php b/src/BusProNet/XmlLoader/PickupLoader.php index 0e46d6d..9180a5d 100644 --- a/src/BusProNet/XmlLoader/PickupLoader.php +++ b/src/BusProNet/XmlLoader/PickupLoader.php @@ -61,7 +61,13 @@ class PickupLoader extends AbstractLoader public function patchPickupsDetails(Travel $travel): void { - foreach ($travel->pickupsOutbound as $pickupId => $pickup) { + $travel->pickupsOutbound = $this->patchAndSortPickups($travel->pickupsOutbound); + $travel->pickupsInbound = $this->patchAndSortPickups($travel->pickupsInbound); + } + + private function patchAndSortPickups(array $pickups): array + { + foreach ($pickups as $pickupId => $pickup) { $pickupData = $this->loadById($pickupId); $pickup->code = $pickupData->code; @@ -69,13 +75,24 @@ class PickupLoader extends AbstractLoader $pickup->city = $pickupData->city; $pickup->street = $pickupData->street; } - foreach ($travel->pickupsInbound as $pickupId => $pickup) { - $pickupData = $this->loadById($pickupId); - $pickup->code = $pickupData->code; - $pickup->postalCode = $pickupData->postalCode; - $pickup->city = $pickupData->city; - $pickup->street = $pickupData->street; + uasort($pickups, fn (Pickup $a, Pickup $b): int => $this->comparePickupsByTime($a, $b)); + + return $pickups; + } + + private function comparePickupsByTime(Pickup $a, Pickup $b): int + { + if (null === $a->time && null === $b->time) { + return 0; } + if (null === $a->time) { + return -1; + } + if (null === $b->time) { + return 1; + } + + return $a->time <=> $b->time; } } diff --git a/src/BusProNet/XmlParser/TravelParser.php b/src/BusProNet/XmlParser/TravelParser.php index c7322d2..baac508 100644 --- a/src/BusProNet/XmlParser/TravelParser.php +++ b/src/BusProNet/XmlParser/TravelParser.php @@ -45,13 +45,14 @@ class TravelParser extends AbstractParser $hotelNode = $this->getHotelNode($node, $hotelId); $dateFrom = $this->stringToDate($node->attr('termin')); + $dateTo = $this->stringToDate($node->attr('bis')); $travel = new Travel(); $travel->id = (int) $node->attr('idbuspro'); $travel->hotelId = (int) $hotelNode->attr('idbuspro'); $travel->label = $this->getStringOrNullValue($node->filterXPath('//text')); $travel->dateFrom = $dateFrom; - $travel->dateTo = $this->stringToDate($node->attr('bis')); + $travel->dateTo = $dateTo; $travel->code = $node->attr('code'); $travel->type = $node->attr('reiseart'); $travel->status = $this->getStringOrNullValue($node->filterXPath('//status_hin')); @@ -63,7 +64,7 @@ class TravelParser extends AbstractParser ->getTransportationServices($node->filterXPath('//lei_befoerderung/leistung')); $travel->rooms = $this->getRooms($hotelNode); $travel->pickupsOutbound = $this->getPickups($node->filterXPath('//zustiege/zustieg'), $dateFrom); - $travel->pickupsInbound = $this->getPickups($node->filterXPath('//zustiege_rueck/zustieg_rueck')); + $travel->pickupsInbound = $this->getPickups($node->filterXPath('//zustiege_rueck/zustieg_rueck'), $dateTo); $travel->guide = $this->getGuide($node); return $travel;