'use client'; import { useState, useEffect } from 'react'; import { motion } from 'framer-motion'; import { DollarSign, Calendar, User, Home, Download, Filter, Search, TrendingUp, TrendingDown, Wallet, Shield, FileText, Printer, X, CheckCircle } from 'lucide-react'; import { formatCurrency } from '@/app/utils/calculations'; import toast, { Toaster } from 'react-hot-toast'; import * as XLSX from 'xlsx'; export default function LedgerBook({ userType = 'admin' }) { const [transactions, setTransactions] = useState([]); const [filteredTransactions, setFilteredTransactions] = useState([]); const [dateRange, setDateRange] = useState({ start: '', end: '' }); const [searchTerm, setSearchTerm] = useState(''); const [summary, setSummary] = useState({ totalRevenue: 0, pendingPayments: 0, securityDeposits: 0, commissionEarned: 0 }); const [isExporting, setIsExporting] = useState(false); useEffect(() => { loadTransactions(); }, []); useEffect(() => { filterTransactions(); calculateSummary(); }, [transactions, dateRange, searchTerm]); const loadTransactions = async () => { const mockTransactions = [ { id: 'T001', date: '2024-02-20', type: 'rent_payment', description: 'دفعة إيجار - فيلا في دمشق', amount: 500000, commission: 25000, fromUser: 'أحمد محمد', toUser: 'مالك العقار', propertyId: 1, propertyName: 'luxuryVillaDamascus', status: 'completed', paymentMethod: 'cash' }, { id: 'T002', date: '2024-02-19', type: 'security_deposit', description: 'سلفة ضمان - شقة في حلب', amount: 250000, commission: 0, fromUser: 'سارة أحمد', toUser: 'مالك العقار', propertyId: 2, propertyName: 'modernApartmentAleppo', status: 'pending_refund', paymentMethod: 'cash' }, { id: 'T003', date: '2024-02-18', type: 'commission', description: 'عمولة منصة - فيلا في درعا', amount: 30000, commission: 30000, fromUser: 'محمد الحلبي', toUser: 'المنصة', propertyId: 5, propertyName: 'villaDaraa', status: 'completed', paymentMethod: 'cash' } ]; setTransactions(mockTransactions); }; const filterTransactions = () => { let filtered = [...transactions]; if (dateRange.start && dateRange.end) { filtered = filtered.filter(t => t.date >= dateRange.start && t.date <= dateRange.end ); } if (searchTerm) { filtered = filtered.filter(t => t.description.includes(searchTerm) || t.fromUser.includes(searchTerm) || t.toUser.includes(searchTerm) ); } setFilteredTransactions(filtered); }; const calculateSummary = () => { const summary = filteredTransactions.reduce((acc, t) => { if (t.type === 'rent_payment' || t.type === 'commission') { acc.totalRevenue += t.amount; } if (t.type === 'security_deposit' && t.status === 'pending_refund') { acc.securityDeposits += t.amount; } if (t.commission) { acc.commissionEarned += t.commission; } if (t.status === 'pending') { acc.pendingPayments += t.amount; } return acc; }, { totalRevenue: 0, pendingPayments: 0, securityDeposits: 0, commissionEarned: 0 }); setSummary(summary); }; const getTransactionIcon = (type) => { switch(type) { case 'rent_payment': return ; case 'security_deposit': return ; case 'commission': return ; default: return ; } }; const exportToExcel = async () => { if (filteredTransactions.length === 0) { toast.error('لا توجد معاملات للتصدير'); return; } setIsExporting(true); toast.loading('جاري تصدير البيانات...', { id: 'export' }); try { const exportData = filteredTransactions.map(t => ({ 'رقم العملية': t.id, 'التاريخ': t.date, 'نوع العملية': t.type === 'rent_payment' ? 'دفعة إيجار' : t.type === 'security_deposit' ? 'سلفة ضمان' : t.type === 'commission' ? 'عمولة' : 'أخرى', 'الوصف': t.description, 'من': t.fromUser, 'إلى': t.toUser, 'المبلغ (ل.س)': t.amount, 'العمولة (ل.س)': t.commission || 0, 'الحالة': t.status === 'completed' ? 'مكتمل' : t.status === 'pending' ? 'معلق' : t.status === 'pending_refund' ? 'بإنتظار الاسترداد' : 'مؤكد', })); const summaryRow = { 'رقم العملية': '', 'التاريخ': '', 'نوع العملية': '', 'الوصف': '', 'من': '', 'إلى': '', 'المبلغ (ل.س)': summary.totalRevenue, 'العمولة (ل.س)': summary.commissionEarned, 'الحالة': '' }; exportData.push(summaryRow); const worksheet = XLSX.utils.json_to_sheet(exportData); const columnWidths = [ { wch: 12 }, // رقم العملية { wch: 12 }, // التاريخ { wch: 12 }, // نوع العملية { wch: 30 }, // الوصف { wch: 20 }, // من { wch: 20 }, // إلى { wch: 15 }, // المبلغ { wch: 15 }, // العمولة { wch: 12 }, // الحالة ]; worksheet['!cols'] = columnWidths; const range = XLSX.utils.decode_range(worksheet['!ref']); for (let C = range.s.c; C <= range.e.c; ++C) { const address = XLSX.utils.encode_col(C) + '1'; if (!worksheet[address]) continue; worksheet[address].s = { font: { bold: true, sz: 12 }, fill: { fgColor: { rgb: "F59E0B" } }, alignment: { horizontal: "center", vertical: "center" } }; } const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, 'دفتر الحسابات'); const fileName = `دفتر_الحسابات_${new Date().toISOString().split('T')[0]}.xlsx`; XLSX.writeFile(workbook, fileName); toast.success(`تم تصدير ${filteredTransactions.length} معاملة بنجاح!`, { id: 'export' }); } catch (error) { console.error('Error exporting to Excel:', error); toast.error('حدث خطأ أثناء تصدير البيانات', { id: 'export' }); } finally { setIsExporting(false); } }; const printReport = () => { const printWindow = window.open('', '_blank'); printWindow.document.write(` تقرير دفتر الحسابات
تقرير دفتر الحسابات
الفترة: ${dateRange.start || 'بداية السجلات'} - ${dateRange.end || 'حتى الآن'}
تاريخ التقرير: ${new Date().toLocaleDateString('ar-SA')}
إجمالي الإيرادات
${formatCurrency(summary.totalRevenue)}
أرباح المنصة
${formatCurrency(summary.commissionEarned)}
سلف الضمان
${formatCurrency(summary.securityDeposits)}
المدفوعات المعلقة
${formatCurrency(summary.pendingPayments)}
${filteredTransactions.map(t => ` `).join('')}
التاريخ الوصف من إلى المبلغ العمولة الحالة
${t.date} ${t.description} ${t.fromUser} ${t.toUser} ${formatCurrency(t.amount)} ${t.commission ? formatCurrency(t.commission) : '-'} ${t.status === 'completed' ? 'مكتمل' : t.status === 'pending' ? 'معلق' : 'بإنتظار الرد'}
`); printWindow.document.close(); }; return (
إجمالي الإيرادات
{formatCurrency(summary.totalRevenue)}
أرباح المنصة
{formatCurrency(summary.commissionEarned)}
سلف الضمان
{formatCurrency(summary.securityDeposits)}
المدفوعات المعلقة
{formatCurrency(summary.pendingPayments)}
setSearchTerm(e.target.value)} className="w-full pl-12 pr-4 py-3 border border-gray-300 rounded-xl focus:outline-none focus:ring-2 focus:ring-blue-500" />
setDateRange({...dateRange, start: e.target.value})} className="px-4 py-3 border border-gray-300 rounded-xl focus:outline-none focus:ring-2 focus:ring-blue-500" /> إلى setDateRange({...dateRange, end: e.target.value})} className="px-4 py-3 border border-gray-300 rounded-xl focus:outline-none focus:ring-2 focus:ring-blue-500" />
{(dateRange.start || dateRange.end || searchTerm) && (
{filteredTransactions.length} معاملة من إجمالي {transactions.length}
)}
{filteredTransactions.map((transaction, index) => ( ))}
التاريخ الوصف من إلى المبلغ العمولة الحالة
{transaction.date}
{getTransactionIcon(transaction.type)} {transaction.description}
{transaction.fromUser}
{transaction.toUser}
{formatCurrency(transaction.amount)} {transaction.commission ? formatCurrency(transaction.commission) : '-'} {transaction.status === 'completed' ? 'مكتمل' : transaction.status === 'pending' ? 'معلق' : 'بإنتظار الرد'}
{filteredTransactions.length === 0 && (

لا توجد معاملات في هذه الفترة

)}
{userType === 'owner' && (

أرصدة المستأجرين

لا توجد أرصدة حالياً

)}
); }