import React, { useState, useEffect } from 'react'; import { Search, Download, Calendar, DollarSign, ArrowDownRight, Filter, CreditCard } from 'lucide-react'; export default function ReceptionistReportIndex() { const [activeTab, setActiveTab] = useState('Collections'); const [loading, setLoading] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const [fromDate, setFromDate] = useState('2026-02-06'); // Defaulting based on screenshot const [toDate, setToDate] = useState('2026-03-08'); const [method, setMethod] = useState('All Methods'); const [type, setType] = useState('All Types'); const [expenseType, setExpenseType] = useState('All Types'); const [collections, setCollections] = useState([]); const [expenses, setExpenses] = useState([]); const [userBranch, setUserBranch] = useState('Downtown Main'); // Fallback const [selectedItem, setSelectedItem] = useState(null); useEffect(() => { const user = window.__APP_DATA__; if (user && user.branch) { setUserBranch(user.branch.name); } fetchData(); }, [activeTab, fromDate, toDate]); const fetchData = async () => { setLoading(true); try { if (activeTab === 'Collections') { const query = new URLSearchParams({ start_date: fromDate, end_date: toDate }); const res = await fetch(`/api/collections?${query}`); const data = await res.json(); setCollections(data || []); } else { const res = await fetch('/api/expenses'); const data = await res.json(); // Client-side date filtering for expenses if backend doesn't support it yet const filtered = data.filter(e => { const d = e.date; return d >= fromDate && d <= toDate; }); setExpenses(filtered || []); } } catch (error) { console.error('Error fetching reports data:', error); } finally { setLoading(false); } }; const filteredCollections = collections.filter(item => { const matchesSearch = item.remarks?.toLowerCase().includes(searchQuery.toLowerCase()) || item.type?.name?.toLowerCase().includes(searchQuery.toLowerCase()); const matchesMethod = method === 'All Methods' || item.payment_method === method; const matchesType = type === 'All Types' || item.type?.name === type; return matchesSearch && matchesMethod && matchesType; }); const filteredExpenses = expenses.filter(item => { const matchesSearch = item.remarks?.toLowerCase().includes(searchQuery.toLowerCase()) || item.category?.name?.toLowerCase().includes(searchQuery.toLowerCase()); const matchesType = expenseType === 'All Types' || item.expense_type === expenseType; return matchesSearch && matchesType; }); const totalCollections = filteredCollections.reduce((sum, item) => sum + parseFloat(item.amount), 0); const totalExpenses = filteredExpenses.reduce((sum, item) => sum + parseFloat(item.amount), 0); return (
{/* Header Section */}

Financial Reports

Branch: {userBranch}

{/* Filters Bar */}
setSearchQuery(e.target.value)} />
setFromDate(e.target.value)} />
setToDate(e.target.value)} />
{activeTab === 'Collections' ? ( <>
) : (
)}
{/* Tabs Sidebar/Style */}
{['Collections', 'Expenses'].map((tab) => ( ))}
{/* Content Area */} {activeTab === 'Collections' ? (
{/* Summary Banner */}

Total Collections (Filtered)

{totalCollections.toLocaleString('en-AE', { minimumFractionDigits: 2 })} AED

Records: {filteredCollections.length}

{/* Table */}
{filteredCollections.map((item, idx) => ( ))} {filteredCollections.length === 0 && ( )}
Date Items / Details Type Method Amount
{new Date(item.date).toLocaleDateString('en-GB')}

{item.remarks || 'No details provided'}

{item.type?.name} {item.payment_method}

{parseFloat(item.amount).toLocaleString('en-AE', { minimumFractionDigits: 2 })} AED

{item.is_adjusted && ( )}
No records found
) : (
{/* Summary Banner */}

Total Expenses (Filtered)

{totalExpenses.toLocaleString('en-AE', { minimumFractionDigits: 2 })} AED

Records: {filteredExpenses.length}

{/* Table */}
{filteredExpenses.map((item, idx) => ( ))} {filteredExpenses.length === 0 && ( )}
Date Category Type Remarks Amount
{new Date(item.date).toLocaleDateString('en-GB')}

{item.category?.name}

{item.expense_type}

{item.remarks || '---'}

{parseFloat(item.amount).toLocaleString('en-AE', { minimumFractionDigits: 2 })} AED

No records found
)} {/* Details Modal */} {selectedItem && (

Adjustment Details

Transaction: #{selectedItem.transaction_id || 'N/A'}

Original Total

{(selectedItem.original_amount || 0).toLocaleString('en-AE', { minimumFractionDigits: 2 })} AED

Adjusted Total

{(parseFloat(selectedItem.amount) || 0).toLocaleString('en-AE', { minimumFractionDigits: 2 })} AED

Remarks / Reason

"{selectedItem.remarks || 'No remarks provided for this adjustment.'}"

)}
); }