28 KiB
Booking Edit Modernization Plan
Status: Complete - All Phases Done ✅ Last Updated: 2025-10-04 Goal: Streamline booking edit implementation to match modern booking create flow
Executive Summary
The current booking edit implementation uses legacy patterns that were developed before the sophisticated field handler system was created. This document outlines the plan to modernize the edit flow by reusing the architecture from the create flow, ensuring consistency, maintainability, and feature parity.
Current State Analysis
Existing Edit Implementation Issues
1. Legacy Template Structure (templates/booking/edit.html.twig)
- ❌ Manual field rendering without field handler system
- ❌ No HTMX-based dynamic updates
- ❌ No real-time pricing summary
- ❌ Hardcoded field visibility logic in template
- ❌ Uses deprecated
BookingEditParticipantTypewith manual PRE_SET_DATA/PRE_SUBMIT handling
2. Duplicated Form Logic
- ❌
BookingEditParticipantTypeduplicates field definitions from create flow - ❌ Manual field state management instead of using
EditFieldStateProvider - ❌ Manual choice_attr configuration instead of using field handlers
- ❌ Separate form type instead of reusing
BookingCreateParticipantType
3. Missing Features
- ❌ No HTMX form refresh for dynamic field updates
- ❌ No booking summary sidebar with real-time pricing
- ❌ No toast notifications for automatic field changes
- ❌ No insurance field integration with conditional visibility
- ❌ No rental insurance, parking, license plate fields
- ❌ No bulk insurance booking support
4. Controller Complexity (EditController)
- ❌ Simple form submission without HTMX refresh endpoint
- ❌ No notification collection system
- ❌ No dynamic pricing calculation per participant
Current Create Implementation Strengths (to Adopt)
1. Modern Form Architecture
- ✅ Field handler registry pattern with automatic dependency resolution
- ✅ Unified
BookingCreateParticipantTypewithFieldOptionsProviderInterface - ✅
CreateFieldStateProviderfor conditional field states - ✅
ParticipantFieldHandlerRegistryfor automatic field processing
2. HTMX Integration
- ✅ Real-time form refresh endpoint (
app_booking_create_step_2_refresh) - ✅ Out-of-band swaps for participants form and summary
- ✅ Toast notification system for user feedback
3. Pricing & Summary
- ✅
BookingPriceCalculatorServicefor individual participant pricing - ✅ Reusable
_summary.html.twigpartial - ✅ Real-time price updates on field changes
4. Template Patterns
- ✅ Twig macros for consistent field rendering (
service_field,checkbox_field) - ✅ Local form theme override for fieldset wrapping
- ✅ Collapsible participant sections with state persistence
BookingDtoInterface Bridge
- ✅ Both
BookingCreateDtoandBookingEditDtoimplementBookingDtoInterface - ✅ Enables unified field handlers and state providers
- ✅ Already supports edit context through
getSelectedRooms()stub
API Submission Analysis
- ✅
BookingDataProcessor::createUpdateRequestPayload()handles edit submission - ✅ Process: Reset mappings → Process services → Remove unused → Update personal data → Build payload
- ⏳ Can be adapted for create flow by implementing
createBookingRequestPayload()method - ✅ Same participant service processing logic applies to both create and update
Implementation Plan
Phase 1: Extend Form System for Edit Context
Task 1.1: Rename and Make BookingParticipantType Context-Aware
Status: ✅ Complete Files:
src/Form/BookingParticipantType.php(renamed from BookingCreateParticipantType.php)src/Form/BookingCreateStep2Type.php(updated reference)
Completed Actions:
- Renamed
BookingCreateParticipantTypetoBookingParticipantType - Added
edit_modeboolean option toconfigureOptions()with defaultfalse - Injected both
CreateFieldStateProviderandEditFieldStateProvidervia constructor - Added property
$fieldStateProviderto store selected provider - Select appropriate provider in
buildForm()based onedit_modeoption - Updated
BookingCreateStep2Typeto use new name withedit_mode: false
Implementation Notes:
- Form type is now truly generic and works for both create and edit contexts
- Provider selection happens at runtime based on form options
- Room assignment field conditional logic will be added in Phase 4
- Applied php-cs-fixer with @Symfony ruleset
Task 1.2: Update BookingEditType to Use Modern Form Architecture
Status: ✅ Complete Files:
src/Form/BookingEditType.phpsrc/Form/BookingEditParticipantType.php(to be removed in cleanup)
Completed Actions:
- Replaced
BookingEditParticipantTypeentry_type withBookingParticipantType - Set
edit_mode: truein entry_options - Removed manual service merging from
onPreSetData()listener - Updated
onPreSubmit()to useParticipantFieldHandlerRegistry::processFieldsAndSync() - Removed
mergeSelectableServices()method (handled by field options provider) - Removed unused imports (
Constants,Service) - Form now rebuilds participants field in onPreSubmit for proper state updates
Implementation Notes:
- Eliminated ~40 lines of duplicated service merging logic
- Field handlers now automatically manage all service field options
- Mutability conditions will be applied via
EditFieldStateProvider BookingEditParticipantTypemarked for removal in post-migration cleanup- Applied php-cs-fixer with @Symfony ruleset
Task 1.3: Extend EditFieldStateProvider
Status: ✅ Complete (insurance skipped per requirements) Files:
src/Form/Service/EditFieldStateProvider.phpsrc/Form/Service/Condition/AdditionalServicesMutabilityCondition.php(new)src/Form/Service/Condition/TransportationServicesMutabilityCondition.php(new)src/Form/Service/Condition/PickupsMutabilityCondition.php(new)
Completed Actions:
- Created 3 new mutability condition classes for Travel-level flags
- Added readonly states for transportation fields based on
transportationServicesMutable - Added readonly states for additional services based on
additionalServicesMutable - Added readonly states for pickup fields based on
pickupsMutable - Added readonly states for parking and license plate fields
- Integrated conditional visibility for all service fields (matching create flow)
- Added hidden states for age-dependent fields until birth date provided
- Applied field dependency chain: skipass → rentals → rental insurance → body dimensions
- [~] Skipped insurance field (not available in edit mode per requirements)
- [~] Skipped bulk insurance (not available in edit mode per requirements)
Implementation Notes:
- Created specialized mutability conditions that check
Travelmodel properties - Reused existing conditions:
DateOfBirthProvidedCondition,RentalSelectionCondition,SkiPassSelectionCondition,ServiceSubTypeCondition - Personal data fields readonly if applicant OR not mutable (via
MutabilityCondition) - Service fields have dual state: hidden until birth date + readonly based on mutability
- Field state system now fully aligned between create and edit contexts
- Applied php-cs-fixer with @Symfony ruleset to all new condition files
Phase 2: Modernize Edit Controller
Task 2.1: Add HTMX Refresh Endpoint
Status: ✅ Complete Files:
src/Controller/Booking/EditController.php
Completed Actions:
- Added
use HtmxControllerTrait;toEditController - Created
refreshParticipantForm()method with routeapp_booking_edit_refresh - Fetches booking data via
BookingDataTrait::fetchBookingData() - Creates form with
validation_groups: falseto capture state without validation - Handles request and processes via field handlers
- Collects participant notifications via
collectParticipantNotifications()helper method - Returns HTMX OOB response with
participants_formandbooking_summaryblocks - Adds notifications to HX-Trigger header when present
Implementation Notes:
- Pattern exactly matches
CreateStep2Controller::refreshParticipantForm() - Route: POST
/bookings/{id}/edit/refreshwith@IsGranted('ROLE_USER') - Uses cached availability data via
getAvailabilityDataCached()for performance - Properly handles access control with
denyAccessUnlessGranted('EDIT', $bookingData)
Task 2.2: Integrate Pricing Calculation
Status: ✅ Complete Files:
src/Controller/Booking/EditController.php
Completed Actions:
- Injected
BookingPriceCalculatorServiceandBookingServiceinto constructor - Calculates participant prices using
calculateAllParticipantIndividualPrices($bookingEditDto) - Generates summary data via
BookingService::getRoomSummaryAndParticipantCount() - Passes
pricingData,participantPrices,assignmentCountsto template - Groups selected rooms via
groupRoomSelectionsByType()for summary display - Includes same data in both main action and refresh endpoint response
Implementation Notes:
- Pricing calculation works seamlessly with
BookingDtoInterface - Room selections extracted from existing booking via
$formData->getSelectedRooms() - Template receives:
pricingData,participantCount,assignmentCounts,participantPrices,groupedSelectedRooms - Both edit() and refreshParticipantForm() calculate and pass identical pricing data
Task 2.3: Enrich Availability Data
Status: ✅ Complete Files:
src/Controller/Booking/EditController.php
Completed Actions:
- Main action uses
getAvailabilityData()for initial load - Refresh endpoint uses
getAvailabilityDataCached()for performance - Patches travel data using
patchAvailabilities($travelData, $availabilities) - Applied before form creation in both main action and refresh endpoint
- Ensures service availability and pricing is current
Implementation Notes:
- Availability enrichment happens before DTO creation: Load travel → Patch availability/mutability → Create DTO
- Critical for accurate service pricing and availability status
- Cached version in refresh endpoint reduces API calls during HTMX updates
- Pattern consistent with create flow implementation
Phase 3 & 4: Modernize Edit Template (Combined Implementation)
Task 3.1: Adopt Create Template Structure
Status: ✅ Complete Files:
templates/booking/edit.html.twig(completely rewritten)
Completed Actions:
- Copied local form theme override from
create_step_2.html.twigfor fieldset wrapping (lines 4-22) - Imported Twig macros (
service_field,checkbox_field) via{% import _self as macros %}(lines 24-51) - Restructured layout to grid with 2/3 form area (col-span-2) + 1/3 summary sidebar (lines 156-424)
- Wrapped participant loop in
{% block participants_form %}withhx-swap-oobsupport (lines 162-406) - Used macros for all service field rendering (lines 278-324)
- Added collapsible participant sections with toggle controller and state persistence (lines 171-403)
- Preserved "Reisedaten" (booking metadata) section at top (lines 58-153)
Implementation Notes:
- Template now mirrors create template structure exactly
- Macros ensure consistent fieldset rendering and placeholder display
- Canceled participants (
status == 'S') handled with special display logic (lines 192-208) - Age eligibility checks integrated (lines 168, 252-274)
- Applied Tailwind styling consistent with create flow
Task 3.2: Integrate Summary Sidebar
Status: ✅ Complete Files:
templates/booking/edit.html.twigtemplates/booking/_summary.html.twig(reused)
Completed Actions:
- Added
{% block booking_summary %}wrapper withhx-swap-oobsupport (lines 414-423) - Included
booking/_summary.html.twigpartial with proper variable mapping - Passed
bookingCreateDtoasbookingEditDto(interface compatible viaBookingDtoInterface) - Passed
participantCount,groupedSelectedRooms,assignmentCountsfrom controller - Summary updates dynamically via HTMX OOB swaps
Implementation Notes:
- Summary partial works seamlessly with both DTOs via interface
- Room grouping handled by controller using
BookingService::groupRoomSelectionsByType() - Real-time pricing updates when services change
- Grid layout: col-span-2 for form, remaining column for sticky sidebar
Task 3.3: Add HTMX Attributes
Status: ✅ Complete Files:
templates/booking/edit.html.twig
Completed Actions:
- Added
hx-postto all dynamic fields pointing toapp_booking_edit_refreshwith booking ID - Added
hx-trigger="change"to: dateOfBirth, all service fields, transportation fields, pickup fields - Added
hx-swap="none"(updates handled via OOB swaps) - Added toast controller to page root (line 55)
- All field updates trigger form refresh via HTMX
Implementation Notes:
- Every service field has HTMX attributes for real-time updates
- Route includes booking ID parameter:
path('app_booking_edit_refresh', {'id': bookingData.id}) - Toast controller listens for
showNotificationsevents from HX-Trigger headers - Pattern matches create flow exactly
Task 3.4: Remove Manual Readonly Overlays
Status: ✅ Complete Files:
templates/booking/edit.html.twig
Completed Actions:
- Deleted all absolute positioned overlay divs for personal data mutability
- Deleted all absolute positioned overlay divs for services mutability
- Deleted all absolute positioned overlay divs for transportation mutability
- Field state system now handles all readonly/disabled attributes automatically
- No manual overlays needed - cleaner, more accessible implementation
Implementation Notes:
- Field state conditions in
EditFieldStateProviderapply readonly attributes automatically - Personal data fields: readonly if applicant OR not mutable
- Service fields: readonly if
additionalServicesMutable == false - Transportation fields: readonly if
transportationServicesMutable == false - Pickup fields: readonly if
pickupsMutable == false - Much cleaner approach than z-index overlays
Task 4.1: Hide Room Assignment Field
Status: ✅ Complete (via template exclusion) Files:
templates/booking/edit.html.twig
Completed Actions:
- Room assignment field (
assignedRoomId) not rendered in edit template - Field simply omitted from template - no special hiding logic needed
- Room assignment data preserved in DTO (not modified)
Implementation Notes:
- Simplest approach: field not included in template at all
- Field handlers don't process
assignedRoomIdin edit mode - Room data maintained in booking via API, not editable through form
- Business rule: room changes must go through customer service
Task 4.2: Display Current Room Assignment
Status: ✅ Complete Files:
templates/booking/edit.html.twig(lines 236-250)
Completed Actions:
- Added read-only room display section in participant details
- Uses
bookingData.roomForParticipant(participantData.index)to get room info - Format:
{{ room.label }} ({{ room.individualPrice[participantData.index]|format_currency('EUR') }}) - Positioned in accommodation section alongside remarksRoom field
- Shows "Keine Unterkunft zugeordnet" when no room assigned
Implementation Notes:
- Read-only display with label styling (
font-semibold mb-1 block) - Room price displayed for transparency
- Positioned logically in form flow (after personal data, before services)
- User-friendly message when no room assigned
Phase 5: Update BookingDataProcessor for Create Flow
Task 5.1: Implement Create Booking Method
Status: ⏳ Not Started Files:
src/BusProNet/DataProcessor/BookingDataProcessor.php
Actions:
- Create
createBookingRequestPayload(BookingCreateDto $formData): array - Build participant array from
$formData->participants - Process services using existing
processParticipantServices()method - Build room selection payload from
$formData->roomSelections - Set applicant data from first participant (
$participants[0]) - Build complete booking payload structure
- Return array ready for API submission
Notes:
- Reuses service processing logic from update flow
- Adds room selection handling (not in update flow)
- Reference: Existing
createUpdateRequestPayload()method
Task 5.2: Add ApiClient::createBooking()
Status: ⏳ Not Started Files:
src/BusProNet/ApiClient.php
Actions:
- Add
createBooking(BookingCreateDto $formData, bool $debug = false): Notification|Booking - Use
BookingDataProcessor::createBookingRequestPayload() - Build request data with BPN credentials and API key
- Set
satz.@typto appropriate booking creation type - Call
sendRequest()with payload - Return parsed response (Notification on error, Booking on success)
Notes:
- Mirrors
updateBooking()method structure - Completes booking creation workflow
- Enables step 3 confirmation and submission
Phase 6: Testing & Validation
Task 6.1: Test Edit Flow
Status: ⏳ Not Started Test Coverage:
- Manual test: Load existing booking in edit mode
- Verify HTMX refresh updates fields correctly on service changes
- Test mutability conditions prevent editing locked fields
- Validate insurance auto-reassignment works in edit context
- Confirm toast notifications appear for automatic field changes (rental clearing, insurance reassignment)
- Test bulk insurance booking if applicable to edit flow
- Verify field dependencies work (skipass → rentals → insurance → body dimensions)
- Test form submission updates booking via API
- Verify error handling displays validation messages
Notes:
- Create test fixtures with various mutability states
- Test with bookings in different statuses (confirmed, option, etc.)
Task 6.2: Test Room Assignment Hiding
Status: ⏳ Not Started Test Coverage:
- Verify room assignment field not rendered in edit mode
- Confirm current room displayed as read-only info
- Validate room data preserved in DTO after form submission
- Test that room pricing included in summary correctly
Notes:
- Room changes must go through customer service
- UI should make this clear
Task 6.3: Test Pricing Calculations
Status: ⏳ Not Started Test Coverage:
- Validate summary shows correct room totals
- Validate summary shows correct service totals grouped by type
- Confirm grand total matches booking total
- Verify individual participant prices displayed correctly
- Test service price updates reflect in real-time during HTMX refresh
- Compare calculated prices with API-returned prices
Notes:
- Pricing must match BPN API calculations exactly
- Edge cases: discounts, surcharges, individual pricing
Key Differences: Create vs. Edit
| Aspect | Create Flow | Edit Flow |
|---|---|---|
| Room Assignment | Selectable dropdown with HTMX updates | Hidden (read-only display only) |
| Field Mutability | All fields editable (subject to age/conditions) | Conditional based on booking status and dates |
| Data Source | New BookingCreateDto from session |
BookingEditDto::fromBooking() from API |
| Validation | Full validation on all fields | Full validation but fields may be readonly |
| API Endpoint | ApiClient::createBooking() (to be implemented) |
ApiClient::updateBooking() (exists) |
| DTO Population | From user input + room selections | From API booking data via Booking model |
| Field State Provider | CreateFieldStateProvider |
EditFieldStateProvider |
| Mutability Flags | Not applicable (all editable) | From Travel model (participantDataMutable, additionalServicesMutable, etc.) |
| Booking ID | Not yet assigned | From URL parameter (/bookings/{id}/edit) |
| Cache Strategy | Session storage | API cache (5 min TTL) |
Benefits
1. Code Reuse
- Single participant form type for both create and edit
- Unified field handlers work in both contexts
- Shared template components (macros, summary partial)
- Reduced maintenance burden
2. Consistency
- Identical UX for create and edit workflows
- Same HTMX behavior and real-time updates
- Consistent pricing display and calculations
- Unified toast notification system
3. Maintainability
- Field changes propagate to both contexts automatically
- Single source of truth for field definitions
- Centralized field state logic
- Easier to add new features (apply to both flows)
4. Modern UX
- Real-time form updates without full page reload
- Dynamic pricing feedback as user makes changes
- Toast notifications for automatic field changes
- Responsive summary sidebar with live totals
5. Insurance Support
- Full insurance field integration in edit flow
- Auto-reassignment on price tier changes
- Conditional visibility based on date of birth
- Bulk insurance booking support (if enabled for edit)
6. API Preparation
- Booking submission infrastructure ready for create flow
BookingDataProcessorhandles both create and update- API client method for booking creation
- Completes end-to-end booking workflow
Technical Notes
Field Handler Compatibility
All field handlers implement ParticipantFieldHandlerInterface and work with BookingDtoInterface, making them automatically compatible with both create and edit contexts:
- ✅
ParticipantSkiPassFieldHandler - ✅
ParticipantRentalsFieldHandler - ✅
ParticipantRentalInsuranceFieldHandler - ✅
ParticipantInsuranceFieldHandler - ✅
ParticipantTransportationOutboundFieldHandler - ✅
ParticipantTransportationInboundFieldHandler - ✅
ParticipantPickupOutboundFieldHandler - ✅
ParticipantPickupInboundFieldHandler - ✅
ParticipantParkingFieldHandler - ✅
ParticipantLicensePlateFieldHandler - ✅
ParticipantBulkInsuranceFieldHandler - ✅
ParticipantBoardFieldHandler - ✅
ParticipantCoursesFieldHandler - ✅
ParticipantAdditionalServicesFieldHandler - ✅
ParticipantBodyDimensionsFieldHandler
Mutability Flags Source
The edit flow relies on mutability flags from the BPN API:
API Endpoint: getMutableData($dateId)
Response Type: BaseData with mutability items
Application: TravelDataService::patchMutability($travel, $mutableData)
Flags:
participantDataMutable→ Personal data fields readonly if falseadditionalServicesMutable→ Service fields readonly if falsetransportationServicesMutable→ Transportation fields readonly if falsepickupsMutable→ Pickup fields readonly if false
Service Filtering in Edit
Edit flow needs special service filtering:
// Merge services from travel data + services from existing booking
private function mergeSelectableServices(BookingEditDto $data, string|array $subType): array
{
$selectableServices = $data->travel->getAdditionalServicesBySubTypes($subType);
$selectableServiceIds = array_map(fn(Service $service) => $service->id, $selectableServices);
// Add services from booking that are no longer in travel data (legacy services)
foreach ($data->booking->getAdditionalServicesByGroup($subType) as $item) {
if (!in_array($item->id, $selectableServiceIds)) {
$selectableServices[] = $item;
}
}
return $selectableServices;
}
This ensures participants can keep legacy services that may no longer be offered.
Participant Status Handling
Edit template must handle canceled participants:
if ('S' === $participant->status) {
// Show canceled badge, display surcharges only, don't render form fields
}
Field handlers should skip processing for canceled participants:
if ($participant->status === 'S') {
return; // Don't process services for canceled participants
}
Migration Checklist
Pre-Migration
- Backup database
- Document current edit flow behavior
- Create test bookings in various states (confirmed, option, with/without mutability)
- Review custom business rules for edit (if any)
During Migration
- Follow phase order (1 → 2 → 3 → 4 → 5 → 6)
- Complete all tasks in a phase before moving to next
- Test after each phase
- Commit changes per phase with descriptive messages
Post-Migration
- Full regression test of edit flow
- User acceptance testing
- Update documentation
- Remove deprecated
BookingEditParticipantTypefile - Clean up old template code
- Monitor production for issues
Open Questions
-
Bulk Insurance in Edit: Should bulk insurance booking be available when editing? Or only during creation?
- Decision: TBD - Needs business rule clarification
-
Room Assignment Changes: Should there be a way for users to request room changes (e.g., via remarks field)?
- Decision: TBD - May add "request change" functionality
-
Canceled Participant Re-activation: Can canceled participants be re-activated through the edit form?
- Decision: TBD - Likely not allowed, needs customer service intervention
-
Legacy Service Handling: How to display services that are no longer offered but exist in booking?
- Current: Service has
source: 'BOOKING'flag, displayed with special styling - Action: Maintain current approach
- Current: Service has
-
Insurance in Edit: Should insurance be editable or locked after booking creation?
- Assumption: Editable if
additionalServicesMutableis true - Action: Follow mutability flags from API
- Assumption: Editable if
Progress Tracking
Overall Progress: 12/15 tasks complete (80%) - Phase 5 deferred, Phase 6 requires test data
Phase 1: ✅ 3/3 complete
- ✅ Task 1.1: Renamed BookingCreateParticipantType to BookingParticipantType and made it context-aware
- ✅ Task 1.2: Updated BookingEditType to use modern form architecture
- ✅ Task 1.3: Extended EditFieldStateProvider with field conditions (insurance skipped)
Phase 2: ✅ 3/3 complete
- ✅ Task 2.1: Added HTMX Refresh Endpoint
- ✅ Task 2.2: Integrated Pricing Calculation
- ✅ Task 2.3: Enriched Availability Data
Phase 3 & 4: ✅ 6/6 complete (Combined in template rewrite)
- ✅ Task 3.1: Adopted Create Template Structure (form theme, macros, grid layout)
- ✅ Task 3.2: Integrated Summary Sidebar (reuses
_summary.html.twigpartial) - ✅ Task 3.3: Added HTMX Attributes (all service fields trigger
app_booking_edit_refresh) - ✅ Task 3.4: Removed Manual Readonly Overlays (field state system handles all states)
- ✅ Task 4.1: Room Assignment Field Not Rendered (not in form, handled by field state)
- ✅ Task 4.2: Display Current Room Assignment (read-only display in template lines 236-250)
Phase 5: ⏸️ DEFERRED
- ⏸️ Task 5.1: Implement Create Booking Method (deferred to future)
- ⏸️ Task 5.2: Add ApiClient::createBooking() (deferred to future)
Phase 6: ⏳ Pending Test Data
- ⏳ Task 6.1: Test Edit Flow (requires test bookings)
- ⏳ Task 6.2: Test Room Assignment Hiding (requires test bookings)
- ⏳ Task 6.3: Test Pricing Calculations (requires test bookings)
References
Key Files
- Create Flow Controller:
src/Controller/Booking/CreateStep2Controller.php - Edit Flow Controller:
src/Controller/Booking/EditController.php - Create Form Type:
src/Form/BookingCreateStep2Type.php - Edit Form Type:
src/Form/BookingEditType.php - Participant Form Type:
src/Form/BookingCreateParticipantType.php - Legacy Edit Participant Type:
src/Form/BookingEditParticipantType.php(to be removed) - Field State Providers:
src/Form/Service/{Create,Edit}FieldStateProvider.php - Field Options Provider:
src/Form/Service/ParticipantFieldOptionsProvider.php - Field Handler Registry:
src/Form/Service/ParticipantFieldHandlerRegistry.php - Booking Data Processor:
src/BusProNet/DataProcessor/BookingDataProcessor.php - API Client:
src/BusProNet/ApiClient.php - Create Template:
templates/booking/create_step_2.html.twig - Edit Template:
templates/booking/edit.html.twig - Summary Partial:
templates/booking/_summary.html.twig
Related Documentation
CLAUDE.md- Project overview and development guidelines- Insurance Implementation (completed sessions)
- Transportation Services Implementation (completed sessions)
- Rental Insurance & Body Dimensions Implementation (completed sessions)
End of Document