*/ #[Assert\Valid] public array $participants = []; public static function fromBooking(Booking $booking, Travel $travel): static { $instance = new static(); $instance->booking = $booking; $instance->travel = $travel; foreach ($booking->participants as $index => $participant) { /** @var PersonalData $participant */ $participantData = ParticipantDto::fromPersonalData($participant); $participantData->index = $index; $participantData->courses = $booking ->getAdditionalServicesForParticipantByGroup($index, Constants::TOKEN_COURSES); $participantData->skiPass = $booking ->getAdditionalServicesForParticipantByGroup($index, Constants::TOKEN_SKI_PASS); $participantData->additionalServices = $booking ->getAdditionalServicesForParticipantByGroup($index, Constants::TOKEN_ADDITIONAL); $participantData->board = $booking ->getAdditionalServicesForParticipantByGroup($index, Constants::TOKEN_BOARD); $participantData->rentals = $booking ->getAdditionalServicesForParticipantByGroup($index, Constants::TOKEN_RENTALS); // Different keys for direction used in booking data (H <=> HIN, R <=> RUECK)! $participantData->transportationServiceTo = $booking ->getTransportationServiceForParticipantAndDirection($index, 'H'); $participantData->transportationServiceFro = $booking ->getTransportationServiceForParticipantAndDirection($index, 'R'); $participantData->pickup = $booking->getPickupForParticipant($index); $instance->participants[$index] = $participantData; } return $instance; } public function isCanceled(): bool { return 'S' === $this->booking->status; } public function isOption(): bool { return 'O' === $this->booking->status; } public function getParticipants(): array { return $this->participants; } public function getTravel(): Travel { return $this->travel; } public function hasParticipant(int $index): bool { return isset($this->participants[$index]); } public function getParticipant(int $index): ?ParticipantDto { return $this->participants[$index] ?? null; } /** * Gets all selected rooms for the booking (edit context). * * @return array Always returns an empty array for edit DTOs unless implemented. */ public function getSelectedRooms(): array { return []; } }