6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit e0da4717
Changed files
comwell_key_app/assets/translations/da-DK.json | 2 +- .../check_out/models/check_out_item.g.dart | 7 +++-- .../.generated/services/models/booking_dto.g.dart | 3 +- .../booking_details/bloc/booking_details_bloc.dart | 9 +++--- .../lib/booking_details/booking_details_page.dart | 17 ++++++----- .../lib/check_in/bloc/check_in_cubit.dart | 5 ++-- .../lib/check_in/bloc/check_in_state.dart | 7 +++++ .../lib/check_out/bloc/check_out_cubit.dart | 26 ++++++++--------- .../lib/check_out/bloc/check_out_state.dart | 34 ++++++++++++---------- .../components/check_out_bill_list_item.dart | 5 ++-- .../lib/check_out/models/check_out_item.dart | 14 +++++---- comwell_key_app/lib/overview/models/booking.dart | 4 +-- .../overview/repository/overview_repository.dart | 4 +-- comwell_key_app/lib/routing/app_router.dart | 5 +++- .../lib/services/models/booking_dto.dart | 2 +- 15 files changed, 82 insertions(+), 62 deletions(-)
Diff
diff --git a/comwell_key_app/assets/translations/da-DK.json b/comwell_key_app/assets/translations/da-DK.json
index 2c0f6e39..625483aa 100644
--- a/comwell_key_app/assets/translations/da-DK.json
+++ b/comwell_key_app/assets/translations/da-DK.json
@@ -183,7 +183,7 @@
"checkout_page_payment_dialog_confirm": "Ja, check ud nu",
"checkout_page_payment_dialog_cancel": "Nej",
"checkout_page_processing_success_title": "Check-out bekræftet",
- "checkout_page_processing_success_subtitle": "Det check-out er nu bekræftet og du har nu 30 minutter til at forlade dit værelse. Herefter vil du ikke længere kunne bruge dit nøglekort. ",
+ "checkout_page_processing_success_subtitle": "Dit check-out er nu bekræftet og du har nu 30 minutter til at forlade dit værelse. Herefter vil du ikke længere kunne bruge dit nøglekort. ",
"checkout_page_processing_success_subtitle_no_digital_card": "Du er nu checket ud. Husk at aflevere din nøgle i lobbyen.",
"checkout_page_processing_error_title": "Check-out fejlet",
"checkout_page_processing_error_subtitle": "Der skete en fejl ved check-out. Du bedes henvende dig i receptionen.",
diff --git a/comwell_key_app/lib/.generated/check_out/models/check_out_item.g.dart b/comwell_key_app/lib/.generated/check_out/models/check_out_item.g.dart
index 28a2be7a..4eff251f 100644
--- a/comwell_key_app/lib/.generated/check_out/models/check_out_item.g.dart
+++ b/comwell_key_app/lib/.generated/check_out/models/check_out_item.g.dart
@@ -6,14 +6,15 @@ part of '../../../check_out/models/check_out_item.dart';
// JsonSerializableGenerator
// **************************************************************************
-AddOnItem _$AddOnItemFromJson(Map json) => AddOnItem(
+CheckoutAddonItem _$CheckoutAddonItemFromJson(Map json) => CheckoutAddonItem(
json['code'] as String,
json['description'] as String,
(json['quantity'] as num).toInt(),
- json['price'] as num,
+ (json['price'] as num).toInt(),
);
-Map<String, dynamic> _$AddOnItemToJson(AddOnItem instance) => <String, dynamic>{
+Map<String, dynamic> _$CheckoutAddonItemToJson(CheckoutAddonItem instance) =>
+ <String, dynamic>{
'code': instance.code,
'description': instance.description,
'quantity': instance.quantity,
diff --git a/comwell_key_app/lib/.generated/services/models/booking_dto.g.dart b/comwell_key_app/lib/.generated/services/models/booking_dto.g.dart
index 2c7fe309..84facacd 100644
--- a/comwell_key_app/lib/.generated/services/models/booking_dto.g.dart
+++ b/comwell_key_app/lib/.generated/services/models/booking_dto.g.dart
@@ -26,7 +26,8 @@ BookingDTO _$BookingDTOFromJson(Map json) => BookingDTO(
balance: json['balance'] as num?,
maskedCardNumber: json['maskedCardNumber'] as String?,
addOnItems: (json['addOnItems'] as List<dynamic>?)
- ?.map((e) => AddOnItem.fromJson(Map<String, dynamic>.from(e as Map)))
+ ?.map((e) =>
+ CheckoutAddonItem.fromJson(Map<String, dynamic>.from(e as Map)))
.toList(),
);
diff --git a/comwell_key_app/lib/booking_details/bloc/booking_details_bloc.dart b/comwell_key_app/lib/booking_details/bloc/booking_details_bloc.dart
index f832dc92..38c4533d 100644
--- a/comwell_key_app/lib/booking_details/bloc/booking_details_bloc.dart
+++ b/comwell_key_app/lib/booking_details/bloc/booking_details_bloc.dart
@@ -106,7 +106,9 @@ class BookingDetailsBloc
Emitter<BookingDetailsState> emit, String bookingId) async {
emit(state.loading());
try {
- booking = await profileRepository.getBookingDetails(bookingId);
+ final bookingDetails =
+ await profileRepository.getBookingDetails(bookingId);
+ booking = bookingDetails;
return booking;
} catch (e) {
@@ -200,9 +202,6 @@ class BookingDetailsBloc
return false;
}
- print("checkOutDate: ${checkOutDate.isAfter(today)}");
- print("today: $today");
-
return checkOutDate.isBefore(today);
}
@@ -210,7 +209,7 @@ class BookingDetailsBloc
bool get isHouseKeepingTime =>
- booking.endDate.difference(booking.startDate).inDays > 2;
+ booking.endDate.difference(booking.startDate).inDays >= 2;
Future<void> getUser(Emitter<BookingDetailsState> emit) async {
user = await profileRepository.fetchProfileSettings();
diff --git a/comwell_key_app/lib/booking_details/booking_details_page.dart b/comwell_key_app/lib/booking_details/booking_details_page.dart
index 45ce7642..7934b24d 100644
--- a/comwell_key_app/lib/booking_details/booking_details_page.dart
+++ b/comwell_key_app/lib/booking_details/booking_details_page.dart
@@ -8,6 +8,7 @@ import 'package:comwell_key_app/common/components/shimmer_loader/booking_details
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:comwell_key_app/services/mappers/booking_mapper.dart';
+import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -29,10 +30,12 @@ class BookingDetailsPage extends StatelessWidget {
if (state.status == BookingDetailsStatus.initial) {
cubit.add(InitialEvent());
}
-
+
+ print("qqq booking ${cubit.booking}");
+
return Scaffold(
extendBodyBehindAppBar: true,
- backgroundColor: Colors.white,
+ backgroundColor: colorBackground,
appBar: const ComwellAppBar(),
body: Builder(
builder: (context) {
@@ -146,13 +149,13 @@ class BookingDetailsPage extends StatelessWidget {
Text(
cubit.booking.id,
style: theme.textTheme.labelLarge?.copyWith(
- color: Colors.white.withValues(alpha: 0.65)
+ color: colorBackground
),
),
Text(
cubit.booking.toRoomType(),
style: theme.textTheme.headlineMedium?.copyWith(
- color: Colors.white,
+ color: colorBackground,
),
),
],
@@ -164,14 +167,14 @@ class BookingDetailsPage extends StatelessWidget {
'balance'.tr(),
textAlign: TextAlign.end,
style: theme.textTheme.labelLarge?.copyWith(
- color: Colors.white.withValues(alpha: 0.65)
+ color: colorBackground
),
),
Text(
'total_charge_value'.tr(
args: [cubit.trimmedBalance]),
style: theme.textTheme.headlineMedium?.copyWith(
- color: Colors.white,
+ color: colorBackground,
),
),
],
@@ -183,7 +186,7 @@ class BookingDetailsPage extends StatelessWidget {
),
const Icon(
Icons.chevron_right,
- color: Colors.white,
+ color: colorBackground,
size: 36,
),
],
diff --git a/comwell_key_app/lib/check_in/bloc/check_in_cubit.dart b/comwell_key_app/lib/check_in/bloc/check_in_cubit.dart
index ff9d6757..fcfff3e3 100644
--- a/comwell_key_app/lib/check_in/bloc/check_in_cubit.dart
+++ b/comwell_key_app/lib/check_in/bloc/check_in_cubit.dart
@@ -17,7 +17,7 @@ class CheckInCubit extends Cubit<CheckInState> {
try {
await Future<void>.delayed(const Duration(milliseconds: 500));
emit(state.checkInStatusLoading());
- //await _checkInRepository.checkIn(booking.confirmationId);
+ await _checkInRepository.checkIn(booking.confirmationId);
final bookingDetails = await _checkInRepository.getBookingDetails(booking.id);
emit(state.checkInStatusRoomFound(roomNumber: bookingDetails.roomNumber));
await _checkInRepository.checkIfSetup();
@@ -36,12 +36,11 @@ class CheckInCubit extends Cubit<CheckInState> {
Future<void> onDonePressed() async {
emit(state.checkInStatusLoading());
try {
- // emit(state.checkInStatusDone());
+ emit(state.checkInStatusDone());
} catch (err, st) {
if (kDebugMode) print("qqq err=$err, $st");
emit(state.checkInStatusError(Exception(err.toString())));
}
- //emit(state.checkInStatusDone());
}
Future<void> tryGetKeys({int attempt = 0}) async {
diff --git a/comwell_key_app/lib/check_in/bloc/check_in_state.dart b/comwell_key_app/lib/check_in/bloc/check_in_state.dart
index 3ea1cf6e..b5adc533 100644
--- a/comwell_key_app/lib/check_in/bloc/check_in_state.dart
+++ b/comwell_key_app/lib/check_in/bloc/check_in_state.dart
@@ -31,6 +31,8 @@ class CheckInState {
return "check_in_room_not_found_title".tr();
case CheckInStatusError _:
return "check_in_error_title".tr();
+ case CheckInStatusDone _:
+ return "check_in_done_title".tr();
}
}
@@ -64,6 +66,9 @@ class CheckInState {
CheckInState checkInStatusError(Exception exception) =>
_copyWith(checkInStatus: CheckInStatusError(exception: exception), loading: false);
+ CheckInState checkInStatusDone() =>
+ _copyWith(checkInStatus: CheckInStatusDone());
+
CheckInState bookingLoaded({required Booking booking}) =>
_copyWith(booking: booking);
@@ -99,6 +104,8 @@ final class CheckInStatusYourDigitalCard extends CheckInStatus {
CheckInStatusYourDigitalCard({required this.roomNumber});
}
+final class CheckInStatusDone extends CheckInStatus {}
+
final class CheckInStatusError extends CheckInStatus {
final Exception exception;
diff --git a/comwell_key_app/lib/check_out/bloc/check_out_cubit.dart b/comwell_key_app/lib/check_out/bloc/check_out_cubit.dart
index 0e85f956..915cf6d7 100644
--- a/comwell_key_app/lib/check_out/bloc/check_out_cubit.dart
+++ b/comwell_key_app/lib/check_out/bloc/check_out_cubit.dart
@@ -22,7 +22,7 @@ class CheckoutCubit extends Cubit<CheckoutState> {
final ProfileRepository profileRepository = locator<ProfileRepository>();
final PreregistrationRepository preregistrationRepository =
locator<PreregistrationRepository>();
- final CheckOutRepository checkOutRepository = locator<CheckOutRepository>();
+ final CheckOutRepository checkOutRepository;
final _tracking = locator<ComwellTracking>();
final pageController = PageController();
bool _isAnimating = false;
@@ -31,15 +31,17 @@ class CheckoutCubit extends Cubit<CheckoutState> {
CheckoutPage get currentPage =>
CheckoutPage.fromIndex(pageController.page?.toInt() ?? 0);
- CheckoutCubit(this.booking) : super(CheckoutState.initial());
+ CheckoutCubit(this.booking, this.checkOutRepository)
+ : super(CheckoutState.initial());
void init() async {
try {
final user = await profileRepository.fetchProfileSettings();
- emit(state.clubPointsFetched(user.points));
- //setItems([...state.items, CheckoutItem("Körv", 500)]);
+ //emit(state.clubPointsFetched(user.points));
+ setItems(booking.addOnItems ?? []);
+ print("qqq user ${state.items}");
+
} catch (e) {
- // Todo handle error
emit(state.processingStateUpdated(
CheckoutProcessingStateError(message: "Error fetching club points")));
}
@@ -53,7 +55,8 @@ class CheckoutCubit extends Cubit<CheckoutState> {
}
}
- void setItems(Iterable<AddOnItem> items) {
+ void setItems(Iterable<CheckoutAddonItem> items) {
+
emit(state.itemsUpdated(items));
}
@@ -62,12 +65,12 @@ class CheckoutCubit extends Cubit<CheckoutState> {
final analyticsEventItem = AnalyticsEventItem(
hotelName: booking.hotelName,
currency: "DKK",
- value: booking.balance!.toInt(),
+ value: booking.balance?.toInt() ?? 0,
placement: "placement",
- items: ["items"],
+ items: booking.addOnItems?.map((e) => e.description).toList() ?? [],
itemId: "itemId",
itemName: "itemName",
- price: booking.balance!.toInt(),
+ price: booking.balance?.toInt() ?? 0,
quantity: 1);
_tracking.trackBeginCheckout(analyticsEventItem);
emit(state.processingStateUpdated(CheckoutProcessingStateProcessing()));
@@ -196,7 +199,6 @@ class CheckoutCubit extends Cubit<CheckoutState> {
case PaymentSessionFinished():
emit(state
.processingStateUpdated(CheckoutProcessingPaymentStateSuccess()));
- //await Future<void>.delayed(const Duration(milliseconds: 4000));
emit(state.processingStateUpdated(CheckoutProcessingStateConfirmed()));
await checkOut();
@@ -205,13 +207,9 @@ class CheckoutCubit extends Cubit<CheckoutState> {
case PaymentError():
emit(state.processingStateUpdated(
CheckoutProcessingStateError(message: "Error processing payment")));
- await Future<void>.delayed(const Duration(milliseconds: 1000));
- //emit(state.processingStateUpdated(CheckoutProcessingStateNotStarted()));
}
}
-
-
void onUserDismissPaymentPopup() {
emit(state.processingStateUpdated(CheckoutProcessingStateNotStarted()));
}
diff --git a/comwell_key_app/lib/check_out/bloc/check_out_state.dart b/comwell_key_app/lib/check_out/bloc/check_out_state.dart
index 7b19e8eb..039cfb94 100644
--- a/comwell_key_app/lib/check_out/bloc/check_out_state.dart
+++ b/comwell_key_app/lib/check_out/bloc/check_out_state.dart
@@ -5,7 +5,7 @@ import 'package:comwell_key_app/check_out/pages/check_out_page.dart';
import 'package:equatable/equatable.dart';
class CheckoutState extends Equatable {
- final Iterable<AddOnItem> _items;
+ final Iterable<CheckoutAddonItem> _items;
final bool isTermsAccepted;
final bool applyClubPoints;
final int clubPoints;
@@ -13,21 +13,23 @@ class CheckoutState extends Equatable {
final CheckoutPage page;
final CheckoutPaymentMethod? paymentMethod;
final bool showTermsError;
+
- num get totalPriceBeforeDiscount => _sumOfList(_items);
+ int get totalPriceBeforeDiscount => _sumOfList(_items);
- num get totalPriceAfterDiscount => _sumOfList(items);
+ int get totalPriceAfterDiscount => _sumOfList(items);
- num get totalPrice => _sumOfList(_items);
+ int get totalPrice => _sumOfList(_items);
- Iterable<AddOnItem> get items {
+ Iterable<CheckoutAddonItem> get items {
if (applyClubPoints) {
- return [..._items, AddOnItem("Rabat", "Rabat", clubPoints * -1, clubPoints * -1)];
+ return [..._items, CheckoutAddonItem("Rabat", "Rabat", clubPoints * -1, clubPoints * -1)];
}
+
return _items;
}
- num _sumOfList(Iterable<AddOnItem> list) {
+ int _sumOfList(Iterable<CheckoutAddonItem> list) {
if (list.isEmpty) return 0;
return list
.map((item) => item.price)
@@ -35,7 +37,7 @@ class CheckoutState extends Equatable {
}
const CheckoutState({
- required Iterable<AddOnItem> items,
+ required Iterable<CheckoutAddonItem> items,
required this.isTermsAccepted,
required this.page,
required this.showTermsError,
@@ -55,8 +57,14 @@ class CheckoutState extends Equatable {
processingState = CheckoutProcessingStateNotStarted(),
applyClubPoints = false;
- CheckoutState itemsUpdated(Iterable<AddOnItem> items) =>
- _copyWith(items: items);
+ CheckoutState itemsUpdated(Iterable<CheckoutAddonItem> items) {
+
+ final newItems = <CheckoutAddonItem>[];
+ for (var item in items) {
+ newItems.add(item.copyWith(price: item.price * item.quantity));
+ }
+ return _copyWith(items: newItems);
+ }
CheckoutState termsAccepted() => _copyWith(termsAccepted: true, showTermsError: false);
@@ -82,7 +90,7 @@ class CheckoutState extends Equatable {
CheckoutState _copyWith({
- Iterable<AddOnItem>? items,
+ Iterable<CheckoutAddonItem>? items,
bool? termsAccepted,
bool? applyClubPoints,
CheckoutProcessingState? updateProcessingState,
@@ -102,10 +110,6 @@ class CheckoutState extends Equatable {
paymentMethod: paymentMethod ?? this.paymentMethod);
}
- static Iterable<AddOnItem> _mockItems() =>
- [1, 2, 3].map((i) => AddOnItem("item $i", "item $i", 1, i * 100));
-
-
@override
List<Object?> get props =>
[
diff --git a/comwell_key_app/lib/check_out/components/check_out_bill_list_item.dart b/comwell_key_app/lib/check_out/components/check_out_bill_list_item.dart
index cf45446c..0d651ac1 100644
--- a/comwell_key_app/lib/check_out/components/check_out_bill_list_item.dart
+++ b/comwell_key_app/lib/check_out/components/check_out_bill_list_item.dart
@@ -2,18 +2,19 @@ import 'package:comwell_key_app/check_out/models/check_out_item.dart';
import 'package:flutter/material.dart';
class CheckOutBillListItem extends StatelessWidget {
- final AddOnItem item;
+ final CheckoutAddonItem item;
const CheckOutBillListItem({super.key, required this.item});
@override
Widget build(BuildContext context) {
+ final totalItems = item.quantity > 1 ? "${item.quantity}x" : "";
return Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
- item.code,
+ "${item.description} $totalItems",
style: Theme.of(context).textTheme.bodyMedium,
),
Text(
diff --git a/comwell_key_app/lib/check_out/models/check_out_item.dart b/comwell_key_app/lib/check_out/models/check_out_item.dart
index e3568b54..8a00d0f6 100644
--- a/comwell_key_app/lib/check_out/models/check_out_item.dart
+++ b/comwell_key_app/lib/check_out/models/check_out_item.dart
@@ -3,20 +3,24 @@ import 'package:json_annotation/json_annotation.dart';
part '../../.generated/check_out/models/check_out_item.g.dart';
@JsonSerializable()
-class AddOnItem {
+class CheckoutAddonItem {
final String code;
final String description;
final int quantity;
- final num price;
+ final int price;
- AddOnItem(this.code, this.description, this.quantity, this.price);
+ CheckoutAddonItem(this.code, this.description, this.quantity, this.price);
@override
String toString() {
return 'AddOnItem{code: $code, description: $description, quantity: $quantity, price: $price}';
}
- factory AddOnItem.fromJson(Map<String, dynamic> json) => _$AddOnItemFromJson(json);
+ factory CheckoutAddonItem.fromJson(Map<String, dynamic> json) => _$CheckoutAddonItemFromJson(json);
- Map<String, dynamic> toJson() => _$AddOnItemToJson(this);
+ Map<String, dynamic> toJson() => _$CheckoutAddonItemToJson(this);
+
+ CheckoutAddonItem copyWith({int? quantity, int? price}) {
+ return CheckoutAddonItem(code, description, quantity ?? this.quantity, price ?? this.price);
+ }
}
\ No newline at end of file
diff --git a/comwell_key_app/lib/overview/models/booking.dart b/comwell_key_app/lib/overview/models/booking.dart
index c53e20f8..d03d5ed2 100644
--- a/comwell_key_app/lib/overview/models/booking.dart
+++ b/comwell_key_app/lib/overview/models/booking.dart
@@ -27,7 +27,7 @@ class Booking extends Equatable {
final num? balance;
final String? maskedCardNumber;
final List<Room> rooms;
- final List<AddOnItem>? addOnItems;
+ final List<CheckoutAddonItem>? addOnItems;
Booking({
required this.id,
@@ -116,7 +116,7 @@ class Booking extends Equatable {
Iterable<Guest>? guests,
num? totalCharge,
List<Room>? rooms,
- List<AddOnItem>? addOnItems,
+ List<CheckoutAddonItem>? addOnItems,
}) {
return Booking(
id: id ?? this.id,
diff --git a/comwell_key_app/lib/overview/repository/overview_repository.dart b/comwell_key_app/lib/overview/repository/overview_repository.dart
index fffcbfda..8517e5fa 100644
--- a/comwell_key_app/lib/overview/repository/overview_repository.dart
+++ b/comwell_key_app/lib/overview/repository/overview_repository.dart
@@ -59,7 +59,7 @@ class OverviewRepository {
totalCharge: 12345,
balance: 0,
maskedCardNumber: "1234567890",
- addOnItems: [AddOnItem("addOnItem1", "addOnItem1", 1, 100), AddOnItem("addOnItem2", "addOnItem2", 1, 200), AddOnItem("addOnItem3", "addOnItem3", 1, 300)]);
+ addOnItems: [CheckoutAddonItem("addOnItem1", "addOnItem1", 1, 100), CheckoutAddonItem("addOnItem2", "addOnItem2", 1, 200), CheckoutAddonItem("addOnItem3", "addOnItem3", 1, 300)]);
return dto.toBooking(user.id, BookingStatus.current, []);
}
}
@@ -95,4 +95,4 @@ final mockBookings = [1, 2, 3].map((i) => Booking(
roomFacilities: [],
tags: ["10 M2"]),
],
- addOnItems: [AddOnItem("addOnItem$i", "addOnItem$i", 1, 100)]));
+ addOnItems: [CheckoutAddonItem("addOnItem$i", "addOnItem$i", 1, 100)]));
diff --git a/comwell_key_app/lib/routing/app_router.dart b/comwell_key_app/lib/routing/app_router.dart
index be43a001..2400296a 100644
--- a/comwell_key_app/lib/routing/app_router.dart
+++ b/comwell_key_app/lib/routing/app_router.dart
@@ -5,6 +5,7 @@ import 'package:comwell_key_app/check_in/check_in_page.dart';
import 'package:comwell_key_app/check_out/bloc/check_out_cubit.dart';
import 'package:comwell_key_app/check_out/bloc/check_out_state.dart';
import 'package:comwell_key_app/check_out/check_out_flow.dart';
+import 'package:comwell_key_app/check_out/check_out_repository.dart';
import 'package:comwell_key_app/choose_share_room/choose_share_room_page.dart';
import 'package:comwell_key_app/choose_share_room/choose_share_room_repository.dart';
import 'package:comwell_key_app/choose_share_room/cubit/choose_share_room_cubit.dart';
@@ -353,7 +354,9 @@ GoRouter goRouter() {
builder: (context, state) {
final booking = state.extra as Booking;
return BlocProvider(
- create: (context) => CheckoutCubit(booking),
+ create: (context) =>
+ CheckoutCubit(booking, locator<CheckOutRepository>())
+ ..init(),
child: BlocBuilder<CheckoutCubit, CheckoutState>(
builder: (context, state) {
return CheckOutFlow(key: ValueKey(state));
diff --git a/comwell_key_app/lib/services/models/booking_dto.dart b/comwell_key_app/lib/services/models/booking_dto.dart
index a9fd4ec3..3961a0c0 100644
--- a/comwell_key_app/lib/services/models/booking_dto.dart
+++ b/comwell_key_app/lib/services/models/booking_dto.dart
@@ -24,7 +24,7 @@ class BookingDTO {
final num? totalCharge;
final num? balance;
final String? maskedCardNumber;
- final List<AddOnItem>? addOnItems;
+ final List<CheckoutAddonItem>? addOnItems;
BookingDTO({
required this.roomNumber,