// Caririaçu Guincho — Tab Serviço (manutencoes existente, adaptado) const { useState: useStateTS, useEffect: useEffectTS, useMemo: useMemoTS } = React; const TabServico = ({ guincho, periodo }) => { const [items, setItems] = useStateTS([]); const [novoOpen, setNovoOpen] = useStateTS(false); const [tick, setTick] = useStateTS(0); useEffectTS(() => { sb.from('manutencoes').select('*') .eq('guincho_id', guincho.id) .gte('data', periodo.inicio) .lte('data', periodo.fim) .order('data', { ascending: false }) .then(r => setItems(r.data || [])); }, [guincho.id, periodo.inicio, periodo.fim, tick]); const metricas = useMemoTS(() => { const total = items.reduce((s, x) => s + Number(x.valor || 0), 0); const preventivas = items.filter(x => x.tipo === 'Preventiva').length; const corretivas = items.filter(x => x.tipo === 'Corretiva').length; return { total, count: items.length, preventivas, corretivas }; }, [items]); const excluir = async (item) => { if (!confirm(`Excluir manutenção "${item.descricao}"?`)) return; const ok = await db.remove('manutencoes', item.id); if (!ok) return; setTick(t => t + 1); showToast('Manutenção excluída', 'info'); }; return ( <>
Preventivas
{metricas.preventivas}
Corretivas
{metricas.corretivas}
{items.length === 0 ? (
Nenhum serviço registrado no período.
) : items.map(x => (
{x.descricao}
{new Date(x.data).toLocaleDateString('pt-BR')} · {x.tipo} {x.oficina && ` · ${x.oficina}`}
{fmtBRL(x.valor)}
))}
setNovoOpen(true)} /> {novoOpen && ( setNovoOpen(false)} onSaved={() => { setTick(t => t + 1); setNovoOpen(false); }} /> )} ); }; Object.assign(window, { TabServico });