'Y-m-d H:i'])] public ?\DateTimeImmutable $time = null; #[Groups(['api:single'])] public ?float $price = null; #[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) { return $label; } if (0.0 === $this->price) { return sprintf('%s (inkl.)', $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, ',', '.')); } }