Merged in fix/SW-3449-corporatecheque-reward-nights-price (pull request #2782)

fix(SW-3449): corporate cheque and rewards price fixes in select rate

* fix(SW-3449): corporate cheque and rewards price fixes in select rate


Approved-by: Erik Tiekstra
Approved-by: Anton Gunnarsson
This commit is contained in:
Bianca Widstam
2025-09-10 08:57:44 +00:00
parent 1ceb1520a6
commit ddd4b7c531
3 changed files with 52 additions and 28 deletions

View File

@@ -255,12 +255,12 @@ export default function SummaryContent({
}
case "redemption":
return {
redemption: room.redemption,
redemption: room.redemption.localPrice,
}
case "code": {
if ("corporateCheque" in room) {
return {
corporateCheque: room.corporateCheque,
corporateCheque: room.corporateCheque.localPrice,
}
}

View File

@@ -90,6 +90,7 @@ function InnerCode({
roomTypeCode={roomTypeCode}
bannerText={bannerText}
packagesSum={pkgsSum}
requestedPackagesSum={pkgsSumRequested}
handleSelectRate={handleSelectRate}
isSelected={isSelected}
/>
@@ -154,6 +155,7 @@ function CorporateChequeCode({
roomIndex,
bannerText,
packagesSum,
requestedPackagesSum,
handleSelectRate,
isSelected,
}: {
@@ -162,6 +164,7 @@ function CorporateChequeCode({
roomTypeCode: string
bannerText: string
packagesSum: ReturnType<typeof sumPackages>
requestedPackagesSum: ReturnType<typeof sumPackagesRequestedPrice>
handleSelectRate: (rateCode: string) => void
isSelected: boolean
}) {
@@ -185,18 +188,22 @@ function CorporateChequeCode({
? (localPrice.currency ?? packagesSum.currency ?? "")
: ""
const approximateRate =
requestedPrice?.additionalPricePerStay && requestedPrice?.currency
? {
label: intl.formatMessage({
defaultMessage: "Approx.",
}),
price:
`${requestedPrice.numberOfCheques} CC + ` +
requestedPrice.additionalPricePerStay,
unit: requestedPrice.currency,
}
: undefined
let approximateRate = undefined
if (requestedPrice?.currency && requestedPrice?.numberOfCheques) {
const base = requestedPrice.numberOfCheques
const additionalPrice =
(requestedPrice.additionalPricePerStay ?? 0) +
(requestedPackagesSum?.price ?? 0)
if (additionalPrice > 0) {
approximateRate = {
label: intl.formatMessage({ defaultMessage: "Approx." }),
price: `${base} CC + ${additionalPrice}`,
unit: requestedPrice.currency,
}
}
}
return (
<CodeRateCard

View File

@@ -28,8 +28,10 @@ export function getTotalPrice({
(x): x is OneLevelNonNullable<SelectedRate> => !!x
)
if (summaryArray.some((rate) => "corporateCheque" in rate)) {
return calculateCorporateChequePrice(summaryArray)
if (
summaryArray.some((room) => room.rate && "corporateCheque" in room.rate)
) {
return calculateCorporateChequePrice(summaryArray, addAdditionalCost)
}
if (!mainRoomRate) {
@@ -42,11 +44,12 @@ export function getTotalPrice({
mainRoomRate.redemption,
mainRoom.roomConfiguration?.selectedPackages.filter(
(pkg) => "localPrice" in pkg
) ?? null
) ?? null,
addAdditionalCost
)
}
if ("voucher" in mainRoomRate) {
const voucherPrice = calculateVoucherPrice(summaryArray)
const voucherPrice = calculateVoucherPrice(summaryArray, addAdditionalCost)
return voucherPrice
}
@@ -152,9 +155,12 @@ function calculateTotalPrice(
function calculateRedemptionTotalPrice(
redemption: RedemptionProduct["redemption"],
packages: RoomPackage[] | null
packages: RoomPackage[] | null,
addAdditonalCost: boolean
) {
const pkgsSum = sumPackages(packages)
const pkgsSum = addAdditonalCost
? sumPackages(packages)
: { price: 0, currency: undefined }
let additionalPrice
if (redemption.localPrice.additionalPricePerStay) {
additionalPrice =
@@ -180,7 +186,8 @@ function calculateRedemptionTotalPrice(
}
function calculateVoucherPrice(
selectedRateSummary: OneLevelNonNullable<SelectedRate>[]
selectedRateSummary: OneLevelNonNullable<SelectedRate>[],
addAdditionalPrice?: boolean
) {
return selectedRateSummary.reduce<Price>(
(total, room) => {
@@ -191,7 +198,9 @@ function calculateVoucherPrice(
total.local.price = total.local.price + rate.numberOfVouchers
const pkgsSum = sumPackages(room.roomConfiguration?.selectedPackages)
const pkgsSum = addAdditionalPrice
? sumPackages(room.roomConfiguration?.selectedPackages)
: { price: 0, currency: undefined }
if (pkgsSum.price && pkgsSum.currency) {
total.local.additionalPrice =
(total.local.additionalPrice || 0) + pkgsSum.price
@@ -216,18 +225,22 @@ type OneLevelNonNullable<T> = {
}
export function calculateCorporateChequePrice(
selectedRates: OneLevelNonNullable<SelectedRate>[]
selectedRates: OneLevelNonNullable<SelectedRate>[],
addAdditionalCost?: boolean
) {
return selectedRates.reduce<Price>(
(total, room) => {
if (!("corporateCheque" in room.rate)) {
if (!(room.rate && "corporateCheque" in room.rate)) {
return total
}
const rate = room.rate.corporateCheque
const pkgsSum = sumPackages(
selectedRates.flatMap((x) => x.roomConfiguration?.selectedPackages)
)
const pkgsSum = addAdditionalCost
? sumPackages(room.roomConfiguration?.selectedPackages)
: { price: 0, currency: undefined }
const packagesRequestedPrice = addAdditionalCost
? sumPackagesRequestedPrice(room.roomConfiguration?.selectedPackages)
: { price: 0, currency: undefined }
total.local.price = total.local.price + rate.localPrice.numberOfCheques
if (rate.localPrice.additionalPricePerStay) {
@@ -257,7 +270,11 @@ export function calculateCorporateChequePrice(
if (rate.requestedPrice.additionalPricePerStay) {
total.requested.additionalPrice =
(total.requested.additionalPrice || 0) +
rate.requestedPrice.additionalPricePerStay
rate.requestedPrice.additionalPricePerStay +
packagesRequestedPrice.price
} else if (packagesRequestedPrice.price) {
total.local.additionalPrice =
(total.local.additionalPrice || 0) + packagesRequestedPrice.price
}
if (rate.requestedPrice.currency) {