feat: fetch additional content from cms via api
This commit is contained in:
@@ -9,6 +9,7 @@ use App\Controller\Booking\Traits\BookingExceptionHandlerTrait;
|
||||
use App\Form\BookingCreateStep1Type;
|
||||
use App\Htmx\HxTrait;
|
||||
use App\Service\BookingService;
|
||||
use App\Service\BookingSummaryDataService;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
@@ -28,6 +29,7 @@ class Step1Controller extends AbstractController
|
||||
|
||||
public function __construct(
|
||||
private readonly BookingService $bookingService,
|
||||
private readonly BookingSummaryDataService $summaryDataService,
|
||||
) {
|
||||
}
|
||||
|
||||
@@ -46,8 +48,6 @@ class Step1Controller extends AbstractController
|
||||
// Get or create baseline snapshot for change detection
|
||||
$oldRoomSelectionSnapshot = $this->bookingService->getOrCreateBaselineSnapshot($request, $bookingCreateDto);
|
||||
|
||||
$summary = $this->bookingService->getRoomSummaryAndParticipantCount($bookingCreateDto);
|
||||
|
||||
// Validate step access - allow step 1 or redirect to current step
|
||||
if ($redirect = $this->validateStepAccess($bookingCreateDto, 1)) {
|
||||
return $redirect;
|
||||
@@ -79,6 +79,9 @@ class Step1Controller extends AbstractController
|
||||
return $this->hxRedirect($request, $this->generateUrl('app_booking_create_step_2'));
|
||||
}
|
||||
|
||||
// Get complete summary data (pricing, rooms, CMS data)
|
||||
$summary = $this->summaryDataService->getSummaryData($bookingCreateDto);
|
||||
|
||||
$availableRooms = $bookingCreateDto->travel->getAvailableRooms();
|
||||
$groupedRooms = $this->bookingService->groupRoomsBySelectionType($availableRooms);
|
||||
$groupedSelectedRooms = $this->bookingService->groupRoomSelectionsByType($summary['selectedRooms'], $availableRooms);
|
||||
@@ -87,7 +90,8 @@ class Step1Controller extends AbstractController
|
||||
'bookingCreateDto' => $bookingCreateDto,
|
||||
'roomSummary' => $summary['selectedRooms'],
|
||||
'participantCount' => $summary['participantCount'],
|
||||
'pricingData' => $summary['pricing'],
|
||||
'pricingData' => $summary['pricingData'],
|
||||
'cmsData' => $summary['cmsData'],
|
||||
'form' => $form->createView(),
|
||||
'groupedRooms' => $groupedRooms,
|
||||
'groupedSelectedRooms' => $groupedSelectedRooms,
|
||||
@@ -115,7 +119,8 @@ class Step1Controller extends AbstractController
|
||||
|
||||
$this->bookingService->saveBookingCreateDto($request, $bookingCreateDto);
|
||||
|
||||
$summary = $this->bookingService->getRoomSummaryAndParticipantCount($bookingCreateDto);
|
||||
// Get complete summary data (pricing, rooms, CMS data)
|
||||
$summary = $this->summaryDataService->getSummaryData($bookingCreateDto);
|
||||
$availableRooms = $bookingCreateDto->travel->getAvailableRooms();
|
||||
$groupedRooms = $this->bookingService->groupRoomsBySelectionType($availableRooms);
|
||||
$groupedSelectedRooms = $this->bookingService->groupRoomSelectionsByType($summary['selectedRooms'], $availableRooms);
|
||||
@@ -129,7 +134,8 @@ class Step1Controller extends AbstractController
|
||||
'form' => $form->createView(),
|
||||
'bookingCreateDto' => $bookingCreateDto,
|
||||
'participantCount' => $summary['participantCount'],
|
||||
'pricingData' => $summary['pricing'],
|
||||
'pricingData' => $summary['pricingData'],
|
||||
'cmsData' => $summary['cmsData'],
|
||||
'groupedRooms' => $groupedRooms,
|
||||
'groupedSelectedRooms' => $groupedSelectedRooms,
|
||||
]
|
||||
|
||||
@@ -12,8 +12,8 @@ use App\Form\Model\BookingDto;
|
||||
use App\Form\Model\ParticipantDto;
|
||||
use App\Form\Service\ParticipantFieldOptionsProvider;
|
||||
use App\Htmx\HxTrait;
|
||||
use App\Service\BookingPriceCalculatorService;
|
||||
use App\Service\BookingService;
|
||||
use App\Service\BookingSummaryDataService;
|
||||
use App\Service\ParticipantCardDataService;
|
||||
use App\Service\ParticipantPrepopulationService;
|
||||
use App\Service\RoomAssignmentService;
|
||||
@@ -38,7 +38,7 @@ class Step2Controller extends AbstractController
|
||||
|
||||
public function __construct(
|
||||
private readonly BookingService $bookingService,
|
||||
private readonly BookingPriceCalculatorService $priceCalculator,
|
||||
private readonly BookingSummaryDataService $summaryDataService,
|
||||
private readonly TravelDataService $travelDataService,
|
||||
private readonly RoomAssignmentService $roomAssignmentService,
|
||||
private readonly ParticipantCardDataService $participantCardService,
|
||||
@@ -99,18 +99,16 @@ class Step2Controller extends AbstractController
|
||||
? $this->participantCardService->getAllCardsDataWithValidation($bookingCreateDto)
|
||||
: $this->generateAllCardsData($bookingCreateDto);
|
||||
|
||||
// Calculate summary data
|
||||
$summaryData = $this->calculateSummaryData($bookingCreateDto);
|
||||
|
||||
// Get detailed pricing data for summary sidebar
|
||||
$summary = $this->bookingService->getRoomSummaryAndParticipantCount($bookingCreateDto);
|
||||
// Get complete summary data (pricing, rooms, CMS data)
|
||||
$summaryData = $this->summaryDataService->getSummaryData($bookingCreateDto);
|
||||
|
||||
$templateData = [
|
||||
'form' => $form->createView(),
|
||||
'bookingDto' => $bookingCreateDto,
|
||||
'cardsData' => $cardsData,
|
||||
'summaryData' => $summaryData,
|
||||
'pricingData' => $summary['pricing'],
|
||||
'pricingData' => $summaryData['pricingData'],
|
||||
'cmsData' => $summaryData['cmsData'],
|
||||
];
|
||||
|
||||
// HTMX request: render blocks only
|
||||
@@ -160,18 +158,16 @@ class Step2Controller extends AbstractController
|
||||
return $this->hxRedirect($request, $this->generateUrl('app_booking_create_step_2'));
|
||||
}
|
||||
|
||||
// Calculate summary data for sidebar
|
||||
$summaryData = $this->calculateSummaryData($bookingDto);
|
||||
|
||||
// Get detailed pricing data for summary sidebar
|
||||
$summary = $this->bookingService->getRoomSummaryAndParticipantCount($bookingDto);
|
||||
// Get complete summary data (pricing, rooms, CMS data)
|
||||
$summaryData = $this->summaryDataService->getSummaryData($bookingDto);
|
||||
|
||||
$templateData = [
|
||||
'form' => $form->createView(),
|
||||
'participantIndex' => $index,
|
||||
'bookingDto' => $bookingDto,
|
||||
'summaryData' => $summaryData,
|
||||
'pricingData' => $summary['pricing'],
|
||||
'pricingData' => $summaryData['pricingData'],
|
||||
'cmsData' => $summaryData['cmsData'],
|
||||
'refreshRouteName' => 'app_booking_create_step_2_participant_refresh',
|
||||
'submitRouteName' => 'app_booking_create_step_2_participant',
|
||||
];
|
||||
|
||||
@@ -12,8 +12,8 @@ use App\Controller\Booking\Traits\BookingExceptionHandlerTrait;
|
||||
use App\Form\BookingCreateStep3Type;
|
||||
use App\Form\Model\BookingDto;
|
||||
use App\Htmx\HxTrait;
|
||||
use App\Service\BookingPriceCalculatorService;
|
||||
use App\Service\BookingService;
|
||||
use App\Service\BookingSummaryDataService;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\Form\FormInterface;
|
||||
@@ -32,8 +32,8 @@ class Step3Controller extends AbstractController
|
||||
|
||||
public function __construct(
|
||||
private readonly BookingService $bookingService,
|
||||
private readonly BookingSummaryDataService $summaryDataService,
|
||||
private readonly ApiClient $apiClient,
|
||||
private readonly BookingPriceCalculatorService $priceCalculator,
|
||||
private readonly LoggerInterface $logger,
|
||||
) {
|
||||
}
|
||||
@@ -172,10 +172,19 @@ class Step3Controller extends AbstractController
|
||||
*/
|
||||
private function renderStepForm(BookingDto $bookingCreateDto, FormInterface $form): Response
|
||||
{
|
||||
// Get complete summary data (pricing, rooms, CMS data)
|
||||
$summaryData = $this->summaryDataService->getSummaryData($bookingCreateDto);
|
||||
$availableRooms = $bookingCreateDto->travel->getAvailableRooms();
|
||||
$groupedSelectedRooms = $this->bookingService->groupRoomSelectionsByType($summaryData['selectedRooms'], $availableRooms);
|
||||
|
||||
return $this->render('booking/create/step_3.html.twig', [
|
||||
'bookingCreateDto' => $bookingCreateDto,
|
||||
'form' => $form->createView(),
|
||||
...$this->getSummaryVariables($bookingCreateDto),
|
||||
'participantCount' => $summaryData['participantCount'],
|
||||
'pricingData' => $summaryData['pricingData'],
|
||||
'cmsData' => $summaryData['cmsData'],
|
||||
'assignmentCounts' => $summaryData['assignmentCounts'],
|
||||
'groupedSelectedRooms' => $groupedSelectedRooms,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ use App\Form\Model\BookingDto;
|
||||
use App\Htmx\HxTrait;
|
||||
use App\Service\BookingPriceCalculatorService;
|
||||
use App\Service\BookingService;
|
||||
use App\Service\BookingSummaryDataService;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\Form\FormInterface;
|
||||
@@ -32,6 +33,7 @@ class Step4Controller extends AbstractController
|
||||
|
||||
public function __construct(
|
||||
private readonly BookingService $bookingService,
|
||||
private readonly BookingSummaryDataService $summaryDataService,
|
||||
private readonly BookingPriceCalculatorService $priceCalculator,
|
||||
private readonly ApiClient $apiClient,
|
||||
private readonly LoggerInterface $logger,
|
||||
@@ -128,10 +130,19 @@ class Step4Controller extends AbstractController
|
||||
*/
|
||||
private function renderStepForm(BookingDto $bookingCreateDto, FormInterface $form): Response
|
||||
{
|
||||
// Get complete summary data (pricing, rooms, CMS data)
|
||||
$summaryData = $this->summaryDataService->getSummaryData($bookingCreateDto);
|
||||
$availableRooms = $bookingCreateDto->travel->getAvailableRooms();
|
||||
$groupedSelectedRooms = $this->bookingService->groupRoomSelectionsByType($summaryData['selectedRooms'], $availableRooms);
|
||||
|
||||
return $this->render('booking/create/step_4.html.twig', [
|
||||
'bookingCreateDto' => $bookingCreateDto,
|
||||
'form' => $form->createView(),
|
||||
...$this->getSummaryVariables($bookingCreateDto),
|
||||
'participantCount' => $summaryData['participantCount'],
|
||||
'pricingData' => $summaryData['pricingData'],
|
||||
'cmsData' => $summaryData['cmsData'],
|
||||
'assignmentCounts' => $summaryData['assignmentCounts'],
|
||||
'groupedSelectedRooms' => $groupedSelectedRooms,
|
||||
'participantPrices' => $this->priceCalculator->calculateAllParticipantIndividualPrices($bookingCreateDto),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -21,8 +21,8 @@ use App\Form\Service\ParticipantFieldHandlerRegistry;
|
||||
use App\Htmx\HxTrait;
|
||||
use App\Security\Crypt;
|
||||
use App\Service\BookingFingerprintService;
|
||||
use App\Service\BookingPriceCalculatorService;
|
||||
use App\Service\BookingService;
|
||||
use App\Service\BookingSummaryDataService;
|
||||
use App\Service\ParticipantCardDataService;
|
||||
use App\Service\TravelDataService;
|
||||
use Psr\Cache\InvalidArgumentException;
|
||||
@@ -57,7 +57,7 @@ class IndexController extends AbstractController
|
||||
private readonly TravelDataService $travelDataService,
|
||||
private readonly BookingService $bookingService,
|
||||
private readonly BookingFingerprintService $fingerprintService,
|
||||
private readonly BookingPriceCalculatorService $priceCalculator,
|
||||
private readonly BookingSummaryDataService $summaryDataService,
|
||||
private readonly ParticipantCardDataService $participantCardService,
|
||||
private readonly ParticipantFieldHandlerRegistry $fieldHandlerRegistry,
|
||||
private readonly CacheInterface $cache,
|
||||
@@ -166,9 +166,8 @@ class IndexController extends AbstractController
|
||||
? $this->participantCardService->getAllCardsDataWithValidation($bookingDto)
|
||||
: $this->participantCardService->getAllCardsData($bookingDto);
|
||||
|
||||
// Calculate summary data for sidebar
|
||||
$summary = $this->bookingService->getRoomSummaryAndParticipantCount($bookingDto);
|
||||
$roomAssignmentCounts = $this->bookingService->getRoomAssignmentCounts($bookingDto);
|
||||
// Get complete summary data (pricing, rooms, CMS data)
|
||||
$summaryData = $this->summaryDataService->getSummaryData($bookingDto);
|
||||
|
||||
// Group selected rooms for summary display
|
||||
$availableRooms = $bookingDto->travel->getAvailableRooms();
|
||||
@@ -184,9 +183,10 @@ class IndexController extends AbstractController
|
||||
'mutableData' => $mutableData,
|
||||
'cardsData' => $cardsData,
|
||||
'participantsCount' => count($bookingDto->participants),
|
||||
'pricingData' => $summary['pricing'],
|
||||
'pricingData' => $summaryData['pricingData'],
|
||||
'cmsData' => $summaryData['cmsData'],
|
||||
'groupedSelectedRooms' => $groupedSelectedRooms,
|
||||
'assignmentCounts' => $roomAssignmentCounts,
|
||||
'assignmentCounts' => $summaryData['assignmentCounts'],
|
||||
'isDirty' => $this->fingerprintService->isDirty($bookingDto),
|
||||
'hasValidationErrors' => $form->isSubmitted() && false === $form->isValid(),
|
||||
];
|
||||
@@ -275,9 +275,8 @@ class IndexController extends AbstractController
|
||||
return $this->hxRedirect($request, $this->generateUrl('app_booking_edit', ['id' => $id]));
|
||||
}
|
||||
|
||||
// Calculate summary data using trait helper
|
||||
$summaryData = $this->calculateSummaryData($bookingDto);
|
||||
$summary = $this->bookingService->getRoomSummaryAndParticipantCount($bookingDto);
|
||||
// Get complete summary data (pricing, rooms, CMS data)
|
||||
$summaryData = $this->summaryDataService->getSummaryData($bookingDto);
|
||||
|
||||
// Fetch mutable data for form constraints
|
||||
$mutableData = $this->travelDataService->getMutabilityData($bookingData->dateId);
|
||||
@@ -289,7 +288,8 @@ class IndexController extends AbstractController
|
||||
'bookingData' => $bookingData,
|
||||
'mutableData' => $mutableData,
|
||||
'summaryData' => $summaryData,
|
||||
'pricingData' => $summary['pricing'],
|
||||
'pricingData' => $summaryData['pricingData'],
|
||||
'cmsData' => $summaryData['cmsData'],
|
||||
'refreshRouteName' => 'app_booking_edit_participant_refresh',
|
||||
'refreshRouteParams' => ['id' => $id, 'index' => $index],
|
||||
'submitRouteName' => 'app_booking_edit_participant',
|
||||
@@ -374,9 +374,8 @@ class IndexController extends AbstractController
|
||||
$participant->notifications = [];
|
||||
}
|
||||
|
||||
// Calculate summary data using trait helper
|
||||
$summaryData = $this->calculateSummaryData($bookingDto);
|
||||
$summary = $this->bookingService->getRoomSummaryAndParticipantCount($bookingDto);
|
||||
// Get complete summary data (pricing, rooms, CMS data)
|
||||
$summaryData = $this->summaryDataService->getSummaryData($bookingDto);
|
||||
|
||||
// Render form + sidebar using htmxOobResponse
|
||||
$response = $this->htmxOobResponse(
|
||||
@@ -389,7 +388,8 @@ class IndexController extends AbstractController
|
||||
'bookingData' => $bookingData,
|
||||
'mutableData' => $mutableData,
|
||||
'summaryData' => $summaryData,
|
||||
'pricingData' => $summary['pricing'],
|
||||
'pricingData' => $summaryData['pricingData'],
|
||||
'cmsData' => $summaryData['cmsData'],
|
||||
'refreshRouteName' => 'app_booking_edit_participant_refresh',
|
||||
'refreshRouteParams' => ['id' => $id, 'index' => $index],
|
||||
'submitRouteName' => 'app_booking_edit_participant',
|
||||
|
||||
@@ -76,52 +76,6 @@ trait ParticipantCardFlowTrait
|
||||
return $this->createForm(BookingParticipantType::class, $wrapper, $formOptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate summary data (pricing, room counts, etc.).
|
||||
*
|
||||
* @return array{
|
||||
* participantsCount: int,
|
||||
* totalPrice: string,
|
||||
* groupedSelectedRooms: array,
|
||||
* assignmentCounts: array
|
||||
* }
|
||||
*/
|
||||
private function calculateSummaryData(BookingDto $bookingDto): array
|
||||
{
|
||||
// Calculate individual prices for all participants
|
||||
$participantPrices = $this->priceCalculator->calculateAllParticipantIndividualPrices($bookingDto);
|
||||
|
||||
// Calculate total price
|
||||
$totalPrice = array_sum($participantPrices);
|
||||
|
||||
// Get room assignment counts
|
||||
$roomCounts = [];
|
||||
foreach ($bookingDto->participants as $participant) {
|
||||
if (null !== $participant->assignedRoomId) {
|
||||
$roomCounts[$participant->assignedRoomId] = ($roomCounts[$participant->assignedRoomId] ?? 0) + 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Group selected rooms with counts
|
||||
$groupedSelectedRooms = [];
|
||||
foreach ($roomCounts as $roomId => $count) {
|
||||
$room = $bookingDto->travel->getRoomById($roomId);
|
||||
if (null !== $room) {
|
||||
$groupedSelectedRooms[] = [
|
||||
'room' => $room,
|
||||
'count' => $count,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'participantsCount' => count($bookingDto->participants),
|
||||
'totalPrice' => number_format($totalPrice, 2, ',', '.').' €',
|
||||
'groupedSelectedRooms' => $groupedSelectedRooms,
|
||||
'assignmentCounts' => $roomCounts,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Process single participant form refresh.
|
||||
*
|
||||
@@ -155,11 +109,8 @@ trait ParticipantCardFlowTrait
|
||||
// Save updated booking data to session (after collecting & clearing notifications)
|
||||
$this->bookingService->saveBookingDto($request, $bookingDto, $bookingDto->getMode());
|
||||
|
||||
// Calculate summary data for sidebar
|
||||
$summaryData = $this->calculateSummaryData($bookingDto);
|
||||
|
||||
// Get detailed pricing data for summary sidebar
|
||||
$summary = $this->bookingService->getRoomSummaryAndParticipantCount($bookingDto);
|
||||
// Get complete summary data (pricing, rooms, CMS data)
|
||||
$summaryData = $this->summaryDataService->getSummaryData($bookingDto);
|
||||
|
||||
// Render form and sidebar with OOB swap using htmxOobResponse
|
||||
// This renders ONLY the specific blocks, not the entire template
|
||||
@@ -171,7 +122,8 @@ trait ParticipantCardFlowTrait
|
||||
'participantIndex' => $index,
|
||||
'bookingDto' => $bookingDto,
|
||||
'summaryData' => $summaryData,
|
||||
'pricingData' => $summary['pricing'],
|
||||
'pricingData' => $summaryData['pricingData'],
|
||||
'cmsData' => $summaryData['cmsData'],
|
||||
'refreshRouteName' => $refreshRouteName,
|
||||
'submitRouteName' => $submitRouteName,
|
||||
]
|
||||
@@ -193,7 +145,7 @@ trait ParticipantCardFlowTrait
|
||||
* Controllers using this trait must have the following properties:
|
||||
* - BookingService $bookingService
|
||||
* - ParticipantCardDataService $participantCardService
|
||||
* - BookingPriceCalculatorService $priceCalculator
|
||||
* - BookingSummaryDataService $summaryDataService
|
||||
*/
|
||||
abstract private function createForm(string $type, $data = null, array $options = []): FormInterface;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user