4.9 KiB
4.9 KiB
Family Booking Detection Issue
Problem Description
The current family booking detection logic in BookingCreateDto::isFamilyBooking() has a critical flaw that causes incorrect classification of booking types, leading to wrong insurance options being displayed.
Current Logic (FLAWED)
// Current implementation in BookingCreateDto::isFamilyBooking()
$adults = 0; // Count of participants >= 18 years
$youngPeople = 0; // Count of participants <= 20 years
foreach ($this->participants as $participant) {
$age = $participant->getAge($travelStartDate);
if ($age >= 18) {
++$adults;
}
if ($age <= 20) {
++$youngPeople;
}
}
$isFamily = ($adults >= 1 && $adults <= 2) && ($youngPeople >= 1);
The Problem
Overlapping Age Ranges: The current logic creates overlapping age categories:
- Adults: ≥18 years
- Young people: ≤20 years
This means participants aged 18-20 are counted as BOTH adults AND young people, causing incorrect family booking detection.
Example Scenario
Booking with 2 participants:
- Participant 1: Born 1980 (age 44 at travel time)
- Participant 2: Born 2000 (age 24 at travel time)
Current logic result:
adults = 2(both participants ≥18)youngPeople = 1(the 24-year-old ≤20)isFamily = (2 >= 1 && 2 <= 2) && (1 >= 1) = true❌
Expected result: This should be classified as an individual/couple booking, not a family booking.
Impact
- Wrong insurance options: Family insurances are shown for individual bookings
- User confusion: Customers see inappropriate insurance options
- Business logic errors: Pricing and eligibility calculations are incorrect
Suggested Solutions
Option 1: Non-Overlapping Age Ranges (Recommended)
// Suggested implementation
$adults = 0; // Count of participants >= 18 years
$children = 0; // Count of participants < 18 years
foreach ($this->participants as $participant) {
$age = $participant->getAge($travelStartDate);
if ($age >= 18) {
++$adults;
} else {
++$children;
}
}
$isFamily = ($adults >= 1) && ($children >= 1);
Benefits:
- No overlapping age ranges
- Clear distinction between adults and children
- Matches insurance industry standards
Option 2: Insurance-Specific Age Ranges
// Alternative implementation based on insurance requirements
$adults = 0; // Count of participants >= 18 years
$minors = 0; // Count of participants < 18 years
foreach ($this->participants as $participant) {
$age = $participant->getAge($travelStartDate);
if ($age >= 18) {
++$adults;
} elseif ($age < 18) {
++$minors;
}
// Note: 18+ year olds are not counted as minors
}
$isFamily = ($adults >= 1) && ($minors >= 1);
Option 3: Configurable Age Thresholds
// More flexible approach with configurable thresholds
private const ADULT_AGE_THRESHOLD = 18;
private const CHILD_AGE_THRESHOLD = 18; // Same as adult threshold for non-overlap
$adults = 0;
$children = 0;
foreach ($this->participants as $participant) {
$age = $participant->getAge($travelStartDate);
if ($age >= self::ADULT_AGE_THRESHOLD) {
++$adults;
} elseif ($age < self::CHILD_AGE_THRESHOLD) {
++$children;
}
}
$isFamily = ($adults >= 1) && ($children >= 1);
Business Rules to Clarify
Before implementing a solution, the following business rules need to be clarified:
-
What defines a "family booking"?
- Must have at least 1 adult (≥18) and at least 1 child (<18)?
- Or can it be 2 adults with children?
- Or any booking with children regardless of adult count?
-
Age thresholds:
- Should 18-year-olds be considered adults or children?
- Are there different rules for different types of services?
-
Edge cases:
- What about bookings with only adults (couples)?
- What about bookings with only children (group bookings)?
Implementation Notes
- The fix should be implemented in
src/Form/Model/BookingCreateDto.php - Update the
isFamilyBooking()method - Add comprehensive unit tests for edge cases
- Consider adding configuration options for age thresholds
- Update documentation to reflect the new business rules
Testing Scenarios
After implementation, test these scenarios:
- Single adult (should be individual booking)
- Two adults (should be couple booking, not family)
- One adult + one child (should be family booking)
- Two adults + one child (should be family booking)
- Only children (edge case - clarify business rule)
- 18-year-old participant (edge case - clarify classification)
Related Files
src/Form/Model/BookingCreateDto.php- Main implementationsrc/Service/InsuranceMatchingService.php- Uses family booking detectiontests/Form/Model/BookingCreateDtoTest.php- Unit tests (to be updated)