import { StatCard } from '@/components/cards/stat-card'; import { Button } from '@/components/ui/button'; import { Calendar } from '@/components/ui/calendar'; import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { formatDate } from '@/lib/formatters'; import { analysis } from '@/routes'; import type { AnalysisPageProps } from '@/types'; import { Head, router, usePage } from '@inertiajs/react'; import { CalendarIcon, Filter, FilterX } from 'lucide-react'; import { useState } from 'react'; import { AovTrendChart } from '../components/charts/aov-trend-chart'; import { CustomBarChart } from '../components/charts/bar-chart'; import { KnobChart } from '../components/charts/knob-chart'; import { CustomPieChart } from '../components/charts/pie-chart'; import { RevenueVsProfitChart } from '../components/charts/revenue-vs-profit-chart'; import { RevenueVsPurchasesChart } from '../components/charts/revenue-vs-purchases-chart'; import { SalesByHourChart } from '../components/charts/sales-by-hour-chart'; import { TransactionVolumeChart } from '../components/charts/transaction-volume-chart'; export default function Analisa() { const { stats, salesByMonth, revenueVsProfit, transactionVolume, salesByHour, paymentMethods, orderStatuses, orderChannels, topProducts, topCustomers, topCategories, filters, } = usePage().props; const [period, setPeriod] = useState(filters.period || 'all'); const [startDate, setStartDate] = useState(filters.start_date || ''); const [endDate, setEndDate] = useState(filters.end_date || ''); const [isStartOpen, setIsStartOpen] = useState(false); const [isEndOpen, setIsEndOpen] = useState(false); const formatToYmd = (date: Date) => { return ( date.getFullYear() + '-' + String(date.getMonth() + 1).padStart(2, '0') + '-' + String(date.getDate()).padStart(2, '0') ); }; const applyFilters = (newParams: any) => { router.get( analysis().url, { ...filters, ...newParams, }, { preserveState: true, preserveScroll: true, }, ); }; const handlePeriodChange = (value: string) => { setPeriod(value); setStartDate(''); setEndDate(''); applyFilters({ period: value, start_date: '', end_date: '' }); }; const handleCustomFilter = () => { if (startDate && endDate) { setPeriod('custom'); applyFilters({ period: 'custom', start_date: startDate, end_date: endDate, }); } }; const clearFilters = () => { setPeriod('all'); setStartDate(''); setEndDate(''); applyFilters({ period: 'all', start_date: '', end_date: '' }); }; const getFilterDescription = (baseDesc: string) => { if (filters.start_date && filters.end_date) { return `${baseDesc} (Periode: ${filters.start_date} s/d ${filters.end_date})`; } switch (filters.period) { case 'week': return `${baseDesc}`; case 'month': return `${baseDesc}`; case 'year': return `${baseDesc}`; default: return `${baseDesc}`; } }; return ( <>

Analisa

Lihat performa bisnis Anda secara mendalam.

{ setStartDate( date ? formatToYmd(date) : '', ); setIsStartOpen(false); }} captionLayout="dropdown" initialFocus /> s/d { setEndDate( date ? formatToYmd(date) : '', ); setIsEndOpen(false); }} captionLayout="dropdown" initialFocus />
{(period !== 'all' || (startDate && endDate)) && ( )}
{/* Stats Grid */}
{[ { title: 'Total Penjualan', stat: stats.total_sales, isCurrency: false, }, { title: 'Total Pendapatan', stat: stats.total_revenue, }, { title: 'Total Pengeluaran', stat: stats.total_expenses, }, { title: 'HPP (Modal)', stat: stats.cogs }, { title: 'AOV (Avg Order Value)', stat: stats.aov }, { title: 'Profit Margin', stat: stats.profit_margin, isPercentage: true, }, { title: 'Total Diskon', stat: stats.total_discount }, { title: 'Laba Kotor', stat: stats.gross_profit }, { title: 'Laba Bersih', stat: stats.net_profit }, { title: 'Total Gaji', stat: stats.total_payrolls }, { title: 'Total Pembelian', stat: stats.total_purchases, }, { title: 'Produk Terjual', stat: stats.products_sold, isCurrency: false, }, { title: 'Total Pelanggan', stat: stats.total_customers, isCurrency: false, }, ].map((item, index) => (
))}
{/* Main Trends Grid */}
{/* Activity & Volume Grid */}
); } Analisa.layout = { breadcrumbs: [ { title: 'Analisa', href: analysis().url, }, ], };