import React, { useState, useEffect, useCallback } from 'react'; import { FileText, RefreshCw, Building2, CheckCircle2, XCircle, Send, Clock } from 'lucide-react'; import { HybridBackend } from '../services/backend.ts'; import { useToast } from '../contexts/ToastContext.tsx'; import { PageHeader } from '../components/PageHeader.tsx'; const dataBR = (d: string) => (d || '').slice(0, 10).split('-').reverse().join('/'); const fmtBRL = (v: number) => 'R$ ' + Number(v || 0).toLocaleString('pt-BR', { minimumFractionDigits: 2 }); // Área do Laboratório (Fatia 3): pedidos de cotação recebidos das clínicas. export const LabCotacoesView: React.FC = () => { const toast = useToast(); const [lista, setLista] = useState([]); const [loading, setLoading] = useState(false); const [forms, setForms] = useState>({}); const [busy, setBusy] = useState(''); const carregar = useCallback(async () => { setLoading(true); try { const r = await HybridBackend.getRfqRecebidas(); setLista(Array.isArray(r) ? r : []); } catch { /* silent */ } finally { setLoading(false); } }, []); useEffect(() => { carregar(); }, [carregar]); const setF = (id: string, k: string, v: string) => setForms(s => ({ ...s, [id]: { ...(s[id] || { valor: '', prazo: '', obs: '' }), [k]: v } })); const responder = async (c: any) => { const f = forms[c.cotacao_id] || { valor: '', prazo: '', obs: '' }; const valor = parseFloat(f.valor); if (!(valor > 0)) { toast.error('INFORME O VALOR.'); return; } setBusy(c.cotacao_id); try { await HybridBackend.responderCotacao(c.cotacao_id, { valor, prazo_dias: parseInt(f.prazo, 10) || undefined, observacao: f.obs.trim() || undefined }); toast.success('COTAÇÃO ENVIADA.'); carregar(); } catch (e: any) { toast.error((e.message || 'ERRO').toUpperCase()); } finally { setBusy(''); } }; return (
{loading ?
: lista.length === 0 ?
Nenhum pedido de cotação.
: (
{lista.map(c => { const aberta = c.rfq_status === 'aberta'; const ganhou = c.cotacao_status === 'escolhida'; const perdeu = c.cotacao_status === 'recusada'; const f = forms[c.cotacao_id] || { valor: '', prazo: '', obs: '' }; return (

{c.descricao}

{c.clinica_nome || 'Clínica'}{c.dentes ? ` · dentes ${c.dentes}` : ''}

{ganhou && Você ganhou} {perdeu && Não escolhida} {aberta && c.cotacao_status === 'enviada' && Cotado · {fmtBRL(c.valor)}}
{(c.paciente_nome || c.prazo_desejado) &&

{c.paciente_nome || ''}{c.prazo_desejado ? ` · prazo desejado ${dataBR(c.prazo_desejado)}` : ''}

} {aberta && (
setF(c.cotacao_id, 'valor', e.target.value)} placeholder={c.valor ? String(c.valor) : '0,00'} className="w-24 p-2 bg-gray-50 border border-gray-100 rounded-lg text-xs font-bold outline-none focus:border-teal-400" />
setF(c.cotacao_id, 'prazo', e.target.value)} className="w-20 p-2 bg-gray-50 border border-gray-100 rounded-lg text-xs font-bold outline-none focus:border-teal-400" />
setF(c.cotacao_id, 'obs', e.target.value)} placeholder="Observação" className="flex-1 min-w-[120px] p-2 bg-gray-50 border border-gray-100 rounded-lg text-xs outline-none focus:border-teal-400" />
)} {!aberta && !ganhou && !perdeu &&

Encerrado

}
); })}
)}
); };