// Caririaçu Guincho — Tab Receita (read-only) const { useState: useStateTR, useEffect: useEffectTR, useMemo: useMemoTR } = React; const TabReceita = ({ guincho, periodo }) => { const [items, setItems] = useStateTR([]); const [loading, setLoading] = useStateTR(true); useEffectTR(() => { let alive = true; sb.from('assistencias').select('*') .eq('guincho_id', guincho.id) .eq('status', 'finalizada') .gte('data', periodo.inicio) .lte('data', periodo.fim + 'T23:59:59') .order('data', { ascending: false }) .then(r => { if (!alive) return; setItems(r.data || []); setLoading(false); }); return () => { alive = false; }; }, [guincho.id, periodo.inicio, periodo.fim]); const metricas = useMemoTR(() => { const total = items.reduce((s, x) => s + Number(x.valor || 0), 0); const dias = Math.max(1, Math.ceil((new Date(periodo.fim) - new Date(periodo.inicio)) / 86400000)); return { total, porDia: total / dias, count: items.length }; }, [items, periodo]); if (loading) return
Carregando…
; return ( <> {/* Cards */}
ℹ️ Receita é calculada a partir das assistências finalizadas. Para criar/editar use a tela Assistências.
{items.length === 0 ? (
Nenhuma assistência finalizada no período.
) : items.map(x => (
{x.numero} · {x.cliente || '—'}
{new Date(x.data).toLocaleDateString('pt-BR')} · {x.servico || '—'} {x.placa && ` · ${x.placa}`}
{fmtBRL(x.valor)}
))}
); }; Object.assign(window, { TabReceita });