import { useState, useEffect } from 'react'; import { type RecurringItem, type RecurringItemCreate, type RecurringItemUpdate, type RecurringItemType, type RecurringFrequency, } from '@/lib/api'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Textarea } from '@/components/ui/textarea'; import { Plus, Trash2 } from 'lucide-react'; const TYPE_OPTIONS: { value: RecurringItemType; label: string }[] = [ { value: 'INCOME', label: 'Ingreso' }, { value: 'EXPENSE', label: 'Egreso' }, ]; const FREQ_OPTIONS: { value: RecurringFrequency; label: string }[] = [ { value: 'WEEKLY', label: 'Semanal' }, { value: 'MONTHLY', label: 'Mensual' }, { value: 'QUARTERLY', label: 'Trimestral' }, { value: 'BIANNUAL', label: 'Semestral' }, { value: 'YEARLY', label: 'Anual' }, ]; const MONTH_LABELS = [ '', 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre', ]; interface RecurringItemDialogProps { open: boolean; onOpenChange: (open: boolean) => void; item?: RecurringItem | null; onSave: (data: RecurringItemCreate | RecurringItemUpdate) => Promise; } export default function RecurringItemDialog({ open, onOpenChange, item, onSave, }: RecurringItemDialogProps) { const isEdit = !!item; const [name, setName] = useState(''); const [amount, setAmount] = useState(''); const [itemType, setItemType] = useState('EXPENSE'); const [frequency, setFrequency] = useState('MONTHLY'); const [dayOfMonth, setDayOfMonth] = useState(''); const [monthOfYear, setMonthOfYear] = useState(''); const [overrides, setOverrides] = useState<{ month: string; amount: string }[]>([]); const [notes, setNotes] = useState(''); const [saving, setSaving] = useState(false); useEffect(() => { if (open) { if (item) { setName(item.name); setAmount(String(item.amount)); setItemType(item.item_type); setFrequency(item.frequency); setDayOfMonth(item.day_of_month != null ? String(item.day_of_month) : ''); setMonthOfYear(item.month_of_year != null ? String(item.month_of_year) : ''); setOverrides( item.override_amounts ? Object.entries(item.override_amounts).map(([m, a]) => ({ month: m, amount: String(a), })) : [], ); setNotes(item.notes || ''); } else { setName(''); setAmount(''); setItemType('EXPENSE'); setFrequency('MONTHLY'); setDayOfMonth(''); setMonthOfYear(''); setOverrides([]); setNotes(''); } } }, [open, item]); const showDayOfMonth = frequency === 'MONTHLY' || frequency === 'WEEKLY'; const showMonthOfYear = frequency === 'YEARLY' || frequency === 'BIANNUAL'; const showOverrides = frequency === 'MONTHLY'; const handleSubmit = async () => { setSaving(true); try { const overrideAmounts = overrides.length > 0 ? Object.fromEntries( overrides .filter((o) => o.month && o.amount) .map((o) => [o.month, parseFloat(o.amount)]), ) : null; const data = { name, amount: parseFloat(amount), item_type: itemType, frequency, day_of_month: dayOfMonth ? parseInt(dayOfMonth) : null, month_of_year: monthOfYear ? parseInt(monthOfYear) : null, override_amounts: overrideAmounts, notes: notes || null, }; await onSave(data); onOpenChange(false); } finally { setSaving(false); } }; return ( {isEdit ? 'Editar' : 'Nuevo'} Item Recurrente
setName(e.target.value)} />
setAmount(e.target.value)} />
{showDayOfMonth && (
setDayOfMonth(e.target.value)} />
)} {showMonthOfYear && (
)}
{showOverrides && (
{overrides.map((o, idx) => (
{ const next = [...overrides]; next[idx].amount = e.target.value; setOverrides(next); }} className="flex-1" />
))}
)}