Skip to main content

TOTVS — Ficha de Integração

Integração bidirecional com o ecossistema TOTVS: recebimento de pedidos via gateway e devolução de laudos ao RIS do cliente via adapter outbound.

Referência OpenAPI — POST /exam/redirect

:::info Classificação

  • T1 (inbound): POST /exam/pedido/totvs — TOTVS envia pedidos à Mobilemed.
  • T2 (outbound): adapter totvs em POST /exam/redirect — Mobilemed envia laudo ao endpoint configurado em tb_integracao_config.url. :::

Identificação

CampoValor
TipoT2 (adapter outbound) + rota inbound específica
adapter_keytotvs
Classeadapters/TotvsAdapter.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
InboundPOST/exam/pedido/totvs(vazio — qualquer config ativa da integração)Recebe pedidos TOTVS, grava MongoDB e gera worklist
OutboundPOST/exam/redirectREDIRECTConverte laudo e envia ao url do adapter totvs

:::caution OpenAPI A rota POST /exam/pedido/totvs não está documentada em swaggerDocs.json hoje. O contrato outbound genérico está em 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).


Configuração (banco)

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

CampoValor típicoObservação
adaptertotvsDeve bater com adapters/index.js
acaoREDIRECTMapeada pelo middleware em POST /exam/redirect
urlURL do endpoint TOTVS do clienteSuporta [#variable#] via convertUrlVariable
reportFormatRTF, TEXT, HTML ou PDFNo modo legado, o adapter gera RTF e TEXT independentemente
tipo_envioJSONPayload enviado como JSON no POST outbound
base64conforme clienteRepassado ao ReportConvertedService
auth_typeTOKEN, BASIC_AUTH ou DEFAULTVer seção Autenticação
automatic_retryconforme tb_integracaoUsado pelo RetryService no fluxo de redirect
medico_padrao_nome / medico_padrao_crmse aplicávelNão usados diretamente pelo TotvsAdapter
additional_settings.alternativeBodytrue / ausenteAlterna entre payload estruturado TOTVS e payload legado
additional_settings.resultOriginex. "Imaging"Só no modo alternativeBody; default "Imaging"
additional_settings.alternativeMethodex. "put"Método HTTP alternativo no externalRequest
additional_settings.validateTokense aplicávelValida token antes do redirect
headers_adicionaisJSON em tb_integracaoHeaders extras no POST outbound

Autenticação

Inbound (gateway → Mobilemed)

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

Outbound (Mobilemed → TOTVS)

Resolvida em exam.service.jsredirect():

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 — POST /exam/pedido/totvs

Corpo esperado (recebePedidoTotvs):

json
{
"orders": [
{
"serviceOrderDate": "2026-01-15T10:30:00",
"patient": {
"patientId": 12345,
"name": "Paciente Exemplo",
"birthDate": "1980-05-20",
"gender": "M",
"cpf": "00000000000"
},
"exams": [
{
"examId": 987,
"description": "RX Tórax PA",
"modality": "CR",
"code": "ACC-2026-001"
}
],
"medicalInsurance": { "name": "Convênio Exemplo" },
"practitioner": { "name": "Dr. Solicitante" }
}
]
}

Comportamento:

  • Valida campos obrigatórios; retorna 400 se faltarem.
  • Deriva accessionNumber de exam.code (remove não-dígitos).
  • Cria registro de worklist por exame.
  • Persiste pedido completo em MongoDB (pedidoTotvs).

Resposta sucesso: { "message": "Orders received successfully" }.

Outbound — modo legado (alternativeBody ausente ou false)

Payload montado por TotvsAdapter.apply() e enviado ao url:

json
{
"accessionNumber": "2026001001",
"Laudortf": "<conteúdo RTF em base64 ou string conforme reportFormat>",
"Laudotxt": "<conteúdo TEXT>"
}

O adapter sempre gera dois formatos (RTF com assinatura/data + TEXT), alternando reportFormat internamente.

Outbound — modo alternativeBody: true

Requer pedido prévio em MongoDB (via /exam/pedido/totvs). Busca por exams.accessionNumber.

json
{
"Id": "<sha256 aleatório>",
"CompanyId": 1,
"ResultId": "<id do laudo convertido>",
"Identification": "<identification do pedido>",
"ProcessingDate": "<ultima_data_laudo>",
"ResultOrigin": "Imaging",
"Action": "I",
"PatientId": 12345,
"OriginPatientId": "<patient.code>",
"ServiceOrder": 100,
"OriginServiceOrder": "<code do pedido>",
"AttendanceId": 200,
"OriginAttendanceId": "<attendance.code>",
"Base64Content": "<laudo convertido>",
"Exam": {
"CompanyId": 1,
"ServiceOrder": 100,
"ExamId": 987,
"Sequential": 1,
"OriginExamId": "<exam.code>",
"MethodDescription": "RX Tórax PA",
"Results": []
}
}
CampoRegra
Action"I" se status_id === 1 (assinado); "A" caso contrário
ResultOriginDefault "Imaging"; sobrescrevível via additional_settings.resultOrigin

Erros comuns (outbound)

ErroCausa
order not found for accession number {acc}Modo alternativeBody sem pedido prévio no MongoDB
Erro ao redirecionar exame devido a laudo ainda não processadoLaudo sem PDF processado
BLOCKED_BY_CONFIGBloqueio por redirectConditionals em additional_settings
404 No integration foundToken inválido/inativo ou config acao=REDIRECT ausente

Idempotência / retry

  • Exames com status_id = 5 (revisão) passam por lógica de retentativa (RetryService) no controller redirect.
  • automatic_retry em tb_integracao controla retentativas automáticas.
  • Modo alternativeBody gera Id aleatório (SHA-256) a cada envio — não é idempotente por design.

Operação

ItemDetalhe
Código adaptermm-pacs-public-api/adapters/TotvsAdapter.js
Controller inboundcontrollers/exam.controllers.jsrecebePedidoTotvs
Controller outboundcontrollers/exam.controllers.jsredirect
Service outboundservices/exam.service.jsredirect()
Persistência pedidosMongoDB collection pedidoTotvs (mongodb/PedidoTOTVS.js)
Deploy / runbooka confirmar
MonitoramentoLogs de integração (tipo 42 no redirect); logs de erro em recebePedidoTotvs
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/totvs
Ficha no repodocs/interfaceReference/integrations/totvs/index.md