fixing-laudo-section

This commit is contained in:
João Gustavo 2025-10-12 00:56:16 -03:00
parent 8cb00bb499
commit 92fc293d0d

View File

@ -202,7 +202,8 @@ const ProfissionalPage = () => {
endereco: (chosen as any).street || (chosen as any).endereco || prev.endereco, endereco: (chosen as any).street || (chosen as any).endereco || prev.endereco,
cidade: (chosen as any).city || (chosen as any).cidade || prev.cidade, cidade: (chosen as any).city || (chosen as any).cidade || prev.cidade,
cep: (chosen as any).cep || prev.cep, cep: (chosen as any).cep || prev.cep,
crm: (chosen as any).crm ? `CRM ${(chosen as any).crm}` : (prev.crm || ''), // store raw CRM (only the number) to avoid double-prefixing when rendering
crm: (chosen as any).crm ? String((chosen as any).crm).replace(/^(?:CRM\s*)+/i, '').trim() : (prev.crm || ''),
especialidade: specialtyStr || prev.especialidade || '', especialidade: specialtyStr || prev.especialidade || '',
// biografia removed: prefer to ignore observacoes/curriculo_url here // biografia removed: prefer to ignore observacoes/curriculo_url here
// (if needed elsewhere, render directly from chosen.observacoes) // (if needed elsewhere, render directly from chosen.observacoes)
@ -1330,7 +1331,11 @@ const ProfissionalPage = () => {
const [pacienteSelecionado, setPacienteSelecionado] = useState<any>(preSelectedPatient || null); const [pacienteSelecionado, setPacienteSelecionado] = useState<any>(preSelectedPatient || null);
const [listaPacientes, setListaPacientes] = useState<any[]>([]); const [listaPacientes, setListaPacientes] = useState<any[]>([]);
// Novo: campos para solicitante e prazo // Novo: campos para solicitante e prazo
const [solicitante, setSolicitante] = useState<string>(user?.id || ""); // solicitanteId será enviado ao backend (sempre o id do usuário logado)
const [solicitanteId, setSolicitanteId] = useState<string>(user?.id || "");
// displaySolicitante é apenas para exibição (nome do usuário) e NÃO é enviado ao backend
// Prefer profileData.nome (nome do médico carregado) — cai back para user.name ou email
const displaySolicitante = ((profileData as any) && ((profileData as any).nome || (profileData as any).nome_social)) || user?.name || (user?.profile as any)?.full_name || user?.email || '';
const [prazoDate, setPrazoDate] = useState<string>(""); const [prazoDate, setPrazoDate] = useState<string>("");
const [prazoTime, setPrazoTime] = useState<string>(""); const [prazoTime, setPrazoTime] = useState<string>("");
@ -1442,9 +1447,14 @@ const ProfissionalPage = () => {
} }
} }
// preencher solicitante/prazo quando existe laudo (edição) // preencher solicitanteId/prazo quando existe laudo (edição)
const possibleName = laudo.requested_by_name ?? laudo.requester_name ?? laudo.requestedByName ?? laudo.executante_name ?? laudo.executante?.nome ?? laudo.requested_by ?? laudo.created_by_name ?? user?.id ?? ""; // preferimos manter o solicitanteId como o user id; se o laudo tiver requested_by que pareça um id, usamos ele
setSolicitante(possibleName); const possibleRequestedById = laudo.requested_by ?? laudo.created_by ?? null;
if (possibleRequestedById && typeof possibleRequestedById === 'string' && possibleRequestedById.length > 5) {
setSolicitanteId(possibleRequestedById);
} else {
setSolicitanteId(user?.id || "");
}
const dueRaw = laudo.due_at ?? laudo.prazo ?? laudo.dueDate ?? laudo.data ?? null; const dueRaw = laudo.due_at ?? laudo.prazo ?? laudo.dueDate ?? laudo.data ?? null;
if (dueRaw) { if (dueRaw) {
@ -1661,9 +1671,10 @@ const ProfissionalPage = () => {
{/* Novos campos: Solicitante e Prazo */} {/* Novos campos: Solicitante e Prazo */}
<div className="mt-3 grid grid-cols-1 md:grid-cols-2 gap-3"> <div className="mt-3 grid grid-cols-1 md:grid-cols-2 gap-3">
<div> <div>
<Label htmlFor="solicitante">Solicitante (ID)</Label> <Label htmlFor="solicitante">Solicitante</Label>
<Input id="solicitante" value={solicitante} onChange={(e) => setSolicitante(e.target.value)} placeholder="Nome ou ID do solicitante (opcional)" /> {/* Mostrar o nome do usuário logado de forma estática (não editável) */}
<p className="text-xs text-muted-foreground mt-1">Se vazio, o usuário logado será usado como solicitante.</p> <Input id="solicitante" value={displaySolicitante} readOnly disabled />
</div> </div>
<div> <div>
<Label htmlFor="prazoDate">Prazo do Laudo</Label> <Label htmlFor="prazoDate">Prazo do Laudo</Label>
@ -2081,8 +2092,11 @@ const ProfissionalPage = () => {
<div className="h-16 mb-2 text-xs text-muted-foreground">Assine no campo ao lado para visualizar aqui.</div> <div className="h-16 mb-2 text-xs text-muted-foreground">Assine no campo ao lado para visualizar aqui.</div>
)} )}
<div className="border-b border-border mb-2"></div> <div className="border-b border-border mb-2"></div>
<p className="text-sm">{user?.name ? user.name : 'Squad-20'}</p> <p className="text-sm">{((profileData as any)?.nome || (profileData as any)?.nome_social) || user?.name || 'Squad-20'}</p>
<p className="text-xs text-muted-foreground">CRM 000000</p> {(((profileData as any)?.crm) || ((user?.profile as any)?.crm)) ? (
// Ensure we render a single 'CRM ' prefix followed by the raw number
<p className="text-xs text-muted-foreground">CRM {(((profileData as any)?.crm) || (user?.profile as any)?.crm).toString().replace(/^(?:CRM\s*)+/i, '').trim()}</p>
) : null}
</div> </div>
)} )}
</div> </div>
@ -2125,7 +2139,7 @@ const ProfissionalPage = () => {
content_html: content, content_html: content,
content_json: {}, content_json: {},
// status intentionally omitted — não enviar 'draft' // status intentionally omitted — não enviar 'draft'
requested_by: solicitante || userId, requested_by: solicitanteId || userId,
due_at: composedDueAt ?? new Date().toISOString(), due_at: composedDueAt ?? new Date().toISOString(),
hide_date: !campos.mostrarData, hide_date: !campos.mostrarData,
hide_signature: !campos.mostrarAssinatura, hide_signature: !campos.mostrarAssinatura,