diff --git a/apps/scandic-web/components/HotelReservation/MyStay/ManageStay/ActionPanel/utils.ts b/apps/scandic-web/components/HotelReservation/MyStay/ManageStay/ActionPanel/utils.ts
new file mode 100644
index 000000000..e3fc04ad0
--- /dev/null
+++ b/apps/scandic-web/components/HotelReservation/MyStay/ManageStay/ActionPanel/utils.ts
@@ -0,0 +1,87 @@
+import { CancellationRuleEnum } from "@/constants/booking"
+
+import type { Room } from "@/stores/my-stay/myStayRoomDetailsStore"
+
+interface ModificationConditions {
+ canModify: boolean
+ isNotPast: boolean
+ isNotCancelled: boolean
+ isNotPrePaid: boolean
+}
+
+interface GuaranteeConditions {
+ isCancellableBefore6PM: boolean
+ hasNoGuaranteeInfo: boolean
+ isNotCancelled: boolean
+ isNotPast: boolean
+}
+
+export function isDatetimePast(date: Date): boolean {
+ return new Date(date) < new Date()
+}
+
+export function checkDateModifiable({
+ canChangeDate,
+ datetimeIsInThePast,
+ isCancelled,
+ isPrePaid,
+}: {
+ canChangeDate: boolean
+ datetimeIsInThePast: boolean
+ isCancelled: boolean
+ isPrePaid: boolean
+}): boolean {
+ const conditions: ModificationConditions = {
+ canModify: canChangeDate,
+ isNotPast: !datetimeIsInThePast,
+ isNotCancelled: !isCancelled,
+ isNotPrePaid: !isPrePaid,
+ }
+
+ return Object.values(conditions).every(Boolean)
+}
+
+export function checkCancelable({
+ bookedRoom,
+ linkedReservationRooms,
+ datetimeIsInThePast,
+}: {
+ bookedRoom: Room
+ linkedReservationRooms: Room[]
+ datetimeIsInThePast: boolean
+}): boolean {
+ const hasAnyCancelableRoom =
+ bookedRoom.isCancelable ||
+ linkedReservationRooms.some((room) => room.isCancelable)
+
+ return hasAnyCancelableRoom && !datetimeIsInThePast
+}
+
+export function checkGuaranteeable({
+ bookedRoom,
+ datetimeIsInThePast,
+}: {
+ bookedRoom: Room
+ datetimeIsInThePast: boolean
+}): boolean {
+ const conditions: GuaranteeConditions = {
+ isCancellableBefore6PM:
+ bookedRoom.rateDefinition.cancellationRule ===
+ CancellationRuleEnum.CancellableBefore6PM,
+ hasNoGuaranteeInfo: !bookedRoom.guaranteeInfo,
+ isNotCancelled: !bookedRoom.isCancelled,
+ isNotPast: !datetimeIsInThePast,
+ }
+
+ return Object.values(conditions).every(Boolean)
+}
+
+export function checkCanDownloadInvoice({
+ isCancelled,
+ isPrePaid,
+}: {
+ isCancelled: boolean
+ isPrePaid: boolean
+}): boolean {
+ return !isCancelled && isPrePaid
+}
diff --git a/apps/scandic-web/components/HotelReservation/MyStay/ManageStay/index.tsx b/apps/scandic-web/components/HotelReservation/MyStay/ManageStay/index.tsx
index 28afced7e..ae19902fd 100644
--- a/apps/scandic-web/components/HotelReservation/MyStay/ManageStay/index.tsx
+++ b/apps/scandic-web/components/HotelReservation/MyStay/ManageStay/index.tsx
@@ -15,6 +15,8 @@ import CancelStay from "./ActionPanel/Actions/CancelStay"
import ModifyStay from "./ActionPanel/Actions/ModifyStay"
import ActionPanel from "./ActionPanel"
+import styles from "./manangeStay.module.css"
+
import type { Hotel } from "@/types/hotel"
import { type CreditCard } from "@/types/user"
@@ -73,9 +75,15 @@ export default function ManageStay({
onClick={() => setIsOpen(true)}
size="small"
disabled={allRoomsCancelled}
+ className={styles.manageStayButton}
>
{intl.formatMessage({ id: "Manage stay" })}
-
+
{isOpen && (
)}
- {isModifiable && (
-
-
- {booking.rateDefinition.generalTerms.map((term) => (
-
- {term}
- {term.endsWith(".") ? " " : ". "}
-
- ))}
-
-
- )}
+
+
+
+ {booking.rateDefinition.generalTerms.map((term) => (
+
+ {term}
+ {term.endsWith(".") ? " " : ". "}
+
+ ))}
+
+
)
}
diff --git a/apps/scandic-web/components/HotelReservation/MyStay/utils/mapRoomDetails.ts b/apps/scandic-web/components/HotelReservation/MyStay/utils/mapRoomDetails.ts
index 32a254d01..259e88f47 100644
--- a/apps/scandic-web/components/HotelReservation/MyStay/utils/mapRoomDetails.ts
+++ b/apps/scandic-web/components/HotelReservation/MyStay/utils/mapRoomDetails.ts
@@ -1,4 +1,4 @@
-import { BookingStatusEnum } from "@/constants/booking"
+import { BookingStatusEnum, CancellationRuleEnum } from "@/constants/booking"
import { dt } from "@/lib/dt"
import { formatChildBedPreferences } from "../utils"
@@ -71,6 +71,11 @@ export function mapRoomDetails({
booking.childBedPreferences
)
+ const isPrePaid =
+ !!booking.guaranteeInfo?.paymentMethodDescription ||
+ booking.rateDefinition.cancellationRule !==
+ CancellationRuleEnum.CancellableBefore6PM
+
return {
hotelId: booking.hotelId,
roomTypeCode: booking.roomTypeCode,
@@ -85,7 +90,6 @@ export function mapRoomDetails({
guaranteeInfo: booking.guaranteeInfo,
linkedReservations: booking.linkedReservations,
bookingCode: booking.bookingCode,
- isModifiable: booking.isModifiable,
isCancelable: booking.isCancelable,
multiRoom: booking.multiRoom,
canChangeDate: booking.canChangeDate,
@@ -136,5 +140,6 @@ export function mapRoomDetails({
},
},
breakfast,
+ isPrePaid,
}
}
diff --git a/apps/scandic-web/stores/my-stay/myStayRoomDetailsStore.ts b/apps/scandic-web/stores/my-stay/myStayRoomDetailsStore.ts
index 5098d1f36..30e0b9db6 100644
--- a/apps/scandic-web/stores/my-stay/myStayRoomDetailsStore.ts
+++ b/apps/scandic-web/stores/my-stay/myStayRoomDetailsStore.ts
@@ -21,7 +21,6 @@ export type Room = Pick<
| "confirmationNumber"
| "cancellationNumber"
| "bookingCode"
- | "isModifiable"
| "isCancelable"
| "multiRoom"
| "canChangeDate"
@@ -41,6 +40,7 @@ export type Room = Pick<
roomPrice: RoomPrice
breakfast: BreakfastPackage | false
mainRoom: boolean
+ isPrePaid: boolean
}
interface MyStayRoomDetailsState {
@@ -85,7 +85,6 @@ export const useMyStayRoomDetailsStore = create
(
rateCode: "",
title: null,
},
- reservationStatus: "",
roomPrice: {
perNight: {
requested: {
@@ -129,7 +128,7 @@ export const useMyStayRoomDetailsStore = create(
breakfast: false,
linkedReservations: [],
isCancelable: false,
- isModifiable: false,
+ isPrePaid: false,
},
linkedReservationRooms: [],
actions: {