diff --git a/components/analytics/ProfitAnalyticsChart.tsx b/components/analytics/ProfitAnalyticsChart.tsx index 18cec61..30889cc 100644 --- a/components/analytics/ProfitAnalyticsChart.tsx +++ b/components/analytics/ProfitAnalyticsChart.tsx @@ -16,7 +16,7 @@ import { import { useToast } from "@/hooks/use-toast"; import { formatGBP } from "@/utils/format"; import { getProfitOverview, type ProfitOverview } from "@/lib/services/profit-analytics-service"; -import { TableSkeleton } from './SkeletonLoaders'; +import { Skeleton } from "@/components/ui/skeleton"; interface ProfitAnalyticsChartProps { timeRange: string; @@ -63,7 +63,81 @@ export default function ProfitAnalyticsChart({ timeRange, hideNumbers = false }: }, [timeRange, toast]); if (isLoading) { - return ; + return ( + + + + + Profit Analytics + + + Track your actual profits based on sales and cost data + + + +
+ {/* Summary Cards Skeleton */} +
+ {[...Array(4)].map((_, i) => ( + + + + + + + + + + ))} +
+ + {/* Coverage Card Skeleton */} + + + + + + +
+ +
+ +
+ +
+
+
+ + {/* Products List Skeleton */} + + + + + + +
+ {[...Array(3)].map((_, i) => ( +
+
+ +
+ + +
+
+
+ + +
+
+ ))} +
+
+
+
+
+
+ ); } if (error || !data) { @@ -111,6 +185,14 @@ export default function ProfitAnalyticsChart({ timeRange, hideNumbers = false }: } const profitDirection = data.summary.totalProfit >= 0; + + // Fallback for backwards compatibility + const revenueFromTracked = data.summary.revenueFromTrackedProducts || data.summary.totalRevenue || 0; + const totalRevenue = data.summary.totalRevenue || 0; + const totalCost = data.summary.totalCost || 0; + const totalProfit = data.summary.totalProfit || 0; + const productsWithCostData = data.summary.productsWithCostData || 0; + const totalProductsSold = data.summary.totalProductsSold || 0; return (
@@ -118,14 +200,17 @@ export default function ProfitAnalyticsChart({ timeRange, hideNumbers = false }:
- Total Revenue + Revenue (Tracked)
- {maskValue(formatGBP(data.summary.totalRevenue))} + {maskValue(formatGBP(revenueFromTracked))}

- From {data.summary.totalProductsSold} items sold + From {productsWithCostData} tracked items +

+

+ Total revenue: {maskValue(formatGBP(totalRevenue))}

@@ -136,10 +221,10 @@ export default function ProfitAnalyticsChart({ timeRange, hideNumbers = false }:
- {maskValue(formatGBP(data.summary.totalCost))} + {maskValue(formatGBP(totalCost))}

- From {data.summary.productsWithCostData} tracked items + From {productsWithCostData} tracked items

@@ -157,10 +242,10 @@ export default function ProfitAnalyticsChart({ timeRange, hideNumbers = false }: ) : ( )} - {maskValue(formatGBP(data.summary.totalProfit))} + {maskValue(formatGBP(totalProfit))}

- {maskValue(`${data.summary.overallProfitMargin.toFixed(1)}%`)} margin + {maskValue(`${(data.summary.overallProfitMargin || 0).toFixed(1)}%`)} margin

@@ -171,7 +256,7 @@ export default function ProfitAnalyticsChart({ timeRange, hideNumbers = false }:
- {maskValue(formatGBP(data.summary.averageProfitPerUnit))} + {maskValue(formatGBP(data.summary.averageProfitPerUnit || 0))}

Per unit sold @@ -194,18 +279,18 @@ export default function ProfitAnalyticsChart({ timeRange, hideNumbers = false }:

- {hideNumbers ? "**%" : `${data.summary.costDataCoverage.toFixed(1)}%`} + {hideNumbers ? "**%" : `${(data.summary.costDataCoverage || 0).toFixed(1)}%`}
- {hideNumbers ? "** / **" : `${data.summary.productsWithCostData} / ${data.summary.totalProductsSold}`} + {hideNumbers ? "** / **" : `${productsWithCostData} / ${totalProductsSold}`}
diff --git a/components/modals/profit-analysis-modal.tsx b/components/modals/profit-analysis-modal.tsx index 3c8ead0..83e04fd 100644 --- a/components/modals/profit-analysis-modal.tsx +++ b/components/modals/profit-analysis-modal.tsx @@ -205,7 +205,9 @@ export const ProfitAnalysisModal: React.FC = ({
- {profitData.profitMargins.map((tier, index) => { + {profitData.profitMargins + .sort((a, b) => a.minQuantity - b.minQuantity) + .map((tier, index) => { const ProfitIcon = getProfitIcon(tier.profit); const totalProfitForMinQty = tier.profit !== null ? tier.profit * tier.minQuantity : null; diff --git a/lib/services/profit-analytics-service.ts b/lib/services/profit-analytics-service.ts index ae67545..da88c12 100644 --- a/lib/services/profit-analytics-service.ts +++ b/lib/services/profit-analytics-service.ts @@ -4,6 +4,7 @@ export interface ProfitOverview { period: string; summary: { totalRevenue: number; + revenueFromTrackedProducts: number; totalCost: number; totalProfit: number; overallProfitMargin: number; diff --git a/public/git-info.json b/public/git-info.json index b406936..eca2f83 100644 --- a/public/git-info.json +++ b/public/git-info.json @@ -1,4 +1,4 @@ { - "commitHash": "f19ddc4", - "buildTime": "2025-08-07T22:45:52.166Z" + "commitHash": "6a2cd9a", + "buildTime": "2025-08-26T20:09:00.025Z" } \ No newline at end of file