From aa997826f80c190c84184a099d22127c0c231adb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Sun, 12 Apr 2026 11:23:19 +0200 Subject: [PATCH] feat: split summary DTOs into typed sub-objects --- .../Booking/Create/Step4Controller.php | 2 +- src/Form/Model/BookingCreateContext.php | 9 ++-- src/Form/Model/BookingEditContext.php | 3 +- src/Form/Model/BookingMutabilityDto.php | 47 +++++++++++++++++++ src/Form/Model/BookingSummaryDto.php | 19 ++------ src/Form/Model/BookingSummaryPricingDto.php | 26 ++++++++++ src/Form/Model/BookingSummaryVoucherDto.php | 17 +++++++ src/Form/Model/RoomGroupsDto.php | 23 +++++++++ src/Service/BookingCreateContextFactory.php | 8 ++-- src/Service/BookingEditContextFactory.php | 7 ++- src/Service/BookingRoomSelectionService.php | 10 ++-- src/Service/BookingSummaryDataService.php | 45 +++++++++--------- templates/booking/_summary.html.twig | 40 ++++++++-------- templates/booking/create/step_1.html.twig | 8 ++-- templates/booking/create/step_4.html.twig | 24 +++++----- .../BookingCreateContextFactoryTest.php | 33 ++++++------- .../Service/BookingEditContextFactoryTest.php | 10 +++- .../BookingRoomSelectionServiceTest.php | 6 ++- 18 files changed, 224 insertions(+), 113 deletions(-) create mode 100644 src/Form/Model/BookingMutabilityDto.php create mode 100644 src/Form/Model/BookingSummaryPricingDto.php create mode 100644 src/Form/Model/BookingSummaryVoucherDto.php create mode 100644 src/Form/Model/RoomGroupsDto.php diff --git a/src/Controller/Booking/Create/Step4Controller.php b/src/Controller/Booking/Create/Step4Controller.php index a1257a5..d3696a4 100644 --- a/src/Controller/Booking/Create/Step4Controller.php +++ b/src/Controller/Booking/Create/Step4Controller.php @@ -136,7 +136,7 @@ class Step4Controller extends AbstractController // Success: Store booking data in flash for conversion tracking $bookingCreateContext = $this->createContextFactory->createWithParticipantPrices($bookingCreateDto); $this->addFlash('booking_number', $bookingResponse->bookingNumber); - $this->addFlash('booking_total', $bookingCreateContext->summaryData->payableAmount); + $this->addFlash('booking_total', $bookingCreateContext->summaryData->vouchers->payableAmount); $this->addFlash('booking_travel_name', $bookingCreateDto->travel->label); $this->clearTravelDataCache($bookingCreateDto); $this->bookingSessionService->clearBookingDto($request, BookingDto::MODE_CREATE); diff --git a/src/Form/Model/BookingCreateContext.php b/src/Form/Model/BookingCreateContext.php index 309ac29..88de2e4 100644 --- a/src/Form/Model/BookingCreateContext.php +++ b/src/Form/Model/BookingCreateContext.php @@ -4,22 +4,19 @@ declare(strict_types=1); namespace App\Form\Model; -use App\BusProNet\Model\Room; - /** * Bundles the data needed to render the booking create flow. */ class BookingCreateContext { /** - * @param array{by_pax: array, by_room: array} $groupedRooms - * @param array|null $cardsData - * @param array|null $participantPrices + * @param array|null $cardsData + * @param array|null $participantPrices */ public function __construct( public readonly BookingDto $bookingDto, public readonly BookingSummaryDto $summaryData, - public readonly array $groupedRooms, + public readonly RoomGroupsDto $groupedRooms, public readonly ?array $cardsData = null, public readonly bool $isSubmitted = false, public readonly ?array $participantPrices = null, diff --git a/src/Form/Model/BookingEditContext.php b/src/Form/Model/BookingEditContext.php index 15f7130..fe8a5f9 100644 --- a/src/Form/Model/BookingEditContext.php +++ b/src/Form/Model/BookingEditContext.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace App\Form\Model; -use App\BusProNet\Model\BaseData; use App\BusProNet\Model\Booking; /** @@ -18,7 +17,7 @@ class BookingEditContext public function __construct( public readonly BookingDto $bookingDto, public readonly ?Booking $bookingData, - public readonly ?BaseData $mutableData, + public readonly ?BookingMutabilityDto $mutableData, public readonly BookingSummaryDto $summaryData, public readonly ?array $cardsData = null, public readonly bool $isDirty = false, diff --git a/src/Form/Model/BookingMutabilityDto.php b/src/Form/Model/BookingMutabilityDto.php new file mode 100644 index 0000000..5b16e13 --- /dev/null +++ b/src/Form/Model/BookingMutabilityDto.php @@ -0,0 +1,47 @@ +getItemByKey($key); + + return $item instanceof MutableData ? $item : null; + } +} diff --git a/src/Form/Model/BookingSummaryDto.php b/src/Form/Model/BookingSummaryDto.php index 656f0b8..147e72c 100644 --- a/src/Form/Model/BookingSummaryDto.php +++ b/src/Form/Model/BookingSummaryDto.php @@ -6,30 +6,17 @@ namespace App\Form\Model; /** * DTO containing all booking summary data for sidebar display. - * - * Provides pricing breakdowns, room assignments, participant counts, - * and CMS product information in a single typed object. */ class BookingSummaryDto { /** - * @param array $selectedRooms Selected room DTOs from booking - * @param int $participantCount Total participant count from room capacity - * @param float $totalPrice Total price before voucher deductions - * @param float $payableAmount Amount after voucher deductions - * @param array $groupedSelectedRooms Rooms grouped by participant assignments - * @param array $assignmentCounts Room ID to participant count mapping - * @param array $pricingData Detailed pricing breakdown - * @param array|null $cmsData CMS product data (images, etc.) + * @param array $selectedRooms Selected room DTOs from booking */ public function __construct( public readonly array $selectedRooms, public readonly int $participantCount, - public readonly float $totalPrice, - public readonly float $payableAmount, - public readonly array $groupedSelectedRooms, - public readonly array $assignmentCounts, - public readonly array $pricingData, + public readonly BookingSummaryPricingDto $pricing, + public readonly BookingSummaryVoucherDto $vouchers, public readonly ?array $cmsData, ) { } diff --git a/src/Form/Model/BookingSummaryPricingDto.php b/src/Form/Model/BookingSummaryPricingDto.php new file mode 100644 index 0000000..0d0ca8c --- /dev/null +++ b/src/Form/Model/BookingSummaryPricingDto.php @@ -0,0 +1,26 @@ +> $rooms + * @param array> $services + * @param array>|null $surcharges + * @param array $assignmentCounts + */ + public function __construct( + public readonly array $rooms, + public readonly array $services, + public readonly ?array $surcharges, + public readonly array $assignmentCounts, + public readonly float $grandTotal, + ) { + } +} diff --git a/src/Form/Model/BookingSummaryVoucherDto.php b/src/Form/Model/BookingSummaryVoucherDto.php new file mode 100644 index 0000000..e531b6a --- /dev/null +++ b/src/Form/Model/BookingSummaryVoucherDto.php @@ -0,0 +1,17 @@ + $byPax + * @param array $byRoom + */ + public function __construct( + public readonly array $byPax, + public readonly array $byRoom, + ) { + } +} diff --git a/src/Service/BookingCreateContextFactory.php b/src/Service/BookingCreateContextFactory.php index 211b8ad..d9a5a84 100644 --- a/src/Service/BookingCreateContextFactory.php +++ b/src/Service/BookingCreateContextFactory.php @@ -6,6 +6,8 @@ namespace App\Service; use App\Form\Model\BookingCreateContext; use App\Form\Model\BookingDto; +use App\Form\Model\BookingSummaryDto; +use App\Form\Model\RoomGroupsDto; /** * Prepares the shared view model for booking create. @@ -60,15 +62,13 @@ class BookingCreateContextFactory } /** - * @return array{summaryData: \App\Form\Model\BookingSummaryDto, groupedRooms: array{by_pax: array, by_room: array}} + * @return array{summaryData: BookingSummaryDto, groupedRooms: RoomGroupsDto} */ private function buildBaseContext(BookingDto $bookingDto, string $pricingMode): array { return [ 'summaryData' => $this->summaryDataService->getSummaryData($bookingDto, $pricingMode), - 'groupedRooms' => $this->roomSelectionService->groupRoomsBySelectionType( - $bookingDto->travel->getAvailableRooms() - ), + 'groupedRooms' => $this->roomSelectionService->groupRoomsBySelectionType($bookingDto->travel->getAvailableRooms()), ]; } } diff --git a/src/Service/BookingEditContextFactory.php b/src/Service/BookingEditContextFactory.php index 52eb529..00d6761 100644 --- a/src/Service/BookingEditContextFactory.php +++ b/src/Service/BookingEditContextFactory.php @@ -8,6 +8,7 @@ use App\BusProNet\Model\Booking; use App\Form\Model\BookingDto; use App\Form\Model\BookingEditContext; use App\Form\Model\BookingSummaryDto; +use App\Form\Model\BookingMutabilityDto; /** * Prepares the shared booking edit flow context. @@ -37,7 +38,9 @@ class BookingEditContextFactory return new BookingEditContext( bookingDto: $bookingDto, bookingData: $bookingData, - mutableData: $bookingData ? $this->travelDataService->getMutabilityData($bookingData->dateId) : null, + mutableData: BookingMutabilityDto::fromBaseData( + $bookingData ? $this->travelDataService->getMutabilityData($bookingData->dateId) : null + ), summaryData: $this->createSummaryData($bookingDto), ); } @@ -52,7 +55,7 @@ class BookingEditContextFactory return new BookingEditContext( bookingDto: $bookingDto, bookingData: $bookingData, - mutableData: $this->travelDataService->getMutabilityData($bookingData->dateId), + mutableData: BookingMutabilityDto::fromBaseData($this->travelDataService->getMutabilityData($bookingData->dateId)), summaryData: $this->createSummaryData($bookingDto), cardsData: $this->participantCardDataService->getAllCardsDataWithValidation($bookingDto), isDirty: $isDirty, diff --git a/src/Service/BookingRoomSelectionService.php b/src/Service/BookingRoomSelectionService.php index 5e7e969..5b23dd2 100644 --- a/src/Service/BookingRoomSelectionService.php +++ b/src/Service/BookingRoomSelectionService.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace App\Service; use App\BusProNet\Model\Room; +use App\Form\Model\RoomGroupsDto; /** * Groups room data for booking steps. @@ -13,10 +14,8 @@ class BookingRoomSelectionService { /** * @param array $rooms - * - * @return array{by_pax: array, by_room: array} */ - public function groupRoomsBySelectionType(array $rooms): array + public function groupRoomsBySelectionType(array $rooms): RoomGroupsDto { $groups = [ Room::SELECTION_TYPE_BY_PAX => [], @@ -35,6 +34,9 @@ class BookingRoomSelectionService uasort($groups[Room::SELECTION_TYPE_BY_PAX], static fn (Room $a, Room $b): int => $a->maxPax <=> $b->maxPax); uasort($groups[Room::SELECTION_TYPE_BY_ROOM], static fn (Room $a, Room $b): int => $a->maxPax <=> $b->maxPax); - return $groups; + return new RoomGroupsDto( + byPax: $groups[Room::SELECTION_TYPE_BY_PAX], + byRoom: $groups[Room::SELECTION_TYPE_BY_ROOM], + ); } } diff --git a/src/Service/BookingSummaryDataService.php b/src/Service/BookingSummaryDataService.php index ecfebd9..b0d3e66 100644 --- a/src/Service/BookingSummaryDataService.php +++ b/src/Service/BookingSummaryDataService.php @@ -7,8 +7,11 @@ namespace App\Service; use App\BusProNet\DataProvider\CountryDataProvider; use App\BusProNet\Model\Hotel; use App\BusProNet\XmlLoader\HotelLoader; +use App\Form\Model\AcceptedVouchersDto; use App\Form\Model\BookingDto; use App\Form\Model\BookingSummaryDto; +use App\Form\Model\BookingSummaryPricingDto; +use App\Form\Model\BookingSummaryVoucherDto; use Psr\Log\LoggerInterface; use Symfony\Contracts\Cache\CacheInterface; use Symfony\Contracts\Cache\ItemInterface; @@ -53,18 +56,6 @@ class BookingSummaryDataService } } - // Group selected rooms with counts (for display) - $groupedSelectedRooms = []; - foreach ($roomCounts as $roomId => $count) { - $room = $bookingDto->travel->getRoomById($roomId); - if (null !== $room) { - $groupedSelectedRooms[] = [ - 'room' => $room, - 'count' => $count, - ]; - } - } - // Get detailed pricing breakdown $pricingData = $this->priceCalculator->getPricingBreakdown($bookingDto, $roomPricingMode); @@ -74,17 +65,29 @@ class BookingSummaryDataService // Calculate participant count from room capacity (source of truth) $participantCount = $this->calculateParticipantCountFromRooms($bookingDto); + $acceptedVouchers = $bookingDto->getAcceptedVouchers($participantPrices); + // Calculate payable amount after voucher deductions - $payableAmount = $this->calculatePayableAmount($bookingDto, $pricingData['grandTotal'], $participantPrices); + $payableAmount = $this->calculatePayableAmount($pricingData['grandTotal'], $acceptedVouchers); + + $pricing = new BookingSummaryPricingDto( + rooms: $pricingData['rooms'], + services: $pricingData['services'], + surcharges: $pricingData['surcharges'] ?? null, + assignmentCounts: $roomCounts, + grandTotal: $pricingData['grandTotal'], + ); + + $vouchers = new BookingSummaryVoucherDto( + acceptedVouchers: $acceptedVouchers, + payableAmount: $payableAmount, + ); return new BookingSummaryDto( selectedRooms: $selectedRooms, participantCount: $participantCount, - totalPrice: $pricingData['grandTotal'], - payableAmount: $payableAmount, - groupedSelectedRooms: $groupedSelectedRooms, - assignmentCounts: $roomCounts, - pricingData: $pricingData, + pricing: $pricing, + vouchers: $vouchers, cmsData: $cmsData, ); } @@ -92,12 +95,10 @@ class BookingSummaryDataService /** * Calculates the payable amount after voucher deductions. * - * @param array $participantPrices Prices per participant for percentage voucher calculation + * @param AcceptedVouchersDto|null $acceptedVouchers Accepted vouchers for discount calculation */ - private function calculatePayableAmount(BookingDto $bookingDto, float $grandTotal, array $participantPrices): float + private function calculatePayableAmount(float $grandTotal, ?AcceptedVouchersDto $acceptedVouchers): float { - $acceptedVouchers = $bookingDto->getAcceptedVouchers($participantPrices); - if (null === $acceptedVouchers) { return $grandTotal; } diff --git a/templates/booking/_summary.html.twig b/templates/booking/_summary.html.twig index f9c48f4..cbf41c1 100644 --- a/templates/booking/_summary.html.twig +++ b/templates/booking/_summary.html.twig @@ -3,7 +3,7 @@
Gesamtpreis - {{ summaryData.payableAmount|format_currency('EUR') }} + {{ summaryData.vouchers.payableAmount|format_currency('EUR') }}
Buchungsübersicht @@ -83,8 +83,8 @@ Zusatzleistungen - {% if mutableData.items['additional_services'].mutable %} - {{ mutableData.items['additional_services'].mutableBefore|date('d.m.Y') }} + {% if mutableData.additionalServices and mutableData.additionalServices.mutable %} + {{ mutableData.additionalServices.mutableBefore|date('d.m.Y') }} {% else %} nicht mehr möglich {% endif %} @@ -95,8 +95,8 @@ Beförderung - {% if mutableData.items['transportation'].mutable %} - {{ mutableData.items['transportation'].mutableBefore|date('d.m.Y') }} + {% if mutableData.transportation and mutableData.transportation.mutable %} + {{ mutableData.transportation.mutableBefore|date('d.m.Y') }} {% else %} nicht mehr möglich {% endif %} @@ -107,8 +107,8 @@ Zustiege - {% if mutableData.items['pickup'].mutable %} - {{ mutableData.items['pickup'].mutableBefore|date('d.m.Y') }} + {% if mutableData.pickup and mutableData.pickup.mutable %} + {{ mutableData.pickup.mutableBefore|date('d.m.Y') }} {% else %} nicht mehr möglich {% endif %} @@ -119,8 +119,8 @@ Unterkunft - {% if mutableData.items['accommodation'].mutable %} - {{ mutableData.items['accommodation'].mutableBefore|date('d.m.Y') }} + {% if mutableData.accommodation and mutableData.accommodation.mutable %} + {{ mutableData.accommodation.mutableBefore|date('d.m.Y') }} {% else %} nicht mehr möglich {% endif %} @@ -131,13 +131,13 @@ {% endif %} {# Rooms Section #} - {% if summaryData.pricingData.rooms is not empty %} + {% if summaryData.pricing.rooms is not empty %}
Unterkunft
- {% for roomPricing in summaryData.pricingData.rooms %} + {% for roomPricing in summaryData.pricing.rooms %}
{{ roomPricing.quantity }}x {{ roomPricing.label }} @@ -152,12 +152,12 @@ {% endif %} {# Services Section #} - {% if summaryData.pricingData.services is not empty %} + {% if summaryData.pricing.services is not empty %}
Leistungen
- {% for serviceGroup in summaryData.pricingData.services %} + {% for serviceGroup in summaryData.pricing.services %}
{{ serviceGroup.groupName }}
@@ -178,13 +178,13 @@ {% endif %} {# Surcharges Section (Edit mode only) #} - {% if summaryData.pricingData.surcharges is defined and summaryData.pricingData.surcharges is not empty %} + {% if summaryData.pricing.surcharges is not empty %}
Zu-/Abschläge
- {% for surchargePricing in summaryData.pricingData.surcharges %} + {% for surchargePricing in summaryData.pricing.surcharges %} {# Voucher discounts breakdown #} @@ -239,12 +239,12 @@ {# Amount to pay after vouchers #}
Zu zahlen - {{ summaryData.payableAmount|format_currency('EUR') }} + {{ summaryData.vouchers.payableAmount|format_currency('EUR') }}
{% else %}
Gesamtpreis - {{ summaryData.payableAmount|format_currency('EUR') }} + {{ summaryData.vouchers.payableAmount|format_currency('EUR') }}
{% endif %} {% endif %} diff --git a/templates/booking/create/step_1.html.twig b/templates/booking/create/step_1.html.twig index 31ca0bb..0bfbf6a 100644 --- a/templates/booking/create/step_1.html.twig +++ b/templates/booking/create/step_1.html.twig @@ -65,19 +65,19 @@ {% block room_selection_form %}
{{ form_errors(form) }} - {% if bookingCreateContext.groupedRooms.by_room is not empty %} + {% if bookingCreateContext.groupedRooms.byRoom is not empty %}

Zimmer

- {% for roomId, room in bookingCreateContext.groupedRooms.by_room %} + {% for roomId, room in bookingCreateContext.groupedRooms.byRoom %} {{ _self.stepFormField(form.roomSelections[roomId]) }} {% endfor %} {% endif %} - {% if bookingCreateContext.groupedRooms.by_pax is not empty %} + {% if bookingCreateContext.groupedRooms.byPax is not empty %}

Betten

- {% for roomId, room in bookingCreateContext.groupedRooms.by_pax %} + {% for roomId, room in bookingCreateContext.groupedRooms.byPax %} {{ _self.stepFormField(form.roomSelections[roomId]) }} {% endfor %} {% endif %} diff --git a/templates/booking/create/step_4.html.twig b/templates/booking/create/step_4.html.twig index ebf6eaf..2fcb9e1 100644 --- a/templates/booking/create/step_4.html.twig +++ b/templates/booking/create/step_4.html.twig @@ -20,7 +20,7 @@
Gesamtpreis - {{ bookingCreateContext.summaryData.payableAmount|format_currency('EUR') }} + {{ bookingCreateContext.summaryData.vouchers.payableAmount|format_currency('EUR') }}
Buchungsübersicht @@ -132,18 +132,18 @@ {# Rooms Section #} - {% if bookingCreateContext.summaryData.pricingData.rooms is not empty %} + {% if bookingCreateContext.summaryData.pricing.rooms is not empty %}
Unterkunft
{{ surchargePricing.participantCount }}x {{ surchargePricing.label }} @@ -199,9 +199,9 @@ {% endif %} {# Total Section #} - {% if summaryData.totalPrice > 0 %} + {% if summaryData.pricing.grandTotal > 0 %} {# Show subtotal and voucher discounts when vouchers are applied #} - {% set acceptedVouchers = bookingDto.getAcceptedVouchers() %} + {% set acceptedVouchers = summaryData.vouchers.acceptedVouchers %} {% if acceptedVouchers and acceptedVouchers.hasVouchers() %}
@@ -214,7 +214,7 @@ Gesamtpreis
- {{ summaryData.totalPrice|format_currency('EUR') }} + {{ summaryData.pricing.grandTotal|format_currency('EUR') }}
- {% for roomPricing in bookingCreateContext.summaryData.pricingData.rooms %} + {% for roomPricing in bookingCreateContext.summaryData.pricing.rooms %} {% for voucher in acceptedVouchers.vouchers %} @@ -498,12 +498,12 @@
Zu zahlen - {{ bookingCreateContext.summaryData.payableAmount|format_currency('EUR') }} + {{ bookingCreateContext.summaryData.vouchers.payableAmount|format_currency('EUR') }}
{% else %}
Gesamtpreis - {{ bookingCreateContext.summaryData.pricingData.grandTotal|format_currency('EUR') }} + {{ bookingCreateContext.summaryData.pricing.grandTotal|format_currency('EUR') }}
{% endif %} {% endif %} diff --git a/tests/Service/BookingCreateContextFactoryTest.php b/tests/Service/BookingCreateContextFactoryTest.php index 93a3469..c67aa3d 100644 --- a/tests/Service/BookingCreateContextFactoryTest.php +++ b/tests/Service/BookingCreateContextFactoryTest.php @@ -8,6 +8,7 @@ use App\BusProNet\Model\Room; use App\BusProNet\Model\Travel; use App\Form\Model\BookingCreateContext; use App\Form\Model\BookingDto; +use App\Form\Model\RoomGroupsDto; use App\Form\Model\ParticipantCardDataDto; use App\Form\Model\ParticipantCardPriceDto; use App\Form\Model\BookingSummaryDto; @@ -56,13 +57,14 @@ class BookingCreateContextFactoryTest extends TestCase ->willReturn($summaryData); $roomSelectionService = $this->createMock(BookingRoomSelectionService::class); + $groupedRooms = new RoomGroupsDto( + byPax: [$roomByPax->id => $roomByPax], + byRoom: [$roomByRoom->id => $roomByRoom], + ); $roomSelectionService->expects($this->once()) ->method('groupRoomsBySelectionType') ->with([$roomByRoom->id => $roomByRoom, $roomByPax->id => $roomByPax]) - ->willReturn([ - Room::SELECTION_TYPE_BY_PAX => [$roomByPax->id => $roomByPax], - Room::SELECTION_TYPE_BY_ROOM => [$roomByRoom->id => $roomByRoom], - ]); + ->willReturn($groupedRooms); $participantCardDataService = $this->createMock(ParticipantCardDataService::class); $participantCardDataService->expects($this->never()) @@ -86,10 +88,7 @@ class BookingCreateContextFactoryTest extends TestCase $this->assertSame($summaryData, $context->summaryData); $this->assertSame(null, $context->cardsData); $this->assertFalse($context->isSubmitted); - $this->assertSame([ - Room::SELECTION_TYPE_BY_PAX => [$roomByPax->id => $roomByPax], - Room::SELECTION_TYPE_BY_ROOM => [$roomByRoom->id => $roomByRoom], - ], $context->groupedRooms); + $this->assertSame($groupedRooms, $context->groupedRooms); } public function testCreateWithParticipantCardsBuildsStep2Context(): void @@ -124,13 +123,14 @@ class BookingCreateContextFactoryTest extends TestCase ->willReturn($summaryData); $roomSelectionService = $this->createMock(BookingRoomSelectionService::class); + $groupedRooms = new RoomGroupsDto( + byPax: [], + byRoom: [$room->id => $room], + ); $roomSelectionService->expects($this->once()) ->method('groupRoomsBySelectionType') ->with([$room->id => $room]) - ->willReturn([ - Room::SELECTION_TYPE_BY_PAX => [], - Room::SELECTION_TYPE_BY_ROOM => [$room->id => $room], - ]); + ->willReturn($groupedRooms); $participantCardDataService = $this->createMock(ParticipantCardDataService::class); $participantCardDataService->expects($this->once()) @@ -181,13 +181,14 @@ class BookingCreateContextFactoryTest extends TestCase ->willReturn($summaryData); $roomSelectionService = $this->createMock(BookingRoomSelectionService::class); + $groupedRooms = new RoomGroupsDto( + byPax: [], + byRoom: [$room->id => $room], + ); $roomSelectionService->expects($this->once()) ->method('groupRoomsBySelectionType') ->with([$room->id => $room]) - ->willReturn([ - Room::SELECTION_TYPE_BY_PAX => [], - Room::SELECTION_TYPE_BY_ROOM => [$room->id => $room], - ]); + ->willReturn($groupedRooms); $participantCardDataService = $this->createMock(ParticipantCardDataService::class); $participantCardDataService->expects($this->never()) diff --git a/tests/Service/BookingEditContextFactoryTest.php b/tests/Service/BookingEditContextFactoryTest.php index 0d8f133..c59f218 100644 --- a/tests/Service/BookingEditContextFactoryTest.php +++ b/tests/Service/BookingEditContextFactoryTest.php @@ -6,8 +6,10 @@ namespace App\Tests\Service; use App\BusProNet\Model\BaseData; use App\BusProNet\Model\Booking; +use App\BusProNet\Model\MutableData; use App\BusProNet\Model\Travel; use App\Form\Model\BookingDto; +use App\Form\Model\BookingMutabilityDto; use App\Form\Model\BookingEditContext; use App\Form\Model\BookingSummaryDto; use App\Service\BookingEditContextFactory; @@ -51,7 +53,9 @@ class BookingEditContextFactoryTest extends TestCase $bookingData = new Booking(); $bookingData->dateId = 1234; - $mutableData = new BaseData([]); + $mutableData = new BaseData([ + MutableData::CATEGORY_ADDITIONAL_SERVICES => new MutableData(MutableData::CATEGORY_ADDITIONAL_SERVICES, true, new \DateTimeImmutable('2030-01-02')), + ]); $summaryData = $this->createMock(BookingSummaryDto::class); $summaryDataService = $this->createMock(BookingSummaryDataService::class); @@ -77,7 +81,9 @@ class BookingEditContextFactoryTest extends TestCase $this->assertInstanceOf(BookingEditContext::class, $context); $this->assertSame($bookingDto, $context->bookingDto); $this->assertSame($bookingData, $context->bookingData); - $this->assertSame($mutableData, $context->mutableData); + $this->assertInstanceOf(BookingMutabilityDto::class, $context->mutableData); + $this->assertSame($mutableData->getItemByKey(MutableData::CATEGORY_ADDITIONAL_SERVICES), $context->mutableData->additionalServices); + $this->assertNull($context->mutableData->transportation); $this->assertSame($summaryData, $context->summaryData); } diff --git a/tests/Service/BookingRoomSelectionServiceTest.php b/tests/Service/BookingRoomSelectionServiceTest.php index 99984cf..77972dc 100644 --- a/tests/Service/BookingRoomSelectionServiceTest.php +++ b/tests/Service/BookingRoomSelectionServiceTest.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace App\Tests\Service; use App\BusProNet\Model\Room; +use App\Form\Model\RoomGroupsDto; use App\Service\BookingRoomSelectionService; use PHPUnit\Framework\TestCase; @@ -27,8 +28,9 @@ class BookingRoomSelectionServiceTest extends TestCase $groups = $this->service->groupRoomsBySelectionType($rooms); - $this->assertSame([10, 12], array_keys($groups[Room::SELECTION_TYPE_BY_PAX])); - $this->assertSame([11], array_keys($groups[Room::SELECTION_TYPE_BY_ROOM])); + $this->assertInstanceOf(RoomGroupsDto::class, $groups); + $this->assertSame([10, 12], array_keys($groups->byPax)); + $this->assertSame([11], array_keys($groups->byRoom)); } private function createRoom(int $id, string $label, int $maxPax): Room
{{ roomPricing.quantity }}x {{ roomPricing.label }}
- {% if bookingCreateContext.summaryData.assignmentCounts[roomPricing.roomId] is defined %} -
{{ bookingCreateContext.summaryData.assignmentCounts[roomPricing.roomId] }} Person(en) belegt
+ {% if bookingCreateContext.summaryData.pricing.assignmentCounts[roomPricing.roomId] is defined %} +
{{ bookingCreateContext.summaryData.pricing.assignmentCounts[roomPricing.roomId] }} Person(en) belegt
{% endif %}
@@ -156,12 +156,12 @@ {% endif %} {# Services Section #} - {% if bookingCreateContext.summaryData.pricingData.services is not empty %} + {% if bookingCreateContext.summaryData.pricing.services is not empty %}
Leistungen
- {% for serviceGroup in bookingCreateContext.summaryData.pricingData.services %} + {% for serviceGroup in bookingCreateContext.summaryData.pricing.services %}
{{ serviceGroup.groupName }}
@@ -462,8 +462,8 @@ {% endfor %} {# Grand Total #} - {% if bookingCreateContext.summaryData.pricingData.grandTotal is defined and bookingCreateContext.summaryData.pricingData.grandTotal > 0 %} - {% set acceptedVouchers = bookingCreateContext.bookingDto.getAcceptedVouchers() %} + {% if bookingCreateContext.summaryData.pricing.grandTotal > 0 %} + {% set acceptedVouchers = bookingCreateContext.summaryData.vouchers.acceptedVouchers %} {% if acceptedVouchers and acceptedVouchers.hasVouchers() %}
@@ -475,7 +475,7 @@ Gesamtpreis
- {{ bookingCreateContext.summaryData.pricingData.grandTotal|format_currency('EUR') }} + {{ bookingCreateContext.summaryData.pricing.grandTotal|format_currency('EUR') }}