feat: centralize create/edit flow contexts, extract edit submit service

This commit is contained in:
Björn Fromme committed 2026-04-12 10:17:04 +02:00
1 parent f903f17ebd
commit 69705052b3
28 files changed
+1342 -423

No files matched your search

@@ -0,0 +1,74 @@
<?php
declare(strict_types=1);
namespace App\Service;
use App\Form\Model\BookingCreateContext;
use App\Form\Model\BookingDto;
/**
* Prepares the shared view model for booking create.
*/
class BookingCreateContextFactory
{
public function __construct(
private readonly BookingRoomSelectionService $roomSelectionService,
private readonly ParticipantCardDataService $participantCardDataService,
private readonly BookingSummaryDataService $summaryDataService,
private readonly BookingPriceCalculatorService $priceCalculator,
) {
}
public function create(
BookingDto $bookingDto,
string $pricingMode = RoomPricingCalculator::PRICING_MODE_ASSIGNMENT,
): BookingCreateContext
{
$baseContext = $this->buildBaseContext($bookingDto, $pricingMode);
return new BookingCreateContext(
bookingDto: $bookingDto,
summaryData: $baseContext['summaryData'],
groupedRooms: $baseContext['groupedRooms'],
);
}
public function createWithParticipantCards(BookingDto $bookingDto, bool $isSubmitted): BookingCreateContext
{
$baseContext = $this->buildBaseContext($bookingDto, RoomPricingCalculator::PRICING_MODE_SELECTION);
return new BookingCreateContext(
bookingDto: $bookingDto,
summaryData: $baseContext['summaryData'],
groupedRooms: $baseContext['groupedRooms'],
cardsData: $this->participantCardDataService->getAllCardsDataWithValidation($bookingDto),
isSubmitted: $isSubmitted,
);
}
public function createWithParticipantPrices(BookingDto $bookingDto): BookingCreateContext
{
$baseContext = $this->buildBaseContext($bookingDto, RoomPricingCalculator::PRICING_MODE_ASSIGNMENT);
return new BookingCreateContext(
bookingDto: $bookingDto,
summaryData: $baseContext['summaryData'],
groupedRooms: $baseContext['groupedRooms'],
participantPrices: $this->priceCalculator->calculateAllParticipantIndividualPrices($bookingDto),
);
}
/**
* @return array{summaryData: \App\Form\Model\BookingSummaryDto, groupedRooms: array{by_pax: array<int, \App\BusProNet\Model\Room>, by_room: array<int, \App\BusProNet\Model\Room>}}
*/
private function buildBaseContext(BookingDto $bookingDto, string $pricingMode): array
{
return [
'summaryData' => $this->summaryDataService->getSummaryData($bookingDto, $pricingMode),
'groupedRooms' => $this->roomSelectionService->groupRoomsBySelectionType(
$bookingDto->travel->getAvailableRooms()
),
];
}
}