feat(comunicacao-interna): pré-preenche endereço a partir da clínica

Perfil sem endereço próprio → GET /api/comunicacao sugere o endereço já cadastrado
da clínica (só confirmar, não redigitar) + flag endereco_da_clinica. Modal mostra
aviso "puxamos o endereço da clínica — é só conferir". Resolve a fricção do dono,
cuja clínica já tem endereço.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
VPS 4 Builder
2026-07-07 20:18:01 +02:00
parent 1e73a0c01f
commit 9fd078e36f
2 changed files with 11 additions and 2 deletions
+7 -1
View File
@@ -7588,7 +7588,13 @@ app.get('/api/comunicacao/:usuarioId', authGuard, async (req, res) => {
if (!(await podeEditarComunicacao(req.authUser.userId, alvo, clinicaId))) return res.status(403).json({ error: 'Sem permissão.' });
const { rows } = await pool.query('SELECT endereco, numeros, agenda, completo FROM pessoa_comunicacao WHERE usuario_id=$1 AND clinica_id=$2', [alvo, clinicaId]);
const p = rows[0] || { endereco: {}, numeros: [], agenda: {}, completo: false };
res.json({ usuario_id: alvo, clinica_id: clinicaId, ...p });
// Perfil ainda sem endereço próprio → sugere o endereço da CLÍNICA (só confirmar, não redigitar).
let enderecoDaClinica = false;
if (!p.endereco || !p.endereco.cidade) {
const { rows: cr } = await pool.query('SELECT logradouro, numero, bairro, cidade, estado, cep FROM clinicas WHERE id=$1', [clinicaId]);
if (cr[0] && (cr[0].cidade || cr[0].logradouro)) { p.endereco = { ...cr[0], ...(p.endereco || {}) }; enderecoDaClinica = true; }
}
res.json({ usuario_id: alvo, clinica_id: clinicaId, ...p, endereco_da_clinica: enderecoDaClinica });
} catch (e) { res.status(500).json({ error: e.message }); }
});
@@ -77,6 +77,7 @@ export const ComunicacaoInternaModal: React.FC<{
const [endereco, setEndereco] = useState<Endereco>({});
const [numeros, setNumeros] = useState<Numero[]>([]);
const [agenda, setAgenda] = useState<Agenda>({});
const [enderecoDaClinica, setEnderecoDaClinica] = useState(false);
const load = useCallback(async () => {
setLoading(true);
@@ -87,6 +88,7 @@ export const ComunicacaoInternaModal: React.FC<{
setEndereco(d.endereco || {});
setNumeros(Array.isArray(d.numeros) ? d.numeros : []);
setAgenda(d.agenda || {});
setEnderecoDaClinica(!!d.endereco_da_clinica);
} catch { /* mantém vazio */ } finally { setLoading(false); }
}, [usuarioId, clinicaId]);
useEffect(() => { load(); }, [load]);
@@ -158,7 +160,8 @@ export const ComunicacaoInternaModal: React.FC<{
{/* ── Endereço ── */}
<section>
<h3 className="flex items-center gap-2 text-xs font-black text-gray-700 uppercase tracking-wide mb-3"><MapPin size={15} style={{ color: COLOR }} /> Endereço</h3>
<h3 className="flex items-center gap-2 text-xs font-black text-gray-700 uppercase tracking-wide mb-1"><MapPin size={15} style={{ color: COLOR }} /> Endereço</h3>
{enderecoDaClinica && <p className="text-[11px] text-teal-600 font-bold mb-3">Puxamos o endereço da clínica é conferir (ou ajustar, se o seu for diferente).</p>}
<div className="grid grid-cols-1 sm:grid-cols-6 gap-3">
<div className="sm:col-span-2">
<label className={label}>CEP</label>