'use client' import React, { useState } from 'react' import { useProfitLossAnalytics } from '../../../../../../services/queries/analytics' import { formatDateDDMMYYYY, formatForInputDate, formatShortCurrency } from '../../../../../../utils/transform' import MultipleSeries from '../../../../../../views/dashboards/profit-loss/EarningReportWithTabs' import { DailyData, ProfitLossReport } from '../../../../../../types/services/analytic' import { TextField, Typography, useTheme } from '@mui/material' import Loading from '../../../../../../components/layout/shared/Loading' const DashboardProfitloss = () => { const theme = useTheme() const today = new Date() const monthAgo = new Date() monthAgo.setDate(today.getDate() - 30) const [filter, setFilter] = useState({ date_from: formatDateDDMMYYYY(monthAgo), date_to: formatDateDDMMYYYY(today) }) // Sample data - replace with your actual data const { data: profitData, isLoading } = useProfitLossAnalytics({ date_from: filter.date_from, date_to: filter.date_to }) const formatCurrency = (amount: any) => { return new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 0 }).format(amount) } const formatPercentage = (value: any) => { return `${value.toFixed(2)}%` } const formatDate = (dateString: any) => { return new Date(dateString).toLocaleDateString('id-ID', { day: 'numeric', month: 'short', year: 'numeric' }) } const getProfitabilityColor = (margin: any) => { if (margin > 50) return 'text-green-600 bg-green-100' if (margin > 0) return 'text-yellow-600 bg-yellow-100' return 'text-red-600 bg-red-100' } function formatMetricName(metric: string): string { const nameMap: { [key: string]: string } = { revenue: 'Revenue', net_profit: 'Net Profit' } return nameMap[metric] || metric.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase()) } const metrics = ['revenue', 'net_profit'] const transformMultipleData = (data: ProfitLossReport) => { return [ { type: 'profits', avatarIcon: 'tabler-currency-dollar', date: data.data.map((d: DailyData) => formatDate(d.date)), series: metrics.map(metric => ({ name: formatMetricName(metric as string), data: data.data.map((item: any) => item[metric] as number) })) } ] } const MetricCard = ({ iconClass, title, value, subtitle, bgColor = 'bg-blue-500', isNegative = false, isCurrency = false }: any) => (
{isCurrency ? 'Rp ' + value : value}
{subtitle &&{subtitle}
}Rp {formatShortCurrency(profitData.summary.net_profit)}
Margin: {formatPercentage(profitData.summary.net_profit_margin)}
{profitData.summary.total_orders}
Rp {formatShortCurrency(profitData.summary.total_tax + profitData.summary.total_discount)}
Tax: {formatShortCurrency(profitData.summary.total_tax)} | Discount:{' '} {formatShortCurrency(profitData.summary.total_discount)}
| Date | Revenue | Cost | Profit | Margin | Orders |
|---|---|---|---|---|---|
| {formatDate(day.date)} | {formatCurrency(day.revenue)} | {formatCurrency(day.cost)} | = 0 ? 'text-green-600' : 'text-red-600' }`} > {formatCurrency(day.gross_profit)} | {formatPercentage(day.gross_profit_margin)} | {day.orders} |
{product.category_name}
= 0 ? 'text-green-600' : 'text-red-600'}`}> {formatCurrency(product.gross_profit)}
{formatPercentage(product.gross_profit_margin)}
| Product | Category | Qty | Revenue | Cost | Profit | Margin | Per Unit |
|---|---|---|---|---|---|---|---|
|
{product.product_name}
|
{product.category_name} | {product.quantity_sold} | {formatCurrency(product.revenue)} | {formatCurrency(product.cost)} | = 0 ? 'text-green-600' : 'text-red-600' }`} > {formatCurrency(product.gross_profit)} | {formatPercentage(product.gross_profit_margin)} | = 0 ? 'text-green-600' : 'text-red-600' }`} > {formatCurrency(product.profit_per_unit)} |