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 { 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 { formatDate } from '@/lib/formatters';
import { AovTrendChart } from '../components/charts/aov-trend-chart';
import { CustomBarChart } from '../components/charts/bar-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';
import { KnobChart } from '../components/charts/knob-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,
},
],
};