import React, { useState, useEffect, useCallback } from 'react'; import { FlaskConical, Wallet, Clock, AlertTriangle, CheckCircle2, RefreshCw, Inbox } from 'lucide-react'; import { HybridBackend } from '../services/backend.ts'; import { PageHeader } from '../components/PageHeader.tsx'; const fmtBRL = (v: number) => 'R$ ' + Number(v || 0).toLocaleString('pt-BR', { minimumFractionDigits: 2 }); // Painel do LABORATÓRIO (protético): aparece quando o workspace ativo é tipo='laboratorio'. // Resumo a partir do que já existe — a Bancada (OS) + o financeiro do workspace do lab. export const LabHomeView: React.FC = () => { const ws: any = HybridBackend.getActiveWorkspace(); const [os, setOs] = useState([]); const [fin, setFin] = useState([]); const [loading, setLoading] = useState(false); const carregar = useCallback(async () => { setLoading(true); try { const [b, f] = await Promise.all([HybridBackend.getProteseBancada(), HybridBackend.getFinanceiro()]); setOs(Array.isArray(b) ? b : []); setFin(Array.isArray(f) ? f : []); } catch { /* silent */ } finally { setLoading(false); } }, []); useEffect(() => { carregar(); }, [carregar]); const ativas = os.filter(o => o.status !== 'entregue' && o.status !== 'cancelado'); const atrasadas = os.filter(o => o.atrasada).length; const ymMes = new Date().toISOString().slice(0, 7); const entreguesMes = os.filter(o => o.status === 'entregue' && (o.updated_at || '').slice(0, 7) === ymMes).length; // Faturamento do mês: RECEITA de prótese lançada no workspace do lab (espelho da entrega). const fatMes = fin .filter(l => l.origem === 'protese' && (l.data_competencia || l.datavencimento || '').slice(0, 7) === ymMes) .reduce((s, l) => s + Number(l.valor || 0), 0); const KPI: React.FC<{ titulo: string; valor: string; cor: string; Icon: any; sub?: string }> = ({ titulo, valor, cor, Icon, sub }) => (

{titulo}

{valor}
{sub &&

{sub}

}
); // Distribuição por status (fila de produção). const STATUS_ORD = ['solicitado', 'recebido', 'producao', 'prova', 'ajuste', 'finalizado']; const STATUS_LABEL: Record = { solicitado: 'Solicitado', recebido: 'Recebido', producao: 'Produção', prova: 'Prova', ajuste: 'Ajuste', finalizado: 'Finalizado' }; const porStatus = STATUS_ORD.map(s => ({ s, n: ativas.filter(o => o.status === s).length })).filter(x => x.n > 0); return (

{ws?.nome || 'Laboratório'}

Área de gestão do protético

{loading ?
: ( <>
{/* Fila por status */}

Fila de produção

{porStatus.length === 0 ? (
Nenhuma OS em produção.
) : (
{porStatus.map(({ s, n }) => (

{STATUS_LABEL[s]}

{n}

))}
)}
{/* Próximas entregas */}

Próximas entregas

{ativas.filter(o => o.prazo_entrega).length === 0 ? (
Sem prazos agendados.
) : (
{['Paciente', 'Tipo', 'Prazo', 'Status', 'Valor'].map(h => )} {ativas.filter(o => o.prazo_entrega).sort((a, b) => (a.prazo_entrega || '').localeCompare(b.prazo_entrega || '')).slice(0, 12).map(o => ( ))}
{h}
{o.paciente_nome || '—'} {o.tipo || '—'} {(o.prazo_entrega || '').slice(0, 10).split('-').reverse().join('/')} {STATUS_LABEL[o.status] || o.status} {fmtBRL(o.custo)}
)}
)}
); };