wip: improved refresh logic
This commit is contained in:
@@ -266,4 +266,58 @@ class BookingService
|
||||
|
||||
return $oldSnapshot !== $newSnapshot;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pre-selects mandatory services for all participants in the booking DTO.
|
||||
*
|
||||
* This method ensures that mandatory services are selected before form rendering
|
||||
* and pricing calculations, resolving timing issues where mandatory services
|
||||
* were only selected during form rendering via choice_attr callbacks.
|
||||
*
|
||||
* @param BookingCreateDto $bookingDto The booking DTO to update with mandatory services
|
||||
*/
|
||||
public function preselectMandatoryServices(BookingCreateDto $bookingDto): void
|
||||
{
|
||||
$additionalServices = $bookingDto->travel->getAdditionalServicesBySubTypes(\App\BusProNet\Constants::TOKEN_ADDITIONAL);
|
||||
$mandatoryServices = array_filter($additionalServices, fn ($service) => true === $service->mandatory);
|
||||
|
||||
// Pre-select mandatory services for each participant
|
||||
foreach ($bookingDto->participants as $participant) {
|
||||
if (null === $participant->dateOfBirth) {
|
||||
continue; // Skip participants without age information
|
||||
}
|
||||
|
||||
// Get age-appropriate mandatory services for this participant
|
||||
$ageAppropriateServices = array_filter($mandatoryServices, function ($service) use ($bookingDto, $participant) {
|
||||
// Use the age evaluator service to check if service is appropriate for participant age
|
||||
if (null === $service->ageFrom && null === $service->ageTo) {
|
||||
return true; // No age restrictions
|
||||
}
|
||||
|
||||
$age = $participant->dateOfBirth->diff($bookingDto->travel->dateFrom)->y;
|
||||
|
||||
if (null !== $service->ageFrom && $age < $service->ageFrom) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (null !== $service->ageTo && $age > $service->ageTo) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
// Add mandatory services to current selections
|
||||
$currentSelections = $participant->additionalServices ?? [];
|
||||
$currentServiceIds = array_map(fn ($service) => $service->id, $currentSelections);
|
||||
|
||||
foreach ($ageAppropriateServices as $mandatoryService) {
|
||||
if (false === in_array($mandatoryService->id, $currentServiceIds, true)) {
|
||||
$currentSelections[] = $mandatoryService;
|
||||
}
|
||||
}
|
||||
|
||||
$participant->additionalServices = $currentSelections;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user