@burdenoff/microfe-kadaikodi 2026.704.1 → 2026.704.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/kadaikodi/hooks/useKadaikodiApi.js +77 -26
  2. package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
  3. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +341 -461
  4. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  5. package/dist/kadaikodi/pages/admin/AdminDashboard.js +115 -399
  6. package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
  7. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +140 -283
  8. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
  9. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +282 -453
  10. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  11. package/dist/kadaikodi/pages/admin/AdminProfilePage.js +115 -242
  12. package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
  13. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +2 -2
  14. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
  15. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  16. package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
  17. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +503 -627
  18. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  19. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +339 -282
  20. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  21. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +323 -422
  22. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  23. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +374 -383
  24. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  25. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +249 -208
  26. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  27. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +1 -1
  28. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  29. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +1 -1
  30. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
  31. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +171 -627
  32. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  33. package/dist/kadaikodi/pages/common/HelpSupportPage.js +331 -415
  34. package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
  35. package/dist/kadaikodi/pages/common/NotificationCenterPage.js +18 -670
  36. package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
  37. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  38. package/dist/kadaikodi/pages/customer/CheckoutPage.js +4 -2
  39. package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
  40. package/dist/kadaikodi/pages/customer/CustomerDashboard.js +191 -369
  41. package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
  42. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +233 -389
  43. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
  44. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
  45. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
  46. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  47. package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js +76 -118
  48. package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js.map +1 -1
  49. package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
  50. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js +135 -213
  51. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
  52. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +272 -774
  53. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
  54. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +232 -343
  55. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  56. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +112 -600
  57. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  58. package/dist/kadaikodi/pages/investor/InvestorDashboard.js +127 -294
  59. package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
  60. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +204 -290
  61. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  62. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +159 -500
  63. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
  64. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +399 -487
  65. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
  66. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +13 -13
  67. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  68. package/dist/kadaikodi/pages/worker/WorkerDashboard.js +192 -296
  69. package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
  70. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +245 -397
  71. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
  72. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +85 -117
  73. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
  74. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +177 -395
  75. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
  76. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AdminFinancialPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/admin/AdminFinancialPage.tsx"],"sourcesContent":["/**\n * Admin Financial Page\n * @module kadaikodi/pages/admin\n *\n * Full-featured financial reports with date range filter, export button,\n * 4 MetricsGrid cards, top performing carts with medals, revenue by\n * category with progress bars, monthly trends table, 3 additional\n * cards, loading state, and back navigation.\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n IndianRupee,\n TrendingUp,\n TrendingDown,\n Download,\n Calendar,\n BarChart3,\n ShoppingCart,\n ArrowLeft,\n Loader2,\n Award,\n Star,\n ShoppingBag,\n PieChart,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ninterface FinancialMetrics {\n totalRevenue: number;\n monthlyRevenue: number;\n revenueGrowth: number;\n totalOrders: number;\n averageOrderValue: number;\n commission: number;\n payouts: number;\n pendingPayouts: number;\n topPerformingCarts: Array<{ id: string; name: string; revenue: number; orders: number }>;\n revenueByCategory: Array<{ category: string; amount: number; percentage: number }>;\n monthlyTrends: Array<{ month: string; revenue: number; orders: number; commission: number }>;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminFinancialPage() {\n const { navigateTo } = useKadaikodi();\n const [loading, setLoading] = useState(true);\n const [dateRange, setDateRange] = useState('30d');\n const [metrics, setMetrics] = useState<FinancialMetrics | null>(null);\n\n useEffect(() => {\n setLoading(true);\n const timer = setTimeout(() => {\n setMetrics({\n totalRevenue: 2850000,\n monthlyRevenue: 425000,\n revenueGrowth: 12.5,\n totalOrders: 15420,\n averageOrderValue: 185,\n commission: 142500,\n payouts: 280000,\n pendingPayouts: 45000,\n topPerformingCarts: [\n { id: '1', name: 'South Indian Express', revenue: 125000, orders: 850 },\n { id: '2', name: 'Pizza Corner', revenue: 98000, orders: 620 },\n { id: '3', name: 'Biryani House', revenue: 87000, orders: 580 },\n { id: '4', name: 'Healthy Bites', revenue: 76000, orders: 490 },\n { id: '5', name: 'Street Food Junction', revenue: 65000, orders: 420 },\n ],\n revenueByCategory: [\n { category: 'South Indian', amount: 750000, percentage: 26.3 },\n { category: 'North Indian', amount: 620000, percentage: 21.8 },\n { category: 'Chinese', amount: 485000, percentage: 17.0 },\n { category: 'Fast Food', amount: 425000, percentage: 14.9 },\n { category: 'Beverages', amount: 320000, percentage: 11.2 },\n { category: 'Desserts', amount: 250000, percentage: 8.8 },\n ],\n monthlyTrends: [\n { month: 'Jan', revenue: 380000, orders: 1200, commission: 19000 },\n { month: 'Feb', revenue: 420000, orders: 1350, commission: 21000 },\n { month: 'Mar', revenue: 395000, orders: 1280, commission: 19750 },\n { month: 'Apr', revenue: 440000, orders: 1420, commission: 22000 },\n { month: 'May', revenue: 465000, orders: 1580, commission: 23250 },\n { month: 'Jun', revenue: 425000, orders: 1400, commission: 21250 },\n ],\n });\n setLoading(false);\n }, 1000);\n return () => clearTimeout(timer);\n }, [dateRange]);\n\n const fmtCur = (amount: number) => formatCurrency(amount, { minimumFractionDigits: 0 });\n\n const handleExportReport = () => {\n alert('Financial report export initiated');\n };\n\n const medalIcon = (index: number) => {\n if (index === 0) return <Award className=\"h-5 w-5 text-status-warning-text\" />;\n if (index === 1) return <Award className=\"h-5 w-5 text-text-secondary\" />;\n if (index === 2) return <Award className=\"h-5 w-5 text-status-warning-text\" />;\n return (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-bg-sunken text-xs font-bold text-text-secondary\">\n {index + 1}\n </span>\n );\n };\n\n if (loading) {\n return (\n <PageLayout title=\"Financial Reports\" description=\"Loading financial data...\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-secondary mb-4\" />\n <p className=\"text-text-secondary\">Loading financial data...</p>\n </div>\n </PageLayout>\n );\n }\n\n if (!metrics) {\n return (\n <PageLayout title=\"Financial Reports\" description=\"Unable to load financial data\">\n <EmptyState\n illustration=\"empty-data\"\n title=\"No financial data available\"\n description=\"We couldn't load the financial figures for this period. Try a different date range or check back shortly.\"\n action={\n <button\n type=\"button\"\n onClick={() => setDateRange('30d')}\n className=\"rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Reset to last 30 days\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Financial Reports\"\n description=\"Revenue, commissions, payouts, and financial trends\"\n actions={\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin')}\n className=\"flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> Back\n </button>\n <select\n value={dateRange}\n onChange={(e) => setDateRange(e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"7d\">Last 7 days</option>\n <option value=\"30d\">Last 30 days</option>\n <option value=\"90d\">Last 3 months</option>\n <option value=\"1y\">Last year</option>\n </select>\n <button\n type=\"button\"\n onClick={handleExportReport}\n className=\"flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <Download className=\"h-4 w-4\" /> Export Report\n </button>\n </div>\n }\n >\n <PagePurpose className=\"mb-6\">\n The money view of Kadaikodi. Use this page to track total and monthly revenue, see the\n platform commission you&apos;ve earned, and stay on top of payouts owed to cart owners and\n workers — then export a report for accounting or investor updates. Adjust the date range to\n compare periods and watch the trend.\n </PagePurpose>\n\n {/* 4 Key Metrics — the one emphasis zone for this page */}\n <EmphasisPanel className=\"mb-8\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">Financial Summary</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4\">\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={fmtCur(metrics.totalRevenue)}\n label=\"Total Revenue\"\n trend=\"up\"\n trendValue={`+${metrics.revenueGrowth}% vs last period`}\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={fmtCur(metrics.monthlyRevenue)}\n label=\"Monthly Revenue\"\n trendValue=\"Current month\"\n />\n <MetricsCard\n icon={<PieChart className=\"h-5 w-5\" />}\n value={fmtCur(metrics.commission)}\n label=\"Commission Earned\"\n trendValue=\"Platform commission\"\n />\n <MetricsCard\n icon={<TrendingDown className=\"h-5 w-5\" />}\n value={fmtCur(metrics.pendingPayouts)}\n label=\"Pending Payouts\"\n trendValue=\"Amount pending\"\n />\n </div>\n </EmphasisPanel>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8\">\n {/* Top Performing Carts */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-4\">\n <ShoppingCart className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">Top Performing Carts</h3>\n </div>\n <div className=\"space-y-3\">\n {metrics.topPerformingCarts.map((cart, index) => (\n <div\n key={cart.id}\n className=\"flex items-center justify-between rounded-lg bg-bg-sunken/50 p-3\"\n >\n <div className=\"flex items-center gap-3\">\n {medalIcon(index)}\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{cart.name}</p>\n <p className=\"text-xs text-text-secondary\">{cart.orders} orders</p>\n </div>\n </div>\n <p className=\"text-sm font-semibold text-text-primary\">{fmtCur(cart.revenue)}</p>\n </div>\n ))}\n </div>\n </div>\n\n {/* Revenue by Category */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-4\">\n <BarChart3 className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">Revenue by Category</h3>\n </div>\n <div className=\"space-y-3\">\n {metrics.revenueByCategory.map((category) => (\n <div key={category.category}>\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-sm font-medium text-text-primary\">{category.category}</span>\n <span className=\"text-sm text-text-secondary\">{category.percentage}%</span>\n </div>\n <div className=\"w-full bg-bg-sunken rounded-full h-2\">\n <div\n className=\"bg-action-primary-bg h-2 rounded-full transition-all duration-300\"\n style={{ width: `${category.percentage}%` }}\n />\n </div>\n <div className=\"text-right mt-1\">\n <span className=\"text-sm font-semibold text-text-primary\">\n {fmtCur(category.amount)}\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Monthly Trends Table */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6 mb-8\">\n <div className=\"flex items-center gap-2 mb-4\">\n <Calendar className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">Monthly Trends</h3>\n </div>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Month\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Revenue\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Orders\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Commission\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {metrics.monthlyTrends.map((trend) => (\n <tr key={trend.month} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"px-4 py-3 text-sm font-medium text-text-primary\">{trend.month}</td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n {fmtCur(trend.revenue)}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n {trend.orders.toLocaleString('en-IN')}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n {fmtCur(trend.commission)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n\n {/* 3 Additional Cards */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6 text-center\">\n <ShoppingBag className=\"h-8 w-8 text-primary mx-auto mb-3\" />\n <h4 className=\"text-lg font-semibold text-text-primary mb-2\">Total Orders</h4>\n <p className=\"text-2xl font-bold text-primary\">\n {metrics.totalOrders.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">All time orders</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6 text-center\">\n <BarChart3 className=\"h-8 w-8 text-status-success-text mx-auto mb-3\" />\n <h4 className=\"text-lg font-semibold text-text-primary mb-2\">Average Order Value</h4>\n <p className=\"text-2xl font-bold text-status-success-text\">\n {fmtCur(metrics.averageOrderValue)}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Per order average</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6 text-center\">\n <IndianRupee className=\"h-8 w-8 text-text-primary mx-auto mb-3\" />\n <h4 className=\"text-lg font-semibold text-text-primary mb-2\">Total Payouts</h4>\n <p className=\"text-2xl font-bold text-text-primary\">{fmtCur(metrics.payouts)}</p>\n <p className=\"text-sm text-text-secondary mt-1\">Paid to cart owners</p>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AdminFinancialPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/admin/AdminFinancialPage.tsx"],"sourcesContent":["/**\n * Admin Financial Page\n * @module kadaikodi/pages/admin\n *\n * Financial reporting wired to the live backend (useDashboardStats +\n * useAdminAnalytics). Revenue, top carts, category breakdown and order\n * trends are all real; the export produces a CSV of the real figures.\n * Metrics with no honest backend source (commission, payouts) are omitted\n * rather than fabricated.\n */\n\nimport { useMemo } from 'react';\nimport {\n IndianRupee,\n TrendingUp,\n Download,\n Calendar,\n BarChart3,\n ShoppingCart,\n ArrowLeft,\n Loader2,\n Award,\n Store,\n ShoppingBag,\n Clock,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useDashboardStats, useAdminAnalytics } from '../../hooks/useKadaikodiApi';\nimport { formatCurrency } from '../../utils/formatters';\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminFinancialPage() {\n const { navigateTo } = useKadaikodi();\n const { data: stats, isLoading: statsLoading } = useDashboardStats();\n const { data: analytics, isLoading: analyticsLoading } = useAdminAnalytics();\n\n const loading = statsLoading || analyticsLoading;\n\n const fmtCur = (amount: number) => formatCurrency(amount, { minimumFractionDigits: 0 });\n\n const averageOrderValue = useMemo(() => {\n if (stats && stats.totalOrders > 0) return stats.totalRevenue / stats.totalOrders;\n return 0;\n }, [stats]);\n\n // Category rows with a real, derived share-of-revenue percentage.\n const categoryRows = useMemo(() => {\n const rows = analytics?.revenueByCategory ?? [];\n const total = rows.reduce((sum, r) => sum + r.revenue, 0);\n return rows.map((r) => ({\n ...r,\n percentage: total > 0 ? (r.revenue / total) * 100 : 0,\n }));\n }, [analytics]);\n\n const topCarts = analytics?.topProviders ?? [];\n const orderTrends = analytics?.orderTrends ?? [];\n\n const handleExportReport = () => {\n const lines: string[] = [];\n lines.push('Kadaikodi Financial Report');\n lines.push('');\n lines.push('Metric,Value');\n lines.push(`Total Revenue,${stats?.totalRevenue ?? 0}`);\n lines.push(`Total Orders,${stats?.totalOrders ?? 0}`);\n lines.push(`Average Order Value,${Math.round(averageOrderValue)}`);\n lines.push(`Pending Orders,${stats?.pendingOrders ?? 0}`);\n lines.push('');\n lines.push('Revenue by Category');\n lines.push('Category,Revenue,Orders,Share %');\n categoryRows.forEach((r) => {\n lines.push(`${r.category},${r.revenue},${r.orders},${r.percentage.toFixed(1)}`);\n });\n lines.push('');\n lines.push('Top Performing Carts');\n lines.push('Cart,Revenue,Orders,Rating');\n topCarts.forEach((c) => {\n lines.push(`${c.name},${c.revenue},${c.orders},${c.rating}`);\n });\n\n const blob = new Blob([lines.join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `kadaikodi-financial-report-${new Date().toISOString().slice(0, 10)}.csv`;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n const medalIcon = (index: number) => {\n if (index < 3) return <Award className=\"h-5 w-5 text-status-warning-text\" />;\n return (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-bg-sunken text-xs font-bold text-text-secondary\">\n {index + 1}\n </span>\n );\n };\n\n if (loading) {\n return (\n <PageLayout title=\"Financial Reports\" description=\"Loading financial data...\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-secondary mb-4\" />\n <p className=\"text-text-secondary\">Loading financial data...</p>\n </div>\n </PageLayout>\n );\n }\n\n if (!stats) {\n return (\n <PageLayout title=\"Financial Reports\" description=\"Unable to load financial data\">\n <EmptyState\n illustration=\"empty-data\"\n title=\"No financial data available\"\n description=\"We couldn't load the financial figures right now. Please check back shortly.\"\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Financial Reports\"\n description=\"Revenue, top carts and financial trends\"\n actions={\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/admin')}\n className=\"flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> Back\n </button>\n <button\n type=\"button\"\n onClick={handleExportReport}\n className=\"flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <Download className=\"h-4 w-4\" /> Export Report\n </button>\n </div>\n }\n >\n <PagePurpose className=\"mb-6\">\n The money view of Kadaikodi. Track total revenue and order volume, see which carts and\n categories drive the most business, and watch how orders trend over time — then export a\n CSV for accounting or investor updates.\n </PagePurpose>\n\n {/* Key Metrics — the one emphasis zone for this page */}\n <EmphasisPanel className=\"mb-8\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">Financial Summary</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4\">\n <MetricsCard\n featured\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={fmtCur(stats.totalRevenue)}\n label=\"Total Revenue\"\n />\n <MetricsCard\n icon={<ShoppingBag className=\"h-5 w-5\" />}\n value={stats.totalOrders.toLocaleString('en-IN')}\n label=\"Total Orders\"\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={fmtCur(averageOrderValue)}\n label=\"Avg Order Value\"\n />\n <MetricsCard\n icon={<Clock className=\"h-5 w-5\" />}\n value={stats.pendingOrders.toLocaleString('en-IN')}\n label=\"Pending Orders\"\n />\n </div>\n </EmphasisPanel>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8\">\n {/* Top Performing Carts */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-4\">\n <ShoppingCart className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">Top Performing Carts</h3>\n </div>\n {topCarts.length > 0 ? (\n <div className=\"space-y-3\">\n {topCarts.map((cart, index) => (\n <div\n key={cart.id}\n className=\"flex items-center justify-between rounded-lg bg-bg-sunken/50 p-3\"\n >\n <div className=\"flex items-center gap-3\">\n {medalIcon(index)}\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{cart.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {cart.orders.toLocaleString('en-IN')} orders\n </p>\n </div>\n </div>\n <p className=\"text-sm font-semibold text-text-primary\">{fmtCur(cart.revenue)}</p>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Top-performing carts will be ranked here once orders start flowing.\n </p>\n )}\n </div>\n\n {/* Revenue by Category */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-center gap-2 mb-4\">\n <BarChart3 className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">Revenue by Category</h3>\n </div>\n {categoryRows.length > 0 ? (\n <div className=\"space-y-3\">\n {categoryRows.map((category) => (\n <div key={category.category}>\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-sm font-medium text-text-primary capitalize\">\n {category.category}\n </span>\n <span className=\"text-sm text-text-secondary\">\n {category.percentage.toFixed(1)}%\n </span>\n </div>\n <div className=\"w-full bg-bg-sunken rounded-full h-2\">\n <div\n className=\"bg-action-primary-bg h-2 rounded-full transition-all duration-300\"\n style={{ width: `${category.percentage}%` }}\n />\n </div>\n <div className=\"text-right mt-1\">\n <span className=\"text-sm font-semibold text-text-primary\">\n {fmtCur(category.revenue)}\n </span>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n Category revenue will appear here once orders are recorded.\n </p>\n )}\n </div>\n </div>\n\n {/* Order Trends Table */}\n {orderTrends.length > 0 && (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6 mb-8\">\n <div className=\"flex items-center gap-2 mb-4\">\n <Calendar className=\"h-5 w-5 text-text-secondary\" />\n <h3 className=\"text-lg font-semibold text-text-primary\">Order Trends</h3>\n </div>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Date\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Orders\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Revenue\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {orderTrends.map((trend) => (\n <tr key={trend.date} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"px-4 py-3 text-sm font-medium text-text-primary\">\n {trend.date}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n {trend.orders.toLocaleString('en-IN')}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n {fmtCur(trend.revenue)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n\n {/* 3 Additional Cards — all real */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6 text-center\">\n <ShoppingBag className=\"h-8 w-8 text-primary mx-auto mb-3\" />\n <h4 className=\"text-lg font-semibold text-text-primary mb-2\">Total Orders</h4>\n <p className=\"text-2xl font-bold text-primary\">\n {stats.totalOrders.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">All-time orders</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6 text-center\">\n <BarChart3 className=\"h-8 w-8 text-status-success-text mx-auto mb-3\" />\n <h4 className=\"text-lg font-semibold text-text-primary mb-2\">Average Order Value</h4>\n <p className=\"text-2xl font-bold text-status-success-text\">{fmtCur(averageOrderValue)}</p>\n <p className=\"text-sm text-text-secondary mt-1\">Per order average</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6 text-center\">\n <Store className=\"h-8 w-8 text-text-primary mx-auto mb-3\" />\n <h4 className=\"text-lg font-semibold text-text-primary mb-2\">Active Carts</h4>\n <p className=\"text-2xl font-bold text-text-primary\">\n {stats.activeProviders.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Currently live on the platform</p>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;AAsCA,SAAgB,IAAqB;CACnC,IAAM,EAAE,kBAAe,GAAc,EAC/B,EAAE,MAAM,GAAO,WAAW,MAAiB,GAAmB,EAC9D,EAAE,MAAM,GAAW,WAAW,MAAqB,GAAmB,EAEtE,IAAU,KAAgB,GAE1B,KAAU,MAAmB,EAAe,GAAQ,EAAE,uBAAuB,GAAG,CAAC,EAEjF,IAAoB,QACpB,KAAS,EAAM,cAAc,IAAU,EAAM,eAAe,EAAM,cAC/D,GACN,CAAC,EAAM,CAAC,EAGL,IAAe,QAAc;EACjC,IAAM,IAAO,GAAW,qBAAqB,EAAE,EACzC,IAAQ,EAAK,QAAQ,GAAK,MAAM,IAAM,EAAE,SAAS,EAAE;AACzD,SAAO,EAAK,KAAK,OAAO;GACtB,GAAG;GACH,YAAY,IAAQ,IAAK,EAAE,UAAU,IAAS,MAAM;GACrD,EAAE;IACF,CAAC,EAAU,CAAC,EAET,IAAW,GAAW,gBAAgB,EAAE,EACxC,IAAc,GAAW,eAAe,EAAE,EAE1C,UAA2B;EAC/B,IAAM,IAAkB,EAAE;AAiB1B,EAhBA,EAAM,KAAK,6BAA6B,EACxC,EAAM,KAAK,GAAG,EACd,EAAM,KAAK,eAAe,EAC1B,EAAM,KAAK,iBAAiB,GAAO,gBAAgB,IAAI,EACvD,EAAM,KAAK,gBAAgB,GAAO,eAAe,IAAI,EACrD,EAAM,KAAK,uBAAuB,KAAK,MAAM,EAAkB,GAAG,EAClE,EAAM,KAAK,kBAAkB,GAAO,iBAAiB,IAAI,EACzD,EAAM,KAAK,GAAG,EACd,EAAM,KAAK,sBAAsB,EACjC,EAAM,KAAK,kCAAkC,EAC7C,EAAa,SAAS,MAAM;AAC1B,KAAM,KAAK,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,GAAG,EAAE,OAAO,GAAG,EAAE,WAAW,QAAQ,EAAE,GAAG;IAC/E,EACF,EAAM,KAAK,GAAG,EACd,EAAM,KAAK,uBAAuB,EAClC,EAAM,KAAK,6BAA6B,EACxC,EAAS,SAAS,MAAM;AACtB,KAAM,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,QAAQ,GAAG,EAAE,OAAO,GAAG,EAAE,SAAS;IAC5D;EAEF,IAAM,IAAO,IAAI,KAAK,CAAC,EAAM,KAAK,KAAK,CAAC,EAAE,EAAE,MAAM,2BAA2B,CAAC,EACxE,IAAM,IAAI,gBAAgB,EAAK,EAC/B,IAAI,SAAS,cAAc,IAAI;AAIrC,EAHA,EAAE,OAAO,GACT,EAAE,WAAW,+CAA8B,IAAI,MAAM,EAAC,aAAa,CAAC,MAAM,GAAG,GAAG,CAAC,OACjF,EAAE,OAAO,EACT,IAAI,gBAAgB,EAAI;IAGpB,KAAa,MACb,IAAQ,IAAU,kBAAC,GAAD,EAAO,WAAU,oCAAqC,CAAA,GAE1E,kBAAC,QAAD;EAAM,WAAU;YACb,IAAQ;EACJ,CAAA;AA2BX,QAvBI,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAoB,aAAY;YAChD,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAS,WAAU,mDAAoD,CAAA,EACvE,kBAAC,KAAD;IAAG,WAAU;cAAsB;IAA6B,CAAA,CAC5D;;EACK,CAAA,GAIZ,IAaH,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAW,SAAS;IACnC,WAAU;cAHZ,CAKE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,QAC1B;OACT,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,WAAU;cAHZ,CAKE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,iBACzB;MACL;;YAnBV;GAsBE,kBAAC,GAAD;IAAa,WAAU;cAAO;IAIhB,CAAA;GAGd,kBAAC,GAAD;IAAe,WAAU;cAAzB,CACE,kBAAC,MAAD;KAAI,WAAU;eAA+C;KAAsB,CAAA,EACnF,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OACE,UAAA;OACA,MAAM,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;OACzC,OAAO,EAAO,EAAM,aAAa;OACjC,OAAM;OACN,CAAA;MACF,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;OACzC,OAAO,EAAM,YAAY,eAAe,QAAQ;OAChD,OAAM;OACN,CAAA;MACF,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;OACxC,OAAO,EAAO,EAAkB;OAChC,OAAM;OACN,CAAA;MACF,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;OACnC,OAAO,EAAM,cAAc,eAAe,QAAQ;OAClD,OAAM;OACN,CAAA;MACE;OACQ;;GAEhB,kBAAC,OAAD;IAAK,WAAU;cAAf,CAEE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAc,WAAU,+BAAgC,CAAA,EACxD,kBAAC,MAAD;OAAI,WAAU;iBAA0C;OAAyB,CAAA,CAC7E;SACL,EAAS,SAAS,IACjB,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAS,KAAK,GAAM,MACnB,kBAAC,OAAD;OAEE,WAAU;iBAFZ,CAIE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACG,EAAU,EAAM,EACjB,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;mBAAyC,EAAK;SAAS,CAAA,EACpE,kBAAC,KAAD;SAAG,WAAU;mBAAb,CACG,EAAK,OAAO,eAAe,QAAQ,EAAC,UACnC;WACA,EAAA,CAAA,CACF;WACN,kBAAC,KAAD;QAAG,WAAU;kBAA2C,EAAO,EAAK,QAAQ;QAAK,CAAA,CAC7E;SAbC,EAAK,GAaN,CACN;MACE,CAAA,GAEN,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAEvC,CAAA,CAEF;QAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAW,WAAU,+BAAgC,CAAA,EACrD,kBAAC,MAAD;OAAI,WAAU;iBAA0C;OAAwB,CAAA,CAC5E;SACL,EAAa,SAAS,IACrB,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAa,KAAK,MACjB,kBAAC,OAAD,EAAA,UAAA;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBACb,EAAS;SACL,CAAA,EACP,kBAAC,QAAD;SAAM,WAAU;mBAAhB,CACG,EAAS,WAAW,QAAQ,EAAE,EAAC,IAC3B;WACH;;OACN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,OAAD;SACE,WAAU;SACV,OAAO,EAAE,OAAO,GAAG,EAAS,WAAW,IAAI;SAC3C,CAAA;QACE,CAAA;OACN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,QAAD;SAAM,WAAU;mBACb,EAAO,EAAS,QAAQ;SACpB,CAAA;QACH,CAAA;OACF,EAAA,EApBI,EAAS,SAoBb,CACN;MACE,CAAA,GAEN,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAEvC,CAAA,CAEF;OACF;;GAGL,EAAY,SAAS,KACpB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAU,WAAU,+BAAgC,CAAA,EACpD,kBAAC,MAAD;MAAI,WAAU;gBAA0C;MAAiB,CAAA,CACrE;QACN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,SAAD;MAAO,WAAU;gBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;OAAI,WAAU;iBAAd;QACE,kBAAC,MAAD;SAAI,WAAU;mBAAuF;SAEhG,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBAAwF;SAEjG,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBAAwF;SAEjG,CAAA;QACF;UACC,CAAA,EACR,kBAAC,SAAD;OAAO,WAAU;iBACd,EAAY,KAAK,MAChB,kBAAC,MAAD;QAAqB,WAAU;kBAA/B;SACE,kBAAC,MAAD;UAAI,WAAU;oBACX,EAAM;UACJ,CAAA;SACL,kBAAC,MAAD;UAAI,WAAU;oBACX,EAAM,OAAO,eAAe,QAAQ;UAClC,CAAA;SACL,kBAAC,MAAD;UAAI,WAAU;oBACX,EAAO,EAAM,QAAQ;UACnB,CAAA;SACF;UAVI,EAAM,KAUV,CACL;OACI,CAAA,CACF;;KACJ,CAAA,CACF;;GAIR,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAa,WAAU,qCAAsC,CAAA;OAC7D,kBAAC,MAAD;QAAI,WAAU;kBAA+C;QAAiB,CAAA;OAC9E,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAM,YAAY,eAAe,QAAQ;QACxC,CAAA;OACJ,kBAAC,KAAD;QAAG,WAAU;kBAAmC;QAAmB,CAAA;OAC/D;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAW,WAAU,iDAAkD,CAAA;OACvE,kBAAC,MAAD;QAAI,WAAU;kBAA+C;QAAwB,CAAA;OACrF,kBAAC,KAAD;QAAG,WAAU;kBAA+C,EAAO,EAAkB;QAAK,CAAA;OAC1F,kBAAC,KAAD;QAAG,WAAU;kBAAmC;QAAqB,CAAA;OACjE;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAO,WAAU,0CAA2C,CAAA;OAC5D,kBAAC,MAAD;QAAI,WAAU;kBAA+C;QAAiB,CAAA;OAC9E,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAM,gBAAgB,eAAe,QAAQ;QAC5C,CAAA;OACJ,kBAAC,KAAD;QAAG,WAAU;kBAAmC;QAAkC,CAAA;OAC9E;;KACF;;GACK;MAhNX,kBAAC,GAAD;EAAY,OAAM;EAAoB,aAAY;YAChD,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,CAAA;EACS,CAAA"}