fix (SW-1352): update PriceDetailsTable with avarage price per night
This commit is contained in:
@@ -8,7 +8,6 @@ import { useEnterDetailsStore } from "@/stores/enter-details"
|
||||
import Body from "@/components/TempDesignSystem/Text/Body"
|
||||
import Caption from "@/components/TempDesignSystem/Text/Caption"
|
||||
import useLang from "@/hooks/useLang"
|
||||
import { getNights } from "@/utils/dateFormatting"
|
||||
import { formatPrice } from "@/utils/numberFormatting"
|
||||
|
||||
import styles from "./priceDetailsTable.module.css"
|
||||
@@ -16,14 +15,22 @@ import styles from "./priceDetailsTable.module.css"
|
||||
import { type PriceDetailsTableProps } from "@/types/components/hotelReservation/enterDetails/priceDetailsTable"
|
||||
import type { DetailsState } from "@/types/stores/enter-details"
|
||||
|
||||
function Row({ label, value }: { label: string; value: string }) {
|
||||
function Row({
|
||||
label,
|
||||
value,
|
||||
bold,
|
||||
}: {
|
||||
label: string
|
||||
value: string
|
||||
bold?: boolean
|
||||
}) {
|
||||
return (
|
||||
<tr className={styles.row}>
|
||||
<td>
|
||||
<Caption>{label}</Caption>
|
||||
<Caption type={bold ? "bold" : undefined}>{label}</Caption>
|
||||
</td>
|
||||
<td className={styles.price}>
|
||||
<Caption>{value}</Caption>
|
||||
<Caption type={bold ? "bold" : undefined}>{value}</Caption>
|
||||
</td>
|
||||
</tr>
|
||||
)
|
||||
@@ -33,11 +40,18 @@ function TableSection({ children }: React.PropsWithChildren) {
|
||||
return <tbody className={styles.tableSection}>{children}</tbody>
|
||||
}
|
||||
|
||||
function TableSectionHeader({ title }: { title: string }) {
|
||||
function TableSectionHeader({
|
||||
title,
|
||||
subtitle,
|
||||
}: {
|
||||
title: string
|
||||
subtitle?: string
|
||||
}) {
|
||||
return (
|
||||
<tr>
|
||||
<th colSpan={2}>
|
||||
<Body>{title}</Body>
|
||||
{subtitle ? <Body>{subtitle}</Body> : null}
|
||||
</th>
|
||||
</tr>
|
||||
)
|
||||
@@ -67,54 +81,58 @@ export default function PriceDetailsTable({
|
||||
|
||||
// TODO: Update for Multiroom later
|
||||
const { adults, childrenInRoom } = booking.rooms[0]
|
||||
const nights = getNights(booking.fromDate, booking.toDate)
|
||||
|
||||
const diff = dt(booking.toDate).diff(booking.fromDate, "days")
|
||||
const nights = intl.formatMessage(
|
||||
{ id: "booking.nights" },
|
||||
{ totalNights: diff }
|
||||
)
|
||||
const vatPercentage = vat / 100
|
||||
const vatAmount = totalPrice.local.price * vatPercentage
|
||||
|
||||
const priceExclVat = totalPrice.local.price - vatAmount
|
||||
|
||||
const duration = ` ${dt(booking.fromDate).locale(lang).format("ddd, D MMM")}
|
||||
-
|
||||
${dt(booking.toDate).locale(lang).format("ddd, D MMM")} (${nights})`
|
||||
return (
|
||||
<table className={styles.priceDetailsTable}>
|
||||
<TableSection>
|
||||
<TableSectionHeader title={roomType} />
|
||||
{nights.map((night) => {
|
||||
return (
|
||||
<Row
|
||||
key={night.format("YYMMDD")}
|
||||
label={dt(night).locale(lang).format("ddd, D MMM YYYY")}
|
||||
value={formatPrice(
|
||||
intl,
|
||||
roomPrice.perNight.local.price,
|
||||
roomPrice.perNight.local.currency
|
||||
)}
|
||||
/>
|
||||
)
|
||||
})}
|
||||
</TableSection>
|
||||
{bedType ? (
|
||||
<TableSection>
|
||||
<TableSectionHeader title={roomType} subtitle={duration} />
|
||||
<Row
|
||||
label={intl.formatMessage({ id: "Average price per night" })}
|
||||
value={formatPrice(
|
||||
intl,
|
||||
roomPrice.perNight.local.price,
|
||||
roomPrice.perNight.local.currency
|
||||
)}
|
||||
/>
|
||||
{bedType ? (
|
||||
<Row
|
||||
label={bedType.description}
|
||||
value={formatPrice(intl, 0, roomPrice.perStay.local.currency)}
|
||||
/>
|
||||
</TableSection>
|
||||
) : null}
|
||||
) : null}
|
||||
<Row
|
||||
bold
|
||||
label={intl.formatMessage({ id: "Room charge" })}
|
||||
value={formatPrice(
|
||||
intl,
|
||||
roomPrice.perStay.local.price,
|
||||
roomPrice.perStay.local.currency
|
||||
)}
|
||||
/>
|
||||
</TableSection>
|
||||
|
||||
{breakfast ? (
|
||||
<TableSection>
|
||||
<TableSectionHeader title={intl.formatMessage({ id: "Breakfast" })} />
|
||||
<Row
|
||||
label={`${intl.formatMessage(
|
||||
label={intl.formatMessage(
|
||||
{
|
||||
id: "{totalAdults, plural, one {# voksen} other {# voksne}}",
|
||||
id: "Breakfast ({totalAdults, plural, one {# adult} other {# adults}}) x {totalBreakfasts}",
|
||||
},
|
||||
{ totalAdults: adults }
|
||||
)}, ${intl.formatMessage(
|
||||
{
|
||||
id: "{totalBreakfasts, plural, one {# morgenmad} other {# morgenmad}}",
|
||||
},
|
||||
{ totalBreakfasts: nights.length }
|
||||
)}`}
|
||||
{ totalAdults: adults, totalBreakfasts: diff }
|
||||
)}
|
||||
value={formatPrice(
|
||||
intl,
|
||||
parseInt(breakfast.localPrice.totalPrice),
|
||||
@@ -123,20 +141,26 @@ export default function PriceDetailsTable({
|
||||
/>
|
||||
{childrenInRoom?.length ? (
|
||||
<Row
|
||||
label={`${intl.formatMessage(
|
||||
label={intl.formatMessage(
|
||||
{
|
||||
id: "{totalChildren, plural, one {# child} other {# children}}",
|
||||
id: "Breakfast ({totalChildren, plural, one {# child} other {# children}}) x {totalBreakfasts}",
|
||||
},
|
||||
{ totalChildren: childrenInRoom.length }
|
||||
)}, ${intl.formatMessage(
|
||||
{
|
||||
id: "{totalBreakfasts, plural, one {# breakfast} other {# breakfasts}}",
|
||||
},
|
||||
{ totalBreakfasts: nights.length }
|
||||
)}`}
|
||||
{ totalChildren: childrenInRoom.length, totalBreakfasts: diff }
|
||||
)}
|
||||
value={formatPrice(intl, 0, breakfast.localPrice.currency)}
|
||||
/>
|
||||
) : null}
|
||||
<Row
|
||||
bold
|
||||
label={intl.formatMessage({
|
||||
id: "Breakfast charge",
|
||||
})}
|
||||
value={formatPrice(
|
||||
intl,
|
||||
parseInt(breakfast.localPrice.totalPrice),
|
||||
breakfast.localPrice.currency
|
||||
)}
|
||||
/>
|
||||
</TableSection>
|
||||
) : null}
|
||||
<TableSection>
|
||||
|
||||
Reference in New Issue
Block a user