import { useState, useEffect } from 'react' import { useParams, Link } from 'react-router-dom' import { Plus, Trash2, Edit, ArrowRight, TrendingUp, TrendingDown, AlertTriangle } from 'lucide-react' import api from '../api' const CATEGORIES = ['אולם', 'קייטרינג', 'מוזיקה/DJ', 'צילום/וידאו', 'פרחים', 'הזמנות', 'הסעות', 'אחר'] const STATUS_OPTIONS = { planned: 'מתוכנן', paid: 'שולם', partial: 'חלקי', cancelled: 'בוטל' } export default function BudgetPage() { const { id } = useParams() const [items, setItems] = useState([]) const [summary, setSummary] = useState(null) const [loading, setLoading] = useState(true) const [showForm, setShowForm] = useState(false) const [editItem, setEditItem] = useState(null) const [form, setForm] = useState({ category: 'אחר', description: '', estimated_cost: '', actual_cost: '', status: 'planned' }) useEffect(() => { loadData() }, [id]) async function loadData() { try { const [itemsRes, summaryRes] = await Promise.all([ api.get(`/budget/event/${id}`), api.get(`/budget/event/${id}/summary`), ]) setItems(itemsRes.data) setSummary(summaryRes.data) } catch (err) { console.error(err) } finally { setLoading(false) } } function openCreate() { setEditItem(null) setForm({ category: 'אחר', description: '', estimated_cost: '', actual_cost: '', status: 'planned' }) setShowForm(true) } function openEdit(item) { setEditItem(item) setForm({ category: item.category, description: item.description || '', estimated_cost: item.estimated_cost || '', actual_cost: item.actual_cost || '', status: item.status }) setShowForm(true) } async function saveItem(e) { e.preventDefault() try { const data = { ...form, estimated_cost: parseFloat(form.estimated_cost) || 0, actual_cost: form.actual_cost ? parseFloat(form.actual_cost) : null } if (editItem) { await api.put(`/budget/${editItem.id}`, data) } else { await api.post('/budget', { ...data, event_id: id }) } setShowForm(false) loadData() } catch (err) { console.error(err) } } async function deleteItem(itemId) { if (!confirm('מחוק פריט?')) return try { await api.delete(`/budget/${itemId}`) loadData() } catch (err) { console.error(err) } } if (loading) return
טוען...
const overBudget = summary?.over_budget return (
הדשבורד / האירוע / תקציב

ניהול תקציב

{/* Summary */} {summary && (

תקציב כולל

₪{Number(summary.event_budget).toLocaleString('he-IL')}

הוצאות מתוכננות

₪{Number(summary.total_estimated).toLocaleString('he-IL')}

הוצאות בפועל

₪{Number(summary.total_actual).toLocaleString('he-IL')}

יתרת תקציב

{overBudget ? : }

₪{Number(Math.abs(summary.remaining_budget)).toLocaleString('he-IL')}

{overBudget &&

חריגה מהתקציב!

}
)} {/* Form */} {showForm && (

{editItem ? 'עריכת הוצאה' : 'הוספת הוצאה'}

setForm({ ...form, description: e.target.value })} className="w-full border border-gray-300 rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-indigo-500" />
setForm({ ...form, estimated_cost: e.target.value })} className="w-full border border-gray-300 rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-indigo-500" />
setForm({ ...form, actual_cost: e.target.value })} className="w-full border border-gray-300 rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-indigo-500" />
)} {/* Items table */}
{items.length === 0 ? ( ) : items.map(item => ( ))}
קטגוריה תיאור מוערך בפועל סטטוס
אין פריטים בתקציב
{item.category} {item.description || '—'} ₪{Number(item.estimated_cost).toLocaleString('he-IL')} {item.actual_cost ? `₪${Number(item.actual_cost).toLocaleString('he-IL')}` : '—'} {STATUS_OPTIONS[item.status] || item.status}
) }