diff --git a/apps/portal/src/features/orders/utils/order-display.ts b/apps/portal/src/features/orders/utils/order-display.ts index 906023a9..cd8244f6 100644 --- a/apps/portal/src/features/orders/utils/order-display.ts +++ b/apps/portal/src/features/orders/utils/order-display.ts @@ -200,7 +200,7 @@ export function buildOrderDisplayItems( } // Don't group items - show each one separately - return items.map((item, index) => { + const displayItems = items.map((item, index) => { const charges = aggregateCharges({ indices: [index], items: [item] }); const isBundled = Boolean(item.isBundledAddon); @@ -217,6 +217,20 @@ export function buildOrderDisplayItems( isBundle: isBundled, }; }); + + // Sort: monthly subscriptions first, then one-time items + return displayItems.sort((a, b) => { + // Get the primary charge kind for each item + const aChargeKind = a.charges[0]?.kind ?? "other"; + const bChargeKind = b.charges[0]?.kind ?? "other"; + + // Sort by charge kind (monthly first, then one-time) + const orderDiff = CHARGE_ORDER[aChargeKind] - CHARGE_ORDER[bChargeKind]; + if (orderDiff !== 0) return orderDiff; + + // If same charge kind, maintain original order + return 0; + }); } export function summarizeOrderDisplayItems(