feat(dashboard,cart,types,utils): refine order details summary (#13313)
* feat(dashboard,types,utils): refine order details summary * fix tests * changeset * ui corrections * tests again * weird tests failing * revert update to subtotal * revert http tests too * comments * move credit lines so it makes more sense * remove currency codes and add bold prices * add new properties in default for storefront * minor to patch * remove bold on things that should be * olis comment about taxes * remove bold from shipping
This commit is contained in:
7
.changeset/spotty-games-retire.md
Normal file
7
.changeset/spotty-games-retire.md
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
"@medusajs/utils": patch
|
||||
"@medusajs/dashboard": patch
|
||||
"@medusajs/types": patch
|
||||
---
|
||||
|
||||
feat(dashboard,cart,types,utils): refine order details summary
|
||||
@@ -1,10 +1,7 @@
|
||||
import { medusaIntegrationTestRunner } from "@medusajs/test-utils"
|
||||
import { HttpTypes } from "@medusajs/types"
|
||||
import { ModuleRegistrationName } from "@medusajs/utils"
|
||||
import {
|
||||
adminHeaders,
|
||||
createAdminUser,
|
||||
} from "../../../../helpers/create-admin-user"
|
||||
import { adminHeaders, createAdminUser, } from "../../../../helpers/create-admin-user"
|
||||
import { setupTaxStructure } from "../../../../modules/__tests__/fixtures"
|
||||
|
||||
jest.setTimeout(300000)
|
||||
|
||||
@@ -3987,6 +3987,9 @@
|
||||
},
|
||||
"taxTotal": {
|
||||
"type": "string"
|
||||
},
|
||||
"totalAfterDiscount": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -4002,7 +4005,8 @@
|
||||
"itemSubtotal",
|
||||
"shippingSubtotal",
|
||||
"discountSubtotal",
|
||||
"taxTotal"
|
||||
"taxTotal",
|
||||
"totalAfterDiscount"
|
||||
],
|
||||
"additionalProperties": false
|
||||
},
|
||||
|
||||
@@ -1067,7 +1067,8 @@
|
||||
"itemSubtotal": "Item Subtotal",
|
||||
"shippingSubtotal": "Shipping Subtotal",
|
||||
"discountSubtotal": "Discount Subtotal",
|
||||
"taxTotal": "Tax Total"
|
||||
"taxTotal": "Tax Total",
|
||||
"totalAfterDiscount": "Total After Discount"
|
||||
},
|
||||
"transfer": {
|
||||
"title": "Transfer ownership",
|
||||
|
||||
@@ -63,6 +63,7 @@ import { getReturnableQuantity } from "../../../../../lib/rma"
|
||||
import { CopyPaymentLink } from "../copy-payment-link/copy-payment-link"
|
||||
import ReturnInfoPopover from "./return-info-popover"
|
||||
import ShippingInfoPopover from "./shipping-info-popover"
|
||||
import { formatPercentage } from "../../../../../lib/percentage-helpers.ts"
|
||||
|
||||
type OrderSummarySectionProps = {
|
||||
order: AdminOrder
|
||||
@@ -191,7 +192,7 @@ export const OrderSummarySection = ({
|
||||
<Header order={order} orderPreview={orderPreview} />
|
||||
<ItemBreakdown order={order} reservations={reservations!} />
|
||||
<CostBreakdown order={order} />
|
||||
<CreditLinesBreakdown order={order} plugins={plugins} />
|
||||
<DiscountAndTotalBreakdown order={order} plugins={plugins} />
|
||||
<Total order={order} />
|
||||
|
||||
{(showAllocateButton || showReturns || showPayment || showRefund) && (
|
||||
@@ -569,51 +570,39 @@ const CostBreakdown = ({
|
||||
const [isTaxOpen, setIsTaxOpen] = useState(false)
|
||||
const [isShippingOpen, setIsShippingOpen] = useState(false)
|
||||
|
||||
const discountCodes = useMemo(() => {
|
||||
const codes = new Set()
|
||||
order.items.forEach((item) =>
|
||||
item.adjustments?.forEach((adj) => {
|
||||
codes.add(adj.code)
|
||||
})
|
||||
)
|
||||
|
||||
return Array.from(codes).sort()
|
||||
}, [order])
|
||||
|
||||
const taxCodes = useMemo(() => {
|
||||
const taxCodeMap = {}
|
||||
const taxCodeMap: { [key: string]: { total: number; rate: number } } = {}
|
||||
|
||||
order.items.forEach((item) => {
|
||||
item.tax_lines?.forEach((line) => {
|
||||
taxCodeMap[line.code] = (taxCodeMap[line.code] || 0) + line.total
|
||||
const prevTotal = taxCodeMap[line.code]?.total || 0
|
||||
taxCodeMap[line.code] = {
|
||||
total: prevTotal + line.subtotal,
|
||||
rate: line.rate,
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
order.shipping_methods.forEach((sm) => {
|
||||
sm.tax_lines?.forEach((line) => {
|
||||
taxCodeMap[line.code] = (taxCodeMap[line.code] || 0) + line.total
|
||||
const prevTotal = taxCodeMap[line.code]?.total || 0
|
||||
taxCodeMap[line.code] = {
|
||||
total: prevTotal + line.subtotal,
|
||||
rate: line.rate,
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
return taxCodeMap
|
||||
}, [order])
|
||||
|
||||
const automaticTaxesOn = !!order.region?.automatic_taxes
|
||||
const hasTaxLines = !!Object.keys(taxCodes).length
|
||||
|
||||
const discountTotal = automaticTaxesOn
|
||||
? order.discount_total
|
||||
: order.discount_subtotal
|
||||
const hasTaxes = !!Object.keys(taxCodes).length
|
||||
|
||||
return (
|
||||
<div className="text-ui-fg-subtle flex flex-col gap-y-2 px-6 py-4">
|
||||
<Cost
|
||||
label={t(
|
||||
automaticTaxesOn
|
||||
? "orders.summary.itemTotal"
|
||||
: "orders.summary.itemSubtotal"
|
||||
)}
|
||||
value={getLocaleAmount(order.item_total, order.currency_code)}
|
||||
label={t("orders.summary.itemSubtotal")}
|
||||
value={getLocaleAmount(order.item_subtotal, order.currency_code)}
|
||||
/>
|
||||
<Cost
|
||||
label={
|
||||
@@ -621,13 +610,7 @@ const CostBreakdown = ({
|
||||
onClick={() => setIsShippingOpen((o) => !o)}
|
||||
className="flex cursor-pointer items-center gap-1"
|
||||
>
|
||||
<span>
|
||||
{t(
|
||||
automaticTaxesOn
|
||||
? "orders.summary.shippingTotal"
|
||||
: "orders.summary.shippingSubtotal"
|
||||
)}
|
||||
</span>
|
||||
<span>{t("orders.summary.shippingSubtotal")}</span>
|
||||
<TriangleDownMini
|
||||
style={{
|
||||
transform: `rotate(${isShippingOpen ? 0 : -90}deg)`,
|
||||
@@ -635,10 +618,7 @@ const CostBreakdown = ({
|
||||
/>
|
||||
</div>
|
||||
}
|
||||
value={getLocaleAmount(
|
||||
automaticTaxesOn ? order.shipping_total : order.shipping_subtotal,
|
||||
order.currency_code
|
||||
)}
|
||||
value={getLocaleAmount(order.shipping_subtotal, order.currency_code)}
|
||||
/>
|
||||
|
||||
{isShippingOpen && (
|
||||
@@ -654,7 +634,7 @@ const CostBreakdown = ({
|
||||
className="flex items-center justify-between gap-x-2"
|
||||
>
|
||||
<div>
|
||||
<span className="txt-small text-ui-fg-subtle font-medium">
|
||||
<span className="txt-small">
|
||||
{sm.name}
|
||||
{sm.detail.return_id &&
|
||||
` (${t("fields.returnShipping")})`}{" "}
|
||||
@@ -665,10 +645,7 @@ const CostBreakdown = ({
|
||||
<div className="bottom-[calc(50% - 2px)] absolute h-[1px] w-full border-b border-dashed" />
|
||||
</div>
|
||||
<span className="txt-small text-ui-fg-muted">
|
||||
{getLocaleAmount(
|
||||
automaticTaxesOn ? sm.total : sm.subtotal,
|
||||
order.currency_code
|
||||
)}
|
||||
{getLocaleAmount(sm.subtotal, order.currency_code)}
|
||||
</span>
|
||||
</div>
|
||||
)
|
||||
@@ -676,36 +653,18 @@ const CostBreakdown = ({
|
||||
</div>
|
||||
)}
|
||||
|
||||
<Cost
|
||||
label={t(
|
||||
automaticTaxesOn
|
||||
? "orders.summary.discountTotal"
|
||||
: "orders.summary.discountSubtotal"
|
||||
)}
|
||||
secondaryValue={discountCodes.join(", ")}
|
||||
value={
|
||||
discountTotal > 0
|
||||
? `- ${getLocaleAmount(discountTotal, order.currency_code)}`
|
||||
: "-"
|
||||
}
|
||||
/>
|
||||
|
||||
<>
|
||||
<div className="flex justify-between">
|
||||
<div
|
||||
onClick={() => hasTaxLines && setIsTaxOpen((o) => !o)}
|
||||
onClick={() => hasTaxes && setIsTaxOpen((o) => !o)}
|
||||
className={clx("flex items-center gap-1", {
|
||||
"cursor-pointer": hasTaxLines,
|
||||
"cursor-pointer": hasTaxes,
|
||||
})}
|
||||
>
|
||||
<span className="txt-small select-none">
|
||||
{t(
|
||||
automaticTaxesOn
|
||||
? "orders.summary.taxTotalIncl"
|
||||
: "orders.summary.taxTotal"
|
||||
)}
|
||||
{t("orders.summary.taxTotal")}
|
||||
</span>
|
||||
{hasTaxLines && (
|
||||
{hasTaxes && (
|
||||
<TriangleDownMini
|
||||
style={{
|
||||
transform: `rotate(${isTaxOpen ? 0 : -90}deg)`,
|
||||
@@ -716,21 +675,22 @@ const CostBreakdown = ({
|
||||
|
||||
<div className="text-right">
|
||||
<Text size="small" leading="compact">
|
||||
{getLocaleAmount(order.tax_total, order.currency_code)}
|
||||
{getLocaleAmount(order.original_tax_total, order.currency_code)}
|
||||
</Text>
|
||||
</div>
|
||||
</div>
|
||||
{isTaxOpen && (
|
||||
<div className="flex flex-col gap-1 pl-5">
|
||||
{Object.entries(taxCodes).map(([code, total]) => {
|
||||
{Object.entries(taxCodes).map(([code, { total, rate }]) => {
|
||||
return (
|
||||
<div
|
||||
key={code}
|
||||
className="flex items-center justify-between gap-x-2"
|
||||
>
|
||||
<div>
|
||||
<span className="txt-small text-ui-fg-subtle font-medium">
|
||||
{code}
|
||||
<div className="flex gap-1">
|
||||
<span className="txt-small">{code}</span>
|
||||
<span className="txt-small">
|
||||
({formatPercentage(rate)})
|
||||
</span>
|
||||
</div>
|
||||
<div className="relative flex-1">
|
||||
@@ -745,11 +705,23 @@ const CostBreakdown = ({
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
<div className="text-ui-fg-base flex items-center justify-between">
|
||||
<Text className="text-ui-fg-subtle" size="small" leading="compact">
|
||||
{t("fields.total")}
|
||||
</Text>
|
||||
<Text
|
||||
className="text-ui-fg-subtle text-bold"
|
||||
size="small"
|
||||
leading="compact"
|
||||
>
|
||||
{getLocaleAmount(order.original_total, order.currency_code)}
|
||||
</Text>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
const CreditLinesBreakdown = ({
|
||||
const DiscountAndTotalBreakdown = ({
|
||||
order,
|
||||
plugins,
|
||||
}: {
|
||||
@@ -757,97 +729,208 @@ const CreditLinesBreakdown = ({
|
||||
plugins: AdminPlugin[]
|
||||
}) => {
|
||||
const { t } = useTranslation()
|
||||
const [isDiscountOpen, setIsDiscountOpen] = useState(false)
|
||||
const [isCreditLinesOpen, setIsCreditLinesOpen] = useState(false)
|
||||
|
||||
const creditLines = order.credit_lines ?? []
|
||||
const loyaltyPlugin = getLoyaltyPlugin(plugins)
|
||||
|
||||
if (creditLines.length === 0) {
|
||||
return null
|
||||
}
|
||||
const discounts = useMemo(() => {
|
||||
const discounts: {
|
||||
type: "item" | "shipping"
|
||||
total: number
|
||||
codes: string[]
|
||||
}[] = []
|
||||
if (order.item_discount_total) {
|
||||
discounts.push({
|
||||
type: "item",
|
||||
total: order.item_discount_total,
|
||||
codes: Array.from(
|
||||
new Set(
|
||||
order.items
|
||||
.flatMap((item) => item.adjustments || [])
|
||||
.map((adjustment) => adjustment.code!)
|
||||
)
|
||||
).sort(),
|
||||
})
|
||||
}
|
||||
if (order.shipping_discount_total) {
|
||||
discounts.push({
|
||||
type: "shipping",
|
||||
total: order.shipping_discount_total,
|
||||
codes: Array.from(
|
||||
new Set(
|
||||
order.shipping_methods
|
||||
.flatMap((shippingMethod) => shippingMethod.adjustments || [])
|
||||
.map((adjustment) => adjustment.code!)
|
||||
)
|
||||
).sort(),
|
||||
})
|
||||
}
|
||||
return discounts
|
||||
}, [order])
|
||||
|
||||
const hasDiscount = discounts.length > 0
|
||||
const hasCreditLines = creditLines.length > 0
|
||||
|
||||
return (
|
||||
<div className="text-ui-fg-subtle flex flex-col">
|
||||
<>
|
||||
<div
|
||||
onClick={() => setIsCreditLinesOpen((o) => !o)}
|
||||
className="bg-ui-bg-component flex cursor-pointer items-center justify-between border border-dashed px-6 py-4"
|
||||
>
|
||||
<div className="flex items-center gap-2">
|
||||
<TriangleDownMini
|
||||
style={{
|
||||
transform: `rotate(${isCreditLinesOpen ? 0 : -90}deg)`,
|
||||
}}
|
||||
/>
|
||||
<span className="text-ui-fg-muted txt-small select-none">
|
||||
{loyaltyPlugin
|
||||
? t("orders.giftCardsStoreCreditLines")
|
||||
: t("orders.creditLines.title")}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<Text size="small" leading="compact">
|
||||
{getLocaleAmount(order.credit_line_total, order.currency_code)}
|
||||
</Text>
|
||||
<div className="text-ui-fg-subtle flex flex-col gap-y-2 px-6 py-4">
|
||||
<Cost
|
||||
label={
|
||||
<div
|
||||
onClick={() => hasDiscount && setIsDiscountOpen((o) => !o)}
|
||||
className={clx("flex items-center gap-1", {
|
||||
"cursor-pointer": hasDiscount,
|
||||
})}
|
||||
>
|
||||
<span>{t("orders.summary.discountTotal")}</span>
|
||||
{hasDiscount && (
|
||||
<TriangleDownMini
|
||||
style={{
|
||||
transform: `rotate(${isDiscountOpen ? 0 : -90}deg)`,
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
}
|
||||
value={getLocaleAmount(order.discount_total, order.currency_code)}
|
||||
/>
|
||||
{isDiscountOpen && (
|
||||
<div className="flex flex-col gap-1 pl-5">
|
||||
{discounts.map(({ type, total, codes }) => {
|
||||
return (
|
||||
<div
|
||||
key={type}
|
||||
className="flex items-center justify-between gap-x-2"
|
||||
>
|
||||
<div className="flex gap-1">
|
||||
<span className="txt-small">{t(`fields.${type}`)}</span>
|
||||
<span className="txt-small">({codes.join(", ")})</span>
|
||||
</div>
|
||||
<div className="relative flex-1">
|
||||
<div className="bottom-[calc(50% - 2px)] absolute h-[1px] w-full border-b border-dashed" />
|
||||
</div>
|
||||
<span className="txt-small text-ui-fg-muted">
|
||||
{getLocaleAmount(total, order.currency_code)}
|
||||
</span>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{isCreditLinesOpen && (
|
||||
<div className="flex flex-col">
|
||||
{creditLines.map((creditLine) => {
|
||||
const prettyReference = creditLine.reference
|
||||
?.split("_")
|
||||
.join(" ")
|
||||
.split("-")
|
||||
.join(" ")
|
||||
{hasCreditLines && (
|
||||
<>
|
||||
<Cost
|
||||
label={
|
||||
<div
|
||||
onClick={() => setIsCreditLinesOpen((o) => !o)}
|
||||
className="flex cursor-pointer items-center gap-1"
|
||||
>
|
||||
<span>
|
||||
{loyaltyPlugin
|
||||
? t("orders.giftCardsStoreCreditLines")
|
||||
: t("orders.creditLines.title")}
|
||||
</span>
|
||||
<TriangleDownMini
|
||||
style={{
|
||||
transform: `rotate(${isCreditLinesOpen ? 0 : -90}deg)`,
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
}
|
||||
value={getLocaleAmount(
|
||||
order.credit_line_total,
|
||||
order.currency_code
|
||||
)}
|
||||
/>
|
||||
{isCreditLinesOpen && (
|
||||
<div className="flex flex-col gap-1 pl-5">
|
||||
{creditLines.map((creditLine) => {
|
||||
const prettyReference = creditLine.reference
|
||||
?.split("_")
|
||||
.join(" ")
|
||||
.split("-")
|
||||
.join(" ")
|
||||
|
||||
const prettyReferenceId = creditLine.reference_id ? (
|
||||
<DisplayId id={creditLine.reference_id} />
|
||||
) : null
|
||||
const prettyReferenceId = creditLine.reference_id ? (
|
||||
<DisplayId id={creditLine.reference_id} />
|
||||
) : null
|
||||
|
||||
return (
|
||||
<div
|
||||
className="text-ui-fg-subtle grid grid-cols-[1fr_1fr_1fr] items-center px-6 py-4 py-4 sm:grid-cols-[1fr_1fr_1fr]"
|
||||
key={creditLine.id}
|
||||
>
|
||||
<div className="w-full min-w-[60px] overflow-hidden">
|
||||
<Text
|
||||
size="small"
|
||||
leading="compact"
|
||||
weight="plus"
|
||||
className="truncate"
|
||||
>
|
||||
<DisplayId id={creditLine.id} />
|
||||
</Text>
|
||||
|
||||
<Text size="small" leading="compact">
|
||||
{format(
|
||||
new Date(creditLine.created_at),
|
||||
"dd MMM, yyyy, HH:mm:ss"
|
||||
)}
|
||||
</Text>
|
||||
</div>
|
||||
|
||||
<div className="hidden items-center justify-end gap-x-2 sm:flex">
|
||||
<Text size="small" leading="compact" className="capitalize">
|
||||
{prettyReference} ({prettyReferenceId})
|
||||
</Text>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center justify-end">
|
||||
<Text size="small" leading="compact">
|
||||
return (
|
||||
<div
|
||||
key={creditLine.id}
|
||||
className="flex items-center justify-between gap-x-2"
|
||||
>
|
||||
<div className="flex items-center">
|
||||
<Text
|
||||
size="small"
|
||||
leading="compact"
|
||||
weight="plus"
|
||||
className="txt-small text-ui-fg-subtle font-medium"
|
||||
>
|
||||
<DisplayId id={creditLine.id} />
|
||||
</Text>
|
||||
<span className="txt-small text-ui-fg-subtle mx-1">
|
||||
-
|
||||
</span>
|
||||
<Tooltip
|
||||
content={format(
|
||||
new Date(creditLine.created_at),
|
||||
"dd MMM, yyyy, HH:mm:ss"
|
||||
)}
|
||||
>
|
||||
<Text
|
||||
size="small"
|
||||
leading="compact"
|
||||
className="txt-small text-ui-fg-subtle"
|
||||
>
|
||||
{format(
|
||||
new Date(creditLine.created_at),
|
||||
"dd MMM, yyyy"
|
||||
)}
|
||||
</Text>
|
||||
</Tooltip>
|
||||
<span className="txt-small text-ui-fg-subtle mx-1">
|
||||
-
|
||||
</span>
|
||||
<Text
|
||||
size="small"
|
||||
leading="compact"
|
||||
className="txt-small text-ui-fg-subtle capitalize"
|
||||
>
|
||||
({prettyReference} {prettyReferenceId})
|
||||
</Text>
|
||||
</div>
|
||||
<div className="relative flex-1">
|
||||
<div className="bottom-[calc(50% - 2px)] absolute h-[1px] w-full border-b border-dashed" />
|
||||
</div>
|
||||
<span className="txt-small text-ui-fg-muted">
|
||||
{getLocaleAmount(
|
||||
creditLine.amount as number,
|
||||
order.currency_code
|
||||
)}
|
||||
</Text>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
|
||||
<div className="text-ui-fg-base flex items-center justify-between">
|
||||
<Text className="text-ui-fg-subtle" size="small" leading="compact">
|
||||
{t("orders.summary.totalAfterDiscount")}
|
||||
</Text>
|
||||
<Text
|
||||
className="text-ui-fg-subtle text-bold"
|
||||
size="small"
|
||||
leading="compact"
|
||||
>
|
||||
{getLocaleAmount(order.total, order.currency_code)}
|
||||
</Text>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -1138,15 +1221,6 @@ const Total = ({ order }: { order: AdminOrder }) => {
|
||||
|
||||
return (
|
||||
<div className=" flex flex-col gap-y-2 px-6 py-4">
|
||||
<div className="text-ui-fg-base flex items-center justify-between">
|
||||
<Text className="text-ui-fg-subtle" size="small" leading="compact">
|
||||
{t("fields.total")}
|
||||
</Text>
|
||||
<Text className="text-ui-fg-subtle" size="small" leading="compact">
|
||||
{getStylizedAmount(order.original_total, order.currency_code)}
|
||||
</Text>
|
||||
</div>
|
||||
|
||||
<div className="text-ui-fg-base flex items-center justify-between">
|
||||
<Text className="text-ui-fg-subtle" size="small" leading="compact">
|
||||
{t("fields.paidTotal")}
|
||||
@@ -1159,18 +1233,20 @@ const Total = ({ order }: { order: AdminOrder }) => {
|
||||
</Text>
|
||||
</div>
|
||||
|
||||
<div className="text-ui-fg-base flex items-center justify-between">
|
||||
<Text className="text-ui-fg-subtle" size="small" leading="compact">
|
||||
{t("fields.creditTotal")}
|
||||
</Text>
|
||||
{getTotalCreditLines(order.credit_lines ?? []) > 0 && (
|
||||
<div className="text-ui-fg-base flex items-center justify-between">
|
||||
<Text className="text-ui-fg-subtle" size="small" leading="compact">
|
||||
{t("fields.creditTotal")}
|
||||
</Text>
|
||||
|
||||
<Text className="text-ui-fg-subtle" size="small" leading="compact">
|
||||
{getStylizedAmount(
|
||||
getTotalCreditLines(order.credit_lines ?? []),
|
||||
order.currency_code
|
||||
)}
|
||||
</Text>
|
||||
</div>
|
||||
<Text className="text-ui-fg-subtle" size="small" leading="compact">
|
||||
{getStylizedAmount(
|
||||
getTotalCreditLines(order.credit_lines ?? []),
|
||||
order.currency_code
|
||||
)}
|
||||
</Text>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="text-ui-fg-base flex items-center justify-between">
|
||||
<Text
|
||||
@@ -1181,7 +1257,7 @@ const Total = ({ order }: { order: AdminOrder }) => {
|
||||
{t("orders.returns.outstandingAmount")}
|
||||
</Text>
|
||||
<Text
|
||||
className="text-ui-fg-subtle text-bold"
|
||||
className="text-ui-fg-subtle text-bold" // ici
|
||||
size="small"
|
||||
leading="compact"
|
||||
>
|
||||
|
||||
@@ -10,14 +10,21 @@ const DEFAULT_PROPERTIES = [
|
||||
// --- TOTALS ---
|
||||
"total",
|
||||
"credit_line_total",
|
||||
"item_subtotal",
|
||||
"item_total",
|
||||
"item_tax_total",
|
||||
"original_item_tax_total",
|
||||
"item_discount_total",
|
||||
"shipping_subtotal",
|
||||
"original_total",
|
||||
"original_tax_total",
|
||||
"subtotal",
|
||||
"discount_total",
|
||||
"discount_subtotal",
|
||||
"shipping_total",
|
||||
"shipping_tax_total",
|
||||
"original_shipping_tax_total",
|
||||
"shipping_discount_total",
|
||||
"tax_total",
|
||||
"refundable_total",
|
||||
"order_change",
|
||||
|
||||
@@ -820,6 +820,10 @@ export interface BaseOrder {
|
||||
* The tax total applied on the order's items, including promotions.
|
||||
*/
|
||||
item_tax_total: number
|
||||
/**
|
||||
* The promotion total applied on the order's items.
|
||||
*/
|
||||
item_discount_total: number
|
||||
/**
|
||||
* The total of the order including taxes, excluding promotions.
|
||||
*/
|
||||
@@ -837,7 +841,7 @@ export interface BaseOrder {
|
||||
*/
|
||||
total: number
|
||||
/**
|
||||
* The total of the order excluding taxes, including promotions.
|
||||
* The total of the order excluding taxes and promotions.
|
||||
*/
|
||||
subtotal: number
|
||||
/**
|
||||
@@ -872,6 +876,10 @@ export interface BaseOrder {
|
||||
* The tax total applied on the order's shipping methods, including promotions.
|
||||
*/
|
||||
shipping_tax_total: number
|
||||
/**
|
||||
* The promotion total applied on the order's shipping methods.
|
||||
*/
|
||||
shipping_discount_total: number
|
||||
/**
|
||||
* The total of the order's shipping methods including taxes, excluding promotions.
|
||||
*/
|
||||
|
||||
@@ -68,7 +68,7 @@ export type QueryIndexFunction = {
|
||||
metadata: RemoteQueryFunctionReturnPagination
|
||||
}
|
||||
: Variables extends { skip?: number | undefined } | { skip?: number }
|
||||
? // TODO: the real type is the one in parenthsis but we put any for now as the current API is broken and need fixin in a separate iteration (RemoteQueryReturnedData<TEntry>[] | {rows: RemoteQueryReturnedData<TEntry>[] metadata: RemoteQueryFunctionReturnPagination })
|
||||
? // TODO: the real type is the one in parenthesis but we put any for now as the current API is broken and need fixing in a separate iteration (RemoteQueryReturnedData<TEntry>[] | {rows: RemoteQueryReturnedData<TEntry>[] metadata: RemoteQueryFunctionReturnPagination })
|
||||
any
|
||||
: RemoteQueryReturnedData<TEntry>[]
|
||||
: RemoteQueryReturnedData<TEntry>[]
|
||||
|
||||
@@ -1182,6 +1182,11 @@ export interface OrderDTO {
|
||||
*/
|
||||
item_tax_total: BigNumberValue
|
||||
|
||||
/**
|
||||
* The item discount total of the order.
|
||||
*/
|
||||
item_discount_total: BigNumberValue
|
||||
|
||||
/**
|
||||
* The original total of the order.
|
||||
*/
|
||||
@@ -1257,6 +1262,11 @@ export interface OrderDTO {
|
||||
*/
|
||||
shipping_tax_total: BigNumberValue
|
||||
|
||||
/**
|
||||
* The shipping discount total of the order.
|
||||
*/
|
||||
shipping_discount_total: BigNumberValue
|
||||
|
||||
/**
|
||||
* The original shipping total of the order.
|
||||
*/
|
||||
|
||||
@@ -76,6 +76,7 @@ describe("Total calculation", function () {
|
||||
item_total: 73.5,
|
||||
item_subtotal: 65,
|
||||
item_tax_total: 8.5,
|
||||
item_discount_total: 0,
|
||||
original_total: 73.5,
|
||||
original_tax_total: 8.5,
|
||||
original_item_subtotal: 65,
|
||||
@@ -149,6 +150,7 @@ describe("Total calculation", function () {
|
||||
item_total: 99,
|
||||
item_subtotal: 100,
|
||||
item_tax_total: 9,
|
||||
item_discount_total: 11,
|
||||
original_item_total: 110,
|
||||
original_item_subtotal: 100,
|
||||
original_item_tax_total: 10,
|
||||
@@ -350,12 +352,14 @@ describe("Total calculation", function () {
|
||||
item_total: 95.7,
|
||||
item_subtotal: 99,
|
||||
item_tax_total: 8.7,
|
||||
item_discount_total: 13.2,
|
||||
original_item_total: 108.9,
|
||||
original_item_subtotal: 99,
|
||||
original_item_tax_total: 9.9,
|
||||
shipping_total: 95.7,
|
||||
shipping_subtotal: 99,
|
||||
shipping_tax_total: 8.7,
|
||||
shipping_discount_total: 13.2,
|
||||
original_shipping_tax_total: 9.9,
|
||||
original_shipping_subtotal: 99,
|
||||
original_shipping_total: 108.9,
|
||||
@@ -444,6 +448,7 @@ describe("Total calculation", function () {
|
||||
item_total: 100,
|
||||
item_subtotal: 90.9090909090909,
|
||||
item_tax_total: 9.090909090909092,
|
||||
item_discount_total: 0,
|
||||
original_item_total: 100,
|
||||
original_item_subtotal: 90.9090909090909,
|
||||
original_item_tax_total: 9.090909090909092,
|
||||
@@ -486,6 +491,7 @@ describe("Total calculation", function () {
|
||||
item_total: 110,
|
||||
item_subtotal: 100,
|
||||
item_tax_total: 10,
|
||||
item_discount_total: 0,
|
||||
original_item_total: 110,
|
||||
original_item_subtotal: 100,
|
||||
original_item_tax_total: 10,
|
||||
@@ -548,6 +554,7 @@ describe("Total calculation", function () {
|
||||
item_total: 210,
|
||||
item_subtotal: 190.9090909090909,
|
||||
item_tax_total: 19.09090909090909,
|
||||
item_discount_total: 0,
|
||||
original_item_total: 210,
|
||||
original_item_subtotal: 190.9090909090909,
|
||||
original_item_tax_total: 19.09090909090909,
|
||||
@@ -638,6 +645,7 @@ describe("Total calculation", function () {
|
||||
item_subtotal: 100,
|
||||
item_tax_total: 18.333333333333332,
|
||||
item_total: 110,
|
||||
item_discount_total: 10,
|
||||
|
||||
credit_line_subtotal: 0,
|
||||
credit_line_tax_total: 0,
|
||||
@@ -749,12 +757,14 @@ describe("Total calculation", function () {
|
||||
item_total: 88,
|
||||
item_subtotal: 100,
|
||||
item_tax_total: 8,
|
||||
item_discount_total: 22,
|
||||
original_item_total: 110,
|
||||
original_item_subtotal: 100,
|
||||
original_item_tax_total: 10,
|
||||
shipping_total: 25.3,
|
||||
shipping_subtotal: 25,
|
||||
shipping_tax_total: 2.3,
|
||||
shipping_discount_total: 2.2,
|
||||
original_shipping_tax_total: 2.5,
|
||||
original_shipping_subtotal: 25,
|
||||
original_shipping_total: 27.5,
|
||||
@@ -866,6 +876,7 @@ describe("Total calculation", function () {
|
||||
item_total: 88,
|
||||
item_subtotal: 100,
|
||||
item_tax_total: 8,
|
||||
item_discount_total: 22,
|
||||
original_item_total: 110,
|
||||
original_item_subtotal: 100,
|
||||
original_item_tax_total: 10,
|
||||
@@ -942,6 +953,7 @@ describe("Total calculation", function () {
|
||||
item_total: 0,
|
||||
item_subtotal: 119,
|
||||
item_tax_total: 0,
|
||||
item_discount_total: 141.61,
|
||||
original_item_total: 141.61,
|
||||
original_item_subtotal: 119,
|
||||
original_item_tax_total: 22.61,
|
||||
@@ -1005,6 +1017,7 @@ describe("Total calculation", function () {
|
||||
discount_total: 0,
|
||||
item_subtotal: 100,
|
||||
item_tax_total: 19,
|
||||
item_discount_total: 0,
|
||||
item_total: 119,
|
||||
items: [
|
||||
{
|
||||
@@ -1048,6 +1061,7 @@ describe("Total calculation", function () {
|
||||
item_subtotal: 119,
|
||||
item_tax_total: 22.61,
|
||||
item_total: 141.61,
|
||||
item_discount_total: 0,
|
||||
items: [
|
||||
{
|
||||
discount_subtotal: 0,
|
||||
@@ -1090,6 +1104,7 @@ describe("Total calculation", function () {
|
||||
item_subtotal: 219,
|
||||
item_tax_total: 41.61,
|
||||
item_total: 260.61,
|
||||
item_discount_total: 0,
|
||||
items: [
|
||||
{
|
||||
discount_subtotal: 0,
|
||||
@@ -1176,6 +1191,7 @@ describe("Total calculation", function () {
|
||||
item_subtotal: 100,
|
||||
item_tax_total: 0,
|
||||
item_total: 0,
|
||||
item_discount_total: 119,
|
||||
items: [
|
||||
{
|
||||
adjustments: [
|
||||
|
||||
@@ -4,8 +4,8 @@ import { calculateCreditLinesTotal } from "../credit-lines"
|
||||
import { GetItemTotalInput, getLineItemsTotals } from "../line-item"
|
||||
import { MathBN } from "../math"
|
||||
import {
|
||||
GetShippingMethodTotalInput,
|
||||
getShippingMethodsTotals,
|
||||
GetShippingMethodTotalInput,
|
||||
} from "../shipping-method"
|
||||
import { transformPropertiesToBigNumber } from "../transform-properties-to-bignumber"
|
||||
|
||||
@@ -86,23 +86,19 @@ export function decorateCartTotals(
|
||||
|
||||
let itemsSubtotal = MathBN.convert(0)
|
||||
let itemsTotal = MathBN.convert(0)
|
||||
|
||||
let itemsOriginalTotal = MathBN.convert(0)
|
||||
let itemsOriginalSubtotal = MathBN.convert(0)
|
||||
|
||||
let itemsTaxTotal = MathBN.convert(0)
|
||||
|
||||
let itemsOriginalTaxTotal = MathBN.convert(0)
|
||||
let itemsDiscountTotal = MathBN.convert(0)
|
||||
|
||||
let shippingSubtotal = MathBN.convert(0)
|
||||
let shippingTotal = MathBN.convert(0)
|
||||
|
||||
let shippingOriginalTotal = MathBN.convert(0)
|
||||
let shippingOriginalSubtotal = MathBN.convert(0)
|
||||
|
||||
let shippingTaxTotal = MathBN.convert(0)
|
||||
|
||||
let shippingOriginalTaxTotal = MathBN.convert(0)
|
||||
let shippingDiscountTotal = MathBN.convert(0)
|
||||
|
||||
const cartItems = items.map((item, index) => {
|
||||
const itemTotals = Object.assign(item, itemsTotals[item.id ?? index] ?? {})
|
||||
@@ -128,15 +124,16 @@ export function decorateCartTotals(
|
||||
itemsTotal = MathBN.add(itemsTotal, itemTotal)
|
||||
itemsOriginalTotal = MathBN.add(itemsOriginalTotal, itemOriginalTotal)
|
||||
itemsOriginalSubtotal = MathBN.add(itemsOriginalSubtotal, itemSubtotal)
|
||||
|
||||
itemsSubtotal = MathBN.add(itemsSubtotal, itemSubtotal)
|
||||
|
||||
itemsTaxTotal = MathBN.add(itemsTaxTotal, itemTaxTotal)
|
||||
|
||||
itemsOriginalTaxTotal = MathBN.add(
|
||||
itemsOriginalTaxTotal,
|
||||
itemOriginalTaxTotal
|
||||
)
|
||||
itemsDiscountTotal = MathBN.add(
|
||||
itemsDiscountTotal,
|
||||
itemDiscountTotal
|
||||
)
|
||||
|
||||
for (const key of Object.values(optionalFields)) {
|
||||
if (key in itemTotals) {
|
||||
@@ -156,48 +153,45 @@ export function decorateCartTotals(
|
||||
|
||||
subtotal = MathBN.add(subtotal, shippingMethodTotals.subtotal)
|
||||
|
||||
shippingSubtotal = MathBN.add(
|
||||
shippingSubtotal,
|
||||
shippingMethodTotals.subtotal
|
||||
)
|
||||
|
||||
shippingTotal = MathBN.add(shippingTotal, shippingMethodTotals.total)
|
||||
|
||||
shippingOriginalTotal = MathBN.add(
|
||||
shippingOriginalTotal,
|
||||
shippingMethodTotals.original_total
|
||||
)
|
||||
|
||||
shippingOriginalSubtotal = MathBN.add(
|
||||
shippingOriginalSubtotal,
|
||||
shippingMethodTotals.subtotal
|
||||
)
|
||||
|
||||
shippingTaxTotal = MathBN.add(
|
||||
shippingTaxTotal,
|
||||
shippingMethodTotals.tax_total
|
||||
)
|
||||
|
||||
shippingOriginalTaxTotal = MathBN.add(
|
||||
shippingOriginalTaxTotal,
|
||||
shippingMethodTotals.original_tax_total
|
||||
)
|
||||
|
||||
discountTotal = MathBN.add(
|
||||
discountTotal,
|
||||
shippingMethodTotals.discount_total
|
||||
)
|
||||
|
||||
discountSubtotal = MathBN.add(
|
||||
discountSubtotal,
|
||||
shippingMethodTotals.discount_subtotal
|
||||
)
|
||||
|
||||
discountTaxTotal = MathBN.add(
|
||||
discountTaxTotal,
|
||||
shippingMethodTotals.discount_tax_total
|
||||
)
|
||||
|
||||
shippingSubtotal = MathBN.add(
|
||||
shippingSubtotal,
|
||||
shippingMethodTotals.subtotal
|
||||
)
|
||||
shippingTotal = MathBN.add(shippingTotal, shippingMethodTotals.total)
|
||||
shippingOriginalTotal = MathBN.add(
|
||||
shippingOriginalTotal,
|
||||
shippingMethodTotals.original_total
|
||||
)
|
||||
shippingOriginalSubtotal = MathBN.add(
|
||||
shippingOriginalSubtotal,
|
||||
shippingMethodTotals.subtotal
|
||||
)
|
||||
shippingTaxTotal = MathBN.add(
|
||||
shippingTaxTotal,
|
||||
shippingMethodTotals.tax_total
|
||||
)
|
||||
shippingOriginalTaxTotal = MathBN.add(
|
||||
shippingOriginalTaxTotal,
|
||||
shippingMethodTotals.original_tax_total
|
||||
)
|
||||
shippingDiscountTotal = MathBN.add(
|
||||
shippingDiscountTotal,
|
||||
shippingMethodTotals.discount_total
|
||||
)
|
||||
|
||||
return shippingMethodTotals
|
||||
})
|
||||
|
||||
@@ -250,6 +244,7 @@ export function decorateCartTotals(
|
||||
cart.item_total = new BigNumber(itemsTotal)
|
||||
cart.item_subtotal = new BigNumber(itemsSubtotal)
|
||||
cart.item_tax_total = new BigNumber(itemsTaxTotal)
|
||||
cart.item_discount_total = new BigNumber(itemsDiscountTotal)
|
||||
|
||||
cart.original_item_total = new BigNumber(itemsOriginalTotal)
|
||||
cart.original_item_subtotal = new BigNumber(itemsOriginalSubtotal)
|
||||
@@ -265,6 +260,7 @@ export function decorateCartTotals(
|
||||
cart.shipping_total = new BigNumber(shippingTotal)
|
||||
cart.shipping_subtotal = new BigNumber(shippingSubtotal)
|
||||
cart.shipping_tax_total = new BigNumber(shippingTaxTotal)
|
||||
cart.shipping_discount_total = new BigNumber(shippingDiscountTotal)
|
||||
|
||||
cart.original_shipping_tax_total = new BigNumber(shippingOriginalTaxTotal)
|
||||
cart.original_shipping_subtotal = new BigNumber(shippingOriginalSubtotal)
|
||||
|
||||
@@ -18,12 +18,14 @@ export const defaultStoreCartFields = [
|
||||
"item_total",
|
||||
"item_subtotal",
|
||||
"item_tax_total",
|
||||
"item_discount_total",
|
||||
"original_item_total",
|
||||
"original_item_subtotal",
|
||||
"original_item_tax_total",
|
||||
"shipping_total",
|
||||
"shipping_subtotal",
|
||||
"shipping_tax_total",
|
||||
"shipping_discount_total",
|
||||
"original_shipping_tax_total",
|
||||
"original_shipping_subtotal",
|
||||
"original_shipping_total",
|
||||
|
||||
@@ -3170,12 +3170,14 @@ moduleIntegrationTestRunner<ICartModuleService>({
|
||||
item_total: 200,
|
||||
item_subtotal: 500,
|
||||
item_tax_total: 0,
|
||||
item_discount_total: 300,
|
||||
original_item_total: 500,
|
||||
original_item_subtotal: 500,
|
||||
original_item_tax_total: 0,
|
||||
shipping_total: 10,
|
||||
shipping_subtotal: 10,
|
||||
shipping_tax_total: 0,
|
||||
shipping_discount_total: 0,
|
||||
original_shipping_tax_total: 0,
|
||||
original_shipping_subtotal: 10,
|
||||
original_shipping_total: 10,
|
||||
@@ -3195,6 +3197,14 @@ moduleIntegrationTestRunner<ICartModuleService>({
|
||||
value: "300",
|
||||
precision: 20,
|
||||
},
|
||||
raw_item_discount_total: {
|
||||
value: "300",
|
||||
precision: 20,
|
||||
},
|
||||
raw_shipping_discount_total: {
|
||||
value: "0",
|
||||
precision: 20,
|
||||
},
|
||||
raw_discount_subtotal: {
|
||||
value: "300",
|
||||
precision: 20,
|
||||
|
||||
Reference in New Issue
Block a user