fix: report an unresolvable hotel instead of failing on it

This commit is contained in:
fromme committed 2026-09-29 15:27:44 +02:00
1 parent 72be779038
commit 2329fe17a0
6 files changed
+317 -7

No files matched your search

@@ -7,27 +7,51 @@ use App\Model\DestinationDto;
trait DestinationTrait
{
/**
* Resolves the chosen boarding points against the base data.
*
* A stop the base data cannot resolve is kept with null city and street rather than dropped,
* the same choice App\Command\MyEpImportCommand makes for the export's own unresolvable ids:
* it is still a real departure point, and App\Service\Common\PickupOptions falls back to
* "Zustieg {busProId}" for one with no town. Dropping it would hide a departure the coach
* actually makes.
*
* The id comes from the form rather than from the resolved stop, so it survives a lookup
* that does not.
*/
private function mapPickups(DestinationDto $destinationDto): array
{
$pickups = [];
foreach ($destinationDto->getPickups() as $pickupId) {
$pickup = $this->pickupDataProvider->get($pickupId);
$pickups[] = [
'busProId' => $pickup->getBusProId(),
'city' => $pickup->getCity(),
'street' => $pickup->getStreet(),
'time' => $pickup->getTime(),
'busProId' => (int) $pickupId,
'city' => $pickup?->getCity(),
'street' => $pickup?->getStreet(),
'time' => $pickup?->getTime(),
];
}
return $pickups;
}
/**
* @throws \LogicException when the hotel does not resolve
*/
private function updateEntity(Destination $destination, DestinationDto $destinationDto): void
{
$hotel = $this->hotelDataProvider->get($destinationDto->getHotelBusProId());
$pickups = $this->mapPickups($destinationDto);
$hotelBusProId = $destinationDto->getHotelBusProId();
// App\Validator\Constraints\ResolvableHotel is what reports this to the operator, on the
// field and in German, and every caller here runs behind $form->isValid(). This is the
// second line only: a caller that skips validation would otherwise write a destination
// with no house name, no cost unit and no country, and nothing reads those back until an
// invoice is stamped. Failing loudly beats a half built row.
if (null === $hotel = $this->hotelDataProvider->get((int) $hotelBusProId)) {
throw new \LogicException(sprintf('Refusing to write destination %s: hotel %s does not resolve against the MyE&P base data', $destination->getId() ?? 'new', var_export($hotelBusProId, true)));
}
$destination
->setProduct($destinationDto->getProduct())
@@ -37,7 +61,7 @@ trait DestinationTrait
->setHotelCode($hotel->getCode())
->setHotelBusProId($hotel->getBusProId())
->setCountry($destinationDto->getCountry())
->setPickups($pickups)
->setPickups($this->mapPickups($destinationDto))
->setCostUnit($hotel->getCostUnit())
;
}