'use client' import { useState, useEffect } from 'react' import { portalAPI, type PurchaseRequest } from '@/lib/api/portal' import Modal from '@/components/Modal' import LoadingSpinner from '@/components/LoadingSpinner' import { toast } from 'react-hot-toast' import { ShoppingCart, Plus } from 'lucide-react' const STATUS_MAP: Record = { PENDING: { label: 'قيد المراجعة', color: 'bg-amber-100 text-amber-800' }, APPROVED: { label: 'معتمد', color: 'bg-green-100 text-green-800' }, REJECTED: { label: 'مرفوض', color: 'bg-red-100 text-red-800' }, ORDERED: { label: 'تم الطلب', color: 'bg-blue-100 text-blue-800' }, } export default function PortalPurchaseRequestsPage() { const [requests, setRequests] = useState([]) const [loading, setLoading] = useState(true) const [showModal, setShowModal] = useState(false) const [submitting, setSubmitting] = useState(false) const [form, setForm] = useState({ items: [{ description: '', quantity: 1, estimatedPrice: '' }], reason: '', priority: 'NORMAL', }) useEffect(() => { portalAPI.getPurchaseRequests() .then(setRequests) .catch(() => toast.error('فشل تحميل الطلبات')) .finally(() => setLoading(false)) }, []) const addItem = () => setForm((p) => ({ ...p, items: [...p.items, { description: '', quantity: 1, estimatedPrice: '' }] })) const removeItem = (i: number) => setForm((p) => ({ ...p, items: p.items.filter((_, idx) => idx !== i) })) const updateItem = (i: number, key: string, value: string | number) => setForm((p) => ({ ...p, items: p.items.map((it, idx) => (idx === i ? { ...it, [key]: value } : it)), })) const handleSubmit = (e: React.FormEvent) => { e.preventDefault() const items = form.items .filter((it) => it.description.trim()) .map((it) => ({ description: it.description, quantity: it.quantity || 1, estimatedPrice: parseFloat(String(it.estimatedPrice)) || 0, })) if (items.length === 0) { toast.error('أضف صنفاً واحداً على الأقل') return } setSubmitting(true) portalAPI.submitPurchaseRequest({ items, reason: form.reason || undefined, priority: form.priority, }) .then((pr) => { setRequests((prev) => [pr, ...prev]) setShowModal(false) setForm({ items: [{ description: '', quantity: 1, estimatedPrice: '' }], reason: '', priority: 'NORMAL' }) toast.success('تم إرسال طلب الشراء') }) .catch(() => toast.error('فشل إرسال الطلب')) .finally(() => setSubmitting(false)) } if (loading) return return (

طلبات الشراء

{requests.length === 0 ? (

لا توجد طلبات شراء

) : (
{requests.map((pr) => { const statusInfo = STATUS_MAP[pr.status] || { label: pr.status, color: 'bg-gray-100 text-gray-800' } const items = Array.isArray(pr.items) ? pr.items : [] return (

{pr.requestNumber}

{pr.totalAmount != null ? `${Number(pr.totalAmount).toLocaleString()} ر.س` : '-'}

{items.length > 0 && (
    {items.slice(0, 3).map((it: any, i: number) => (
  • {it.description} × {it.quantity || 1} {it.estimatedPrice ? ` (${Number(it.estimatedPrice).toLocaleString()} ر.س)` : ''}
  • ))} {items.length > 3 &&
  • ... و {items.length - 3} أصناف أخرى
  • }
)} {pr.rejectedReason && (

سبب الرفض: {pr.rejectedReason}

)}
{statusInfo.label}
) })}
)} setShowModal(false)} title="طلب شراء جديد">
{form.items.map((it, i) => (
updateItem(i, 'description', e.target.value)} className="flex-1 px-2 py-1 border rounded text-sm" /> updateItem(i, 'quantity', parseInt(e.target.value) || 1)} className="w-20 px-2 py-1 border rounded text-sm" /> updateItem(i, 'estimatedPrice', e.target.value)} className="w-24 px-2 py-1 border rounded text-sm" />
))}