Skip to main content

Política de SLA por prioridade e modalidade — API

Define o prazo de laudo (em minutos) por prioridade de exame e, opcionalmente, por modalidade, com uma agenda semanal de janelas ativas. É a política base sobre a qual o cap de protocolo clínico pode atuar depois.

Funcionamento​

  1. Autentica (JwtAuthenticationGuard) e autoriza (AuthorizationGuard) a permissão sla:read (leitura) ou sla:write/sla:delete (escrita) no escopo do tenantId/unitId do path.
  2. Confirma que o tenant está ativo (GET/PUT de tenant) ou que a unidade está ativa e pertence a um tenant ativo (GET/PUT/DELETE de unidade) — resolvido pelo diretório de organização. Não encontrado/inativo → 404.
  3. Leitura (GET): monta a política efetiva — para cada uma das 6 prioridades × (nenhuma modalidade + 14 modalidades), resolve a primeira regra que casar na cascata unidade → tenant → padrão do sistema (ver Escopos e herança na visão geral) e devolve também os overrides próprios do escopo consultado.
  4. Escrita (PUT): valida o corpo (ver Body), confere a versão esperada (e, para unidade, a versão esperada do tenant herdado), substitui toda a lista de overrides do escopo de uma vez (não é um merge) e audita a mudança. Devolve a política efetiva recalculada.
  5. Restaurar uma regra (DELETE .../rules/:priority): só existe para unidade. Remove o override exato (prioridade + modalidade, se informada) e a unidade volta a herdar do tenant/sistema para aquela combinação. Se esse override exato não existir, 404.

Endpoints​

MétodoRotaDescrição
GET/v1/tenants/:tenantId/sla-policyLê a política efetiva do tenant (overrides do tenant + padrão do sistema)
PUT/v1/tenants/:tenantId/sla-policySubstitui todos os overrides de SLA do tenant
GET/v1/units/:unitId/sla-policyLê a política efetiva da unidade (overrides da unidade + do tenant herdado + padrão do sistema)
PUT/v1/units/:unitId/sla-policySubstitui todos os overrides de SLA da unidade
DELETE/v1/units/:unitId/sla-policy/rules/:priorityRestaura uma regra exata da unidade para o valor herdado

Versão: v1

Swagger: Diagnosis — SLA policy · Rota (Dev): http://localhost:3000/v1/tenants/:tenantId/sla-policy

Lógica de decisão (autenticação, autorização, existência do escopo, validação e versão → desfechos):

Permissões​

RotaGuardsPermissão exigidaEscopo
GET /tenants/:tenantId/sla-policyJwtAuthenticationGuard, AuthorizationGuardsla:readtenant (path tenantId)
PUT /tenants/:tenantId/sla-policyidemsla:writetenant (path tenantId)
GET /units/:unitId/sla-policyidemsla:readunit (path unitId)
PUT /units/:unitId/sla-policyidemsla:writeunit (path unitId)
DELETE /units/:unitId/sla-policy/rules/:priorityidemsla:deleteunit (path unitId)

Sem token → 401. Sem a permissão no escopo do path → 403. Não há rota de restauração de regra para tenant — o DELETE de regra exata só existe no escopo de unidade.

Headers​

HeaderObrigatórioDescrição
AuthorizationSimBearer <token>

Path parameters​

NomeTipoObrigatórioDescrição
tenantIduuidSim (rotas de tenant)ParseUUIDPipe — formato inválido → 400
unitIduuidSim (rotas de unidade)ParseUUIDPipe — formato inválido → 400
priorityenum ExamPrioritySim (DELETE .../rules/:priority)ParseEnumPipe — valor fora do enum → 400

Query parameters​

DELETE /units/:unitId/sla-policy/rules/:priority:

NomeTipoObrigatórioDefaultDescrição
expectedVersioninteger ≥ 0Sim—Versão da política da unidade que o cliente leu por último
modalityenum ExamModalityNãonull (regra "só prioridade")Modalidade do override exato a restaurar

GET não recebe query parameters.

Body​

ReplaceDiagnosisSlaPolicyRequest (tenant) / ReplaceDiagnosisUnitSlaPolicyRequest (unidade, estende o de tenant):

json
{
"expectedVersion": 3,
"expectedTenantVersion": 5,
"overrides": [
{
"priority": "EMERGENCY",
"modality": "CT",
"slaMinutes": 60,
"days": [
{ "weekday": 0, "mode": "ALL_DAY", "startTime": null, "endTime": null },
{ "weekday": 1, "mode": "WINDOW", "startTime": "08:00", "endTime": "18:00" },
{ "weekday": 2, "mode": "WINDOW", "startTime": "08:00", "endTime": "18:00" },
{ "weekday": 3, "mode": "WINDOW", "startTime": "08:00", "endTime": "18:00" },
{ "weekday": 4, "mode": "WINDOW", "startTime": "08:00", "endTime": "18:00" },
{ "weekday": 5, "mode": "INACTIVE", "startTime": null, "endTime": null },
{ "weekday": 6, "mode": "INACTIVE", "startTime": null, "endTime": null }
]
}
]
}

expectedTenantVersion só existe no corpo das rotas de unidade.

CampoTipoObrigatórioValidação
expectedVersionintegerSim@IsInt @Min(0); deve ser igual à versão atual do escopo, senão 409
expectedTenantVersionintegerSim (só unidade)@IsInt @Min(0); deve ser igual à versão atual do tenant herdado, senão 409
overridesarray de regrasSimpode ser vazio (remove todos os overrides do escopo)
overrides[].priorityenum ExamPrioritySimROUTINE, OUTPATIENT, URGENT, EMERGENCY, ON_CALL, INPATIENT
overrides[].modalityenum ExamModality | nullNãonull = regra vale para todas as modalidades dessa prioridade; senão uma das 14 modalidades do catálogo
overrides[].slaMinutesintegerSim1 a 59999 minutos
overrides[].daysarray de 7 diasSimexatamente os 7 weekday (0=domingo…6=sábado) únicos, e ao menos um dia com mode !== INACTIVE
overrides[].days[].weekdayintegerSim0 a 6
overrides[].days[].modeenum DiagnosisSlaRuleDayModeSimALL_DAY, WINDOW, INACTIVE
overrides[].days[].startTime / endTimestring HH:mm | nullCondicionalobrigatórios e startTime < endTime quando mode = WINDOW; devem ser null nos demais modos

Não pode haver duas entradas em overrides com a mesma combinação priority + modality (inclusive duas com modality: null para a mesma prioridade) — 409 SLA_RULE_DUPLICATE.

Response​

200 — DiagnosisSlaPolicyEnvelopeRestResponse:

json
{
"data": {
"scope": { "type": "UNIT", "id": "b7a1...-uuid" },
"configured": true,
"version": 4,
"tenantVersion": 5,
"priorities": ["ROUTINE", "OUTPATIENT", "URGENT", "EMERGENCY", "ON_CALL", "INPATIENT"],
"modalities": ["MR", "CT", "CR", "DX", "US", "MG", "OT", "XA", "CP", "NM", "ES", "EEG", "ECG", "BMD"],
"overrides": [
{ "priority": "EMERGENCY", "modality": "CT", "slaMinutes": 60, "days": ["..."] }
],
"effectiveRules": [
{
"priority": "EMERGENCY",
"modality": "CT",
"slaMinutes": 60,
"days": ["..."],
"source": "UNIT",
"sourceRuleModality": "CT",
"hasOwnOverride": true
}
]
}
}

effectiveRules traz uma entrada por prioridade × (nenhuma modalidade + cada uma das 14 modalidades) — sempre a grade completa, já resolvida. tenantVersion é null quando a resposta é de uma rota de tenant (não existe uma versão "acima" dele).

CampoTipoDescrição
scope.type / scope.idenum / uuidEscopo consultado (TENANT ou UNIT) e seu id
configuredbooleantrue se o escopo tem pelo menos um override próprio
versionintegerVersão do escopo consultado
tenantVersioninteger | nullVersão do tenant herdado (só em rotas de unidade)
overridesarraySó os overrides próprios do escopo consultado (sem herança)
effectiveRules[].sourceenum DiagnosisSlaRuleSourceSYSTEM, TENANT ou UNIT — de onde veio o valor efetivo
effectiveRules[].hasOwnOverridebooleantrue se o escopo consultado tem override exato para essa combinação
effectiveRules[].sourceRuleModalityenum | nullModalidade da regra que efetivamente casou (pode ser null mesmo pedindo uma modalidade específica, se só existir a regra "geral" daquela prioridade)

Erros​

Classe de erroerrorCodeStatusQuando ocorre
(validação de payload)BAD_REQUEST400corpo, path (uuid) ou query inválidos
ScopedResourceNotFoundError—404tenant/unidade inexistente, inativo ou fora do escopo autorizado
DiagnosisSlaRuleOverrideNotFoundErrorSLA_RULE_OVERRIDE_NOT_FOUND404DELETE .../rules/:priority sem override exato para restaurar
DiagnosisSlaPolicyVersionConflictErrorSLA_POLICY_VERSION_CONFLICT409expectedVersion do próprio escopo divergente da versão atual
DiagnosisSlaTenantVersionConflictErrorSLA_TENANT_VERSION_CONFLICT409(rotas de unidade) expectedTenantVersion divergente da versão atual do tenant
DiagnosisSlaRuleDuplicateErrorSLA_RULE_DUPLICATE409dois overrides do corpo com a mesma prioridade + modalidade
DiagnosisSlaRuleWeekInvalidErrorSLA_RULE_WEEK_INVALID422semana incompleta/duplicada, todos os dias inativos, janela sem início/fim válidos, ou prioridade/modalidade fora do catálogo
DiagnosisSlaRuleDurationInvalidErrorSLA_RULE_DURATION_INVALID422slaMinutes fora de 1..59999

Regras de negócio​

IDRegraComportamento esperado
RN-01Resolução em cascataunidade (específica) → unidade (geral) → tenant (específica) → tenant (geral) → padrão do sistema
RN-02Regra padrão do sistema é fixa por prioridade, 7 dias ALL_DAYver tabela de padrões abaixo; não depende de variável de ambiente
RN-03PUT substitui a lista inteira de overrides do escoponão é merge — overrides ausentes no corpo deixam de existir
RN-04Toda regra cobre exatamente os 7 dias da semanadias faltando ou repetidos → 422 SLA_RULE_WEEK_INVALID
RN-05Uma regra não pode ter todos os dias INACTIVEprecisa de ao menos um dia alcançável → senão 422
RN-06Janela (WINDOW) exige HH:mm válido com início < fimfora disso → 422; ALL_DAY/INACTIVE não podem ter horário
RN-07Duração entre 1 e 59.999 minutos, sempre inteirofora disso → 422 SLA_RULE_DURATION_INVALID
RN-08modality: null cobre a prioridade inteira quando não há regra mais específicauma prioridade pode ter uma regra geral e regras específicas por modalidade convivendo, sem duplicar
RN-09Restaurar (DELETE) só existe para unidadetenant não tem override "acima" para herdar de volta
RN-10Toda escrita audita antes/depois com ator, IP e versão resultanteeventos diagnosis.sla-policy.tenant-replaced, unit-replaced e unit-rule-restored

Prazos-padrão do sistema por prioridade (constantes no código, DiagnosisSystemSlaRuleCatalog, sem override de ambiente):

PrioridadePrazo padrão
ROUTINE2880 min (48h)
OUTPATIENT1440 min (24h)
URGENT120 min (2h)
EMERGENCY60 min (1h)
ON_CALL120 min (2h)
INPATIENT240 min (4h)

Esses valores coincidem com os prazos-padrão descritos na especificação de legado (BR-SLA-013).

Compliance​

A confirmar — responsável: time de Compliance/Diagnosis; data: 24/09/2026. O card de legado F-001 registra parecer de compliance (LGPD parcial por auditoria de alteração; HIPAA não aplicável; ANVISA sim, por exigir trilha imutável e validação de prazos inválidos) sobre a feature de produto, não sobre este contrato HTTP reescrito. Não foi possível confirmar no código atual se a trilha de auditoria (diagnosis.sla-policy.*) é tratada como append-only nem se há um processo de change control formal sobre esta rota — o que existe e está confirmado é o registro de antes/depois/ator/IP por escrita (ver Regras de negócio, RN-10).

Variáveis de ambiente​

Nenhuma variável de ambiente específica desta política. Os limites (7 dias, 1–59999 minutos, 6 prioridades, 14 modalidades) e os prazos-padrão por prioridade são constantes no código.

Tempo médio de resposta​

A confirmar — responsável: time de Diagnosis; data: 24/09/2026. Não há medição publicada; não foi executado neste levantamento.

Requisitos não funcionais​

RequisitoDefinição
IdempotênciaPUT é idempotente para o mesmo expectedVersion + mesmo corpo (mas a versão muda a cada aplicação bem-sucedida, então repetir a chamada com o mesmo expectedVersion após o primeiro sucesso resulta em 409)
PaginaçãoNão se aplica — effectiveRules sempre traz a grade completa (6 prioridades × 15 combinações de modalidade)
Rate limitNão confirmado neste levantamento — não há decorator de throttling neste controller
CacheNão
AuditoriaSim — ver tabela de eventos na visão geral do módulo

Relacionado​