121 lines
3.8 KiB
Markdown
121 lines
3.8 KiB
Markdown
# Body Dimensions Transition Plan (Stakeholder Draft)
|
|
|
|
## Goal
|
|
|
|
Prevent edit-form failures for existing bookings while we transition from legacy body-dimension values to a better long-term field model.
|
|
|
|
This plan introduces a temporary compatibility phase and keeps sunsetting manual and straightforward.
|
|
|
|
## Current Problem
|
|
|
|
- Existing bookings may contain legacy values such as `-148`, `149-157`, or `195+`.
|
|
- Integer-only form fields can fail when these legacy strings are loaded.
|
|
- Result: participant edit forms can crash before submit.
|
|
|
|
## Proposed Transition Strategy
|
|
|
|
Use **text input fields** for body dimensions during transition, with explicit server-side format validation.
|
|
|
|
### Key Decisions
|
|
|
|
- No gating by booking create date.
|
|
- One unified behavior for all bookings.
|
|
- Accept both legacy and numeric formats during transition.
|
|
- Keep manual sunsetting later (no automated migration switch).
|
|
|
|
## Functional Scope
|
|
|
|
Affected fields:
|
|
|
|
- `height`
|
|
- `weight`
|
|
- `shoeSize`
|
|
|
|
Affected components:
|
|
|
|
- `src/Form/BodyDimensionsType.php`
|
|
- `src/Validator/Constraints/ParticipantValidator.php`
|
|
- `src/Form/BookingParticipantType.php` (option passthrough already in place)
|
|
- `config/services.yaml` (ranges remain as validation/config source)
|
|
|
|
## Validation Rules During Transition
|
|
|
|
### Accepted formats
|
|
|
|
- Numeric value: `^\d+$` (e.g. `176`)
|
|
- Legacy lower/open/range tokens:
|
|
- `^-\d+$` (e.g. `-148`)
|
|
- `^\d+\+$` (e.g. `195+`)
|
|
- `^\d+\s*-\s*\d+$` (e.g. `149-157`)
|
|
|
|
### Requiredness
|
|
|
|
- Keep existing rule: body dimensions required when rentals are selected.
|
|
|
|
### Range checks
|
|
|
|
- Keep current numeric range checks based on `body_dimension_ranges`.
|
|
- Apply range checks only to plain numeric values in transition phase.
|
|
|
|
## UX/Behavior Expectations
|
|
|
|
- Existing legacy values render without form initialization errors.
|
|
- New numeric entries are accepted and validated.
|
|
- Invalid free text (e.g. `abc`, `17x`) shows clear validation errors.
|
|
- HTMX refresh behavior remains unchanged.
|
|
|
|
## Implementation Steps
|
|
|
|
1. **Form type change**
|
|
- In `BodyDimensionsType`, replace integer fields with text fields for all three body dimensions.
|
|
- Keep labels/help text; keep placeholders based on configured ranges.
|
|
|
|
2. **Validator extension**
|
|
- Add format validation for all three fields in `ParticipantValidator`.
|
|
- Keep existing required-when-rentals logic.
|
|
- Keep existing range validation for numeric values.
|
|
|
|
3. **Message tuning**
|
|
- Add one clear message for invalid format.
|
|
- Retain existing range message for numeric out-of-range values.
|
|
|
|
4. **Testing and QA**
|
|
- Validate old bookings with legacy values open/edit successfully.
|
|
- Validate numeric path (valid and invalid range).
|
|
- Validate invalid format handling.
|
|
- Validate rental-required behavior.
|
|
|
|
## Acceptance Criteria
|
|
|
|
- No 500 error when editing participants with legacy body-dimension values.
|
|
- Legacy values can be loaded and submitted in transition phase.
|
|
- Numeric values are accepted and range-validated.
|
|
- Invalid text is rejected with a user-facing validation message.
|
|
- Existing participant edit/refresh flows continue to work.
|
|
|
|
## Risks and Mitigations
|
|
|
|
- **Risk:** Free-text field semantics are less strict than integer fields.
|
|
- **Mitigation:** strict server-side regex + range checks.
|
|
|
|
- **Risk:** Inconsistent data representations during transition.
|
|
- **Mitigation:** explicit acceptance policy and manual sunset plan.
|
|
|
|
## Effort Estimate
|
|
|
|
- Implementation: 0.5 day
|
|
- Validation/message tuning: 0.25 day
|
|
- QA/manual testing: 0.5 day
|
|
- **Total:** ~1 to 1.5 days
|
|
|
|
## Manual Sunset Plan (Later)
|
|
|
|
When stakeholders approve end of transition:
|
|
|
|
1. Replace text fields with final semantic field type(s).
|
|
2. Remove legacy format acceptance from validator.
|
|
3. Keep only final numeric/range validation behavior.
|
|
4. Remove transition-specific tests and copy.
|
|
|
|
Expected cleanup effort: ~0.25 to 0.5 day.
|