fix: adapt changes in create mode for edit mode, cleanup

This commit is contained in:
Björn Fromme
2025-10-24 17:30:41 +02:00
parent b63804df88
commit ba0eab9e96
5 changed files with 82 additions and 79 deletions
@@ -15,6 +15,7 @@ use App\Entity\User;
use App\Form\BookingEditType;
use App\Form\BookingParticipantType;
use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantEditDto;
use App\Form\Service\ParticipantFieldHandlerRegistry;
use App\Htmx\HxTrait;
use App\Security\Crypt;
@@ -244,10 +245,15 @@ class IndexController extends AbstractController
return $this->redirectToRoute('app_booking_edit', ['id' => $id]);
}
// Create wrapper DTO for email uniqueness validation
$wrapper = new ParticipantEditDto(
participant: $participant,
bookingContext: $bookingDto,
);
// Create form for participant with booking context
$form = $this->createForm(BookingParticipantType::class, $participant, [
$form = $this->createForm(BookingParticipantType::class, $wrapper, [
'booking_context' => $bookingDto,
'edit_mode' => true,
'validation_groups' => ['booking_edit'],
]);
@@ -327,10 +333,15 @@ class IndexController extends AbstractController
? $this->travelDataService->getMutabilityData($bookingData->dateId)
: null;
// Create wrapper DTO for form
$wrapper = new ParticipantEditDto(
participant: $bookingDto->participants[$index],
bookingContext: $bookingDto,
);
// Create form with validation disabled
$form = $this->createForm(BookingParticipantType::class, $bookingDto->participants[$index], [
$form = $this->createForm(BookingParticipantType::class, $wrapper, [
'booking_context' => $bookingDto,
'edit_mode' => true,
'validation_groups' => false,
]);
+1 -1
View File
@@ -42,7 +42,7 @@ class BookingParticipantType extends AbstractType
/** @var BookingDto $bookingContext */
$bookingContext = $options['booking_context'];
// Select field state provider based on edit_mode option
// Select field state provider based on booking mode
$this->fieldStateProvider = BookingDto::MODE_EDIT === $bookingContext->getMode()
? $this->editFieldStateProvider
: $this->createFieldStateProvider;
@@ -10,7 +10,7 @@ use App\Form\Service\Contract\FieldConditionInterface;
/**
* Condition that determines if personal data fields should be hidden for authenticated users.
*
* When a participant is linked to an existing BPN account (has addressId and personId),
* When a participant is linked to an existing BPN account (has personId),
* their personal data should not be editable during the booking process. Changes to
* master personal data should only happen through the dedicated personal data management
* interface to prevent:
@@ -18,6 +18,10 @@ use App\Form\Service\Contract\FieldConditionInterface;
* - Disconnecting bookings from the user's account
* - Data inconsistencies between booking and account data
*
* Note: In edit mode, the BPN API may not return addressId in booking responses,
* so we rely on personId alone to identify authenticated users. The personId is
* sufficient to link a participant to an existing BPN account.
*
* When this condition is satisfied (returns true), the template should:
* - Hide the form fields for personal data
* - Display the values as static, read-only text
@@ -46,9 +50,10 @@ class AuthenticatedUserPersonalDataCondition implements FieldConditionInterface
return false;
}
// Hide personal data fields if participant has BPN account IDs
// (indicates prepopulation from authenticated user)
return null !== $participant->addressId && null !== $participant->personId;
// Hide personal data fields if participant has BPN person ID
// In edit mode, bookings may not include addressId, so we check personId only
// The personId alone is sufficient to identify a participant linked to a BPN account
return null !== $participant->personId;
}
/**
+30 -1
View File
@@ -8,6 +8,7 @@ use App\BusProNet\Utility\DirectionMapper;
use App\Form\Service\Abstract\AbstractFieldStateProvider;
use App\Form\Service\Condition\AdditionalServicesMutabilityCondition;
use App\Form\Service\Condition\ApplicantCondition;
use App\Form\Service\Condition\AuthenticatedUserPersonalDataCondition;
use App\Form\Service\Condition\CompositeCondition;
use App\Form\Service\Condition\DateOfBirthProvidedCondition;
use App\Form\Service\Condition\FieldValueCondition;
@@ -43,7 +44,12 @@ class EditFieldStateProvider extends AbstractFieldStateProvider
$transportationServicesMutabilityCondition = new TransportationServicesMutabilityCondition();
$pickupsMutabilityCondition = new PickupsMutabilityCondition();
// Authenticated user personal data protection
// Hide personal data fields for participants linked to BPN accounts (prevents duplicate records)
$authenticatedUserCondition = new AuthenticatedUserPersonalDataCondition();
// Make all personal data fields readonly if participant not mutable
// OR hidden if participant is linked to BPN account (authenticated user)
// Note: First participant is now treated as independent from applicant and can be edited
$personalDataFields = [
'firstName',
@@ -56,15 +62,38 @@ class EditFieldStateProvider extends AbstractFieldStateProvider
];
foreach ($personalDataFields as $field) {
$this->fieldStateConditions[$field] = [
'hidden' => $authenticatedUserCondition,
'readonly' => CompositeCondition::not(new MutabilityCondition()),
];
}
// Address fields - readonly if participant not mutable
// Address fields - hidden for authenticated users, readonly if participant not mutable
$this->fieldStateConditions['address'] = [
'hidden' => $authenticatedUserCondition,
'readonly' => CompositeCondition::not(new MutabilityCondition()),
];
// Address subfields - must be hidden to prevent creating duplicate BPN records
$this->fieldStateConditions['address.street'] = [
'hidden' => $authenticatedUserCondition,
];
$this->fieldStateConditions['address.postCode'] = [
'hidden' => $authenticatedUserCondition,
];
$this->fieldStateConditions['address.city'] = [
'hidden' => $authenticatedUserCondition,
];
$this->fieldStateConditions['address.country'] = [
'hidden' => $authenticatedUserCondition,
];
$this->fieldStateConditions['address.district'] = [
'hidden' => $authenticatedUserCondition,
];
// Conditional visibility for service fields (same as create flow)
$rentalCondition = new RentalSelectionCondition();
$skiPassCondition = new SkiPassSelectionCondition();