import React, { useState, useEffect } from 'react'; import DataTable from '../../../Components/DataTable'; import Toast from '../Components/Toast'; import { Search, Plus, Eye, Filter, Calendar, Building, CreditCard, ArrowUpRight, X, ChevronRight, SearchIcon, CalendarIcon } from 'lucide-react'; import AddCollectionModal from './AddCollectionModal'; export default function CollectionsIndex() { const [collections, setCollections] = useState([]); const [branches, setBranches] = useState([]); const [collectionTypes, setCollectionTypes] = useState([]); const [loading, setLoading] = useState(true); const [isModalOpen, setIsModalOpen] = useState(false); const [toast, setToast] = useState(null); const [searchTerm, setSearchTerm] = useState(''); // Filter States const [filterFromDate, setFilterFromDate] = useState(''); const [filterToDate, setFilterToDate] = useState(''); const [filterBranch, setFilterBranch] = useState(window.__APP_DATA__?.branch?.id || ''); const [filterMethod, setFilterMethod] = useState(''); const isReceptionist = window.__APP_DATA__?.role === 'receptionist'; useEffect(() => { fetchMetadata(); fetchCollections(); }, [filterBranch, filterFromDate, filterToDate, filterMethod]); const fetchMetadata = async () => { try { const [bRes, tRes] = await Promise.all([ fetch('/api/branches?status=Active'), fetch('/api/masters/collection') ]); if (bRes.ok) setBranches(await bRes.json()); if (tRes.ok) setCollectionTypes(await tRes.json()); } catch (error) { console.error('Error fetching metadata:', error); } }; const fetchCollections = async () => { setLoading(true); try { let url = '/api/collections?'; if (filterBranch) url += `branch_id=${filterBranch}&`; if (filterFromDate) url += `start_date=${filterFromDate}&`; if (filterToDate) url += `end_date=${filterToDate}&`; if (filterMethod) url += `payment_method=${filterMethod}&`; const response = await fetch(url); const data = await response.json(); setCollections(data); } catch (error) { console.error('Error fetching collections:', error); } finally { setLoading(false); } }; const columns = [ { header: 'DATE', render: (row) => ( {new Date(row.date).toLocaleDateString()} ) }, { header: 'BRANCH', render: (row) => ( {row.branch?.name} ) }, { header: 'ITEMS', render: (row) => (
{row.type?.name === 'Product sale' || row.type?.name === 'Product saled' ? (row.items && row.items.length > 0 ? row.items[0].product?.name : 'Product Sale') : row.type?.name } {row.items && row.items.length > 1 && ( +{row.items.length - 1} more items )}
) }, { header: 'PAYMENT METHOD', render: (row) => ( {row.payment_method} ) }, { header: 'AMOUNT', render: (row) => ( {parseFloat(row.amount).toFixed(2)} AED ) }, { header: 'REMARKS', render: (row) => ( {row.remarks || '-'} ) } ]; const filteredCollections = collections.filter(c => (c.remarks?.toLowerCase().includes(searchTerm.toLowerCase()) || c.type?.name.toLowerCase().includes(searchTerm.toLowerCase()) || c.items?.some(i => i.product?.name.toLowerCase().includes(searchTerm.toLowerCase()))) ); return ( <> {toast && setToast(null)} />}

Collections

{!isReceptionist && (
)}
setFilterFromDate(e.target.value)} /> - setFilterToDate(e.target.value)} />
setSearchTerm(e.target.value)} />
( )} emptyMessage="No collection entries found." />
setIsModalOpen(false)} onSave={(newCol) => { setCollections([newCol, ...collections]); setToast({ message: 'Collection recorded successfully!', type: 'success' }); }} branches={branches} types={collectionTypes} /> ); }