Merged in fix/SW-3198-prices-select-rate (pull request #2763)

fix(SW-3198): fix striketrhough/regular prices, the same in enter details as select rate

* fix(SW-3198): fix striketrhough/regular prices, the same in enter details as select rate

* fix(SW-3198): remove additonalcost if calculating cost per room

* fix(SW-3198): include bookingcode in specialrate

* fix(SW-3198): remove console log

* fix(SW-3198): add or operator

* fix(SW-3198): capture total return value

* fix(SW-3198): rename and move function


Approved-by: Joakim Jäderberg
Approved-by: Hrishikesh Vaipurkar
This commit is contained in:
Bianca Widstam
2025-09-05 14:02:47 +00:00
parent a87cef91d4
commit bba4e24569
19 changed files with 290 additions and 236 deletions

View File

@@ -24,13 +24,13 @@ import styles from "./summaryContent.module.css"
import type { Price } from "../../../../../../contexts/SelectRate/getTotalPrice"
export type SelectRateSummaryProps = {
isMember: boolean
isUserLoggedIn: boolean
bookingCode?: string
toggleSummaryOpen: () => void
}
export default function SummaryContent({
isMember,
isUserLoggedIn,
toggleSummaryOpen,
}: SelectRateSummaryProps) {
const { selectedRates, input } = useSelectRateContext()
@@ -61,7 +61,7 @@ export default function SummaryContent({
return null
}
const showDiscounted = containsBookingCodeRate || isMember
const showDiscounted = containsBookingCodeRate || isUserLoggedIn
const totalRegularPrice = selectedRates?.totalPrice?.local?.regularPrice
? selectedRates.totalPrice.local.regularPrice
: 0
@@ -117,7 +117,7 @@ export default function SummaryContent({
<Room
key={idx}
room={mapToRoom({
isMember,
isUserLoggedIn,
rate: room,
input,
idx,
@@ -126,7 +126,7 @@ export default function SummaryContent({
})}
roomNumber={idx + 1}
roomCount={selectedRates.rates.length}
isMember={isMember}
isMember={isUserLoggedIn && idx === 0}
/>
)
})}
@@ -192,13 +192,15 @@ export default function SummaryContent({
showStrikeThroughPrice &&
selectedRates.totalPrice.local.regularPrice ? (
<Typography variant="Body/Paragraph/mdRegular">
<s className={styles.strikeThroughRate}>
{formatPrice(
intl,
selectedRates.totalPrice.local.regularPrice,
selectedRates.totalPrice.local.currency
)}
</s>
<p>
<s className={styles.strikeThroughRate}>
{formatPrice(
intl,
selectedRates.totalPrice.local.regularPrice,
selectedRates.totalPrice.local.currency
)}
</s>
</p>
</Typography>
) : null}
</div>
@@ -217,7 +219,7 @@ export default function SummaryContent({
}
const mapped = mapToRoom({
isMember,
isUserLoggedIn,
rate: room,
input,
idx,
@@ -231,17 +233,26 @@ export default function SummaryContent({
) {
switch (room.type) {
case "regular":
const memberLocalPrice = room.member?.localPrice
? {
...room.member.localPrice,
regularPricePerStay:
room.public?.localPrice?.pricePerStay ||
room.member.localPrice.regularPricePerStay,
}
: undefined
return {
regular:
isMember && memberLocalPrice
? memberLocalPrice
: room.public?.localPrice,
}
case "campaign":
return {
regular: isMember
? (room.member?.localPrice ?? room.public?.localPrice)
: room.public?.localPrice,
}
case "campaign":
return {
campaign: isMember
? (room.member ?? room.public)
: room.public,
}
case "redemption":
return {
redemption: room.redemption,
@@ -259,10 +270,19 @@ export default function SummaryContent({
}
}
if ("public" in room) {
const memberLocalPrice = room.member?.localPrice
? {
...room.member.localPrice,
regularPricePerStay:
room.public?.localPrice?.pricePerStay ||
room.member.localPrice.regularPricePerStay,
}
: undefined
return {
regular: isMember
? (room.member?.localPrice ?? room.public?.localPrice)
: room.public?.localPrice,
regular:
isMember && memberLocalPrice
? memberLocalPrice
: room.public?.localPrice,
}
}
}
@@ -271,7 +291,7 @@ export default function SummaryContent({
}
}
const p = getPrice(room!, isMember)
const p = getPrice(room!, isUserLoggedIn && idx === 0)
return {
...mapped,
@@ -293,7 +313,7 @@ export default function SummaryContent({
vat={selectedRates.vat}
/>
</div>
{!isMember && memberPrice ? (
{!isUserLoggedIn && memberPrice ? (
<SignupPromoDesktop
memberPrice={{
amount: memberPrice.localPrice.pricePerStay,
@@ -307,14 +327,14 @@ export default function SummaryContent({
}
function mapToRoom({
isMember,
isUserLoggedIn,
rate,
input,
idx,
getPriceForRoom,
rateTitles,
}: {
isMember: boolean
isUserLoggedIn: boolean
rate: NonNullable<
ReturnType<typeof useSelectRateContext>["selectedRates"]["rates"][number]
>
@@ -323,6 +343,7 @@ function mapToRoom({
getPriceForRoom: (roomIndex: number) => Price | null
rateTitles: ReturnType<typeof useRateTitles>
}) {
const useMemberPrice = isUserLoggedIn && idx === 0
return {
adults: input.data?.booking.rooms[idx].adults || 0,
childrenInRoom: input.data?.booking.rooms[idx].childrenInRoom,
@@ -335,7 +356,7 @@ function mapToRoom({
local: { price: -1, currency: CurrencyEnum.Unknown },
},
},
rateDetails: isMember
rateDetails: useMemberPrice
? (rate.rateDefinitionMember?.generalTerms ??
rate.rateDefinition.generalTerms)
: rate.rateDefinition.generalTerms,

View File

@@ -10,7 +10,6 @@ import { Typography } from "@scandic-hotels/design-system/Typography"
import { ChildBedMapEnum } from "@scandic-hotels/trpc/enums/childBedMapEnum"
import { isBookingCodeRate } from "../../utils"
import { getMemberPrice } from "../utils"
import styles from "./room.module.css"
@@ -68,9 +67,7 @@ export default function Room({
const childBedCrib = childrenBeds?.get(ChildBedMapEnum.IN_CRIB)
const childBedExtraBed = childrenBeds?.get(ChildBedMapEnum.IN_EXTRA_BED)
const memberPrice = getMemberPrice(room.roomRate)
const showMemberPrice = !!(isMember && memberPrice && roomNumber === 1)
const showDiscounted = isBookingCodeRate(room.roomRate) || showMemberPrice
const showDiscounted = isBookingCodeRate(room.roomRate) || isMember
const adultsMsg = intl.formatMessage(
{
@@ -130,25 +127,19 @@ export default function Room({
[styles.discounted]: showDiscounted,
})}
>
{showMemberPrice
? formatPrice(
intl,
memberPrice.amount,
memberPrice.currency
)
: formatPrice(
intl,
room.roomPrice.perStay.local.price,
room.roomPrice.perStay.local.currency,
room.roomPrice.perStay.local.additionalPrice,
room.roomPrice.perStay.local.additionalPriceCurrency
)}
{formatPrice(
intl,
room.roomPrice.perStay.local.price,
room.roomPrice.perStay.local.currency,
room.roomPrice.perStay.local.additionalPrice,
room.roomPrice.perStay.local.additionalPriceCurrency
)}
</p>
{showDiscounted && room.roomPrice.perStay.local.price ? (
{showDiscounted && room.roomPrice.perStay.local.regularPrice ? (
<s className={styles.strikeThroughRate}>
{formatPrice(
intl,
room.roomPrice.perStay.local.price,
room.roomPrice.perStay.local.regularPrice,
room.roomPrice.perStay.local.currency
)}
</s>

View File

@@ -61,19 +61,12 @@ export function MobileSummary() {
return null
}
const totalRegularPrice = selectedRates.totalPrice.local?.regularPrice
? selectedRates.totalPrice.local.regularPrice
: 0
const showStrikeThroughPrice =
totalRegularPrice > selectedRates.totalPrice.local?.price
return (
<div className={styles.wrapper} data-open={isSummaryOpen}>
<div className={styles.content}>
<div className={styles.summaryAccordion}>
<SummaryContent
isMember={isUserLoggedIn}
isUserLoggedIn={isUserLoggedIn}
toggleSummaryOpen={toggleSummaryOpen}
/>
</div>
@@ -106,17 +99,17 @@ export function MobileSummary() {
)}
</span>
</Typography>
{showDiscounted &&
showStrikeThroughPrice &&
selectedRates.totalPrice.local.regularPrice ? (
{showDiscounted && selectedRates.totalPrice.local?.regularPrice ? (
<Typography variant="Body/Paragraph/mdRegular">
<s className={styles.strikeThroughRate}>
{formatPrice(
intl,
selectedRates.totalPrice.local.regularPrice,
selectedRates.totalPrice.local.currency
)}
</s>
<p>
<s className={styles.strikeThroughRate}>
{formatPrice(
intl,
selectedRates.totalPrice.local?.regularPrice,
selectedRates.totalPrice.local.currency
)}
</s>
</p>
</Typography>
) : null}

View File

@@ -1,13 +0,0 @@
import type { Product } from "@scandic-hotels/trpc/types/roomAvailability"
export function getMemberPrice(roomRate: Product) {
if ("member" in roomRate && roomRate.member) {
return {
amount: roomRate.member.localPrice.pricePerStay,
currency: roomRate.member.localPrice.currency,
pricePerNight: roomRate.member.localPrice.pricePerNight,
}
}
return null
}