diff --git a/src/BusProNet/DataProcessor/BookingDataProcessor.php b/src/BusProNet/DataProcessor/BookingDataProcessor.php index b7f9596..c8d275c 100644 --- a/src/BusProNet/DataProcessor/BookingDataProcessor.php +++ b/src/BusProNet/DataProcessor/BookingDataProcessor.php @@ -14,6 +14,7 @@ use App\BusProNet\Utility\DirectionMapper; use App\Form\Model\BankAccountDto; use App\Form\Model\BookingDto; use App\Form\Model\ParticipantDto; +use App\Form\Model\RoomSelectionDto; use App\Service\BookingPriceCalculatorService; use App\Service\InsuranceService; @@ -132,6 +133,22 @@ class BookingDataProcessor $dto->participants[$index] = $participantData; } + // Rebuild roomSelections array from booking room data + // This is needed for conditions like SingleRoomTypeCondition that rely on roomSelections + // The booking already contains rooms with actual quantities (anzahl from XML) + $availableRooms = $travel->getAvailableRooms(); + foreach ($booking->rooms as $bookingRoom) { + $room = $availableRooms[$bookingRoom->id] ?? null; + if (null !== $room && null !== $bookingRoom->totalCount && $bookingRoom->totalCount > 0) { + $roomSelection = new RoomSelectionDto(); + $roomSelection->roomId = $bookingRoom->id; + $roomSelection->roomLabel = $room->label; + $roomSelection->roomPrice = $room->price; + $roomSelection->quantity = $bookingRoom->totalCount; // Actual quantity from booking XML (anzahl) + $dto->roomSelections[] = $roomSelection; + } + } + return $dto; } diff --git a/src/Form/Service/CreateFieldStateProvider.php b/src/Form/Service/CreateFieldStateProvider.php index 3cbea12..8ac3a58 100644 --- a/src/Form/Service/CreateFieldStateProvider.php +++ b/src/Form/Service/CreateFieldStateProvider.php @@ -262,9 +262,9 @@ class CreateFieldStateProvider extends AbstractFieldStateProvider 'required' => new ApplicantCondition(), ]; - // Hide assignedRoomId field when only one room type is selected (auto-assigned by RoomAssignmentService) + // Render assignedRoomId field as static text when only one room type is selected (auto-assigned by RoomAssignmentService) $this->fieldStateConditions['assignedRoomId'] = [ - 'hidden' => new SingleRoomTypeCondition(), + 'static_text' => new SingleRoomTypeCondition(), ]; // Example field state conditions would be registered here diff --git a/src/Form/Service/EditFieldStateProvider.php b/src/Form/Service/EditFieldStateProvider.php index b43497b..27aae15 100644 --- a/src/Form/Service/EditFieldStateProvider.php +++ b/src/Form/Service/EditFieldStateProvider.php @@ -16,6 +16,7 @@ use App\Form\Service\Condition\PersonalDataMutabilityCondition; use App\Form\Service\Condition\PickupsMutabilityCondition; use App\Form\Service\Condition\RentalSelectionCondition; use App\Form\Service\Condition\ServiceSubTypeCondition; +use App\Form\Service\Condition\SingleRoomTypeCondition; use App\Form\Service\Condition\SkiPassSelectionCondition; use App\Form\Service\Condition\TransportationServicesMutabilityCondition; @@ -96,6 +97,12 @@ class EditFieldStateProvider extends AbstractFieldStateProvider 'static_text' => $personalDataHiddenCondition, ]; + // Render assignedRoomId field as static text when only one room type is selected (auto-assigned by RoomAssignmentService) + // Same logic as create mode - render as static text when only one room type available + $this->fieldStateConditions['assignedRoomId'] = [ + 'static_text' => new SingleRoomTypeCondition(), + ]; + // Conditional visibility for service fields (same as create flow) $rentalCondition = new RentalSelectionCondition(); $skiPassCondition = new SkiPassSelectionCondition(); diff --git a/templates/booking/_participant_form.html.twig b/templates/booking/_participant_form.html.twig index cf9b44d..e4a33a7 100644 --- a/templates/booking/_participant_form.html.twig +++ b/templates/booking/_participant_form.html.twig @@ -136,22 +136,16 @@ {# Room assignment #}
- {% if form.assignedRoomId is defined %} - {{ form_row(form.assignedRoomId, { - 'attr': { - 'hx-trigger': 'change', - 'hx-post': path(refreshRouteName, refreshRouteParams|default({index: participantIndex})), - 'hx-target': '#main-content', - 'hx-swap': 'innerHTML' - } - }) }} - {% else %} - {# Display room label directly when only one room type selected (auto-assigned) #} -
- -
{{ bookingDto.singleRoomLabel }}
-
- {% endif %} + {% set assignedRoom = bookingDto.travel.getRoomById(form.vars.data.participant.assignedRoomId) %} + {% set roomLabel = assignedRoom ? assignedRoom.label : 'Kein Zimmer zugewiesen' %} + {{ macros.field_or_static(form, 'assignedRoomId', 'Zimmer', roomLabel, bookingDto, participantIndex, { + 'attr': { + 'hx-trigger': 'change', + 'hx-post': path(refreshRouteName, refreshRouteParams|default({index: participantIndex})), + 'hx-target': '#main-content', + 'hx-swap': 'innerHTML' + } + }) }} {% if form.remarksRoom is defined %} {{ form_row(form.remarksRoom) }} {% endif %}