သd-600 hover:bg-red-100 rounded-lg"> )} {(c.age || c.gender) && (
{[c.age && `${t('age')} ${c.age}`, c.gender && t(c.gender.toLowerCase())].filter(Boolean).join(' | ')}
)}
{[c.phone1, c.phone2, c.phone3].filter(Boolean).join(' , ')}
{c.diagnosis &&
{t('diagnosis')}: {c.diagnosis}
}
Total Records: {c.records.length} | {t('balance')}: 0 ? 'text-red-600' : 'text-green-600'}`}>{c.balance}
{c.balance > 0 && ( )} {expandedCus === c.id ? : }
{/* Expanded Records */} {expandedCus === c.id && (
{c.records.map(r => (
{r.date}
{r.cart.map(item => `${item.name}(${item.qty})`).join(', ')}
Sale: {r.grandTotal} | Pay: {r.payAmount}
{r.isPaid ? t('paid') : `${t('unpaid')} (${r.remainingBalance})`}
))}
)} ))} {payCus && setPayCus(null)} theme={theme} t={t} lang={lang} />} {delCusId && setDelCusId(null)} theme={theme} t={t} lang={lang} />} ); } // 5. EXPENSE SECTION (Unchanged) function ExpenseSection({ user, t, theme, expenses, lang }) { const [form, setForm] = useState({ name: '', amount: '', deduct_profit: true }); const [editId, setEditId] = useState(null); const [delId, setDelId] = useState(null); const handleSubmit = async (e) => { e.preventDefault(); const payload = { ...form, amount: Number(form.amount), createdAt: new Date().toISOString() }; if (editId) { await updateDoc(doc(db, getDbPath(user.uid, 'expenses'), editId), payload); setEditId(null); } else { await addDoc(collection(db, getDbPath(user.uid, 'expenses')), payload); } setForm({ name: '', amount: '', deduct_profit: true }); }; const executeDelete = async () => { if(!delId) return; await deleteDoc(doc(db, getDbPath(user.uid, 'expenses'), delId)); setDelId(null); }; return (

{t('expense')}

setForm({...form, name: e.target.value})} /> setForm({...form, amount: e.target.value})} />
{editId && }
{expenses.map(e => (

{e.name}

{e.amount}

{e.deduct_profit ? 'Deducted from profit' : 'Not deducted'}

))}
{delId && setDelId(null)} theme={theme} t={t} lang={lang} />}
); } // 6. REPORT SECTION (Unchanged) function ReportSection({ t, theme, purchases, sales, expenses }) { const [tf, setTf] = useState('daily'); const stats = useMemo(() => { const now = new Date(); const today = now.toISOString().split('T')[0]; const thisYearMonth = today.slice(0, 7); const thisYear = today.slice(0, 4); const getWeek = (dateStr) => { const d = new Date(dateStr); d.setHours(0, 0, 0, 0); d.setDate(d.getDate() + 3 - (d.getDay() + 6) % 7); const week1 = new Date(d.getFullYear(), 0, 4); return 1 + Math.round(((d.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7); }; const currentWeek = getWeek(now); const isMatch = (dateStr) => { if(tf === 'all') return true; if(tf === 'daily') return dateStr === today; if(tf === 'monthly') return dateStr.startsWith(thisYearMonth); if(tf === 'yearly') return dateStr.startsWith(thisYear); if(tf === 'weekly') return getWeek(dateStr) === currentWeek && dateStr.startsWith(thisYear); return true; }; let totalSale = 0; let totalCostOfSold = 0; let totalServiceFee = 0; let prodQtyMap = {}; sales.forEach(s => { if(isMatch(s.date)) { totalSale += s.totalSale; totalServiceFee += s.serviceFee; s.cart.forEach(item => { totalCostOfSold += (item.cost * item.qty); if(!prodQtyMap[item.name]) prodQtyMap[item.name] = 0; prodQtyMap[item.name] += item.qty; }); } }); let totalExpenseDeducted = 0; expenses.forEach(e => { const eDate = new Date(e.createdAt).toISOString().split('T')[0]; if(isMatch(eDate) && e.deduct_profit) { totalExpenseDeducted += e.amount; } }); const netProfit = (totalSale - totalCostOfSold) + totalServiceFee - totalExpenseDeducted; const invAsset = purchases.reduce((sum, p) => sum + (p.qty * p.cost), 0); const topProducts = Object.entries(prodQtyMap).sort((a,b) => b[1] - a[1]).slice(0, 10); return { totalSale, netProfit, invAsset, topProducts }; }, [sales, expenses, purchases, tf]); const grandStats = useMemo(() => { let tSale = 0; let tCost = 0; let tSF = 0; sales.forEach(s => { tSale += s.totalSale; tSF += s.serviceFee; s.cart.forEach(item => tCost += (item.cost * item.qty)); }); let tExp = expenses.filter(e => e.deduct_profit).reduce((sum, e) => sum + e.amount, 0); return { sale: tSale, profit: (tSale - tCost) + tSF - tExp }; }, [sales, expenses]); return (

{t('report')}

{['daily', 'weekly', 'monthly', 'yearly', 'all_time'].map(k => { const val = k === 'all_time' ? 'all' : k; return ( ) })}
{t('total_sales')} ({t(tf === 'all' ? 'all_time' : tf)})
{stats.totalSale}
{t('net_profit')}
{stats.netProfit}
{t('inventory_asset')} (Latest)
{stats.invAsset}

{t('best_selling')} (Top 10)

{stats.topProducts.map(([name, qty], idx) => (
{idx + 1}. {name} {qty} Sold
))} {stats.topProducts.length === 0 &&
{t('no_data')}
}

{t('grand_report')}

{t('total_sales')}
{grandStats.sale}
{t('total_profit')}
{grandStats.profit}
); }