fieldStateConditions[$field] = [ 'static_text' => $personalDataHiddenCondition, ]; } // Address fields - render as static text if authenticated user OR participant not mutable $this->fieldStateConditions['address'] = [ 'static_text' => $personalDataHiddenCondition, ]; // Address subfields - render as static text if authenticated user OR participant not mutable $this->fieldStateConditions['address.street'] = [ 'static_text' => $personalDataHiddenCondition, ]; $this->fieldStateConditions['address.postCode'] = [ 'static_text' => $personalDataHiddenCondition, ]; $this->fieldStateConditions['address.city'] = [ 'static_text' => $personalDataHiddenCondition, ]; $this->fieldStateConditions['address.country'] = [ 'static_text' => $personalDataHiddenCondition, ]; // Room assignments are fixed in edit mode - always render as static text // The assignedRoomId value passes through unchanged from the loaded booking data $this->fieldStateConditions['assignedRoomId'] = [ 'static_text' => new BookingModeCondition(BookingDto::MODE_EDIT), ]; // Show remarks room field only when room with code 'mbz' (single bed) is selected $sharedRoomCondition = new RoomSelectionCondition(['mbz']); $this->fieldStateConditions['remarksRoom'] = [ 'hidden' => CompositeCondition::not($sharedRoomCondition), ]; // Conditional visibility for service fields (same as create flow) $rentalCondition = new RentalSelectionCondition(); $skiPassCondition = new SkiPassSelectionCondition(); $dateOfBirthProvidedCondition = new DateOfBirthProvidedCondition(); // Hide body dimensions unless rentals are selected $this->fieldStateConditions['bodyDimensions'] = [ 'hidden' => CompositeCondition::not($rentalCondition), ]; // Age-dependent service fields - hidden until birth date provided (except for first participant who always has DOB) // Also readonly if services not mutable // For first participant in edit mode: DOB is always available (patched from booking), so never hide $hideUntilDobCondition = CompositeCondition::and( CompositeCondition::not($dateOfBirthProvidedCondition), CompositeCondition::not(new FirstParticipantCondition()) // Don't hide for first participant ); $this->fieldStateConditions['courses'] = [ 'hidden' => $hideUntilDobCondition, 'readonly' => $additionalServicesMutabilityCondition, ]; $this->fieldStateConditions['additionalServices'] = [ 'hidden' => $hideUntilDobCondition, 'readonly' => $additionalServicesMutabilityCondition, ]; $this->fieldStateConditions['board'] = [ 'hidden' => $hideUntilDobCondition, 'readonly' => $additionalServicesMutabilityCondition, ]; // Skipass - hidden until birth date (except first participant), readonly if services not mutable $this->fieldStateConditions['skiPass'] = [ 'hidden' => $hideUntilDobCondition, 'readonly' => $additionalServicesMutabilityCondition, ]; // Rentals - shown only when skipass selected, readonly if services not mutable // For first participant: only check skipass, not DOB $this->fieldStateConditions['rentals'] = [ 'hidden' => CompositeCondition::or( $hideUntilDobCondition, CompositeCondition::not($skiPassCondition) ), 'readonly' => $additionalServicesMutabilityCondition, ]; // Rental insurance - shown only when rentals selected, readonly if services not mutable $this->fieldStateConditions['rentalInsurance'] = [ 'hidden' => CompositeCondition::not($rentalCondition), 'readonly' => $additionalServicesMutabilityCondition, ]; // Transportation fields - hidden until birth date (except first participant), readonly if transportation not mutable $this->fieldStateConditions['transportationOutbound'] = [ 'hidden' => $hideUntilDobCondition, 'readonly' => $transportationServicesMutabilityCondition, ]; $this->fieldStateConditions['transportationInbound'] = [ 'hidden' => $hideUntilDobCondition, 'readonly' => $transportationServicesMutabilityCondition, ]; // Pickup field (unified) - shown only when either transportation direction is BUS, readonly if pickups not mutable $this->fieldStateConditions['pickup'] = [ 'hidden' => CompositeCondition::not( CompositeCondition::or( ServiceSubTypeCondition::equals('transportationOutbound', DirectionMapper::SUBTYPE_BUS_API), ServiceSubTypeCondition::equals('transportationInbound', DirectionMapper::SUBTYPE_BUS_API) ) ), 'readonly' => $pickupsMutabilityCondition, ]; // Parking - shown only when outbound transportation is PKW AND participant is 18+, readonly if transportation not mutable // Participants under 18 cannot drive in Germany, so parking is not relevant for them $minimumDrivingAgeCondition = new AgeRangeCondition(18); $this->fieldStateConditions['parking'] = [ 'hidden' => CompositeCondition::or( CompositeCondition::not( ServiceSubTypeCondition::equals('transportationOutbound', DirectionMapper::SUBTYPE_CAR_API) ), CompositeCondition::not($minimumDrivingAgeCondition) ), 'readonly' => $transportationServicesMutabilityCondition, ]; // License plate - shown only when parking selected, readonly if transportation not mutable $this->fieldStateConditions['licensePlate'] = [ 'hidden' => FieldValueCondition::equals('parking', false), 'readonly' => $transportationServicesMutabilityCondition, ]; } }