/** * ════════════════════════════════════════════════════════════ * مُصادَق (Musadaq) — Invoices Management Page * ════════════════════════════════════════════════════════════ */ import { useState, useEffect } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { Upload, Search, Filter, Eye, CheckCircle2, Clock, AlertCircle, MoreVertical, ChevronLeft, ChevronRight, Building2, FileText, Send } from 'lucide-react'; import apiClient from '../../api/client'; export const InvoicesPage = () => { const [invoices, setInvoices] = useState([]); const [companies, setCompanies] = useState([]); const [isLoading, setIsLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(''); const [isUploadModalOpen, setIsUploadModalOpen] = useState(false); // Upload Form State const [selectedCompanyId, setSelectedCompanyId] = useState(''); const [selectedFile, setSelectedFile] = useState(null); const [isUploading, setIsUploading] = useState(false); const fetchData = async () => { setIsLoading(true); try { // Fetch companies first so the dropdown always works try { const compRes = await apiClient.get('/companies'); console.log('Fetched Companies:', compRes.data); setCompanies(compRes.data); } catch (err) { console.error('Failed to fetch companies', err); } // Fetch invoices separately try { const invRes = await apiClient.get('/invoices'); console.log('Fetched Invoices:', invRes.data); setInvoices(invRes.data); } catch (err) { console.error('Failed to fetch invoices', err); } } finally { setIsLoading(false); } }; useEffect(() => { fetchData(); }, []); const handleUpload = async (e: React.FormEvent) => { e.preventDefault(); if (!selectedCompanyId || !selectedFile) return; setIsUploading(true); const formData = new FormData(); formData.append('file', selectedFile); try { await apiClient.post(`/invoices/upload/${selectedCompanyId}`, formData, { headers: { 'Content-Type': 'multipart/form-data' } }); setIsUploadModalOpen(false); setSelectedFile(null); setSelectedCompanyId(''); fetchData(); } catch (error) { console.error('Upload failed', error); alert('حدث خطأ أثناء رفع الفاتورة'); } finally { setIsUploading(false); } }; const handleFileChange = (e: React.ChangeEvent) => { if (e.target.files && e.target.files[0]) { setSelectedFile(e.target.files[0]); } }; const filteredInvoices = invoices.filter(inv => inv.invoice_number?.includes(searchTerm) || inv.company?.name?.includes(searchTerm) ); const StatusBadge = ({ status }: { status: string }) => { const config: any = { approved: { color: 'text-emerald-700 bg-emerald-50 border-emerald-100', icon: CheckCircle2, label: 'تم التصديق' }, validated: { color: 'text-blue-700 bg-blue-50 border-blue-100', icon: CheckCircle2, label: 'جاهز للإرسال' }, extracted: { color: 'text-indigo-700 bg-indigo-50 border-indigo-100', icon: CheckCircle2, label: 'تم الاستخراج' }, uploaded: { color: 'text-amber-700 bg-amber-50 border-amber-100', icon: Clock, label: 'قيد المعالجة AI' }, extracting: { color: 'text-amber-700 bg-amber-50 border-amber-100', icon: Clock, label: 'قيد الاستخراج' }, validation_failed: { color: 'text-red-700 bg-red-50 border-red-100', icon: AlertCircle, label: 'خطأ في التحقق' }, }; const { color, icon: Icon, label } = config[status] || { color: 'text-slate-500 bg-slate-50', icon: Clock, label: status }; return ( {label} ); }; return (

إدارة الفواتير

عرض، معالجة، وإرسال الفواتير الضريبية لبوابة الضريبة.

{/* ── Filter & Search Bar ──────────────────────────────── */}
setSearchTerm(e.target.value)} />
{/* ── Invoices Table ───────────────────────────────────── */}
{isLoading ? (
) : filteredInvoices.length === 0 ? (

لا توجد فواتير بعد

ابدأ برفع أول فاتورة ليقوم محرك الذكاء الاصطناعي باستخراج بياناتها ومصادقتها ضريبياً.

) : (
{filteredInvoices.map((inv, idx) => ( ))}
رقم الفاتورة الشركة التاريخ المجموع (JOD) الحالة إجراءات
{inv.invoice_number || '---'}
{inv.company?.name || 'شركة غير معروفة'}
{inv.issue_date ? new Date(inv.issue_date).toLocaleDateString('ar-JO') : '---'} {Number(inv.total_amount).toLocaleString('en-US', { minimumFractionDigits: 3 })}
{inv.status === 'validated' && ( )}
)} {/* ── Pagination ───────────────────────────────────────── */} {!isLoading && filteredInvoices.length > 0 && (

عرض {filteredInvoices.length} فواتير

)}
{/* ── Upload Modal ─────────────────────────────────────── */} {isUploadModalOpen && (

رفع فاتورة جديدة

اختر الشركة وملف الفاتورة (PDF أو صورة) وسيقوم الذكاء الاصطناعي بالباقي.

{selectedFile ? selectedFile.name : 'اسحب الملف هنا أو انقر للاختيار'}

PDF, JPG, PNG (حد أقصى 10MB)

)}
); };