feat: comprehensive booking overview for confirmation

This commit is contained in:
Björn Fromme
2025-10-06 16:43:55 +02:00
parent 2f582f0548
commit b7b80296e9
4 changed files with 239 additions and 82 deletions
+45
View File
@@ -41,4 +41,49 @@ class Pickup
#[Groups(['api:booking'])]
public array $mapping = [];
/**
* Gets the formatted label for the pickup location without pricing.
*
* Creates user-friendly labels following the pattern:
* - Primary format: "City (Street)" if street is available
* - Fallback format: "City" if no street information
*
* @return string The formatted pickup location label
*/
public function getLabel(): string
{
$label = $this->city ?? '';
if (null !== $this->street && '' !== trim($this->street)) {
$label .= ' ('.$this->street.')';
}
return $label;
}
/**
* Gets the formatted label with pricing information.
*
* Formats the pickup label with price display:
* - Zero/null price: Just the label without price suffix
* - Positive price: "Label (€X,XX)" as surcharge
* - Negative price: "Label (-X,XX€ Rabatt)" as discount
*
* @return string The formatted pickup label with pricing
*/
public function getLabelWithPrice(): string
{
$label = $this->getLabel();
if (null === $this->price || 0.0 === $this->price) {
return $label;
}
if ($this->price < 0) {
return sprintf('%s (-%s€ Rabatt)', $label, number_format(abs($this->price), 2, ',', '.'));
}
return sprintf('%s (€%s)', $label, number_format($this->price, 2, ',', '.'));
}
}
+18
View File
@@ -228,4 +228,22 @@ class Travel
return $result;
}
/**
* Retrieves a room by its ID.
*
* @param int|null $roomId The room ID to search for
*
* @return Room|null The room with the matching ID, or null if not found
*/
public function getRoomById(?int $roomId): ?Room
{
if (null === $roomId) {
return null;
}
$rooms = $this->getRoomsByIds([$roomId]);
return false === empty($rooms) ? reset($rooms) : null;
}
}