Envio automático de e-mail (paciente e médico solicitante)
Documentação funcional do caso de uso envio automático de laudo por e-mail do portal MM-PACS, cobrindo os dois destinos possíveis: paciente e médico solicitante. A configuração foi unificada na aba de entrega do formulário de empresa.
Índice
- Visão geral
- Rota e acesso
- Configuração da empresa (entregaForm)
- Campos do exame
- Envio automático — fluxos de disparo
- Models
- Serviços HTTP
- i18n
- Âncoras de referência
Visão geral
O envio automático de e-mail é disparado pelo backend nos eventos abaixo, desde que os flags da empresa estejam habilitados e os campos de e-mail do exame estejam preenchidos. O frontend não realiza nenhuma chamada HTTP de e-mail nesses fluxos.
O comportamento varia conforme a opção "Habilitar liberação de exames para impressão do laudo" (permissao_imprimir_exames) da empresa:
permissao_imprimir_exames | Assinar | Reassinar | Liberar |
|---|---|---|---|
false (desabilitado) | Envia e-mail | Envia e-mail | Botão não existe |
true (habilitado) | Não envia | Não envia | Envia e-mail |
Quando permissao_imprimir_exames = true, o backend aguarda a liberação para disparar o e-mail — os eventos de assinatura e reassinatura não o disparam. Quando permissao_imprimir_exames = false, não há botão de liberar e os e-mails são enviados apenas ao assinar e reassinar.
| Evento | Endpoint | Destino(s) | Condição de disparo |
|---|---|---|---|
| Assinar exame no laudário | PUT /laudo/assinar | Paciente e/ou Médico solicitante | Somente quando permissao_imprimir_exames = false |
| Reassinar exame no laudário | PUT /laudo/assinar (com resign: true) | Paciente e/ou Médico solicitante | Somente quando permissao_imprimir_exames = false |
| Liberar exame na listagem | PUT /exame (com is_liberado: true) | Paciente e/ou Médico solicitante | Somente quando permissao_imprimir_exames = true |
O backend verifica individualmente cada flag de destino:
permissao_emails_automaticos = true→ envia e-mail para oemail_pacientedo exame.enviar_email_medico_solicitante = true→ envia e-mail para oemail_solicitantedo exame.
Os dois destinos são independentes: é possível habilitar apenas um, ambos ou nenhum.
Rota e acesso
| Item | Valor |
|---|---|
| Template config empresa — aba Entrega | views/empresa/form/entregaForm.html |
| Controller empresa | empresaFormCtrl (app/controllers/empresaFormCtrl.js) |
| State (UI-Router) — listagem de exames | exames |
| URL | /exames |
| Template da listagem | views/exames/exames.html |
| Controller da listagem | examesCtrl |
| State (UI-Router) — laudário | laudo |
| URL | /laudo |
| Template do laudário | views/laudo/laudo.html |
| Controller do laudário | laudoCtrl |
| Template formulário exame | views/modais/exameForm.html |
| Controller formulário exame | exameFormCtrl |
| Template modal médico | views/modais/modalMedico.html |
| Controller modal médico | modalMedicoCtrl |
Configuração da empresa (entregaForm)
| Atributo | Valor |
|---|---|
| Arquivo | views/empresa/form/entregaForm.html |
| Aba | Entrega |
A funcionalidade de envio automático está agrupada na aba de entrega e exposta por meio de três checkboxes em cascata, todos visíveis apenas para o perfil PROPRIETÁRIO (enums.permissaoSistemaEnum().PROPRIETARIO).
Os 3 checkboxes
1. Habilitador geral — "Permitir envio de emails automáticos"
| Atributo | Valor |
|---|---|
| ID | checkbox-entrega-form-permitir-emails-automaticos |
| ng-model | empresa.empresa.emails_automaticos |
| ng-hide | Visível somente quando permissao_entrega_exames = true |
| ng-change | emailsAutomaticos(empresa.empresa.emails_automaticos) |
| Label i18n | PERMITIR_EMAILS_AUTOMATICOS → "Permitir envio de emails automáticos ao assinar, reassinar ou liberar exame" |
Ao marcar este checkbox, a função emailsAutomaticos() define simultaneamente permissao_emails_automaticos = true e enviar_email_medico_solicitante = true, habilitando os dois sub-checkboxes de uma vez. Ao desmarcar, os dois destinos são desmarcados juntos.
Os sub-checkboxes abaixo ficam visíveis apenas quando emails_automaticos = true.
2. Destino: Paciente
| Atributo | Valor |
|---|---|
| ID | checkbox-enviar-email-paciente |
| ng-model | empresa.empresa.permissao_emails_automaticos |
| ng-hide | Visível somente quando permissao_entrega_exames = true e emails_automaticos = true |
| ng-change | hidePermitirEmailsAutomaticos() |
| Label i18n | ENVIAR_EMAIL_PACIENTE → "Paciente" |
Quando habilitado, o backend envia o laudo automaticamente para o campo email_paciente do exame nos eventos de assinatura e liberação.
3. Destino: Médico Solicitante
| Atributo | Valor |
|---|---|
| ID | checkbox-enviar-email-medico-solicitante |
| ng-model | empresa.empresa.enviar_email_medico_solicitante |
| ng-hide | Visível somente quando permissao_entrega_exames = true e emails_automaticos = true |
| ng-change | hidePermitirEmailsAutomaticos() |
| Label i18n | ENVIAR_EMAIL_MEDICO_SOLICITANTE → "Médico Solicitante" |
Quando habilitado, o backend envia o laudo automaticamente para o campo email_solicitante do exame nos eventos de assinatura e liberação.

Dependências entre checkboxes
textpermissao_entrega_exames (checkbox-entrega-form-permitir-entrega-exames)└── emails_automaticos (checkbox-entrega-form-permitir-emails-automaticos)├── permissao_emails_automaticos (checkbox-enviar-email-paciente)└── enviar_email_medico_solicitante (checkbox-enviar-email-medico-solicitante)
permissao_entrega_exames = false→ todos os checkboxes filhos ficam ocultos e seus valores são zerados automaticamente (emails_automaticos,permissao_emails_automaticos,enviar_email_medico_solicitante).emails_automaticos = false→ os dois sub-checkboxes ficam ocultos.- Desmarcar ambos os sub-checkboxes →
emails_automaticosé automaticamente desmarcado.
Lógica de controle no controller
| Arquivo | app/controllers/empresaFormCtrl.js |
|---|
| Função | Trigger | Comportamento |
|---|---|---|
verificaPermissaoEmailsAutomaticos(selecionado) | ng-change do checkbox principal de entrega (permissao_entrega_exames) | Se selecionado = false, zera emails_automaticos, permissao_emails_automaticos e enviar_email_medico_solicitante. |
emailsAutomaticos(selecionado) | ng-change do checkbox habilitador geral | Define permissao_emails_automaticos e enviar_email_medico_solicitante com o mesmo valor de selecionado. |
hidePermitirEmailsAutomaticos() | ng-change de cada sub-checkbox | Se permissao_emails_automaticos e enviar_email_medico_solicitante estiverem ambos false, define emails_automaticos = false. |
Campos do exame
Campo email_paciente
| Atributo | Valor |
|---|---|
| ng-model | exame.email_paciente |
| Arquivo view | views/modais/exameForm.html |
| Arquivo model | app/domain/models/exameFormModel.js, app/domain/models/exameModel.js |
| Tipo | input[type=text] |
| Padrão aceito | E-mail válido (/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/) |
| Label i18n | EMAIL_PACIENTE → "E-mail do Paciente" |
Campo preenchido manualmente pelo usuário no formulário de criação ou edição de exame. É o endereço para o qual o backend envia o laudo automaticamente quando permissao_emails_automaticos = true.
Opção 1 - Durante a criação do exame:

Opção 2 - Ao editar os dados do paciente de um exame previamente realizado:

Campo email_solicitante
| Atributo | Valor |
|---|---|
| ng-model | exame.email_solicitante |
| Arquivo view | views/modais/exameForm.html, views/modais/modalMedico.html |
| Arquivo model | app/domain/models/exameFormModel.js, app/domain/models/exameModel.js |
| Tipo | input[type=text] com datalist autocomplete |
| Padrão aceito | E-mail válido ou CRM no formato 0000-UF |
| list | solicitanteList |
| ng-change | selecionarSolicitante(exame.email_solicitante) — preenche automaticamente medico_solicitante |
| Tooltip | Ícone fa-info-circle com chave i18n DESC_EMAIL_MEDICO_SOLICITANTE |
| Mensagem de erro | Padrão inválido → chave EMAIL_MEDICO_SOLICITANTE_ERRO |
| Label i18n | DIG_EMAIL_CRM_SOLICITANTE → "Digite Email ou CRM do Solicitante" |
Campo preenchido via datalist (autocomplete) com médicos solicitantes cadastrados na empresa. É o endereço para o qual o backend envia o laudo automaticamente quando enviar_email_medico_solicitante = true.
Opção 1 - Durante a criação do exame:

Opção 2 - Ao editar os dados da equipe médica de um exame previamente realizado:

Funções relevantes
| Controller | Função | Descrição |
|---|---|---|
exameFormCtrl | buscarMedicosSolicitantes(empresa_id) | Chama GET /usuario/solicitante/:empresa_id e popula $scope.usuariosSolicitantes para a datalist. |
exameFormCtrl | selecionarSolicitante(item) | Ao selecionar item da datalist, preenche exame.medico_solicitante com o nome do médico. Aceita e-mail ou CRM-UF. |
modalMedicoCtrl | exibirMedicoSolicitante(empresa_id) | Mesma lógica de carregamento da datalist, no contexto do modal de equipe médica. |
modalMedicoCtrl | selecionarSolicitante(item) | Versão simplificada: preenche exame.medico_solicitante pelo e-mail selecionado. |
Envio automático — fluxos de disparo
Pré-requisitos
Configurar envio automático na empresa
- Administrador acessa o formulário de cadastro/edição de empresa.
- Na aba Entrega, verifica se o checkbox "Permitir entrega de exames" (
checkbox-entrega-form-permitir-entrega-exames) está marcado — é pré-requisito para os demais. - Marca o checkbox "Permitir envio de emails automáticos ao assinar, reassinar ou liberar exame" (
checkbox-entrega-form-permitir-emails-automaticos).- Isso habilita automaticamente os dois sub-checkboxes.
- Ajusta individualmente se necessário:
- Mantém/desmarca "Paciente" (
checkbox-enviar-email-paciente) — controlapermissao_emails_automaticos. - Mantém/desmarca "Médico Solicitante" (
checkbox-enviar-email-medico-solicitante) — controlaenviar_email_medico_solicitante.
- Mantém/desmarca "Paciente" (
- Salva a empresa via botão Salvar (
btn-entrega-form-salvar). Os flags são persistidos viaempresaModel.backEmpresa().
Identificar o destino no exame
- Para envio ao paciente: preencher o campo
email_pacienteno formulário de criação ou edição do exame. - Para envio ao médico solicitante: preencher o campo
email_solicitanteno formulário de exame (exameForm.html) ou no modal de equipe médica (modalMedico.html), selecionando um usuário da datalist ou digitando e-mail/CRM válido.
Fluxo 1 — Assinar exame (não assinado)
-
Na listagem de exames, o usuário clica no ícone do laudário (
btn-laudario-{{exame.id}}) em um exame com status diferente de1,5e9.
-
examesCtrl.buscarEAcessarLaudo(exame)executaabrirLaudario(), que chamaPOST /exame/laudario/verify/{id}com{ resign: false }para validar e preparar a sessão. -
O laudário é aberto em
/laudo. -
O usuário redige o laudo e clica em Assinar (
btn-assinar-laudo).
-
signReportButtonEvent(false)→saveReport→signReport→laudoHttpService.assinarLaudo(laudo)→PUT /laudo/assinar. -
O backend, dado que
permissao_imprimir_exames = false, verifica os flags de destino:- Se
permissao_emails_automaticos = truee o exame tiveremail_pacientepreenchido → envia o laudo ao paciente. - Se
enviar_email_medico_solicitante = truee o exame tiveremail_solicitantepreenchido → envia o laudo ao médico solicitante.
- Se
Fluxo 2 — Reassinar exame (já assinado)
-
Na listagem, o usuário clica no ícone do laudário em um exame com status
1ou5. -
examesCtrl.buscarLaudo(exame.id)abre um dropdown com as opções do laudo assinado. -
O usuário clica em Reassinar (
btn-reassinar-laudo-{{exame.id}}), acionandoreassinar(ev, exame, laudo).
-
Se a empresa exige motivo: abre o modal
modalMotivoCtrl. Após confirmação,buscarEAcessarLaudo(exame, ..., resign=true)é chamado.
-
Se não exige motivo:
buscarEAcessarLaudoé chamado diretamente. -
abrirLaudario()chamaPOST /exame/laudario/verify/{id}com{ resign: true }. O laudário abre com o laudo anterior carregado. -
O usuário clica em Assinar →
PUT /laudo/assinar→ backend repete a mesma verificação de flags e envia os e-mails conforme configuração.
Fluxo 3 — Liberar exame
Pré-requisito: O botão de liberar (
btn-liberar-exame-{{exame.id}}) só é renderizado na listagem quandoexame.empresa.permissao_imprimir_exames = true. Se essa opção não estiver habilitada na empresa, este fluxo não existe e o e-mail automático não é disparado na liberação.

-
Na listagem, o usuário clica no ícone "+" em um exame com status
1ou5e não liberado. -
Clica em Liberar (
btn-liberar-exame-{{exame.id}}), acionandoexamesCtrl.liberar(exame). -
Um
$mdDialog.confirm()solicita confirmação.
-
Após confirmar,
_mudarLiberacaoExameModal(exame)alternais_liberadoparatruee chamaexameHttpServices.atualizarExame()→PUT /exame. -
O backend, ao processar com
is_liberado: true, verifica os flags e:- Se
permissao_emails_automaticos = true→ envia aoemail_paciente. - Se
enviar_email_medico_solicitante = true→ envia aoemail_solicitante.
- Se
-
O front abre
modalLiberarCtrl(views/modais/modalLiberar.html) com opções para imprimir ou copiar o laudo.
Models
empresaModel
| Arquivo | app/domain/models/empresaModel.js |
|---|
| Campo | Tipo | Descrição |
|---|---|---|
emails_automaticos | boolean | Campo derivado no frontend. Calculado como !!(enviar_email_medico_solicitante || permissao_emails_automaticos) na função front(). Controla a visibilidade dos sub-checkboxes e é zerado ao desabilitar ambos. Não é persistido isoladamente via API. |
permissao_emails_automaticos | boolean → 1/0 via backEmpresa() | Flag de envio automático ao paciente. Persistido via API. |
enviar_email_medico_solicitante | boolean → true/false via backEmpresa() | Flag de envio automático ao médico solicitante. Persistido via API. |
exameModel
| Arquivo | app/domain/models/exameModel.js |
|---|
| Campo | Uso |
|---|---|
email_paciente | E-mail do paciente — presente nas funções de mapeamento front e back (linhas 477, 625). |
email_solicitante | E-mail/CRM do médico solicitante — presente nas funções de mapeamento (linhas 530, 592, 638). |
exameFormModel
| Arquivo | app/domain/models/exameFormModel.js |
|---|
| Campo | Uso |
|---|---|
email_paciente | Mapeamento para o formulário de criação/edição (linhas 34, 120, 169). |
email_solicitante | Mapeamento para o formulário de criação/edição (linhas 50, 132, 172). |
Serviços HTTP
laudoHttpService
| Arquivo | app/services/http/laudoHttpService.js |
|---|
| Método | HTTP | URL | Descrição |
|---|---|---|---|
assinarLaudo(laudo) | PUT | /laudo/assinar | Assina o laudo. O backend dispara e-mail ao paciente se permissao_emails_automaticos = true e ao médico solicitante se enviar_email_medico_solicitante = true. Mesmo endpoint para assinatura e reassinatura. |
exameHttpServices
| Arquivo | app/services/http/exameHttpServices.js |
|---|
| Método | HTTP | URL | Descrição |
|---|---|---|---|
abrirLaudario(exameId, options) | POST | /exame/laudario/verify/:exame_id | Valida e prepara a sessão do laudário. Não dispara e-mail. Body: { options: { resign: bool } }. |
atualizarExame(exame) | PUT | /exame | Atualiza o exame. Quando is_liberado: true, o backend dispara e-mail ao paciente e/ou médico solicitante conforme flags habilitados. |
usuarioHttpService
| Arquivo | app/services/http/usuarioHttpService.js |
|---|
| Método | HTTP | URL | Descrição |
|---|---|---|---|
buscaUsuariosSolicitantes(empresa_id) | GET | /usuario/solicitante/:empresa_id | Retorna lista de usuários solicitantes da empresa para preencher a datalist do campo email_solicitante. |
i18n
| Chave | Valor (pt-br) | Uso |
|---|---|---|
PERMITIR_ENTREGA_EXAMES | "Permitir entrega de exames" | Label do checkbox principal de entrega — pré-requisito para os emails automáticos. |
PERMITIR_EMAILS_AUTOMATICOS | "Permitir envio de emails automáticos ao assinar, reassinar ou liberar exame" | Label do checkbox habilitador geral de emails automáticos. |
ENVIAR_EMAIL_PACIENTE | "Paciente" | Label do sub-checkbox de envio ao paciente. |
ENVIAR_EMAIL_MEDICO_SOLICITANTE | "Médico Solicitante" | Label do sub-checkbox de envio ao médico solicitante. |
EMAIL_PACIENTE | "E-mail do Paciente" | Label do campo email_paciente no formulário de exame. |
DIG_EMAIL_CRM_SOLICITANTE | "Digite Email ou CRM do Solicitante" | Label do campo email_solicitante no formulário de exame. |
EMAIL_MEDICO_SOLICITANTE_ERRO | "Digite um E-mail ou um CRM (CRM-UF) valido" | Mensagem de validação do campo email_solicitante com padrão inválido. |
DESC_EMAIL_MEDICO_SOLICITANTE | (tooltip) | Tooltip do campo email_solicitante explicando a relação com a tag DICOM Referring Physician's Name. |
Âncoras de referência
| Âncora | Conteúdo |
|---|---|
#visão-geral | Tabela dos 3 eventos disparadores e os dois destinos de envio. |
#rota-e-acesso | States, URLs e arquivos envolvidos. |
#configuração-da-empresa-entregaform | Os 3 checkboxes da aba de entrega e suas dependências. |
#dependências-entre-checkboxes | Estrutura em cascata dos flags. |
#lógica-de-controle-no-controller | Funções do controller que controlam os flags. |
#campos-do-exame | Campos email_paciente e email_solicitante no exame. |
#envio-automático--fluxos-de-disparo | Pré-requisitos e 3 fluxos de disparo (assinar, reassinar, liberar). |
#models | Campos relevantes em empresaModel, exameModel e exameFormModel. |
#serviços-http | Endpoints de assinatura, liberação e busca de solicitantes. |
#i18n | Chaves de tradução utilizadas na feature. |
Written by: Lucas Côrte Galdino de Freitas
Last modified: 24/04/2026
© 2026 Mobilemed. Todos os direitos reservados.