6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit f02997c4
Changed files
common/assets/translations/intl_en.arb | 10 +- common/lib/.generated/l10n/app_localizations.dart | 10 +- .../lib/.generated/l10n/app_localizations_en.dart | 10 +- .../lib/.generated/assets/assets.gen.dart | 5 +- .../.generated/domain/models/housekeeping.g.dart | 28 +++++ .../housekeeping/models/housekeeping.g.dart | 28 ----- .../choose_share_room_repository.dart | 2 +- .../lib/database/daos/bookings_dao.dart | 2 +- comwell_key_app/lib/database/daos/user_dao.dart | 2 +- .../lib/domain/models/housekeeping.dart | 38 ++++++ .../repositories/booking_details_repository.dart | 2 +- .../repositories/housekeeping_repository.dart | 40 ++++++ .../domain/repositories/profile_repository.dart | 2 +- .../repositories/profile_settings_repository.dart | 2 +- .../lib/find_booking/find_booking_repository.dart | 2 +- .../components/housekeeping_service.dart | 53 -------- .../components/selectable_service.dart | 91 -------------- .../lib/housekeeping/cubit/housekeeping_cubit.dart | 56 --------- .../lib/housekeeping/cubit/housekeeping_state.dart | 20 --- .../lib/housekeeping/house_keeping_route.dart | 2 +- .../lib/housekeeping/housekeeping_page.dart | 115 ----------------- .../lib/housekeeping/housekeeping_repository.dart | 40 ------ .../lib/housekeeping/models/housekeeping.dart | 38 ------ .../lib/my_booking/my_booking_page.dart | 2 +- .../overview/repository/overview_repository.dart | 2 +- .../bloc/booking_details_cubit.dart | 6 +- .../booking_details/booking_details_page.dart | 2 +- .../components/housekeeping_service.dart | 53 ++++++++ .../components/selectable_service.dart | 91 ++++++++++++++ .../house_keeping/cubit/housekeeping_cubit.dart | 56 +++++++++ .../house_keeping/cubit/housekeeping_state.dart | 20 +++ .../screens/house_keeping/housekeeping_page.dart | 115 +++++++++++++++++ .../past_cancelled_booking_detail_page.dart | 2 +- comwell_key_app/lib/services/api.dart | 2 +- .../interceptors/mappers/addon_item_mapper.dart | 44 +++++++ .../interceptors/mappers/booking_mapper.dart | 140 +++++++++++++++++++++ .../interceptors/mappers/bookings_mapper.dart | 15 +++ .../services/interceptors/mappers/room_mapper.dart | 21 ++++ .../services/interceptors/mappers/user_mapper.dart | 92 ++++++++++++++ .../lib/services/mappers/addon_item_mapper.dart | 44 ------- .../lib/services/mappers/booking_mapper.dart | 140 --------------------- .../lib/services/mappers/bookings_mapper.dart | 15 --- .../lib/services/mappers/room_mapper.dart | 21 ---- .../lib/services/mappers/user_mapper.dart | 92 -------------- .../lib/share/share_booking_repository.dart | 2 +- comwell_key_app/lib/utils/locator.dart | 2 +- comwell_key_app/pubspec.yaml | 1 + .../android/.gradle/8.1.1/checksums/checksums.lock | Bin 17 -> 17 bytes .../.gradle/8.1.1/checksums/md5-checksums.bin | Bin 35197 -> 41197 bytes .../.gradle/8.1.1/checksums/sha1-checksums.bin | Bin 109964 -> 154187 bytes 50 files changed, 791 insertions(+), 787 deletions(-)
Diff
diff --git a/common/assets/translations/intl_en.arb b/common/assets/translations/intl_en.arb
index c7a421c0..cd761a84 100644
--- a/common/assets/translations/intl_en.arb
+++ b/common/assets/translations/intl_en.arb
@@ -114,7 +114,7 @@
"nationality": "Nationality",
"preregistration_payment_title": "Payment card",
"preregistration_payment_subtitle": "To stay overnight at Comwell, we need a payment card.",
- "preregistration_payment_add_card": "Add map",
+ "preregistration_payment_add_card": "Add card",
"preregistration_confirmation_title": "Registration information",
"preregistration_confirmation_profile_card_title": "Profile information",
"preregistration_confirmation_address_card_title": "Address",
@@ -123,7 +123,7 @@
"preregistration_confirmation_extras_card_title_plural": "{amount} selected add-ons",
"preregistration_my_addons": "My purchases",
"preregistration_my_addons_subtitle": "Ea sit sunt sunt sint exercitation id cupidatat ipsum quis eu quis incididunt mollit ea pariatur.",
- "preregistration_confirmation_extras_card_subtitle": "Will be written on your room bill",
+ "preregistration_confirmation_extras_card_subtitle": "Written on your room bill",
"need_help": "Do you need help?",
"call_us": "Call us",
"call_us_description": "Do you need to get in touch with one of our hotels? Use the button below to call.",
@@ -183,7 +183,7 @@
"checkout_page_payment_total": "Total",
"checkout_page_payment_price": "{amount} kr.",
"checkout_page_payment_club_points_title": "Use Comwell Club Points",
- "checkout_page_payment_club_points_subtitle": "You have {points} points, use and save {amount}kr.",
+ "checkout_page_payment_club_points_subtitle": "You have {points} points, use them and save {amount}kr.",
"checkout_page_payment_club_points_subtitle_zero": "You have no points to use.",
"checkout_page_payment_payment_title": "Pay and check out",
"checkout_page_confirmation": "Go to check out",
@@ -227,7 +227,7 @@
"notifications_page_title": "Notifications",
"subscribe_all": "Subscribe to all notifications",
"company_deal": "Company agreement",
- "company_deal_subtitle": "Yes, I would like to receive relevant information related to the company agreement from Comwell A/S via email and SMS. You can terminate your registration at any time by clicking the exit link at the bottom of the email.",
+ "company_deal_subtitle": "Yes, I would like to receive relevant information related to the company agreement from Comwell A/S via email and SMS. You can end your registration at any time by clicking the exit link at the bottom of the email.",
"club_newsletter": "Comwell Club newsletter",
"club_newsletter_subtitle": "Yes, I would like to receive emails with exciting offers on hotel stays and events at Comwell Hotels. I can unsubscribe at any time.",
"digital_media": "Digital media",
@@ -398,7 +398,7 @@
"accept_notifications_rationale": "To get the latest updates about your booking, please allow notifications.",
"allow": "Allow",
"skip": "Skip",
- "internet_disabled": "The Internet is down.",
+ "internet_disabled": "The internet is down.",
"please_enable_internet": "Please check your internet connection.",
"bluetooth_disabled": "Bluetooth is disabled.",
"please_enable_bluetooth": "Activate Bluetooth",
diff --git a/common/lib/.generated/l10n/app_localizations.dart b/common/lib/.generated/l10n/app_localizations.dart
index aa682831..a904126f 100644
--- a/common/lib/.generated/l10n/app_localizations.dart
+++ b/common/lib/.generated/l10n/app_localizations.dart
@@ -785,7 +785,7 @@ abstract class AppLocalizations {
/// No description provided for @preregistration_payment_add_card.
///
/// In en, this message translates to:
- /// **'Add map'**
+ /// **'Add card'**
String get preregistration_payment_add_card;
/// No description provided for @preregistration_confirmation_title.
@@ -839,7 +839,7 @@ abstract class AppLocalizations {
/// No description provided for @preregistration_confirmation_extras_card_subtitle.
///
/// In en, this message translates to:
- /// **'Will be written on your room bill'**
+ /// **'Written on your room bill'**
String get preregistration_confirmation_extras_card_subtitle;
/// No description provided for @need_help.
@@ -1199,7 +1199,7 @@ abstract class AppLocalizations {
/// No description provided for @checkout_page_payment_club_points_subtitle.
///
/// In en, this message translates to:
- /// **'You have {points} points, use and save {amount}kr.'**
+ /// **'You have {points} points, use them and save {amount}kr.'**
String checkout_page_payment_club_points_subtitle(
Object amount,
Object points,
@@ -1466,7 +1466,7 @@ abstract class AppLocalizations {
/// No description provided for @company_deal_subtitle.
///
/// In en, this message translates to:
- /// **'Yes, I would like to receive relevant information related to the company agreement from Comwell A/S via email and SMS. You can terminate your registration at any time by clicking the exit link at the bottom of the email.'**
+ /// **'Yes, I would like to receive relevant information related to the company agreement from Comwell A/S via email and SMS. You can end your registration at any time by clicking the exit link at the bottom of the email.'**
String get company_deal_subtitle;
/// No description provided for @club_newsletter.
@@ -2492,7 +2492,7 @@ abstract class AppLocalizations {
/// No description provided for @internet_disabled.
///
/// In en, this message translates to:
- /// **'The Internet is down.'**
+ /// **'The internet is down.'**
String get internet_disabled;
/// No description provided for @please_enable_internet.
diff --git a/common/lib/.generated/l10n/app_localizations_en.dart b/common/lib/.generated/l10n/app_localizations_en.dart
index d8bebd09..0f1c9072 100644
--- a/common/lib/.generated/l10n/app_localizations_en.dart
+++ b/common/lib/.generated/l10n/app_localizations_en.dart
@@ -365,7 +365,7 @@ class AppLocalizationsEn extends AppLocalizations {
'To stay overnight at Comwell, we need a payment card.';
@override
- String get preregistration_payment_add_card => 'Add map';
+ String get preregistration_payment_add_card => 'Add card';
@override
String get preregistration_confirmation_title => 'Registration information';
@@ -398,7 +398,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get preregistration_confirmation_extras_card_subtitle =>
- 'Will be written on your room bill';
+ 'Written on your room bill';
@override
String get need_help => 'Do you need help?';
@@ -607,7 +607,7 @@ class AppLocalizationsEn extends AppLocalizations {
Object amount,
Object points,
) {
- return 'You have $points points, use and save ${amount}kr.';
+ return 'You have $points points, use them and save ${amount}kr.';
}
@override
@@ -752,7 +752,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get company_deal_subtitle =>
- 'Yes, I would like to receive relevant information related to the company agreement from Comwell A/S via email and SMS. You can terminate your registration at any time by clicking the exit link at the bottom of the email.';
+ 'Yes, I would like to receive relevant information related to the company agreement from Comwell A/S via email and SMS. You can end your registration at any time by clicking the exit link at the bottom of the email.';
@override
String get club_newsletter => 'Comwell Club newsletter';
@@ -1330,7 +1330,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get skip => 'Skip';
@override
- String get internet_disabled => 'The Internet is down.';
+ String get internet_disabled => 'The internet is down.';
@override
String get please_enable_internet => 'Please check your internet connection.';
diff --git a/comwell_key_app/lib/.generated/assets/assets.gen.dart b/comwell_key_app/lib/.generated/assets/assets.gen.dart
index d57457ce..0ffb709b 100644
--- a/comwell_key_app/lib/.generated/assets/assets.gen.dart
+++ b/comwell_key_app/lib/.generated/assets/assets.gen.dart
@@ -17,6 +17,9 @@ import 'package:vector_graphics/vector_graphics.dart' as _vg;
class $EnvGen {
const $EnvGen();
+ /// File path: env/.dev.env
+ String get aDev => 'env/.dev.env';
+
/// File path: env/.prod.env
String get aProd => 'env/.prod.env';
@@ -24,7 +27,7 @@ class $EnvGen {
String get aStage => 'env/.stage.env';
/// List of all assets
- List<String> get values => [aProd, aStage];
+ List<String> get values => [aDev, aProd, aStage];
}
class $AssetsAnimationsGen {
diff --git a/comwell_key_app/lib/.generated/domain/models/housekeeping.g.dart b/comwell_key_app/lib/.generated/domain/models/housekeeping.g.dart
new file mode 100644
index 00000000..0cf563a0
--- /dev/null
+++ b/comwell_key_app/lib/.generated/domain/models/housekeeping.g.dart
@@ -0,0 +1,28 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of '../../../domain/models/housekeeping.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+Housekeeping _$HousekeepingFromJson(Map json) => Housekeeping(
+ hotelCode: json['hotelCode'] as String,
+ roomNumber: json['roomNumber'] as String,
+ cleaning: json['cleaning'] as bool,
+ soap: json['soap'] as bool,
+ towels: json['towels'] as bool,
+ trash: json['trash'] as bool,
+ refill: json['refill'] as bool,
+);
+
+Map<String, dynamic> _$HousekeepingToJson(Housekeeping instance) =>
+ <String, dynamic>{
+ 'hotelCode': instance.hotelCode,
+ 'roomNumber': instance.roomNumber,
+ 'cleaning': instance.cleaning,
+ 'soap': instance.soap,
+ 'towels': instance.towels,
+ 'trash': instance.trash,
+ 'refill': instance.refill,
+ };
diff --git a/comwell_key_app/lib/.generated/housekeeping/models/housekeeping.g.dart b/comwell_key_app/lib/.generated/housekeeping/models/housekeeping.g.dart
deleted file mode 100644
index 645c2917..00000000
--- a/comwell_key_app/lib/.generated/housekeeping/models/housekeeping.g.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of '../../../housekeeping/models/housekeeping.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-Housekeeping _$HousekeepingFromJson(Map json) => Housekeeping(
- hotelCode: json['hotelCode'] as String,
- roomNumber: json['roomNumber'] as String,
- cleaning: json['cleaning'] as bool,
- soap: json['soap'] as bool,
- towels: json['towels'] as bool,
- trash: json['trash'] as bool,
- refill: json['refill'] as bool,
-);
-
-Map<String, dynamic> _$HousekeepingToJson(Housekeeping instance) =>
- <String, dynamic>{
- 'hotelCode': instance.hotelCode,
- 'roomNumber': instance.roomNumber,
- 'cleaning': instance.cleaning,
- 'soap': instance.soap,
- 'towels': instance.towels,
- 'trash': instance.trash,
- 'refill': instance.refill,
- };
diff --git a/comwell_key_app/lib/choose_share_room/choose_share_room_repository.dart b/comwell_key_app/lib/choose_share_room/choose_share_room_repository.dart
index d2c4ee06..d6f257b2 100644
--- a/comwell_key_app/lib/choose_share_room/choose_share_room_repository.dart
+++ b/comwell_key_app/lib/choose_share_room/choose_share_room_repository.dart
@@ -1,6 +1,6 @@
import 'package:comwell_key_app/overview/models/room.dart';
import 'package:comwell_key_app/services/api.dart';
-import 'package:comwell_key_app/services/mappers/room_mapper.dart';
+import 'package:comwell_key_app/services/interceptors/mappers/room_mapper.dart';
import 'package:comwell_key_app/services/models/room_dto.dart';
class ChooseShareRoomRepository {
diff --git a/comwell_key_app/lib/database/daos/bookings_dao.dart b/comwell_key_app/lib/database/daos/bookings_dao.dart
index c69041c4..119cda11 100644
--- a/comwell_key_app/lib/database/daos/bookings_dao.dart
+++ b/comwell_key_app/lib/database/daos/bookings_dao.dart
@@ -1,6 +1,6 @@
import 'dart:convert';
import 'package:comwell_key_app/database/comwell_db.dart';
-import 'package:comwell_key_app/services/mappers/booking_mapper.dart';
+import 'package:comwell_key_app/services/interceptors/mappers/booking_mapper.dart';
import 'package:comwell_key_app/services/models/booking_dto.dart';
import 'package:comwell_key_app/services/models/bookings_dto.dart';
import 'package:comwell_key_app/utils/json.dart';
diff --git a/comwell_key_app/lib/database/daos/user_dao.dart b/comwell_key_app/lib/database/daos/user_dao.dart
index eaa1c814..e4ea108f 100644
--- a/comwell_key_app/lib/database/daos/user_dao.dart
+++ b/comwell_key_app/lib/database/daos/user_dao.dart
@@ -2,7 +2,7 @@ import 'dart:convert';
import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/domain/models/user.dart';
-import 'package:comwell_key_app/services/mappers/user_mapper.dart';
+import 'package:comwell_key_app/services/interceptors/mappers/user_mapper.dart';
import 'package:comwell_key_app/services/models/user_dto.dart';
import 'package:comwell_key_app/utils/json.dart';
import 'package:drift/drift.dart';
diff --git a/comwell_key_app/lib/domain/models/housekeeping.dart b/comwell_key_app/lib/domain/models/housekeeping.dart
new file mode 100644
index 00000000..cf74569f
--- /dev/null
+++ b/comwell_key_app/lib/domain/models/housekeeping.dart
@@ -0,0 +1,38 @@
+import 'package:comwell_key_app/presentation/screens/house_keeping/components/housekeeping_service.dart';
+import 'package:json_annotation/json_annotation.dart';
+
+part '../../.generated/domain/models/housekeeping.g.dart';
+
+@JsonSerializable()
+class Housekeeping {
+ final String hotelCode;
+ final String roomNumber;
+ final bool cleaning;
+ final bool soap;
+ final bool towels;
+ final bool trash;
+ final bool refill;
+
+ Housekeeping({
+ required this.hotelCode,
+ required this.roomNumber,
+ required this.cleaning,
+ required this.soap,
+ required this.towels,
+ required this.trash,
+ required this.refill,
+ });
+
+ factory Housekeeping.toJson(
+ String hotelCode, String roomNumber, List<HouseKeepingService> services) {
+ return Housekeeping(
+ hotelCode: hotelCode,
+ roomNumber: roomNumber,
+ cleaning: services.contains(HouseKeepingService.cleaning),
+ soap: services.contains(HouseKeepingService.soap),
+ towels: services.contains(HouseKeepingService.towels),
+ trash: services.contains(HouseKeepingService.trash),
+ refill: services.contains(HouseKeepingService.refill),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/domain/repositories/booking_details_repository.dart b/comwell_key_app/lib/domain/repositories/booking_details_repository.dart
index fba8efa1..16d67c7b 100644
--- a/comwell_key_app/lib/domain/repositories/booking_details_repository.dart
+++ b/comwell_key_app/lib/domain/repositories/booking_details_repository.dart
@@ -1,7 +1,7 @@
import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/services/api.dart';
-import 'package:comwell_key_app/services/mappers/booking_mapper.dart';
+import 'package:comwell_key_app/services/interceptors/mappers/booking_mapper.dart';
import 'package:comwell_key_app/services/models/bookings_dto.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:comwell_key_app/utils/secure_storage.dart';
diff --git a/comwell_key_app/lib/domain/repositories/housekeeping_repository.dart b/comwell_key_app/lib/domain/repositories/housekeeping_repository.dart
new file mode 100644
index 00000000..14f953e9
--- /dev/null
+++ b/comwell_key_app/lib/domain/repositories/housekeeping_repository.dart
@@ -0,0 +1,40 @@
+import 'package:comwell_key_app/domain/models/housekeeping.dart';
+import 'package:comwell_key_app/services/api.dart';
+import 'package:comwell_key_app/utils/locator.dart';
+
+import '../../utils/secure_storage.dart';
+
+class HouseKeepingRepository {
+ final secureStorage = locator<SecureStorage>();
+ final api = Api();
+
+ Future<void> saveHouseKeepingOrdered(Housekeeping housekeeping) async {
+ await secureStorage.write(
+ houseKeepingLastOrderedKey(housekeeping.roomNumber),
+ DateTime.now().millisecondsSinceEpoch.toString());
+ await api.orderHousekeeping(housekeeping);
+ }
+
+ Future<bool> isHousesKeepingOrdered(String roomNumber) async {
+ final lastOrderedValue = await secureStorage
+ .read(HouseKeepingRepository.houseKeepingLastOrderedKey(roomNumber));
+ if (lastOrderedValue != null) {
+ final lastOrdered =
+ DateTime.fromMillisecondsSinceEpoch(int.parse(lastOrderedValue))
+ .copyWith(hour: 0, minute: 0, second: 0);
+
+ final isToday = DateTime.now().copyWith(hour: 0, minute: 0, second: 0);
+ final isNextDay = DateTime.now().isAfter(isToday) &&
+ DateTime.now().isAfter(lastOrdered);
+ final timeOfToday = DateTime.now().hour;
+ final isHouseKeepingAllowed = isNextDay &&
+ timeOfToday > 2; // If it's after 3am on the day after the order
+
+ return isHouseKeepingAllowed;
+ }
+ return false;
+ }
+
+ static String houseKeepingLastOrderedKey(String roomNumber) =>
+ 'housekeeping_last_ordered_$roomNumber';
+}
diff --git a/comwell_key_app/lib/domain/repositories/profile_repository.dart b/comwell_key_app/lib/domain/repositories/profile_repository.dart
index e6fda2c0..be1f9e44 100644
--- a/comwell_key_app/lib/domain/repositories/profile_repository.dart
+++ b/comwell_key_app/lib/domain/repositories/profile_repository.dart
@@ -2,7 +2,7 @@ import 'package:comwell_key_app/authentication/authentication_repository.dart';
import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/domain/models/user.dart';
import 'package:comwell_key_app/services/api.dart';
-import 'package:comwell_key_app/services/mappers/user_mapper.dart';
+import 'package:comwell_key_app/services/interceptors/mappers/user_mapper.dart';
import 'package:comwell_key_app/services/models/user_dto.dart';
import 'package:comwell_key_app/utils/json.dart';
import 'package:comwell_key_app/utils/locator.dart';
diff --git a/comwell_key_app/lib/domain/repositories/profile_settings_repository.dart b/comwell_key_app/lib/domain/repositories/profile_settings_repository.dart
index c301a793..5ef73a5b 100644
--- a/comwell_key_app/lib/domain/repositories/profile_settings_repository.dart
+++ b/comwell_key_app/lib/domain/repositories/profile_settings_repository.dart
@@ -1,7 +1,7 @@
import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/domain/models/user.dart';
import 'package:comwell_key_app/services/api.dart';
-import 'package:comwell_key_app/services/mappers/user_mapper.dart';
+import 'package:comwell_key_app/services/interceptors/mappers/user_mapper.dart';
import 'package:comwell_key_app/services/models/user_dto.dart';
import 'package:comwell_key_app/utils/json.dart';
diff --git a/comwell_key_app/lib/find_booking/find_booking_repository.dart b/comwell_key_app/lib/find_booking/find_booking_repository.dart
index 6e6be575..37746555 100644
--- a/comwell_key_app/lib/find_booking/find_booking_repository.dart
+++ b/comwell_key_app/lib/find_booking/find_booking_repository.dart
@@ -1,6 +1,6 @@
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/services/api.dart';
-import 'package:comwell_key_app/services/mappers/booking_mapper.dart';
+import 'package:comwell_key_app/services/interceptors/mappers/booking_mapper.dart';
class FindBookingRepository {
final Api api = Api();
diff --git a/comwell_key_app/lib/housekeeping/components/housekeeping_service.dart b/comwell_key_app/lib/housekeeping/components/housekeeping_service.dart
deleted file mode 100644
index 3db58f31..00000000
--- a/comwell_key_app/lib/housekeeping/components/housekeeping_service.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-import 'package:comwell_key_app/.generated/assets/assets.gen.dart';
-import 'package:comwell_key_app/utils/l10n_utils.dart';
-import 'package:flutter/material.dart';
-
-enum HouseKeepingService {
- cleaning,
- towels,
- refill,
- trash,
- soap;
-
- String titleStringId(BuildContext context) {
- switch (this) {
- case HouseKeepingService.cleaning:
- return context.strings.housekeeping_page_service_title_cleaning;
- case HouseKeepingService.towels:
- return context.strings.housekeeping_page_service_title_towels;
- case HouseKeepingService.refill:
- return context.strings.housekeeping_page_service_title_refill;
- case HouseKeepingService.trash:
- return context.strings.housekeeping_page_service_title_trash;
- case HouseKeepingService.soap:
- return context.strings.housekeeping_page_service_title_soap;
- }
- }
-
- String get assetId {
- switch (this) {
- case HouseKeepingService.cleaning:
- return Assets.icons.iconHousekeepingCleaning.path;
- case HouseKeepingService.towels:
- return Assets.icons.iconHousekeepingTowels.path;
- case HouseKeepingService.refill:
- return Assets.icons.iconHousekeepingCoffee.path;
- case HouseKeepingService.trash:
- return Assets.icons.iconHousekeepingTrash.path;
- case HouseKeepingService.soap:
- return Assets.icons.iconHousekeepingSoap.path;
- }
- }
-
- String subtitleStringId(BuildContext context) {
- switch (this) {
- case HouseKeepingService.cleaning:
- return context.strings.housekeeping_page_service_cleaning_subtitle;
- case HouseKeepingService.towels:
- case HouseKeepingService.refill:
- case HouseKeepingService.trash:
- case HouseKeepingService.soap:
- return "";
- }
- }
-}
diff --git a/comwell_key_app/lib/housekeeping/components/selectable_service.dart b/comwell_key_app/lib/housekeeping/components/selectable_service.dart
deleted file mode 100644
index a2907e6d..00000000
--- a/comwell_key_app/lib/housekeeping/components/selectable_service.dart
+++ /dev/null
@@ -1,91 +0,0 @@
-import 'package:comwell_key_app/housekeeping/cubit/housekeeping_cubit.dart';
-import 'package:comwell_key_app/themes/light_theme.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
-import 'package:flutter_svg/svg.dart';
-import 'housekeeping_service.dart';
-
-class SelectableService extends StatelessWidget {
- final HouseKeepingService service;
-
- const SelectableService({super.key, required this.service});
-
- @override
- Widget build(BuildContext context) {
- final cubit = context.read<HouseKeepingCubit>();
- final isSelected = cubit.state.selectedServices.contains(service.name);
- return InkWell(
- onTap: () {
- cubit.onServiceClicked(service.name);
- },
- borderRadius: const BorderRadius.all(Radius.circular(5)),
- child: Container(
- decoration: BoxDecoration(
- border: Border.all(
- color: colorDivider,
- ),
- borderRadius: const BorderRadius.all(Radius.circular(10)),
- ),
- child: Padding(
- padding: const EdgeInsets.all(12.0),
- child: Row(
- children: [
- Container(
- height: 36,
- width: 36,
- decoration: const BoxDecoration(
- color: colorSecondary,
- shape: BoxShape.circle,
- ),
- child: Padding(
- padding: const EdgeInsets.all(10.0),
- child: SvgPicture.asset(service.assetId),
- ),
- ),
- const SizedBox(width: 12),
- Expanded(
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(
- service.titleStringId(context),
- style: Theme.of(context).textTheme.bodySmall,
- maxLines: 1,
- overflow: TextOverflow.clip,
- ),
- if (service == HouseKeepingService.cleaning)
- Text(service.subtitleStringId(context),
- maxLines: 1,
- style: Theme.of(context)
- .textTheme
- .bodySmall
- ?.copyWith(color: Colors.grey),
- overflow: TextOverflow.clip),
- ],
- ),
- ),
- const SizedBox(width: 12),
- if (isSelected)
- SvgPicture.asset(
- "assets/icons/ic_checkmark.svg",
- height: 24,
- width: 24,
- )
- else
- Container(
- height: 24,
- width: 24,
- decoration: BoxDecoration(
- border: Border.all(
- color: colorDivider,
- ),
- shape: BoxShape.circle,
- ),
- )
- ],
- ),
- ),
- ),
- );
- }
-}
diff --git a/comwell_key_app/lib/housekeeping/cubit/housekeeping_cubit.dart b/comwell_key_app/lib/housekeeping/cubit/housekeeping_cubit.dart
deleted file mode 100644
index 3456a735..00000000
--- a/comwell_key_app/lib/housekeeping/cubit/housekeeping_cubit.dart
+++ /dev/null
@@ -1,56 +0,0 @@
-import 'package:bloc/bloc.dart';
-import 'package:comwell_key_app/housekeeping/cubit/housekeeping_state.dart';
-import 'package:comwell_key_app/overview/models/booking.dart';
-import 'package:comwell_key_app/tracking/comwell_tracking.dart';
-import 'package:comwell_key_app/tracking/models/analytics_event_item.dart';
-import 'package:comwell_key_app/utils/locator.dart';
-
-import '../components/housekeeping_service.dart';
-import '../housekeeping_repository.dart';
-
-class HouseKeepingCubit extends Cubit<HouseKeepingState> {
- final houseKeepingRepository = HouseKeepingRepository();
- final tracking = locator<ComwellTracking>();
- HouseKeepingCubit() : super(HouseKeepingState.initial());
-
- final Iterable<HouseKeepingService> servicesSupplies = [
- HouseKeepingService.soap,
- HouseKeepingService.towels,
- HouseKeepingService.trash,
- HouseKeepingService.refill
- ];
-
- void onAddServiceClicked(String service) {
- final List<String> updatedServices = List.from(state.selectedServices)
- ..add(service);
- emit(state.servicesSelected(selectedServices: updatedServices));
- }
-
- void onRemoveServiceClicked(String service) {
- final List<String> updatedServices = List.from(state.selectedServices)
- ..remove(service);
- emit(state.servicesSelected(selectedServices: updatedServices));
- }
-
- void onServiceClicked(String name) {
- if (state.selectedServices.contains(name)) {
- onRemoveServiceClicked(name);
- } else {
- onAddServiceClicked(name);
- }
- }
-
- Future<List<String>> onOrderHousekeepingClicked(Booking booking) async {
-
- final analyticsEventItem = AnalyticsEventItem(
- hotelName: booking.hotelName,
- currency: "DKK",
- value: 0,
- placement: "housekeeping_page",
- items: state.selectedServices.map((e) => HouseKeepingService.values.firstWhere((element) => element.name == e).name).toList(),
- itemIds: state.selectedServices.map((e) => HouseKeepingService.values.firstWhere((element) => element.name == e).name).toList(),
- bookingReference: booking.confirmationNumber);
- tracking.trackAddToCart(analyticsEventItem);
- return state.selectedServices.toList();
- }
-}
\ No newline at end of file
diff --git a/comwell_key_app/lib/housekeeping/cubit/housekeeping_state.dart b/comwell_key_app/lib/housekeeping/cubit/housekeeping_state.dart
deleted file mode 100644
index f48f33bf..00000000
--- a/comwell_key_app/lib/housekeeping/cubit/housekeeping_state.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-class HouseKeepingState {
- final Iterable<String> selectedServices;
-
- HouseKeepingState({required this.selectedServices});
-
- HouseKeepingState.initial() : selectedServices = [];
-
- HouseKeepingState servicesSelected({
- required Iterable<String> selectedServices,
- }) =>
- _copyWith(selectedServices: selectedServices);
-
- HouseKeepingState _copyWith({
- Iterable<String>? selectedServices,
- }) {
- return HouseKeepingState(
- selectedServices: selectedServices ?? this.selectedServices,
- );
- }
-}
diff --git a/comwell_key_app/lib/housekeeping/house_keeping_route.dart b/comwell_key_app/lib/housekeeping/house_keeping_route.dart
index 777b4019..3a7af3c9 100644
--- a/comwell_key_app/lib/housekeeping/house_keeping_route.dart
+++ b/comwell_key_app/lib/housekeeping/house_keeping_route.dart
@@ -1,4 +1,4 @@
-import 'package:comwell_key_app/housekeeping/housekeeping_page.dart';
+import 'package:comwell_key_app/presentation/screens/house_keeping/housekeeping_page.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:go_router/go_router.dart';
diff --git a/comwell_key_app/lib/housekeeping/housekeeping_page.dart b/comwell_key_app/lib/housekeeping/housekeeping_page.dart
deleted file mode 100644
index 59f7902f..00000000
--- a/comwell_key_app/lib/housekeeping/housekeeping_page.dart
+++ /dev/null
@@ -1,115 +0,0 @@
-import 'package:comwell_key_app/housekeeping/components/housekeeping_service.dart';
-import 'package:comwell_key_app/housekeeping/components/selectable_service.dart';
-import 'package:comwell_key_app/housekeeping/cubit/housekeeping_cubit.dart';
-import 'package:comwell_key_app/housekeeping/cubit/housekeeping_state.dart';
-import 'package:comwell_key_app/overview/models/booking.dart';
-import 'package:comwell_key_app/themes/light_theme.dart';
-import 'package:comwell_key_app/utils/l10n_utils.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
-import 'package:go_router/go_router.dart';
-
-import '../common/components/comwell_app_bar.dart';
-
-class HousekeepingPage extends StatefulWidget {
- final Booking booking;
- const HousekeepingPage({super.key, required this.booking});
-
- @override
- State<HousekeepingPage> createState() => _HousekeepingPageState();
-}
-
-class _HousekeepingPageState extends State<HousekeepingPage> {
- @override
- Widget build(BuildContext context) {
- final theme = Theme.of(context);
- return BlocProvider(
- create: (context) => HouseKeepingCubit(),
- child: BlocBuilder<HouseKeepingCubit, HouseKeepingState>(
- builder: (context, state) {
- final cubit = context.read<HouseKeepingCubit>();
- return Scaffold(
- backgroundColor: Colors.white,
- appBar: const ComwellAppBar(),
- bottomNavigationBar: Builder(builder: (context) {
- return Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- const Divider(
- color: colorDivider,
- height: 0,
- ),
- Row(
- children: [
- Expanded(
- child: Padding(
- padding: const EdgeInsets.all(16.0),
- child: ElevatedButton(
- onPressed: () async {
- final selectedServices = await cubit
- .onOrderHousekeepingClicked(widget.booking);
-
- if (context.mounted) {
- context.pop(selectedServices);
- }
- },
- style: const ButtonStyle(
- backgroundColor:
- WidgetStatePropertyAll(Color(0xffAA8D65)),
- foregroundColor:
- WidgetStatePropertyAll(Colors.white)),
- child: Padding(
- padding: const EdgeInsets.symmetric(vertical: 16.0),
- child: Text(context.strings.housekeeping_page_button),
- ),
- ),
- ),
- ),
- ],
- ),
- ],
- );
- }),
- body: Padding(
- padding: const EdgeInsets.symmetric(horizontal: 16.0),
- child: ListView(
- children: [
- const SizedBox(height: 20),
- Text(context.strings.housekeeping_page_title,
- style: theme.textTheme.headlineLarge),
- const SizedBox(height: 8),
- Text(
- context.strings.housekeeping_page_subtitle,
- style: theme.textTheme.bodySmall,
- ),
- const SizedBox(height: 25),
- Text(
- context.strings.housekeeping_page_cleaning,
- style: theme.textTheme.headlineMedium,
- ),
- const SizedBox(height: 12),
- SelectableService(
- key: ValueKey(HouseKeepingService.cleaning.name),
- service: HouseKeepingService.cleaning,
- ),
- const SizedBox(height: 22),
- Text(context.strings.housekeeping_page_supplies,
- style: theme.textTheme.headlineMedium),
- const SizedBox(height: 12),
- ...cubit.servicesSupplies.map((service) {
- return Column(
- children: [
- SelectableService(service: service),
- const SizedBox(height: 12)
- ],
- );
- }),
- const SizedBox(height: 40)
- ],
- ),
- ),
- );
- }),
- );
- }
-}
diff --git a/comwell_key_app/lib/housekeeping/housekeeping_repository.dart b/comwell_key_app/lib/housekeeping/housekeeping_repository.dart
deleted file mode 100644
index 35394fba..00000000
--- a/comwell_key_app/lib/housekeeping/housekeeping_repository.dart
+++ /dev/null
@@ -1,40 +0,0 @@
-import 'package:comwell_key_app/housekeeping/models/housekeeping.dart';
-import 'package:comwell_key_app/services/api.dart';
-import 'package:comwell_key_app/utils/locator.dart';
-
-import '../utils/secure_storage.dart';
-
-class HouseKeepingRepository {
- final secureStorage = locator<SecureStorage>();
- final api = Api();
-
- Future<void> saveHouseKeepingOrdered(Housekeeping housekeeping) async {
- await secureStorage.write(
- houseKeepingLastOrderedKey(housekeeping.roomNumber),
- DateTime.now().millisecondsSinceEpoch.toString());
- await api.orderHousekeeping(housekeeping);
- }
-
- Future<bool> isHousesKeepingOrdered(String roomNumber) async {
- final lastOrderedValue = await secureStorage
- .read(HouseKeepingRepository.houseKeepingLastOrderedKey(roomNumber));
- if (lastOrderedValue != null) {
- final lastOrdered =
- DateTime.fromMillisecondsSinceEpoch(int.parse(lastOrderedValue))
- .copyWith(hour: 0, minute: 0, second: 0);
-
- final isToday = DateTime.now().copyWith(hour: 0, minute: 0, second: 0);
- final isNextDay = DateTime.now().isAfter(isToday) &&
- DateTime.now().isAfter(lastOrdered);
- final timeOfToday = DateTime.now().hour;
- final isHouseKeepingAllowed = isNextDay &&
- timeOfToday > 2; // If it's after 3am on the day after the order
-
- return isHouseKeepingAllowed;
- }
- return false;
- }
-
- static String houseKeepingLastOrderedKey(String roomNumber) =>
- 'housekeeping_last_ordered_$roomNumber';
-}
diff --git a/comwell_key_app/lib/housekeeping/models/housekeeping.dart b/comwell_key_app/lib/housekeeping/models/housekeeping.dart
deleted file mode 100644
index 20fcbdf7..00000000
--- a/comwell_key_app/lib/housekeeping/models/housekeeping.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-import 'package:comwell_key_app/housekeeping/components/housekeeping_service.dart';
-import 'package:json_annotation/json_annotation.dart';
-
-part '../../.generated/housekeeping/models/housekeeping.g.dart';
-
-@JsonSerializable()
-class Housekeeping {
- final String hotelCode;
- final String roomNumber;
- final bool cleaning;
- final bool soap;
- final bool towels;
- final bool trash;
- final bool refill;
-
- Housekeeping({
- required this.hotelCode,
- required this.roomNumber,
- required this.cleaning,
- required this.soap,
- required this.towels,
- required this.trash,
- required this.refill,
- });
-
- factory Housekeeping.toJson(
- String hotelCode, String roomNumber, List<HouseKeepingService> services) {
- return Housekeeping(
- hotelCode: hotelCode,
- roomNumber: roomNumber,
- cleaning: services.contains(HouseKeepingService.cleaning),
- soap: services.contains(HouseKeepingService.soap),
- towels: services.contains(HouseKeepingService.towels),
- trash: services.contains(HouseKeepingService.trash),
- refill: services.contains(HouseKeepingService.refill),
- );
- }
-}
diff --git a/comwell_key_app/lib/my_booking/my_booking_page.dart b/comwell_key_app/lib/my_booking/my_booking_page.dart
index 33063c1d..c6365374 100644
--- a/comwell_key_app/lib/my_booking/my_booking_page.dart
+++ b/comwell_key_app/lib/my_booking/my_booking_page.dart
@@ -6,7 +6,7 @@ import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/presentation/screens/booking_details/bloc/booking_details_cubit.dart';
import 'package:comwell_key_app/presentation/screens/booking_details/components/share_button.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/services/interceptors/mappers/booking_mapper.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/utils/l10n_utils.dart';
import 'package:comwell_key_app/utils/locator.dart';
diff --git a/comwell_key_app/lib/overview/repository/overview_repository.dart b/comwell_key_app/lib/overview/repository/overview_repository.dart
index 1188430c..1f5097c1 100644
--- a/comwell_key_app/lib/overview/repository/overview_repository.dart
+++ b/comwell_key_app/lib/overview/repository/overview_repository.dart
@@ -1,7 +1,7 @@
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/overview/models/bookings.dart';
import 'package:comwell_key_app/services/api.dart';
-import 'package:comwell_key_app/services/mappers/booking_mapper.dart';
+import 'package:comwell_key_app/services/interceptors/mappers/booking_mapper.dart';
import 'package:comwell_key_app/services/models/booking_dto.dart';
class OverviewRepository {
diff --git a/comwell_key_app/lib/presentation/screens/booking_details/bloc/booking_details_cubit.dart b/comwell_key_app/lib/presentation/screens/booking_details/bloc/booking_details_cubit.dart
index bf0a9fad..f6566826 100644
--- a/comwell_key_app/lib/presentation/screens/booking_details/bloc/booking_details_cubit.dart
+++ b/comwell_key_app/lib/presentation/screens/booking_details/bloc/booking_details_cubit.dart
@@ -2,9 +2,9 @@ import 'dart:async';
import 'package:comwell_key_app/domain/models/user.dart';
import 'package:comwell_key_app/domain/repositories/booking_details_repository.dart';
import 'package:comwell_key_app/domain/models/app_error.dart';
-import 'package:comwell_key_app/housekeeping/components/housekeeping_service.dart';
-import 'package:comwell_key_app/housekeeping/housekeeping_repository.dart';
-import 'package:comwell_key_app/housekeeping/models/housekeeping.dart';
+import 'package:comwell_key_app/presentation/screens/house_keeping/components/housekeeping_service.dart';
+import 'package:comwell_key_app/domain/repositories/housekeeping_repository.dart';
+import 'package:comwell_key_app/domain/models/housekeeping.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/presentation/base/base_cubit.dart';
import 'package:comwell_key_app/presentation/screens/booking_details/bloc/booking_details_state.dart';
diff --git a/comwell_key_app/lib/presentation/screens/booking_details/booking_details_page.dart b/comwell_key_app/lib/presentation/screens/booking_details/booking_details_page.dart
index 58c77154..ae4ac437 100644
--- a/comwell_key_app/lib/presentation/screens/booking_details/booking_details_page.dart
+++ b/comwell_key_app/lib/presentation/screens/booking_details/booking_details_page.dart
@@ -9,7 +9,7 @@ import 'package:comwell_key_app/presentation/screens/booking_details/components/
import 'package:comwell_key_app/presentation/screens/booking_details/components/room_number_container.dart';
import 'package:comwell_key_app/presentation/screens/booking_details/components/share_button.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/services/interceptors/mappers/booking_mapper.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/up_sales/models/room_upgrade_list.dart';
import 'package:flutter/material.dart';
diff --git a/comwell_key_app/lib/presentation/screens/house_keeping/components/housekeeping_service.dart b/comwell_key_app/lib/presentation/screens/house_keeping/components/housekeeping_service.dart
new file mode 100644
index 00000000..3db58f31
--- /dev/null
+++ b/comwell_key_app/lib/presentation/screens/house_keeping/components/housekeeping_service.dart
@@ -0,0 +1,53 @@
+import 'package:comwell_key_app/.generated/assets/assets.gen.dart';
+import 'package:comwell_key_app/utils/l10n_utils.dart';
+import 'package:flutter/material.dart';
+
+enum HouseKeepingService {
+ cleaning,
+ towels,
+ refill,
+ trash,
+ soap;
+
+ String titleStringId(BuildContext context) {
+ switch (this) {
+ case HouseKeepingService.cleaning:
+ return context.strings.housekeeping_page_service_title_cleaning;
+ case HouseKeepingService.towels:
+ return context.strings.housekeeping_page_service_title_towels;
+ case HouseKeepingService.refill:
+ return context.strings.housekeeping_page_service_title_refill;
+ case HouseKeepingService.trash:
+ return context.strings.housekeeping_page_service_title_trash;
+ case HouseKeepingService.soap:
+ return context.strings.housekeeping_page_service_title_soap;
+ }
+ }
+
+ String get assetId {
+ switch (this) {
+ case HouseKeepingService.cleaning:
+ return Assets.icons.iconHousekeepingCleaning.path;
+ case HouseKeepingService.towels:
+ return Assets.icons.iconHousekeepingTowels.path;
+ case HouseKeepingService.refill:
+ return Assets.icons.iconHousekeepingCoffee.path;
+ case HouseKeepingService.trash:
+ return Assets.icons.iconHousekeepingTrash.path;
+ case HouseKeepingService.soap:
+ return Assets.icons.iconHousekeepingSoap.path;
+ }
+ }
+
+ String subtitleStringId(BuildContext context) {
+ switch (this) {
+ case HouseKeepingService.cleaning:
+ return context.strings.housekeeping_page_service_cleaning_subtitle;
+ case HouseKeepingService.towels:
+ case HouseKeepingService.refill:
+ case HouseKeepingService.trash:
+ case HouseKeepingService.soap:
+ return "";
+ }
+ }
+}
diff --git a/comwell_key_app/lib/presentation/screens/house_keeping/components/selectable_service.dart b/comwell_key_app/lib/presentation/screens/house_keeping/components/selectable_service.dart
new file mode 100644
index 00000000..4d5d240e
--- /dev/null
+++ b/comwell_key_app/lib/presentation/screens/house_keeping/components/selectable_service.dart
@@ -0,0 +1,91 @@
+import 'package:comwell_key_app/presentation/screens/house_keeping/cubit/housekeeping_cubit.dart';
+import 'package:comwell_key_app/themes/light_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_svg/svg.dart';
+import 'housekeeping_service.dart';
+
+class SelectableService extends StatelessWidget {
+ final HouseKeepingService service;
+
+ const SelectableService({super.key, required this.service});
+
+ @override
+ Widget build(BuildContext context) {
+ final cubit = context.read<HouseKeepingCubit>();
+ final isSelected = cubit.state.selectedServices.contains(service.name);
+ return InkWell(
+ onTap: () {
+ cubit.onServiceClicked(service.name);
+ },
+ borderRadius: const BorderRadius.all(Radius.circular(5)),
+ child: Container(
+ decoration: BoxDecoration(
+ border: Border.all(
+ color: colorDivider,
+ ),
+ borderRadius: const BorderRadius.all(Radius.circular(10)),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(12.0),
+ child: Row(
+ children: [
+ Container(
+ height: service == HouseKeepingService.cleaning ? 48 : 36,
+ width: 36,
+ decoration: const BoxDecoration(
+ color: colorSecondary,
+ shape: BoxShape.circle,
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(10.0),
+ child: SvgPicture.asset(service.assetId),
+ ),
+ ),
+ const SizedBox(width: 12),
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ service.titleStringId(context),
+ style: Theme.of(context).textTheme.bodySmall,
+ maxLines: 1,
+ overflow: TextOverflow.clip,
+ ),
+ if (service == HouseKeepingService.cleaning)
+ Text(service.subtitleStringId(context),
+ maxLines: 2,
+ style: Theme.of(context)
+ .textTheme
+ .bodySmall
+ ?.copyWith(color: Colors.grey),
+ overflow: TextOverflow.clip),
+ ],
+ ),
+ ),
+ const SizedBox(width: 12),
+ if (isSelected)
+ SvgPicture.asset(
+ "assets/icons/ic_checkmark.svg",
+ height: 24,
+ width: 24,
+ )
+ else
+ Container(
+ height: 24,
+ width: 24,
+ decoration: BoxDecoration(
+ border: Border.all(
+ color: colorDivider,
+ ),
+ shape: BoxShape.circle,
+ ),
+ )
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/presentation/screens/house_keeping/cubit/housekeeping_cubit.dart b/comwell_key_app/lib/presentation/screens/house_keeping/cubit/housekeeping_cubit.dart
new file mode 100644
index 00000000..cf5b5500
--- /dev/null
+++ b/comwell_key_app/lib/presentation/screens/house_keeping/cubit/housekeeping_cubit.dart
@@ -0,0 +1,56 @@
+import 'package:bloc/bloc.dart';
+import 'package:comwell_key_app/presentation/screens/house_keeping/cubit/housekeeping_state.dart';
+import 'package:comwell_key_app/overview/models/booking.dart';
+import 'package:comwell_key_app/tracking/comwell_tracking.dart';
+import 'package:comwell_key_app/tracking/models/analytics_event_item.dart';
+import 'package:comwell_key_app/utils/locator.dart';
+
+import '../components/housekeeping_service.dart';
+import '../../../../domain/repositories/housekeeping_repository.dart';
+
+class HouseKeepingCubit extends Cubit<HouseKeepingState> {
+ final houseKeepingRepository = HouseKeepingRepository();
+ final tracking = locator<ComwellTracking>();
+ HouseKeepingCubit() : super(HouseKeepingState.initial());
+
+ final Iterable<HouseKeepingService> servicesSupplies = [
+ HouseKeepingService.soap,
+ HouseKeepingService.towels,
+ HouseKeepingService.trash,
+ HouseKeepingService.refill
+ ];
+
+ void onAddServiceClicked(String service) {
+ final List<String> updatedServices = List.from(state.selectedServices)
+ ..add(service);
+ emit(state.servicesSelected(selectedServices: updatedServices));
+ }
+
+ void onRemoveServiceClicked(String service) {
+ final List<String> updatedServices = List.from(state.selectedServices)
+ ..remove(service);
+ emit(state.servicesSelected(selectedServices: updatedServices));
+ }
+
+ void onServiceClicked(String name) {
+ if (state.selectedServices.contains(name)) {
+ onRemoveServiceClicked(name);
+ } else {
+ onAddServiceClicked(name);
+ }
+ }
+
+ Future<List<String>> onOrderHousekeepingClicked(Booking booking) async {
+
+ final analyticsEventItem = AnalyticsEventItem(
+ hotelName: booking.hotelName,
+ currency: "DKK",
+ value: 0,
+ placement: "housekeeping_page",
+ items: state.selectedServices.map((e) => HouseKeepingService.values.firstWhere((element) => element.name == e).name).toList(),
+ itemIds: state.selectedServices.map((e) => HouseKeepingService.values.firstWhere((element) => element.name == e).name).toList(),
+ bookingReference: booking.confirmationNumber);
+ tracking.trackAddToCart(analyticsEventItem);
+ return state.selectedServices.toList();
+ }
+}
\ No newline at end of file
diff --git a/comwell_key_app/lib/presentation/screens/house_keeping/cubit/housekeeping_state.dart b/comwell_key_app/lib/presentation/screens/house_keeping/cubit/housekeeping_state.dart
new file mode 100644
index 00000000..f48f33bf
--- /dev/null
+++ b/comwell_key_app/lib/presentation/screens/house_keeping/cubit/housekeeping_state.dart
@@ -0,0 +1,20 @@
+class HouseKeepingState {
+ final Iterable<String> selectedServices;
+
+ HouseKeepingState({required this.selectedServices});
+
+ HouseKeepingState.initial() : selectedServices = [];
+
+ HouseKeepingState servicesSelected({
+ required Iterable<String> selectedServices,
+ }) =>
+ _copyWith(selectedServices: selectedServices);
+
+ HouseKeepingState _copyWith({
+ Iterable<String>? selectedServices,
+ }) {
+ return HouseKeepingState(
+ selectedServices: selectedServices ?? this.selectedServices,
+ );
+ }
+}
diff --git a/comwell_key_app/lib/presentation/screens/house_keeping/housekeeping_page.dart b/comwell_key_app/lib/presentation/screens/house_keeping/housekeeping_page.dart
new file mode 100644
index 00000000..6bbc3519
--- /dev/null
+++ b/comwell_key_app/lib/presentation/screens/house_keeping/housekeeping_page.dart
@@ -0,0 +1,115 @@
+import 'package:comwell_key_app/presentation/screens/house_keeping/components/housekeeping_service.dart';
+import 'package:comwell_key_app/presentation/screens/house_keeping/components/selectable_service.dart';
+import 'package:comwell_key_app/presentation/screens/house_keeping/cubit/housekeeping_cubit.dart';
+import 'package:comwell_key_app/presentation/screens/house_keeping/cubit/housekeeping_state.dart';
+import 'package:comwell_key_app/overview/models/booking.dart';
+import 'package:comwell_key_app/themes/light_theme.dart';
+import 'package:comwell_key_app/utils/l10n_utils.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:go_router/go_router.dart';
+
+import '../../../common/components/comwell_app_bar.dart';
+
+class HousekeepingPage extends StatefulWidget {
+ final Booking booking;
+ const HousekeepingPage({super.key, required this.booking});
+
+ @override
+ State<HousekeepingPage> createState() => _HousekeepingPageState();
+}
+
+class _HousekeepingPageState extends State<HousekeepingPage> {
+ @override
+ Widget build(BuildContext context) {
+ final theme = Theme.of(context);
+ return BlocProvider(
+ create: (context) => HouseKeepingCubit(),
+ child: BlocBuilder<HouseKeepingCubit, HouseKeepingState>(
+ builder: (context, state) {
+ final cubit = context.read<HouseKeepingCubit>();
+ return Scaffold(
+ backgroundColor: Colors.white,
+ appBar: const ComwellAppBar(),
+ bottomNavigationBar: Builder(builder: (context) {
+ return Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ const Divider(
+ color: colorDivider,
+ height: 0,
+ ),
+ Row(
+ children: [
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: ElevatedButton(
+ onPressed: () async {
+ final selectedServices = await cubit
+ .onOrderHousekeepingClicked(widget.booking);
+
+ if (context.mounted) {
+ context.pop(selectedServices);
+ }
+ },
+ style: const ButtonStyle(
+ backgroundColor:
+ WidgetStatePropertyAll(Color(0xffAA8D65)),
+ foregroundColor:
+ WidgetStatePropertyAll(Colors.white)),
+ child: Padding(
+ padding: const EdgeInsets.symmetric(vertical: 16.0),
+ child: Text(context.strings.housekeeping_page_button),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ );
+ }),
+ body: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16.0),
+ child: ListView(
+ children: [
+ const SizedBox(height: 20),
+ Text(context.strings.housekeeping_page_title,
+ style: theme.textTheme.headlineLarge),
+ const SizedBox(height: 8),
+ Text(
+ context.strings.housekeeping_page_subtitle,
+ style: theme.textTheme.bodySmall,
+ ),
+ const SizedBox(height: 25),
+ Text(
+ context.strings.housekeeping_page_cleaning,
+ style: theme.textTheme.headlineMedium,
+ ),
+ const SizedBox(height: 12),
+ SelectableService(
+ key: ValueKey(HouseKeepingService.cleaning.name),
+ service: HouseKeepingService.cleaning,
+ ),
+ const SizedBox(height: 22),
+ Text(context.strings.housekeeping_page_supplies,
+ style: theme.textTheme.headlineMedium),
+ const SizedBox(height: 12),
+ ...cubit.servicesSupplies.map((service) {
+ return Column(
+ children: [
+ SelectableService(service: service),
+ const SizedBox(height: 12)
+ ],
+ );
+ }),
+ const SizedBox(height: 40)
+ ],
+ ),
+ ),
+ );
+ }),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/presentation/screens/past_cancelled_booking_details/past_cancelled_booking_detail_page.dart b/comwell_key_app/lib/presentation/screens/past_cancelled_booking_details/past_cancelled_booking_detail_page.dart
index 93873c52..c011ebdc 100644
--- a/comwell_key_app/lib/presentation/screens/past_cancelled_booking_details/past_cancelled_booking_detail_page.dart
+++ b/comwell_key_app/lib/presentation/screens/past_cancelled_booking_details/past_cancelled_booking_detail_page.dart
@@ -1,7 +1,7 @@
import 'package:comwell_key_app/common/components/comwell_app_bar.dart';
import 'package:comwell_key_app/overview/components/bill_download_modal.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
-import 'package:comwell_key_app/services/mappers/booking_mapper.dart';
+import 'package:comwell_key_app/services/interceptors/mappers/booking_mapper.dart';
import 'package:comwell_key_app/themes/comwell_colors.dart' show colorError;
import 'package:comwell_key_app/utils/l10n_utils.dart';
import 'package:flutter/material.dart';
diff --git a/comwell_key_app/lib/services/api.dart b/comwell_key_app/lib/services/api.dart
index 6d17eed6..550e28e2 100644
--- a/comwell_key_app/lib/services/api.dart
+++ b/comwell_key_app/lib/services/api.dart
@@ -1,7 +1,7 @@
import 'dart:convert';
import 'dart:io';
import 'package:comwell_key_app/hotel_information/models/hotel.dart';
-import 'package:comwell_key_app/housekeeping/models/housekeeping.dart';
+import 'package:comwell_key_app/domain/models/housekeeping.dart';
import 'package:comwell_key_app/domain/models/notification_permission.dart';
import 'package:comwell_key_app/presentation/screens/pregistration/prereg_request_model.dart';
import 'package:comwell_key_app/services/http_client.dart';
diff --git a/comwell_key_app/lib/services/interceptors/mappers/addon_item_mapper.dart b/comwell_key_app/lib/services/interceptors/mappers/addon_item_mapper.dart
new file mode 100644
index 00000000..c737c553
--- /dev/null
+++ b/comwell_key_app/lib/services/interceptors/mappers/addon_item_mapper.dart
@@ -0,0 +1,44 @@
+import 'package:comwell_key_app/services/models/booking_dto.dart';
+import 'package:comwell_key_app/up_sales/models/upgrade.dart';
+import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
+import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
+
+extension AddOnItemDTOMapper on BookingAddonItem {
+ Upgrade toUpgrade() {
+ // Determine if this is a room upgrade or addon based on the code
+ // You may need to adjust this logic based on your business rules
+ if (code.contains('ROOM') || code.contains('SDP') || code.contains('STD')) {
+ // This is a room upgrade
+ return RoomUpgrade(
+ id: code,
+ name: description,
+ price: price.toInt(),
+ currency: "DKK",
+ images: const [],
+ description: description,
+ quantity: quantity,
+ facilityTypes: const [],
+ roomSize: 0,
+ );
+ } else {
+ // This is an addon upgrade
+ return AddOnUpgrade(
+ id: code,
+ name: description,
+ price: price.toInt(),
+ currency: "DKK",
+ images: const [],
+ description: description,
+ isSelected: false,
+ quantity: quantity,
+ isService: true,
+ isPopular: false,
+ onlyAvailableBeforeCheckin: false,
+ );
+ }
+ }
+}
+
+ extension ListAddOnItemDTOMapper on List<BookingAddonItem> {
+ List<Upgrade> toUpgrades() => map((dto) => dto.toUpgrade()).toList();
+}
diff --git a/comwell_key_app/lib/services/interceptors/mappers/booking_mapper.dart b/comwell_key_app/lib/services/interceptors/mappers/booking_mapper.dart
new file mode 100644
index 00000000..4d044712
--- /dev/null
+++ b/comwell_key_app/lib/services/interceptors/mappers/booking_mapper.dart
@@ -0,0 +1,140 @@
+import 'package:comwell_key_app/overview/models/booking.dart';
+import 'package:comwell_key_app/overview/models/guest.dart';
+import 'package:comwell_key_app/overview/models/room.dart';
+import 'package:comwell_key_app/services/models/booking_dto.dart';
+import 'package:comwell_key_app/services/models/room_dto.dart';
+import 'package:comwell_key_app/services/interceptors/mappers/room_mapper.dart';
+
+//TODO: Fix actual image
+extension BookingDTOMapper on BookingDTO {
+ Booking toBooking() {
+ final startDate = DateTime.parse(dayIn);
+ final endDate = DateTime.parse(dayOut);
+ final mappedGuests = guests.map(
+ (guest) => Guest(
+ firstName: guest.firstName,
+ lastName: guest.lastName,
+ id: guest.id,
+ ),
+ ).toList();
+ return Booking(
+ id: confirmationNumber,
+ confirmationNumber: confirmationNumber,
+ roomNumber: roomNumber ?? "",
+ startDate: startDate,
+ endDate: endDate,
+ reservationStatus: ReservationStatus.fromString(status),
+ image: "assets/images/no_current_bookings_background.jpeg",
+ hotelName: "Hotel $hotelCode",
+ roomType: roomType ?? '',
+ addOnItems: addOnItems,
+ balance: balance ?? 0,
+ children: children,
+ firstName: firstName,
+ lastName: lastName,
+ bookerFirstName: bookerFirstName,
+ bookerLastName: bookerLastName,
+ adults: adults,
+ hotelCode: hotelCode,
+ bookingDate: startDate,
+ digitalCard: true,
+ isPrimaryGuest: isPrimaryGuest,
+ maskedCardNumber: maskedCardNumber,
+ guests: mappedGuests,
+ );
+ }
+}
+
+extension BookingMapper on Booking {
+ BookingDTO toDTO() {
+ final firstName = this.firstName;
+ final lastName = this.lastName;
+ final mappedGuests = guests
+ .map(
+ (guest) => GuestDTO(
+ id: guest.id,
+ firstName: guest.firstName,
+ lastName: guest.lastName,
+ ),
+ )
+ .toList();
+ return BookingDTO(
+ roomNumber: roomNumber,
+ hotelCode: hotelCode,
+ firstName: firstName,
+ lastName: lastName,
+ bookerFirstName: firstName,
+ bookerLastName: lastName,
+ guests: mappedGuests,
+ confirmationNumber: confirmationNumber,
+ dayIn: startDate.toIso8601String(),
+ dayOut: endDate.toIso8601String(),
+ cancelTime: null,
+ isCancelled: false,
+ bookTime: startDate.toIso8601String(),
+ status: reservationStatus.name,
+ roomType: roomType,
+ adults: adults,
+ children: children,
+ balance: balance ?? 0,
+ isPrimaryGuest: isPrimaryGuest,
+ addOnItems: addOnItems ?? [],
+ );
+ }
+}
+
+extension BookingWithRoomsMapper on Booking {
+ Booking withRooms(List<Room> rooms) {
+ return Booking(
+ id: id,
+ confirmationNumber: confirmationNumber,
+ roomNumber: roomNumber,
+ startDate: startDate,
+ endDate: endDate,
+ reservationStatus: reservationStatus,
+ image: image,
+ hotelName: hotelName,
+ roomType: roomType,
+ addOnItems: addOnItems,
+ balance: balance,
+ children: children,
+ firstName: firstName,
+ lastName: lastName,
+ bookerFirstName: bookerFirstName,
+ bookerLastName: bookerLastName,
+ adults: adults,
+ hotelCode: hotelCode,
+ bookingDate: bookingDate,
+ digitalCard: digitalCard,
+ isPrimaryGuest: isPrimaryGuest,
+ maskedCardNumber: maskedCardNumber,
+ );
+ }
+}
+
+extension ListRoomMapper on List<RoomDto> {
+ List<Room> toRooms() => map((dto) => dto.toRoom()).toList();
+}
+
+extension ListBookingMapper on Iterable<BookingDTO> {
+ Iterable<Booking> toBookings() => map((dto) => dto.toBooking());
+}
+
+extension RoomTypeMapper on Booking {
+ String toRoomType() {
+ switch (roomType) {
+ case "SDPBO":
+ return "Standard Double Plus Room";
+ case "SDBO":
+ return "Standard Double Room";
+ case "STPBO":
+ return "Standard Twin Plus Room";
+ case "STPO":
+ return "Standard Twin Room";
+ case "SUBO":
+ return "Suite";
+ default:
+ return "Room";
+ }
+ }
+}
diff --git a/comwell_key_app/lib/services/interceptors/mappers/bookings_mapper.dart b/comwell_key_app/lib/services/interceptors/mappers/bookings_mapper.dart
new file mode 100644
index 00000000..4b5ea622
--- /dev/null
+++ b/comwell_key_app/lib/services/interceptors/mappers/bookings_mapper.dart
@@ -0,0 +1,15 @@
+import 'package:comwell_key_app/overview/models/bookings.dart';
+import 'package:comwell_key_app/services/interceptors/mappers/booking_mapper.dart';
+import 'package:comwell_key_app/services/models/bookings_dto.dart';
+
+extension BookingsMapper on BookingsDTO {
+ Bookings toBookings() {
+ return Bookings(
+ current:
+ current.map((booking) => booking.toBooking()).toList(),
+ past: past.map((booking) => booking.toBooking()).toList(),
+ cancelled:
+ cancelled.map((booking) => booking.toBooking()).toList(),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/services/interceptors/mappers/room_mapper.dart b/comwell_key_app/lib/services/interceptors/mappers/room_mapper.dart
new file mode 100644
index 00000000..5362417b
--- /dev/null
+++ b/comwell_key_app/lib/services/interceptors/mappers/room_mapper.dart
@@ -0,0 +1,21 @@
+import 'package:comwell_key_app/overview/models/room.dart';
+import 'package:comwell_key_app/services/models/room_dto.dart';
+
+extension RoomDTOMapper on RoomDto {
+ Room toRoom() {
+ return Room(
+ confirmationNumber: confirmationNumber,
+ assignedTo: assignedTo,
+ name: name,
+ description: description,
+ guests: guests,
+ imageAssets: imageAssets,
+ roomFacilities: [],
+ tags: tags,
+ );
+ }
+}
+
+extension ListRoomMapper on List<RoomDto> {
+ List<Room> toRooms() => map((dto) => dto.toRoom()).toList();
+}
\ No newline at end of file
diff --git a/comwell_key_app/lib/services/interceptors/mappers/user_mapper.dart b/comwell_key_app/lib/services/interceptors/mappers/user_mapper.dart
new file mode 100644
index 00000000..2d7d6fc6
--- /dev/null
+++ b/comwell_key_app/lib/services/interceptors/mappers/user_mapper.dart
@@ -0,0 +1,92 @@
+import 'package:comwell_key_app/domain/models/address.dart';
+import 'package:comwell_key_app/domain/models/user.dart';
+import 'package:comwell_key_app/services/models/simple_user_dto.dart';
+import 'package:comwell_key_app/services/models/user_dto.dart';
+
+extension UserMapper on UserDto {
+ User toUser() {
+ return User(
+ userId: userId,
+ hmsId: hmsId ?? "",
+ firstName: firstName,
+ lastName: lastName,
+ email: email,
+ emailVerified: emailVerified,
+ phoneNumber: phoneNumber,
+ address: Address(
+ street: addressStreet,
+ city: addressCity,
+ country: addressCountry,
+ zipCode: addressZip,
+ ),
+ birthDate: birthDate ?? DateTime.now(),
+ shopperReference: userId,
+ points: points,
+ gender: gender ?? "",
+ isClubMember: isClubMember,
+ createDate: createDate,
+ companyId: companyId ?? "",
+ companyName: companyName ?? "",
+ symplifyId: symplifyId ?? "",
+ signUpDate: signUpDate,
+ signUpCampaign: signUpCampaign ?? "",
+ signUpSource: signUpSource ?? "",
+ locale: locale ?? "",
+ wasRecentlyCreated: wasRecentlyCreated,
+ nationality: nationality ?? "",
+ );
+ }
+}
+
+extension UserDtoMapper on User {
+ UserDto toUserDto() {
+ return UserDto(
+ id: 0,
+ userId: userId,
+ hmsId: hmsId,
+ firstName: firstName,
+ lastName: lastName,
+ email: email,
+ emailVerified: emailVerified,
+ isClubMember: isClubMember,
+ birthDate: birthDate,
+ createDate: createDate,
+ companyId: companyId,
+ companyName: companyName,
+ symplifyId: symplifyId,
+ phoneNumber: phoneNumber,
+ gender: gender,
+ addressStreet: address.street,
+ addressZip: address.zipCode,
+ addressCity: address.city,
+ addressCountry: address.country,
+ points: points,
+ signUpDate: signUpDate,
+ signUpCampaign: signUpCampaign,
+ signUpSource: signUpSource,
+ locale: null,
+ wasRecentlyCreated: wasRecentlyCreated,
+ permissions: null,
+ // Permissions are not stored in User model
+ nationality: nationality,
+ );
+ }
+}
+
+extension SimpleUserDtoMapper on User {
+ SimpleUserDto toSimpleUserDto() {
+ return SimpleUserDto(
+ firstName: firstName,
+ lastName: lastName,
+ birthDate: birthDate?.toIso8601String(),
+ phoneNumber: phoneNumber,
+ gender: gender,
+ addressStreet: address.street,
+ addressZip: address.zipCode,
+ addressCity: address.city,
+ addressCountry: address.country,
+ locale: locale.isNotEmpty ? locale : null,
+ permissions: {}, // Permissions are not stored in User model
+ );
+ }
+}
\ No newline at end of file
diff --git a/comwell_key_app/lib/services/mappers/addon_item_mapper.dart b/comwell_key_app/lib/services/mappers/addon_item_mapper.dart
deleted file mode 100644
index c737c553..00000000
--- a/comwell_key_app/lib/services/mappers/addon_item_mapper.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-import 'package:comwell_key_app/services/models/booking_dto.dart';
-import 'package:comwell_key_app/up_sales/models/upgrade.dart';
-import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
-import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
-
-extension AddOnItemDTOMapper on BookingAddonItem {
- Upgrade toUpgrade() {
- // Determine if this is a room upgrade or addon based on the code
- // You may need to adjust this logic based on your business rules
- if (code.contains('ROOM') || code.contains('SDP') || code.contains('STD')) {
- // This is a room upgrade
- return RoomUpgrade(
- id: code,
- name: description,
- price: price.toInt(),
- currency: "DKK",
- images: const [],
- description: description,
- quantity: quantity,
- facilityTypes: const [],
- roomSize: 0,
- );
- } else {
- // This is an addon upgrade
- return AddOnUpgrade(
- id: code,
- name: description,
- price: price.toInt(),
- currency: "DKK",
- images: const [],
- description: description,
- isSelected: false,
- quantity: quantity,
- isService: true,
- isPopular: false,
- onlyAvailableBeforeCheckin: false,
- );
- }
- }
-}
-
- extension ListAddOnItemDTOMapper on List<BookingAddonItem> {
- List<Upgrade> toUpgrades() => map((dto) => dto.toUpgrade()).toList();
-}
diff --git a/comwell_key_app/lib/services/mappers/booking_mapper.dart b/comwell_key_app/lib/services/mappers/booking_mapper.dart
deleted file mode 100644
index 2954569b..00000000
--- a/comwell_key_app/lib/services/mappers/booking_mapper.dart
+++ /dev/null
@@ -1,140 +0,0 @@
-import 'package:comwell_key_app/overview/models/booking.dart';
-import 'package:comwell_key_app/overview/models/guest.dart';
-import 'package:comwell_key_app/overview/models/room.dart';
-import 'package:comwell_key_app/services/models/booking_dto.dart';
-import 'package:comwell_key_app/services/models/room_dto.dart';
-import 'package:comwell_key_app/services/mappers/room_mapper.dart';
-
-//TODO: Fix actual image
-extension BookingDTOMapper on BookingDTO {
- Booking toBooking() {
- final startDate = DateTime.parse(dayIn);
- final endDate = DateTime.parse(dayOut);
- final mappedGuests = guests.map(
- (guest) => Guest(
- firstName: guest.firstName,
- lastName: guest.lastName,
- id: guest.id,
- ),
- ).toList();
- return Booking(
- id: confirmationNumber,
- confirmationNumber: confirmationNumber,
- roomNumber: roomNumber ?? "",
- startDate: startDate,
- endDate: endDate,
- reservationStatus: ReservationStatus.fromString(status),
- image: "assets/images/no_current_bookings_background.jpeg",
- hotelName: "Hotel $hotelCode",
- roomType: roomType ?? '',
- addOnItems: addOnItems,
- balance: balance ?? 0,
- children: children,
- firstName: firstName,
- lastName: lastName,
- bookerFirstName: bookerFirstName,
- bookerLastName: bookerLastName,
- adults: adults,
- hotelCode: hotelCode,
- bookingDate: startDate,
- digitalCard: true,
- isPrimaryGuest: isPrimaryGuest,
- maskedCardNumber: maskedCardNumber,
- guests: mappedGuests,
- );
- }
-}
-
-extension BookingMapper on Booking {
- BookingDTO toDTO() {
- final firstName = this.firstName;
- final lastName = this.lastName;
- final mappedGuests = guests
- .map(
- (guest) => GuestDTO(
- id: guest.id,
- firstName: guest.firstName,
- lastName: guest.lastName,
- ),
- )
- .toList();
- return BookingDTO(
- roomNumber: roomNumber,
- hotelCode: hotelCode,
- firstName: firstName,
- lastName: lastName,
- bookerFirstName: firstName,
- bookerLastName: lastName,
- guests: mappedGuests,
- confirmationNumber: confirmationNumber,
- dayIn: startDate.toIso8601String(),
- dayOut: endDate.toIso8601String(),
- cancelTime: null,
- isCancelled: false,
- bookTime: startDate.toIso8601String(),
- status: reservationStatus.name,
- roomType: roomType,
- adults: adults,
- children: children,
- balance: balance ?? 0,
- isPrimaryGuest: isPrimaryGuest,
- addOnItems: addOnItems ?? [],
- );
- }
-}
-
-extension BookingWithRoomsMapper on Booking {
- Booking withRooms(List<Room> rooms) {
- return Booking(
- id: id,
- confirmationNumber: confirmationNumber,
- roomNumber: roomNumber,
- startDate: startDate,
- endDate: endDate,
- reservationStatus: reservationStatus,
- image: image,
- hotelName: hotelName,
- roomType: roomType,
- addOnItems: addOnItems,
- balance: balance,
- children: children,
- firstName: firstName,
- lastName: lastName,
- bookerFirstName: bookerFirstName,
- bookerLastName: bookerLastName,
- adults: adults,
- hotelCode: hotelCode,
- bookingDate: bookingDate,
- digitalCard: digitalCard,
- isPrimaryGuest: isPrimaryGuest,
- maskedCardNumber: maskedCardNumber,
- );
- }
-}
-
-extension ListRoomMapper on List<RoomDto> {
- List<Room> toRooms() => map((dto) => dto.toRoom()).toList();
-}
-
-extension ListBookingMapper on Iterable<BookingDTO> {
- Iterable<Booking> toBookings() => map((dto) => dto.toBooking());
-}
-
-extension RoomTypeMapper on Booking {
- String toRoomType() {
- switch (roomType) {
- case "SDPBO":
- return "Standard Double Plus Room";
- case "SDBO":
- return "Standard Double Room";
- case "STPBO":
- return "Standard Twin Plus Room";
- case "STPO":
- return "Standard Twin Room";
- case "SUBO":
- return "Suite";
- default:
- return "Room";
- }
- }
-}
diff --git a/comwell_key_app/lib/services/mappers/bookings_mapper.dart b/comwell_key_app/lib/services/mappers/bookings_mapper.dart
deleted file mode 100644
index 2e0a3955..00000000
--- a/comwell_key_app/lib/services/mappers/bookings_mapper.dart
+++ /dev/null
@@ -1,15 +0,0 @@
-import 'package:comwell_key_app/overview/models/bookings.dart';
-import 'package:comwell_key_app/services/mappers/booking_mapper.dart';
-import 'package:comwell_key_app/services/models/bookings_dto.dart';
-
-extension BookingsMapper on BookingsDTO {
- Bookings toBookings() {
- return Bookings(
- current:
- current.map((booking) => booking.toBooking()).toList(),
- past: past.map((booking) => booking.toBooking()).toList(),
- cancelled:
- cancelled.map((booking) => booking.toBooking()).toList(),
- );
- }
-}
diff --git a/comwell_key_app/lib/services/mappers/room_mapper.dart b/comwell_key_app/lib/services/mappers/room_mapper.dart
deleted file mode 100644
index 5362417b..00000000
--- a/comwell_key_app/lib/services/mappers/room_mapper.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-import 'package:comwell_key_app/overview/models/room.dart';
-import 'package:comwell_key_app/services/models/room_dto.dart';
-
-extension RoomDTOMapper on RoomDto {
- Room toRoom() {
- return Room(
- confirmationNumber: confirmationNumber,
- assignedTo: assignedTo,
- name: name,
- description: description,
- guests: guests,
- imageAssets: imageAssets,
- roomFacilities: [],
- tags: tags,
- );
- }
-}
-
-extension ListRoomMapper on List<RoomDto> {
- List<Room> toRooms() => map((dto) => dto.toRoom()).toList();
-}
\ No newline at end of file
diff --git a/comwell_key_app/lib/services/mappers/user_mapper.dart b/comwell_key_app/lib/services/mappers/user_mapper.dart
deleted file mode 100644
index 2d7d6fc6..00000000
--- a/comwell_key_app/lib/services/mappers/user_mapper.dart
+++ /dev/null
@@ -1,92 +0,0 @@
-import 'package:comwell_key_app/domain/models/address.dart';
-import 'package:comwell_key_app/domain/models/user.dart';
-import 'package:comwell_key_app/services/models/simple_user_dto.dart';
-import 'package:comwell_key_app/services/models/user_dto.dart';
-
-extension UserMapper on UserDto {
- User toUser() {
- return User(
- userId: userId,
- hmsId: hmsId ?? "",
- firstName: firstName,
- lastName: lastName,
- email: email,
- emailVerified: emailVerified,
- phoneNumber: phoneNumber,
- address: Address(
- street: addressStreet,
- city: addressCity,
- country: addressCountry,
- zipCode: addressZip,
- ),
- birthDate: birthDate ?? DateTime.now(),
- shopperReference: userId,
- points: points,
- gender: gender ?? "",
- isClubMember: isClubMember,
- createDate: createDate,
- companyId: companyId ?? "",
- companyName: companyName ?? "",
- symplifyId: symplifyId ?? "",
- signUpDate: signUpDate,
- signUpCampaign: signUpCampaign ?? "",
- signUpSource: signUpSource ?? "",
- locale: locale ?? "",
- wasRecentlyCreated: wasRecentlyCreated,
- nationality: nationality ?? "",
- );
- }
-}
-
-extension UserDtoMapper on User {
- UserDto toUserDto() {
- return UserDto(
- id: 0,
- userId: userId,
- hmsId: hmsId,
- firstName: firstName,
- lastName: lastName,
- email: email,
- emailVerified: emailVerified,
- isClubMember: isClubMember,
- birthDate: birthDate,
- createDate: createDate,
- companyId: companyId,
- companyName: companyName,
- symplifyId: symplifyId,
- phoneNumber: phoneNumber,
- gender: gender,
- addressStreet: address.street,
- addressZip: address.zipCode,
- addressCity: address.city,
- addressCountry: address.country,
- points: points,
- signUpDate: signUpDate,
- signUpCampaign: signUpCampaign,
- signUpSource: signUpSource,
- locale: null,
- wasRecentlyCreated: wasRecentlyCreated,
- permissions: null,
- // Permissions are not stored in User model
- nationality: nationality,
- );
- }
-}
-
-extension SimpleUserDtoMapper on User {
- SimpleUserDto toSimpleUserDto() {
- return SimpleUserDto(
- firstName: firstName,
- lastName: lastName,
- birthDate: birthDate?.toIso8601String(),
- phoneNumber: phoneNumber,
- gender: gender,
- addressStreet: address.street,
- addressZip: address.zipCode,
- addressCity: address.city,
- addressCountry: address.country,
- locale: locale.isNotEmpty ? locale : null,
- permissions: {}, // Permissions are not stored in User model
- );
- }
-}
\ No newline at end of file
diff --git a/comwell_key_app/lib/share/share_booking_repository.dart b/comwell_key_app/lib/share/share_booking_repository.dart
index d52d6ce6..7f497157 100644
--- a/comwell_key_app/lib/share/share_booking_repository.dart
+++ b/comwell_key_app/lib/share/share_booking_repository.dart
@@ -1,6 +1,6 @@
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/services/api.dart';
-import 'package:comwell_key_app/services/mappers/booking_mapper.dart';
+import 'package:comwell_key_app/services/interceptors/mappers/booking_mapper.dart';
import 'package:flutter/material.dart';
class ShareBookingRepository {
diff --git a/comwell_key_app/lib/utils/locator.dart b/comwell_key_app/lib/utils/locator.dart
index d8e5dfc9..d10e6995 100644
--- a/comwell_key_app/lib/utils/locator.dart
+++ b/comwell_key_app/lib/utils/locator.dart
@@ -9,7 +9,7 @@ import 'package:comwell_key_app/domain/repositories/booking_details_repository.d
import 'package:comwell_key_app/domain/repositories/internet_status_repository.dart';
import 'package:comwell_key_app/find_booking/find_booking_repository.dart';
import 'package:comwell_key_app/hotel_information/repository/hotel_information_repository.dart';
-import 'package:comwell_key_app/housekeeping/housekeeping_repository.dart';
+import 'package:comwell_key_app/domain/repositories/housekeeping_repository.dart';
import 'package:comwell_key_app/key/repository/key_repository.dart';
import 'package:comwell_key_app/my_booking/my_booking_repository.dart';
import 'package:comwell_key_app/domain/repositories/notifications_repository.dart';
diff --git a/comwell_key_app/pubspec.yaml b/comwell_key_app/pubspec.yaml
index 759f5e4a..89d7de12 100644
--- a/comwell_key_app/pubspec.yaml
+++ b/comwell_key_app/pubspec.yaml
@@ -77,6 +77,7 @@ dependencies:
dependency_overrides:
#Remove override when slider button updates
vibration: 3.1.3
+ analyzer: 8.3.0
dev_dependencies:
sentry_dart_plugin: ^3.0.0
diff --git a/mobilekeys_sdk_plugin/android/.gradle/8.1.1/checksums/checksums.lock b/mobilekeys_sdk_plugin/android/.gradle/8.1.1/checksums/checksums.lock
index e8086aea..6d06f3da 100644
Binary files a/mobilekeys_sdk_plugin/android/.gradle/8.1.1/checksums/checksums.lock and b/mobilekeys_sdk_plugin/android/.gradle/8.1.1/checksums/checksums.lock differ
diff --git a/mobilekeys_sdk_plugin/android/.gradle/8.1.1/checksums/md5-checksums.bin b/mobilekeys_sdk_plugin/android/.gradle/8.1.1/checksums/md5-checksums.bin
index 62e14f09..f5dcbb82 100644
Binary files a/mobilekeys_sdk_plugin/android/.gradle/8.1.1/checksums/md5-checksums.bin and b/mobilekeys_sdk_plugin/android/.gradle/8.1.1/checksums/md5-checksums.bin differ
diff --git a/mobilekeys_sdk_plugin/android/.gradle/8.1.1/checksums/sha1-checksums.bin b/mobilekeys_sdk_plugin/android/.gradle/8.1.1/checksums/sha1-checksums.bin
index 3476a7fd..18a94177 100644
Binary files a/mobilekeys_sdk_plugin/android/.gradle/8.1.1/checksums/sha1-checksums.bin and b/mobilekeys_sdk_plugin/android/.gradle/8.1.1/checksums/sha1-checksums.bin differ