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:
+7
-1
@@ -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 — é só 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>
|
||||
|
||||
Reference in New Issue
Block a user