Skip to main content

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

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_examesAssinarReassinarLiberar
false (desabilitado)Envia e-mailEnvia e-mailBotão não existe
true (habilitado)Não enviaNão enviaEnvia 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.

EventoEndpointDestino(s)Condição de disparo
Assinar exame no laudárioPUT /laudo/assinarPaciente e/ou Médico solicitanteSomente quando permissao_imprimir_exames = false
Reassinar exame no laudárioPUT /laudo/assinar (com resign: true)Paciente e/ou Médico solicitanteSomente quando permissao_imprimir_exames = false
Liberar exame na listagemPUT /exame (com is_liberado: true)Paciente e/ou Médico solicitanteSomente quando permissao_imprimir_exames = true

O backend verifica individualmente cada flag de destino:

  • permissao_emails_automaticos = true → envia e-mail para o email_paciente do exame.
  • enviar_email_medico_solicitante = true → envia e-mail para o email_solicitante do exame.

Os dois destinos são independentes: é possível habilitar apenas um, ambos ou nenhum.


Rota e acesso

ItemValor
Template config empresa — aba Entregaviews/empresa/form/entregaForm.html
Controller empresaempresaFormCtrl (app/controllers/empresaFormCtrl.js)
State (UI-Router) — listagem de examesexames
URL/exames
Template da listagemviews/exames/exames.html
Controller da listagemexamesCtrl
State (UI-Router) — laudáriolaudo
URL/laudo
Template do laudárioviews/laudo/laudo.html
Controller do laudáriolaudoCtrl
Template formulário exameviews/modais/exameForm.html
Controller formulário exameexameFormCtrl
Template modal médicoviews/modais/modalMedico.html
Controller modal médicomodalMedicoCtrl

Configuração da empresa (entregaForm)

AtributoValor
Arquivoviews/empresa/form/entregaForm.html
AbaEntrega

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"

AtributoValor
IDcheckbox-entrega-form-permitir-emails-automaticos
ng-modelempresa.empresa.emails_automaticos
ng-hideVisível somente quando permissao_entrega_exames = true
ng-changeemailsAutomaticos(empresa.empresa.emails_automaticos)
Label i18nPERMITIR_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

AtributoValor
IDcheckbox-enviar-email-paciente
ng-modelempresa.empresa.permissao_emails_automaticos
ng-hideVisível somente quando permissao_entrega_exames = true e emails_automaticos = true
ng-changehidePermitirEmailsAutomaticos()
Label i18nENVIAR_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

AtributoValor
IDcheckbox-enviar-email-medico-solicitante
ng-modelempresa.empresa.enviar_email_medico_solicitante
ng-hideVisível somente quando permissao_entrega_exames = true e emails_automaticos = true
ng-changehidePermitirEmailsAutomaticos()
Label i18nENVIAR_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.

Aba Entrega — checkboxes de envio automático habilitados


Dependências entre checkboxes

text
permissao_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

Arquivoapp/controllers/empresaFormCtrl.js
FunçãoTriggerComportamento
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 geralDefine permissao_emails_automaticos e enviar_email_medico_solicitante com o mesmo valor de selecionado.
hidePermitirEmailsAutomaticos()ng-change de cada sub-checkboxSe permissao_emails_automaticos e enviar_email_medico_solicitante estiverem ambos false, define emails_automaticos = false.

Campos do exame

Campo email_paciente

AtributoValor
ng-modelexame.email_paciente
Arquivo viewviews/modais/exameForm.html
Arquivo modelapp/domain/models/exameFormModel.js, app/domain/models/exameModel.js
Tipoinput[type=text]
Padrão aceitoE-mail válido (/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/)
Label i18nEMAIL_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:

Campo E-mail do Paciente no formulário de exame

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

Campo E-mail do Paciente no formulário de exame

Campo email_solicitante

AtributoValor
ng-modelexame.email_solicitante
Arquivo viewviews/modais/exameForm.html, views/modais/modalMedico.html
Arquivo modelapp/domain/models/exameFormModel.js, app/domain/models/exameModel.js
Tipoinput[type=text] com datalist autocomplete
Padrão aceitoE-mail válido ou CRM no formato 0000-UF
listsolicitanteList
ng-changeselecionarSolicitante(exame.email_solicitante) — preenche automaticamente medico_solicitante
TooltipÍcone fa-info-circle com chave i18n DESC_EMAIL_MEDICO_SOLICITANTE
Mensagem de erroPadrão inválido → chave EMAIL_MEDICO_SOLICITANTE_ERRO
Label i18nDIG_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:

Campo Identificação do Solicitante com datalist no formulário de exame

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

Campo Identificação do Solicitante com datalist no formulário de exame

Funções relevantes

ControllerFunçãoDescrição
exameFormCtrlbuscarMedicosSolicitantes(empresa_id)Chama GET /usuario/solicitante/:empresa_id e popula $scope.usuariosSolicitantes para a datalist.
exameFormCtrlselecionarSolicitante(item)Ao selecionar item da datalist, preenche exame.medico_solicitante com o nome do médico. Aceita e-mail ou CRM-UF.
modalMedicoCtrlexibirMedicoSolicitante(empresa_id)Mesma lógica de carregamento da datalist, no contexto do modal de equipe médica.
modalMedicoCtrlselecionarSolicitante(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

  1. Administrador acessa o formulário de cadastro/edição de empresa.
  2. Na aba Entrega, verifica se o checkbox "Permitir entrega de exames" (checkbox-entrega-form-permitir-entrega-exames) está marcado — é pré-requisito para os demais.
  3. 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.
  4. Ajusta individualmente se necessário:
    • Mantém/desmarca "Paciente" (checkbox-enviar-email-paciente) — controla permissao_emails_automaticos.
    • Mantém/desmarca "Médico Solicitante" (checkbox-enviar-email-medico-solicitante) — controla enviar_email_medico_solicitante.
  5. Salva a empresa via botão Salvar (btn-entrega-form-salvar). Os flags são persistidos via empresaModel.backEmpresa().

Identificar o destino no exame

  • Para envio ao paciente: preencher o campo email_paciente no formulário de criação ou edição do exame.
  • Para envio ao médico solicitante: preencher o campo email_solicitante no 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)

  1. Na listagem de exames, o usuário clica no ícone do laudário (btn-laudario-{{exame.id}}) em um exame com status diferente de 1, 5 e 9.

    Botão Abrir laudário

  2. examesCtrl.buscarEAcessarLaudo(exame) executa abrirLaudario(), que chama POST /exame/laudario/verify/{id} com { resign: false } para validar e preparar a sessão.

  3. O laudário é aberto em /laudo.

  4. O usuário redige o laudo e clica em Assinar (btn-assinar-laudo).

    Botão Assinar no laudário

  5. signReportButtonEvent(false)saveReportsignReportlaudoHttpService.assinarLaudo(laudo)PUT /laudo/assinar.

  6. O backend, dado que permissao_imprimir_exames = false, verifica os flags de destino:

    • Se permissao_emails_automaticos = true e o exame tiver email_paciente preenchido → envia o laudo ao paciente.
    • Se enviar_email_medico_solicitante = true e o exame tiver email_solicitante preenchido → envia o laudo ao médico solicitante.

Fluxo 2 — Reassinar exame (já assinado)

  1. Na listagem, o usuário clica no ícone do laudário em um exame com status 1 ou 5.

  2. examesCtrl.buscarLaudo(exame.id) abre um dropdown com as opções do laudo assinado.

  3. O usuário clica em Reassinar (btn-reassinar-laudo-{{exame.id}}), acionando reassinar(ev, exame, laudo).

    Botão Abrir laudário

  4. Se a empresa exige motivo: abre o modal modalMotivoCtrl. Após confirmação, buscarEAcessarLaudo(exame, ..., resign=true) é chamado.

    Selecionar Motivo

  5. Se não exige motivo: buscarEAcessarLaudo é chamado diretamente.

  6. abrirLaudario() chama POST /exame/laudario/verify/{id} com { resign: true }. O laudário abre com o laudo anterior carregado.

  7. O usuário clica em AssinarPUT /laudo/assinar → backend repete a mesma verificação de flags e envia os e-mails conforme configuração.

    Botão Assinar no laudário


Fluxo 3 — Liberar exame

Pré-requisito: O botão de liberar (btn-liberar-exame-{{exame.id}}) só é renderizado na listagem quando exame.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.

Habilitar liberação de exames

  1. Na listagem, o usuário clica no ícone "+" em um exame com status 1 ou 5 e não liberado.

  2. Clica em Liberar (btn-liberar-exame-{{exame.id}}), acionando examesCtrl.liberar(exame).

  3. Um $mdDialog.confirm() solicita confirmação.

    Liberar exame

  4. Após confirmar, _mudarLiberacaoExameModal(exame) alterna is_liberado para true e chama exameHttpServices.atualizarExame()PUT /exame.

  5. O backend, ao processar com is_liberado: true, verifica os flags e:

    • Se permissao_emails_automaticos = true → envia ao email_paciente.
    • Se enviar_email_medico_solicitante = true → envia ao email_solicitante.
  6. O front abre modalLiberarCtrl (views/modais/modalLiberar.html) com opções para imprimir ou copiar o laudo.

    Exame liberado


Models

empresaModel

Arquivoapp/domain/models/empresaModel.js
CampoTipoDescrição
emails_automaticosbooleanCampo 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_automaticosboolean1/0 via backEmpresa()Flag de envio automático ao paciente. Persistido via API.
enviar_email_medico_solicitantebooleantrue/false via backEmpresa()Flag de envio automático ao médico solicitante. Persistido via API.

exameModel

Arquivoapp/domain/models/exameModel.js
CampoUso
email_pacienteE-mail do paciente — presente nas funções de mapeamento front e back (linhas 477, 625).
email_solicitanteE-mail/CRM do médico solicitante — presente nas funções de mapeamento (linhas 530, 592, 638).

exameFormModel

Arquivoapp/domain/models/exameFormModel.js
CampoUso
email_pacienteMapeamento para o formulário de criação/edição (linhas 34, 120, 169).
email_solicitanteMapeamento para o formulário de criação/edição (linhas 50, 132, 172).

Serviços HTTP

laudoHttpService

Arquivoapp/services/http/laudoHttpService.js
MétodoHTTPURLDescrição
assinarLaudo(laudo)PUT/laudo/assinarAssina 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

Arquivoapp/services/http/exameHttpServices.js
MétodoHTTPURLDescrição
abrirLaudario(exameId, options)POST/exame/laudario/verify/:exame_idValida e prepara a sessão do laudário. Não dispara e-mail. Body: { options: { resign: bool } }.
atualizarExame(exame)PUT/exameAtualiza o exame. Quando is_liberado: true, o backend dispara e-mail ao paciente e/ou médico solicitante conforme flags habilitados.

usuarioHttpService

Arquivoapp/services/http/usuarioHttpService.js
MétodoHTTPURLDescrição
buscaUsuariosSolicitantes(empresa_id)GET/usuario/solicitante/:empresa_idRetorna lista de usuários solicitantes da empresa para preencher a datalist do campo email_solicitante.

i18n

ChaveValor (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

ÂncoraConteúdo
#visão-geralTabela dos 3 eventos disparadores e os dois destinos de envio.
#rota-e-acessoStates, URLs e arquivos envolvidos.
#configuração-da-empresa-entregaformOs 3 checkboxes da aba de entrega e suas dependências.
#dependências-entre-checkboxesEstrutura em cascata dos flags.
#lógica-de-controle-no-controllerFunções do controller que controlam os flags.
#campos-do-exameCampos email_paciente e email_solicitante no exame.
#envio-automático--fluxos-de-disparoPré-requisitos e 3 fluxos de disparo (assinar, reassinar, liberar).
#modelsCampos relevantes em empresaModel, exameModel e exameFormModel.
#serviços-httpEndpoints de assinatura, liberação e busca de solicitantes.
#i18nChaves 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.