Skip to main content

AGFA — Ficha de Integração

Integração outbound com o RIS AGFA: após o exame ser laudado, a Public API monta um envelope dadosIntegracao (paciente, exame, médico e corpo do laudo) e envia ao endpoint configurado no cliente.

Referência OpenAPI — POST /exam/redirect

:::info Classificação

  • T2 (outbound): adapter agfa em POST /exam/redirect — Mobilemed envia laudo ao url de tb_integracao_config.
  • T1 (inbound): não se aplica — não há rota gateway específica AGFA no código. :::

Identificação

CampoValor
TipoT2 (adapter outbound)
adapter_keyagfa
Classeadapters/AgfaAdapter.js
Cliente/tenantMulti-tenant (configurado por tb_integracao)
Statusativo
Owner squada confirmar
Contato técnico clientea confirmar
Última revisão2026-08-14

Escopo

Fluxo completo

Rotas envolvidas

DireçãoMétodoRotaacao (middleware)Função
OutboundPOST/exam/redirectREDIRECTConverte laudo e envia ao url do adapter agfa

O adapter implementa apenas apply(). Não há override de notify(), getRequests nem _validateToken. POST /exam/notify usaria IntegrationAdapter.notify() vazio — não é o contrato deste adapter.

:::caution OpenAPI Não existe path /exam/agfa (nem equivalente) em swaggerDocs.json. O contrato HTTP do gateway é o genérico Integra exame (POST /exam/redirect). :::

Ambientes

AmbienteBase URL
Homologaçãohttps://gateway-homolog.mobilemed.com.br/api-public
Produçãohttps://integracao.mobilemed.com.br/v1

Headers obrigatórios no gateway: token, api (mob ou one).

:::caution Ambiente do footer AgfaAdapter.js carrega modelos com require("../models")("mob") no topo do arquivo. A busca de rodapé (ExameLaudoFooter) sempre usa o banco mob, independentemente do header api. :::


Configuração (banco)

Registros em tb_integracao + tb_integracao_config (models/IntegrationConfig.js).

CampoValor típicoObservação
adapteragfaDeve bater com adapters/index.js
acaoREDIRECTMapeada pelo middleware em POST /exam/redirect
urlURL do endpoint AGFA do clienteAgfaAdapter não implementa convertUrlVariable; URL com [#variable#] falharia no redirect()
reportFormatHTML, RTF, PDF ou TEXTPassado a ReportConvertedService.convert()
tipo_envioJSONPayload é objeto JS; redirect() envia como JSON quando tipo_envio === "JSON"
base64conforme clienteRepassado ao conversor de laudo
auth_typeTOKEN, BASIC_AUTH ou DEFAULTVer seção Autenticação
automatic_retryconforme tb_integracaoUsado pelo RetryService no fluxo de redirect
medico_padrao_nomestringUsado em medico_executante quando medico_padrao_crm está preenchido
medico_padrao_crm{crm}-{uf}Ex.: 123456-SP — split por -; se vazio, usa study.medico
additional_settings.versionex. "2016.4.2.40"Default no código: "2016.4.2.40"
additional_settings.site_identifierstring ou nullDefault: null
additional_settings.alternativeMethodex. "put"Método HTTP alternativo no externalRequest (fluxo genérico de redirect())
headers_adicionaisJSON em tb_integracaoHeaders extras no POST outbound

Pré-requisito de conteúdo: a empresa precisa de registro em tb_exame_laudo_footer (models/ExameLaudoFooter.js). Placeholders substituídos no HTML: [#laudadoDate] (DD/MM/YYYY) e [#laudadoTime] (HH:mm), a partir de study.ultima_data_laudo em UTC.


Autenticação

Inbound (gateway → Mobilemed)

HeaderObrigatórioDescrição
tokensimToken da integração (tb_integracao.token)
apisimAmbiente: mob ou one

Outbound (Mobilemed → AGFA)

Resolvida em exam.service.jsredirect() (o adapter não monta headers):

auth_type (config ou integração)Comportamento
TOKEN + token_nameHeader dinâmico: {token_name}: {client_token}
BASIC_AUTHHeader Authorization: Basic {base64(user:pass)}
DEFAULTHerda auth_type / credenciais de tb_integracao

Credenciais adicionais podem ser injetadas via headers_adicionais (JSON).

Rotação de credenciais: a confirmar (responsável / data).


Contrato

Inbound

Não se aplica.

Outbound — POST /exam/redirectAgfaAdapter.apply()

Antes de converter o laudo, o adapter:

  1. Resolve o médico executante (getDefaultPhysicianInfo).
  2. Se há médico padrão, anexa ao HTML do laudo um bloco centralizado com study.medico (nome + CRM/{UF} {crm}) — o payload continua com o médico padrão.
  3. Anexa o rodapé da empresa (addRodapeInfo).
  4. Converte o HTML via ReportConvertedService.

Payload enviado ao url:

json
{
"dadosIntegracao": {
"exame_id": 1001,
"message_datetime": "20260814120000",
"message_id": "<nanoid 36 chars>",
"version": "2016.4.2.40",
"site_identifier": null,
"codigo_pedido": "PED-001",
"accession_number": "2026001001",
"study_date": "20260810143000",
"study_description": "RX Torax PA",
"requested_preocedure_name": "RX Torax PA",
"patient_id": "PAC001",
"patient_name": "Paciente Exemplo",
"patient_birth_date": "19800520",
"patient_sex": "M",
"medico_executante": "Dr. Exemplo",
"medico_crm": "123456",
"report_sign_datetime": "20260814114500",
"report_body": "<conteúdo convertido conforme reportFormat>"
}
}
CampoRegra no código
message_datetimemoment() local, formato YYYYMMDDHHmmss
message_idnanoid(36) — novo a cada envio
versionadditional_settings.version ou "2016.4.2.40"
site_identifieradditional_settings.site_identifier ou null
study_datedata_realizacao em UTC → YYYYMMDDHHmmss
patient_birth_dateaniversario_pacienteYYYYMMDD, ou null
patient_sex"M" se sexo_paciente_id == 1; senão "F"
report_sign_datetimeultima_data_laudo em UTC, ou moment() se nulo
requested_preocedure_nameCópia de estudo_descricao — o nome do campo no código contém o typo preocedure
medico_executante / medico_crmMédico padrão (crm = parte antes de -) ou study.medico.nome / study.medico.crm

Erros comuns (outbound)

ErroCausa
TypeError ao acessar htmlFooter.htmlEmpresa sem registro em tb_exame_laudo_footer (findOne retorna null)
Falha em study.medico.estado.ufAssociação medico/estado ausente ao montar o bloco HTML do médico padrão
Erro ao redirecionar exame devido a laudo ainda não processadoLaudo sem pdf_path (fluxo genérico de redirect())
BLOCKED_BY_CONFIGBloqueio por redirectConditionals em additional_settings
404 No integration foundToken inválido/inativo ou config acao=REDIRECT ausente
adapter.convertUrlVariable is not a functionurl contém [#variable#] e o AgfaAdapter não implementa o método

Idempotência / retry

  • Exames com status_id = 5 passam pela lógica de retentativa (RetryService) no controller redirect.
  • automatic_retry em tb_integracao controla retentativas automáticas.
  • message_id é gerado com nanoid(36) a cada apply()não é idempotente por design.

Operação

ItemDetalhe
Código adaptermm-pacs-public-api/adapters/AgfaAdapter.js
Registro da chaveadapters/index.jsagfa: AgfaAdapter
Controller outboundcontrollers/exam.controllers.jsredirect
Service outboundservices/exam.service.jsredirect()
Conversão de laudoservices/reportConverter.service.js
Rodapémodels/ExameLaudoFooter.js (tb_exame_laudo_footer)
Deploy / runbooka confirmar
MonitoramentoLogs de integração no fluxo de redirect (tipo 42)
Escalaçãoa confirmar

Evidências

  • Homologação: a confirmar (responsável / data)
  • Payloads de exemplo acima são anonimizados — não incluir PHI em PRs ou Bitrix

Rastreio

ItemValor
Tarefa Bitrixa confirmar
PR códigoa confirmar
PR documentaçãoa confirmar
URL publicada/docs/interfaceReference/integrations/agfa
Ficha no repodocs/interfaceReference/integrations/agfa/index.md